Apa perbedaan antara SML dan OCaml? [Tutup]

Jawaban:

157

Ada banyak perbedaan, beberapa teknis, beberapa sosiopolitik. Saya telah mencoba untuk mengutamakan perbedaan yang lebih penting.

  • SML adalah bahasa dengan definisi dan standar. Itu stabil (dan sebenarnya telah dibekukan sehingga tidak dapat berkembang). Objective Caml adalah implementasi yang dikendalikan oleh sekelompok kecil di INRIA. Itu terus berkembang. (IMO evolusi dikelola dengan baik.)

  • SML memiliki banyak implementasi; Caml hanya punya satu.

  • Objective Caml memiliki sejumlah fitur tambahan, di antaranya yang paling menonjol mungkin adalah objek dan varian polimorfik.

  • Kedua bahasa tersebut memiliki model jenis rekaman yang sangat berbeda. Singkatnya, di Caml, nama bidang rekaman harus unik, di mana di SML, dua tipe rekaman berbeda dalam lingkup yang sama mungkin memiliki nama bidang yang sama. Keunikan ini dapat membuat porting dari SML ke Caml sedikit rumit.

  • Ada beberapa perbedaan sintaksis.

  • Perpustakaan dan fungsi standar sangat berbeda. Pustaka Caml sangat penting, sedangkan Pustaka Dasar Standar SML lebih fungsional. Misalnya, komposisi fungsi adalah primitif level atas di SML; itu bukan bagian dari perpustakaan Caml. Pustaka string Caml tidak menyediakan fungsi lipat (setidaknya tidak sejak versi 3.08). Penerapan banyak Listfungsi Caml tidak aman untuk daftar yang sangat panjang; mereka meledakkan tumpukan.

  • Sistem tipe sedikit berbeda: Di Caml, anotasi tipe pada ekspresi e : tyditerima jika tipe ty menyatu dengan tipe e. Di SML, e : tyditerima hanya jika tipenya tyadalah turunan dari tipe e. Perbedaan ini membuat anotasi di Caml kurang berguna dalam praktiknya, karena tidak mungkin menggunakan anotasi tipe untuk menegaskan bahwa ekspresi polimorfik.

  • Caml memiliki hubungan yang jauh lebih masuk akal dan masuk akal antara antarmuka (disebut jenis modul atau tanda tangan ) dan implementasi (konkret) (disebut modul atau struktur ) daripada SML. Dalam SML hampir semua hal berjalan dan Anda harus bergantung pada programmer untuk membuat kesepakatan yang baik. Di Caml, konvensi yang baik dibuat dan diberlakukan oleh kompilator.

  • Di SML, operator aritmatika kelebihan beban untuk diterapkan pada data floating-point dan integer. Di Caml, operator tidak kelebihan beban; operator floating-point diberi notasi dengan titik ekstra.

  • Di SML, pemrogram dapat mengontrol prioritas dan asosiasi operator infix. Di Caml, ini ditentukan oleh karakter pertama dari nama operator. Pembatasan ini membatasi manfaat dari kemampuan untuk menentukan notasi infix Anda sendiri.

Untuk analisis yang lebih detail lengkap dengan komentar editorial, Anda juga bisa melihat halaman perbandingan Adam Chlipala .

Norman Ramsey
sumber
4
Anda lupa kesetaraan (tidak dibatasi dan tidak aman di OCaml vs jenis kesetaraan aman tapi terbatas di SML), variabel jenis non-umum ('_a di OCaml), printf, interpretasi nama file sebagai nama modul di OCaml, jauh lebih curry di stdlib OCaml. Anda menulis antarmuka dua kali ketika Anda bermaksud sesuatu yang lain (implementasi?) Untuk kedua kalinya.
JD
1
dan pola-or dan penjaga OCaml dalam pencocokan pola.
JD
1
Perhatikan bahwa batasan kegunaan anotasi tipe telah dikurangi di 3.12, di mana anotasi e : 'a . ty(a)dimungkinkan dan bermakna.
4
Anda membuat pengamatan penting: "Perpustakaan Caml sangat penting". Ini tampaknya meresapi seluruh filosofi, sampai pada titik bahwa implementasi paralel pada perangkat keras multicore tampaknya sangat sulit menjadi tidak mungkin. Sebaliknya, setidaknya ada dua SML paralel: Mlton dan Poly / ML.
Makarius
2
Tentang poin ketiga Anda, nama rekaman tidak membutuhkan keunikan lagi di OCaml.
PatJ
-3

OCaml menambahkan fitur orientasi objek dan memiliki beberapa perbedaan sintaks kecil.

Charlie Martin
sumber