Saya selalu mendengar bahwa C adalah yang bahasa pilihan untuk menggunakan untuk embedded system, atau apapun yang perlu dijalankan pada kecepatan maksimum. Saya tidak pernah mengembangkan kesukaan untuk C, terutama karena saya tidak suka pointer aritmatika dan bahasanya tidak seperti anak tangga di atas assembler.
Di sisi lain, bahasa ML adalah fungsional, bahasa yang dikumpulkan sampah, dan OCaml bahkan memiliki model objek, namun mereka memiliki reputasi sebagai secepat C. bahasa ML memiliki abstraksi yang dapat diminta siapa pun untuk menulis tingkat tinggi, ringkas kode, namun tetap mempertahankan kecepatan yang diperlukan untuk menulis aplikasi berkinerja tinggi.
OCaml khususnya dapat digunakan di mana saja yang secara tradisional digunakan C, seperti untuk perangkat yang disematkan, driver grafis, sistem operasi, dll. Dengan semua hak, OCaml seharusnya telah mengambil alih dunia sekarang, tetapi hampir tidak ada orang yang mendengar bahasa itu sendirian. menggunakannya
Ini adalah pertanyaan subyektif, tetapi mengapa OCaml dan ML bahasa lainnya tetap tidak jelas, sementara C dan bahasa lainnya menjadi populer?
Saya pikir masalah dengan OCaml adalah tidak terlalu berguna "di luar kotak". Alasan akhirnya mengapa orang menggunakan bahasa adalah karena memiliki perpustakaan yang mereka butuhkan. Dengan tidak adanya "out of the box", tidak ada yang cukup jauh dalam proyek untuk menyadari bahwa mereka perlu menulis perpustakaan. Hasilnya adalah bahasa tanpa perpustakaan, yang membuatnya sulit untuk menulis "aplikasi nyata".
Saya pikir inilah yang menderita OCaml - tidak ada yang mau memulai "proyek nyata" di dalamnya karena semua yang ada adalah bahasa pemrograman. Yay, saya bisa menambahkan dua dan dua dan mencetak hasilnya. Hasilnya adalah kumpulan perpustakaan yang sebagian besar adalah perangkat akademis (penulis mendapatkan gelar PhD dan melanjutkan), yang tidak terlalu membantu untuk mempraktikkan programmer.
(Saya tahu ada pekerjaan yang sedang dilakukan untuk mengubah ini, dengan proyek-proyek seperti "Termasuk Baterai". Kembali ke sini dalam 5 tahun, dan mungkin OCaml akan lebih populer.)
Ada beberapa pengecualian untuk aturan ini. Java dimulai dengan tidak ada perpustakaan, tetapi Sun membayar orang untuk menulis semuanya di rumah, dan kemudian mereka memasarkannya. Sertifikasi Java, perangkat keras khusus Java, buku Java, kelas Java, dll. Kemudian bahkan meyakinkan sebagian besar universitas untuk mengajarkannya secara eksklusif, meskipun itu bukan bahasa yang sangat baik untuk digunakan untuk mempelajari pemrograman.
Hasilnya adalah popularitas. Uang dapat memecahkan banyak masalah.
Di arena bahasa fungsional, kita dapat melihat bahwa Haskell menjadi sangat populer. Saya pikir sebagian besar popularitas adalah karena orang-orang seperti don yang menulis perpustakaan yang bermanfaat, dan tidak pernah berhenti menjual bahasa. Setiap hari Anda melihat beberapa artikel Haskell tentang Pemrograman Reddit. Ini membuatnya terjebak dalam pikiran orang-orang sampai mereka akhirnya memutuskan, "Saya akan mencoba Haskell." Ketika mereka melakukannya, mereka melihat hal-hal berguna seperti kerangka kerja web, database objek, pustaka OpenGL, dan pustaka pemrosesan XML. Ini berarti bahwa mereka benar-benar dapat melakukan sesuatu yang bermanfaat "Right Now". Jadi antara potensi untuk menjadi produktif dan banyak mendengar tentang itu, Haskell telah mendapatkan banyak popularitas.
CL memiliki banyak perpustakaan yang sama dengan Haskell dan hampir secepatnya, tetapi tidak ada yang membicarakannya, sehingga "terasa mati". Memang #lisp jauh lebih tenang daripada #haskell, tetapi Lisp masih merupakan bahasa yang sangat produktif dengan banyak perpustakaan. Tidak ada bahasa lain yang memiliki SLIME. Tetapi pemasaran sangat penting, dan Haskell melakukannya lebih baik daripada Lisp atau OCaml (dan bersaing untuk pengguna yang sama).
Akhirnya, beberapa orang tidak akan pernah "mendapatkan" pemrograman, jadi dengan menghancurkan model mental mereka (variabel adalah kotak dengan nilai, kode dijalankan dari atas ke bawah) akan memastikan bahwa mereka tidak menggunakan bahasa Anda. Jenis programmer ini adalah persentase besar dari populasi pemrograman, jadi ini lebih lanjut membatasi kemungkinan penggunaan bahasa abstrak seperti Lisp, Haskell, dan OCaml.
sumber
Saya suka OCaml banyak sebagai bahasa. TAPI...
Dukungan alat tidak ada. Debugger hanya berfungsi OK tapi tidak bekerja di windows (terakhir saya periksa) dan tidak ada banyak alat pengembangan yang tersedia untuk itu.
Sistem tipenya, kadang-kadang, agak terlalu kuat. Untuk seseorang yang tidak mengerti cara kerja inferensi tipe atau sistem tipe ML secara umum, fakta bahwa ia tidak dapat menambahkan bilangan bulat ke float adalah langsung mematikan.
Perpustakaan standar kadang-kadang dapat memiliki perasaan yang tidak konsisten.
Model objek tampaknya agak ditempelkan dan perpustakaan standar jarang menggunakannya, sebagai gantinya memilih untuk perpustakaan berbasis modul.
Ada banyak hal lain yang pada dasarnya sama dengan bahasa yang tidak merasa "dipoles" dan yang membuat orang menjauh selama periode yang sangat kritis ketika mereka mengambil bahasa dan mencoba memutuskan apakah mereka menyukainya atau tidak.
Saya pikir warisan terpentingnya adalah bahwa hal itu, bersama dengan dialek ML lainnya, telah memiliki pengaruh yang sangat kuat pada bahasa fungsional lainnya. Sebagian besar bahasa fungsional generasi saat ini mengambil elemen terbaik dari dialek ML dan memperbaiki beberapa gangguan.
sumber
Sistem tertanam sering membutuhkan dua hal: kecepatan dan determinisme. OCaml dapat memberikan kecepatan, tetapi fakta bahwa ia memiliki pengumpul sampah membuatnya secara inheren tidak deterministik, dan untuk sistem real-time yang sederhana tidak akan berhasil.
sumber
Ini sedikit perbandingan apel dengan jeruk. OCaml adalah bahasa yang cukup muda [1] dan tidak pernah ada upaya serius dan berkelanjutan untuk mendorongnya ke arus utama (kecuali karya Microsoft saat ini dengan F #). Tidak seperti C, itu bukan lingua franca dari sistem operasi perusahaan yang paling banyak didukung dan ditiru (yaitu, UNIX). Tidak seperti Java, ia belum memiliki perusahaan besar yang mendorongnya sebagai platform komputasi generasi mendatang. Tidak seperti Perl, Python, dan Ruby, itu belum mengambil posisi di profil tinggi, ceruk berpengaruh (yaitu, ceruknya adalah bahasa pemrograman dan riset penalaran otomatis — tidak terlalu profil tinggi dibandingkan dengan pengembangan web). Karenanya, itu tidak super populer.
[1] Dalam keadilan, bahasa ML asli telah ada sejak 70-an. Tetapi OCaml tidak muncul sampai tahun 1996 dan tidak mewarisi pustaka ML standar. Secara praktis, ini adalah bahasa yang lebih muda dari C, C ++, Java, Python, Haskell, atau bahkan Ruby.
sumber
Komunitas OCaml gagal mengembangkan perpustakaan standar yang besar dan andal (melampaui apa yang hadir dengan OCaml saat ini) yang membuat pengembangan aplikasi menjadi mudah. Ada beberapa upaya untuk menyelesaikan masalah tetapi lihatlah Python atau Ruby untuk melihat apa yang hilang. OCaml adalah bahasa yang hebat jika Anda ingin menyelesaikan masalah algoritmik yang tidak terlalu bergantung pada keharusan berinteraksi dengan modul standar lanjutan seperti XML, jaringan, kalkulasi data, dan sebagainya, yang Anda tidak ingin terapkan sendiri.
Saya percaya bahwa bagian dari masalahnya adalah bagaimana modul dipetakan ke file oleh OCaml: secara konseptual semua file * .ml hidup dalam ruang nama yang sama dan direktori tidak memiliki arti. Ini membuat sulit bagi komunitas untuk mengembangkan perpustakaan. Jika kompiler akan memetakan hierarki direktori menjadi hierarki modul saya akan melihat peluang yang lebih baik bahwa perpustakaan standar akan berkembang. Namun, ini akan membutuhkan upaya yang cukup besar dari pengembang inti kompiler. (Saya tahu ada modul pengemasan tapi saya pikir ini adalah kludge.)
Masalah perpustakaan lain adalah kompatibilitas biner antara rilis kompiler. Cukup aman untuk mengatakan bahwa semua kode perpustakaan harus dikompilasi ulang setelah pemutakhiran kompiler. Ini membuatnya sulit untuk menyediakan rilis biner dari modul atau perpustakaan.
sumber
Mungkin karena terlalu banyak orang yang diajarkan ML sebagai bagian dari pengantar hal-hal teoritis aneh dan membingungkan tentang jenis. Itulah yang terjadi pada saya.
Saya ditunjukkan ML dan Smalltalk sekitar waktu yang sama. Smalltalk baru saja terlihat keren, dan segera bisa dimengerti untuk apa OO dan bagaimana Anda bisa membuat barang-barang yang cantik dan interaktif di lingkungan ini. ML adalah tentang hal-hal matematika abstrak yang tampaknya tidak relevan dengan apa yang ingin saya lakukan. Dan tidak seperti C, tidak berjanji untuk membiarkan saya menulis game cepat dengan micros 16-bit.
Ini, tentu saja, sangat tidak adil dan subyektif. Tapi itu mungkin menjadi kisah nyata bagi kebanyakan orang.
Akhir-akhir ini saya kira pertanyaannya adalah: sekarang saya merasa perlu mengetahui hal-hal teoritis yang aneh dan membingungkan tentang jenis ini, mengapa saya memilih ML daripada Haskell atau Erlang?
sumber
Saya percaya bahwa masalah utama adalah kurangnya perpustakaan standar yang sebenarnya. Oleh karena itu, proyeksikan Baterai OCaml Termasuk , yang diharapkan akan memperbaiki situasi. Seharusnya memasuki fase Beta dalam beberapa hari, jadi Anda harus mengajukan pertanyaan lagi dalam satu tahun atau lebih.
sumber
Saya setuju bahwa dukungan Windows yang buruk, kurva pembelajaran yang curam dan perpustakaan standar yang ramping telah menahan semua penyerapan OCaml di masa lalu, tetapi saya akan menambahkan bahwa ada banyak sekali informasi tutorial (misalnya buku) tentang OCaml dibandingkan dengan bahasa utama seperti Java.
Juga, jenis orang yang tahu bahasa seperti OCaml sangat heterogen. Di antara programmer web, mungkin 1 dari 1.000 akan pernah mendengar tentang OCaml. Di antara orang-orang yang melakukan komputasi ilmiah di Universitas Cambridge, sekitar 90% dari orang yang saya kenal fasih di OCaml. Memang, saya adalah salah satu yang terakhir di antara teman-teman saya yang belajar OCaml. Kami bahkan menjalankan OCaml pada supercomputer 256 CPU kami ...
Saya juga harus menyebutkan bahwa masalah ini sedang ditangani dengan cepat. OCaml telah menemukan kembali dirinya untuk pemrograman web baru-baru ini dengan proyek-proyek seperti Ocsigen dan sudah memiliki setidaknya dua kisah sukses industri utama dalam konteks itu. Ada lagi buku baru di OCaml sekarang. Komunitas ini berkolaborasi pada perpustakaan standar komprehensif yang disebut "baterai termasuk" yang baru saja dirilis dan dirilis menjadi beta. Versi ramah multicore dari OCaml akan segera dirilis. Versi terbaru OCaml juga mencakup banyak fitur baru yang hebat seperti pola lazy dan pustaka OCaml kode asli yang di-load secara dinamis.
sumber
Saya pikir bagian dari masalahnya adalah bahwa pemrograman fungsional bukan cara alami bagi kebanyakan orang untuk berpikir (dan saya mengatakan ini sebagai seseorang yang memiliki minat besar pada, dan penghargaan untuk, pemrograman fungsional). Ini diperparah oleh kenyataan bahwa sebagian besar programmer saat ini mulai belajar pemrograman prosedural (sebagian besar bahasa OOP populer masih prosedural di hati) dan bahasa fungsional sulit untuk menyesuaikan pada awalnya.
Ketika saya mulai kuliah, saya sudah tahu BASIC, C ++ dan Java dalam jumlah yang wajar dan sedikit bahasa assembly Pascal dan x86. Saya jauh dari seorang ahli tetapi telah mencapai kesimpulan (agak naif) bahwa semua bahasa pemrograman pada dasarnya sama dengan sintaksis yang sedikit berbeda. Pengantar kursus pemrograman kami menggunakan ML yang dengan cepat melemahkan saya dari gagasan itu. Saya mengalami kesulitan mendapatkan ML sekitar pada tahap karir pemrograman saya dan tidak benar-benar melihat titik pemrograman fungsional. Saya pikir dibutuhkan sedikit lebih banyak pengalaman dengan beberapa masalah pemrograman prosedural untuk benar-benar menghargai manfaat dari pendekatan fungsional.
Dosen ML kami sering mengklaim bahwa mengungkapkan masalah secara rekursif lebih 'alami' dan lebih mudah daripada menggunakan loop atau konsep prosedural lainnya. Saya tidak pernah diyakinkan oleh klaim itu dan masih belum membelinya. Fungsi rekursif kadang-kadang dapat memberikan solusi yang sangat elegan dan ringkas untuk masalah tetapi saya masih merasa itu cara yang tidak wajar untuk memikirkan masalah. Mungkin jika Anda memiliki latar belakang matematika yang sangat kuat tampaknya lebih intuitif tetapi saya tidak berpikir itu mudah bagi kebanyakan orang untuk berpikir secara rekursif. Mengingat sentralitas fungsi rekursif dengan paradigma pemrograman fungsional saya pikir ini juga dapat menjadi alasan untuk popularitas bahasa fungsional yang lebih rendah.
Ada juga efek umpan balik terhadap popularitas bahasa. Ketika saya mulai pemrograman saya ingin tahu bagaimana memprogram efek grafis dan game. Setelah mempelajari sedikit BBC BASIC dan kemudian QBASIC, saya secara alami menyelidiki apa bahasa yang paling umum digunakan oleh adegan demo dan programmer game dan mulai belajar C ++ dan x86 assembly. Saat ini beberapa programmer baru mungkin ingin tahu cara membuat aplikasi web dan akan tertarik untuk belajar PHP, Ruby atau C #. Ada beberapa area aplikasi untuk programmer pemula yang memiliki motivasi di mana jawaban untuk 'apa bahasa terbaik untuk belajar memprogram sesuatu seperti X' adalah 'Ocaml'.
Banyak alasan praktis yang diberikan untuk popularitas Ocaml yang terbatas (kurangnya perpustakaan yang matang, debuggers, IDE, dll.) Ditangani oleh dukungan resmi Microsoft untuk F # sebagai bahasa .NET class. Akan menarik untuk melihat apakah F # membantu membawa tingkat popularitas yang lebih besar untuk pemrograman fungsional.
sumber
Saya percaya inti masalahnya adalah politik. Pengembang Ocaml pada dasarnya tertarik dalam penelitian dan tidak memiliki sumber daya untuk menyediakan dan memelihara perpustakaan yang kaya. Namun mereka juga tidak mau melepaskan kendali produk kepada masyarakat yang memang memiliki sumber daya ini, hasilnya adalah beberapa upaya untuk menyelesaikan masalah ini bergantung pada kerja sama yang tidak ada dan pendanaan perpustakaan pihak ketiga dan upaya ini gagal. Baterai akan gagal karena alasan yang sama, kecuali pengembang Ocaml mengubah sikap mereka.
Saya menggunakan Ocaml untuk mengembangkan produk saya, dan saya memiliki aturan sederhana: meminimalkan ketergantungan pada kode pihak ketiga. Ketika item pihak ketiga berguna, jika memungkinkan, sertakan kode sumber langsung dalam paket. Misalnya Skema OCS dan Dypgen adalah bagian penting dari pengurai Felix, jadi mereka disalin ke sumber kami sehingga kami memiliki kendali atas mereka. Kontrolnya agak ilusi (karena Dypgen setidaknya sangat kompleks sehingga tidak mungkin kita bisa mempertahankannya, tetapi setidaknya kita memiliki salinan yang menurut kami berfungsi :)
Saya tidak akan menggunakan baterai karena lisensinya terbatas, jadi saya tidak dapat menyalin sumbernya, dan saya tidak percaya pada kelayakan jangka panjangnya sebagai produk yang berdiri sendiri: satu-satunya cara saya dapat menggunakannya adalah jika itu adalah dimasukkan langsung ke dalam distribusi standar Ocaml.
Dalam dunia C ++, saya mungkin hanya mempertimbangkan untuk menggunakan Boost: meskipun ini adalah perpustakaan pihak ketiga bukan bagian dari Standar, ia memiliki dukungan komunitas yang sangat besar dan sebenarnya sangat baik disinkronkan dengan proses pengembangan Standar. Gagasan yang dikembangkan dan diuji dalam Boost menjadi jenis praktik yang ada yang dapat distandarisasi, dan proses standar cukup terbuka untuk memungkinkan partisipasi masyarakat.
Ocaml telah mendapatkan popularitas yang sebenarnya karena itu adalah produk yang sangat bagus, tetapi itu tidak cukup untuk membuatnya menjadi bahasa utama. Jawa kasar, dipopulerkan dengan miliaran dolar dari pemasaran dan pengembangan perpustakaan, tetapi pada akhirnya harus dilepaskan ke masyarakat untuk bertahan hidup sama sekali.
sumber
Saya telah menikmati pengkodean dalam ML dan C untuk berbagai proyek. Hal yang mencegah saya menggunakan ML dalam proyek tertanam (sebagian besar yang memiliki kendala waktu nyata, dan memerlukan validasi) adalah pengumpulan sampah.
Ada penelitian manajemen memori dengan wilayah (lihat MLKit ) tetapi kompleksitas implementasi dan pelatihan yang diperlukan untuk menggunakannya dengan benar (dan risiko yang menyertainya) telah menjadi hambatan untuk menggunakannya.
sumber
IMHO, saya pikir masalah besar OCaml bukan dalam bahasa (yang hebat) tetapi pada orang-orang yang mengembangkannya dan akibatnya, lisensinya:
http://caml.inria.fr/ocaml/license.en.html
Mereka menggunakan lisensi Q Public untuk kompiler! Ya, lisensi ex-Trolltech yang digunakan untuk perpustakaan Qt! Lupakan tentang mendapatkan kontribusi apa pun dengan lisensi seperti itu.
Jika Anda memeriksa Penembakan Bahasa ( http://shootout.alioth.debian.org/ ) sekitar 7-8 tahun yang lalu, OCaml berada tepat di belakang C dan C ++ untuk kecepatan eksekusi. Sementara itu, bahasa lain (seperti Haskell) mendapat kompiler yang lebih baik (karena pendekatan komunitas yang berbeda, saya kira) dan sekarang kecepatan eksekusi OCaml tidak begitu besar seperti di masa lalu.
Singkatnya, saya tidak akan menggunakan OCaml, karena saya tidak melihatnya berjalan lebih baik tanpa beberapa peretas yang benar-benar baik membuat kompiler OCaml yang memiliki lisensi sumber terbuka BENAR-BENAR dan komunitas dengan perilaku sumber terbuka BENAR-BENAR.
sumber
Nah jika ini tentang uang seperti kata @jrockway, kita akan lihat apakah F # akan mendapatkan popularitas seperti java atau C #.
Bagi saya, saya kira pengembang tidak merasa nyaman dengan cara fungsional dalam melakukan sesuatu (itu dari sesi F # di techdays 2009 di mana sekitar 10 orang mengatakan mereka tahu pemrograman fungsional di antara hampir 100 orang).
Saya memulai OCAML tahun ini, saya tidak pernah kotor dengan pemrograman fungsional, tapi sekarang saya benar-benar belajar hal-hal baru selalu dari OCAML dan cara fungsional untuk memecahkan masalah, (tapi saya tidak bisa mengatakan bahwa saya akan menyerah C # untuk menggunakan OCAML :)).
sumber
Yah, mungkin F # menjadi populer.
sumber
Tidak membantu bahwa c-> ocaml adalah transisi mental yang lebih besar daripada c-> lisp. Saya telah mempertimbangkan ocaml beberapa kali, dan selalu menemukan bahwa biaya / manfaatnya tidak ada untuk saya, jadi sisihkan lagi. Bukan konstruksi yang membuatnya tampak keras, yang sebenarnya terlihat sangat rapi. Itu mencoba mempelajari makna yang sama sekali berbeda untuk '!'. Gangguan setidaknya terlihat sangat berbeda sehingga mudah untuk menghindari salah menafsirkan potongan kecil itu sebagai c.
sumber
Jika Anda ingin bahasa digunakan dalam sistem embedded real-time, Anda memerlukan pointer dan Anda tidak mampu membeli GC.
sumber
Saya pikir alasan utamanya adalah karena terlalu sedikit pengembang yang tahu OCaml.
Dan ketika berbicara dengan pengembang lain (mereka yang mendengar sesuatu tentang Ocaml) saya selalu mendapat kesan bahwa mereka menganggap OCaml sebagai bahasa "hanya pendidikan" ... sedih tapi benar
sumber
Saya sangat menyukai O'caml ... Saya telah mengimplementasikan banyak hal dengan menggunakannya, kompiler, juru bahasa, sistem untuk berkomunikasi dengan C ...
ketika saya mempelajarinya, masalah utama adalah bahwa pesan kesalahan tidak benar-benar jelas ... jadi misalnya, pada awalnya saya tidak benar-benar yakin kapan harus meletakkan ';' dan itu sangat sulit untuk menemukan bahwa sebenarnya; salah tempat ...
sumber