Câu trả lời:
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 List
hà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 : ty
chỉ được chấp nhận nếu kiểu ty
là 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 .
e : 'a . ty(a)
là có thể và có ý nghĩa.
Để biết chi tiết về sự khác biệt cú pháp mà Norman Ramsey đã đề cập, đây là một vài trang web:
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.