Dalam beberapa hari terakhir, sejumlah artikel telah diterbitkan di Habré, leitmotif umum yang (terutama dalam komentar) adalah konfrontasi antara orang-orang yang tumpul dan runcing - penganut FP terhadap PLO, meskipun mereka didesak untuk tidak berdebat. Kadang-kadang Erlang dibahas, sehubungan dengan yang saya ingat posting pendek tentang topik dari Joe Armstrong, salah satu pencipta bahasa ini, ditulis olehnya pada akhir 2018 di forum Elixir dalam menanggapi pertanyaan tentang paradigma bahasa. Saya pikir komentarnya akan menarik.
Joe Armstrong 12 September 2018
Semua hal baik tentang Elixir (dan Erlang) terkait dengan konkurensi - hanya menciptakan proses dan pengiriman pesan yang independen. Dan inilah esensi dari pemrograman berorientasi objek, seperti yang berulang kali ditunjukkan Alan Kay.
OOP sepenuhnya didedikasikan untuk objek. Objek merespons (atau harus merespons) terhadap pesan, dan ketika Anda ingin melakukan sesuatu, Anda mengirim pesan ke objek, dan bagaimana proses itu benar-benar tidak relevan. Pikirkan benda sebagai "kotak hitam", dan ketika Anda menginginkan sesuatu darinya - cukup kirim pesan, dan mereka akan mengirimi Anda pesan sebagai tanggapan.
Bagaimana semuanya diatur di dalam tidak masalah apakah kode di dalam kotak hitam fungsional atau penting - hanya apa yang seharusnya dilakukan adalah penting.
Sayangnya, meskipun bahasa berorientasi objek pertama yang berhasil berdasarkan model ini (Smalltalk) dioperasikan pada konsep "objek" dan "pesan", yang terakhir dalam Smalltalk bukanlah pesan nyata, tetapi hanya panggilan fungsi sinkron yang disamarkan. Kesalahan yang sama diulangi dalam C ++, kemudian di Jawa, dan gagasan utama OOP berubah menjadi paradigma aneh untuk mengatur kode ke dalam kelas dan metode.
Erlang dan Elixir membuatnya mudah untuk membuat jutaan proses yang terisolasi di mana semuanya bekerja dengan mengirim pesan di antara mereka. Arsitektur sistem ditentukan oleh tingkat paralelisme yang Anda inginkan, dengan pemetaan selanjutnya ke proses secara langsung.
Server web Elixir untuk 10.000 pengguna bukanlah "satu server web dengan 10.000 pengguna" (seperti halnya Apache atau Jigsaw dan sejenisnya), tetapi "10.000 server web per pengguna" - setuju, sebuah radikal berangkat dari model tradisional.
Fakta bahwa bahasa fungsional yang sederhana digunakan untuk menggambarkan model proses Erlang / Elixir hampir merupakan kecelakaan. Semuanya dimulai dengan sistem pemrograman logis (Prolog), dan hal-hal seperti C-node, misalnya, dapat ditulis dalam bahasa apa saja. Hal yang sangat penting bagi Elixir (dan bahasa BEAM lainnya) adalah kemampuan mesin virtual mereka untuk beroperasi dengan sejumlah besar proses paralel.
Untuk waktu yang lama saya mengatakan bahwa "Erlang adalah satu-satunya bahasa berorientasi objek nyata." Kurasa sekarang aku bisa menambahkannya dan Elixir.
Untuk OOP, hal-hal dasar adalah:
- isolasi antara objek (kita memilikinya)
- mengikat terlambat (kami memutuskan apa yang harus dilakukan hanya ketika proses menerima pesan)
- polimorfisme (semua objek dapat merespons pesan dengan jenis yang sama, misalnya, "cetak sendiri" dan objek apa pun dapat mengetahui cara melakukannya)
Jauh lebih tidak penting:
- pembagian ke dalam kelas dan metode
- sintaksis
- model perangkat lunak (fungsional atau keharusan)
Setelah kami membagi sistem menjadi sejumlah besar proses kecil berkomunikasi satu sama lain, yang lainnya menjadi (relatif) mudah - setiap proses harus cukup sederhana dan dapat melakukan sedikit, yang sangat menyederhanakan pemrograman.
Apa yang dibawa Erlang (dan Elixir) ke pemrograman adalah gagasan komunikasi (tautan - kira-kira. Penerjemah). Awalnya diusulkan oleh Mike Williams, itu terdiri dalam memperluas kemungkinan penanganan kesalahan, memungkinkannya dilakukan di luar batas proses. Dengan ini, kami mendapatkan semua alat yang diperlukan untuk membangun pohon pengawas, dll.
Supervisor, gen_server, dan semua jazz itu hanyalah perpustakaan yang menyembunyikan beberapa detail dari pengguna. Sederhana di dalam, ditulis menggunakan alat yang sama - proses paralel dan hubungan di antara mereka.
Erlang tidak dikembangkan sebagai bahasa pemrograman fungsional, tetapi sebagai alat untuk menciptakan sistem toleransi kesalahan yang berumur panjang.
Elemen utama toleransi kesalahan adalah konsep penanganan kesalahan jarak jauh. Jika keseluruhan sistem gagal, kerusakan harus diperbaiki (dikompensasi) pada komputer lain, karena sudah tidak mungkin melakukannya secara lokal - komputer lokal tidak berfungsi.
Ini berarti bahwa untuk pemrograman sistem yang toleran terhadap kesalahan, kita memerlukan distribusi (proses) dan pengiriman pesan menjadi alat yang mudah digunakan, dan itulah sebabnya, pada prinsipnya, setiap arsitektur yang toleran terhadap kesalahan pada akhirnya akan tampak seperti Erlang.
Inti dari menciptakan Erlang adalah menyederhanakan pemrograman sistem toleran-kesalahan, efek sampingnya adalah kemudahan pemrograman sistem yang dapat diskalakan.
Perbedaan antara Erlang dan Elixir dan "semua orang" adalah dalam mekanisme untuk memastikan konkurensi dan toleransi kesalahan, dan ini bukan tentang monad, sintaksis, atau "kemurnian" dari FP.
Sekarang pertanyaannya adalah - apakah Anda ingin memproses 10.000 pengguna dalam satu utas, menggunakan panggilan balik untuk mengemulasi konkurensi, atau apakah Anda masih ingin membuat 10.000 proses paralel, yang masing-masing sederhana dan tidak memerlukan panggilan balik sama sekali?
Setiap proses menunggu pesan yang diminati, kemudian melakukan perhitungan dan tertidur untuk mengantisipasi selanjutnya.
Saya pikir masalah besar dengan mempopulerkan Erlang / Elixir adalah bahwa Anda perlu menjelaskan bagaimana banyak proses paralel membantu menyelesaikan masalah spesifik Anda. Karena tidak ada bahasa umum lainnya yang awalnya ditujukan untuk pemrograman paralel dan tidak memfasilitasinya dengan cara apa pun yang berarti, kebutuhan akan bahasa tersebut bagi orang-orang tidak sepenuhnya dipahami dan dipahami.
"Tapi saya bisa melakukan semuanya dengan callback dalam satu utas," kata mereka. Dan mereka melakukannya, dan itu sangat sulit. Dan Anda bertanya, "apa yang terjadi jika callback masuk ke loop atau melempar pengecualian?", Dan jika mereka tidak memahami pertanyaannya, maka Anda harus bekerja keras dan menjelaskan masalahnya. Tetapi jika pertanyaannya jelas, beri tahu mereka bahwa ada satu negara yang jauh di mana panggilan balik tidak diperlukan untuk memprogram konkurensi.
Tampaknya semua hal di atas dapat direduksi menjadi yang berikut: tolong jangan iklankan Elixir sebagai bahasa pemrograman fungsional - tidak. Ini adalah bahasa pemrograman paralel (CPL, Bahasa Pemrograman Bersamaan).
Jangan menanggapi argumen seperti "bahasa fungsional saya lebih fungsional daripada bahasa Anda." Dan bahkan tidak repot-repot membicarakan monad, segera ganti topik pembicaraan.
"- Apa itu CPL?"
"- Kamu tahu, inilah yang dibuat WhatsApp ..."
Dari penerjemah
Pertama-tama, saya ingin menyampaikan penyesalan saya atas kematian mendadak Joe Armstrong - dia meninggal pada 20 April 2019. Sulit untuk meremehkan kontribusinya terhadap pengembangan industri, serta bakatnya sebagai seorang populariser - buku, pidato, dan pekerjaan aktif di komunitas Erlang dan Elixir.
Tautan yang bermanfaat: