Sự khác biệt giữa SML và OCaml là gì? [đóng cửa]


99

Điều gì làm cho hai phương ngữ ML khác nhau?


3
So sánh cú pháp: adam.chlipala.net/mlcomp
nawfal

Câu trả lời:


157

Có rất nhiều khác biệt, một số kỹ thuật, một số chính trị xã hội. Tôi đã cố gắng đặt những điểm khác biệt quan trọng hơn trước.

  • SML là một ngôn ngữ có định nghĩa và tiêu chuẩn. Nó ổn định (và trên thực tế đã bị đóng băng nên không thể phát triển). Objective Caml là một triển khai được kiểm soát bởi một nhóm nhỏ tại INRIA. Nó tiếp tục phát triển. (IMO quá trình tiến hóa được quản lý tốt.)

  • SML có nhiều cách triển khai; Caml chỉ có một.

  • Objective Caml có một số tính năng bổ sung, trong đó nổi bật nhất có lẽ là các đối tượng và các biến thể đa hình.

  • Hai ngôn ngữ có các mô hình loại bản ghi khác nhau đáng kể. Tóm lại, trong Caml, tên của các trường bản ghi phải là duy nhất, trong đó trong SML, hai loại bản ghi khác nhau trong cùng một phạm vi có thể có tên trường chung. Điều kỳ quặc này có thể khiến việc chuyển từ SML sang Caml trở nên khó khăn một chút.

  • Có khá nhiều khác biệt về cú pháp.

  • Các thư viện và các chức năng tiêu chuẩn khác nhau đáng kể. Thư viện Caml rất bắt buộc, trong khi Thư viện Cơ sở Tiêu chuẩn SML có nhiều chức năng hơn. Ví dụ, thành phần hàm là một nguyên thủy cấp cao nhất trong SML; nó không phải là một phần của thư viện Caml. Thư viện chuỗi Caml không cung cấp chức năng gấp (ít nhất là không phải ở phiên bản 3.08). Việc triển khai nhiều Listhàm Caml không an toàn đối với danh sách rất dài; họ thổi bay ngăn xếp.

  • Các hệ thống kiểu khác nhau một cách tinh tế: Trong Caml, chú thích kiểu trên một biểu thức e : tyđược chấp nhận nếu kiểu ty thống nhất với kiểu của e. Trong SML, e : tychỉ được chấp nhận nếu kiểu tylà một thể hiện của kiểu e. Sự khác biệt này làm cho chú thích trong Caml ít hữu ích hơn trong thực tế, bởi vì không thể sử dụng chú thích kiểu để khẳng định rằng một biểu thức là đa hình.

  • Caml có mối quan hệ lành mạnh và hợp lý hơn nhiều giữa các giao diện (được gọi là kiểu mô-đun hoặc chữ ký ) và (cụ thể) triển khai (được gọi là mô-đun hoặc cấu trúc ) so với SML. Trong SML có khá nhiều thứ và bạn phải dựa vào lập trình viên để thiết lập các quy ước tốt. Trong Caml, các quy ước tốt được thiết lập và thực thi bởi trình biên dịch.

  • Trong SML, các toán tử số học được nạp chồng để áp dụng cho cả dữ liệu dấu phẩy động và số nguyên. Trong Caml, các toán tử không bị quá tải; toán tử dấu phẩy động được ký hiệu bằng một dấu chấm phụ.

  • Trong SML, người lập trình có thể kiểm soát mức độ ưu tiên và tính liên kết của các toán tử infix. Trong Caml, chúng được xác định bởi ký tự đầu tiên của tên nhà điều hành. Hạn chế này hạn chế lợi ích của việc có thể xác định ký hiệu infix của riêng bạn.

Để có phân tích chi tiết hơn hoàn chỉnh với bình luận của ban biên tập, bạn cũng có thể xem trang so sánh của Adam Chlipala .


4
Bạn đã quên bình đẳng (không hạn chế và không an toàn trong OCaml so với các loại bình đẳng an toàn nhưng bị hạn chế trong SML), các biến kiểu không tổng quát hóa ('_a trong OCaml), printf, cách diễn giải tên tệp dưới dạng tên mô-đun trong OCaml, nhiều thứ phức tạp hơn trong stdlib của OCaml. Bạn đã viết giao diện hai lần khi bạn có ý định khác (triển khai?) Lần thứ hai.
JD

1
và hoặc-các mẫu và bảo vệ của OCaml trong khớp mẫu.
JD

1
Lưu ý rằng giới hạn về tính hữu dụng của chú thích kiểu đã được giảm bớt phần nào trong 3.12, khi chú thích e : 'a . ty(a)là có thể và có ý nghĩa.

4
Bạn nhận xét quan trọng: "Thư viện Caml rất bắt buộc". Điều này dường như thấm nhuần toàn bộ triết lý, đến mức việc thực hiện song song trên phần cứng đa lõi dường như là rất khó đến mức không thể. Ngược lại, có ít nhất hai SML song song: Mlton và Poly / ML.
Makarius

2
Về điểm thứ ba của bạn, tên bản ghi không yêu cầu tính duy nhất nữa trong OCaml.
PatJ


-3

OCaml bổ sung các tính năng hướng đối tượng và có một số khác biệt nhỏ về cú pháp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.