2009-03-31 45 views

Trả lời

141

Có rất nhiều sự 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 khác biệt quan trọng hơn trước.

  • SML là 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 nó không thể phát triển). Caml mục tiêu là một thực hiện đượ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 sự tiến hóa được quản lý tốt.)

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

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

  • Hai ngôn ngữ có các kiểu 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 SML, hai loại bản ghi khác nhau trong cùng phạm vi có thể có tên trường chung. Quirk này có thể làm cho việc chuyển từ SML sang Caml một chút phức tạp.

  • Có một vài khác biệt về cú pháp.

  • Các thư viện và chức năng tiêu chuẩn khác nhau đáng kể. Thư viện Caml là rất cấp bách, trong khi Thư viện cơ sở tiêu chuẩn SML là 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 chức năng của Caml List không an toàn cho các danh sách rất dài; họ thổi đống.

  • Các hệ thống loại là tinh tế khác nhau: Trong CAML, một loại chú thích trên một biểu e : ty được chấp nhận nếu kiểu tythống nhất với loại e. Trong SML, e : ty chỉ được chấp nhận nếu loại ty là một ví dụ của loại e. Sự khác biệt này ám chỉ 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 để nhấn mạnh rằng một biểu thức là đa hình.

  • CAML có một mối quan hệ lành mạnh hơn và hợp lý giữa các giao diện (gọi tắt là loại mô-đun hoặc chữ ký) và (bê tông) triển khai (gọi tắt là module 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, toán tử số học bị quá tải để á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 với dấu chấm phụ.

  • Trong SML, người lập trình có thể kiểm soát ưu tiên và tính tương thích của các toán tử kết xuất. Trong Caml, chúng được xác định bởi ký tự đầu tiên của tên của toán tử.Hạn chế này giới hạn các 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, hãy xem Adam Chlipala's comparison page.

+2

rất nhiều thông tin! +1 của tôi cho điều này. –

+4

Bạn quên bình đẳng (không bị 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ị giới hạn trong SML), các biến kiểu không tổng quát ('_a in OCaml), printf, giải thích tên tập tin như tên mô-đun trong OCaml, nhiều currying hơn trong OCaml's stdlib . Bạn đã viết giao diện hai lần khi bạn có ý nghĩa gì đó khác (thực hiện?) Lần thứ hai. –

+1

và OCaml hoặc mẫu và bảo vệ trong khớp mẫu. –

-4

OCaml thêm đối tượng định hướng đối tượng và có một số khác biệt cú pháp nhỏ.

Các vấn đề liên quan