Belajar Erlang vs belajar node.js [ditutup]

41

Saya melihat banyak omong kosong online tentang bagaimana Erlang menendang pantat node.js 'di hampir setiap kategori yang mungkin. Jadi saya ingin belajar Erlang, dan mencobanya, tapi inilah masalahnya. Saya menemukan bahwa saya memiliki waktu yang lebih sulit untuk mengambil Erlang daripada saya mengambil node.js. Dengan node.js, saya dapat memilih proyek yang relatif kompleks, dan dalam sehari saya memiliki sesuatu yang berfungsi. Dengan Erlang, saya menghadapi hambatan, dan tidak berjalan secepat itu.

Jadi .. bagi mereka yang lebih berpengalaman, apakah Erlang rumit untuk dipelajari, atau apakah saya hanya melewatkan sesuatu? Node.js mungkin tidak sempurna, tapi sepertinya aku bisa menyelesaikannya.

Noli
sumber
9
Mungkin saya kehilangan sesuatu, tetapi bukankah node.js perpustakaan JavaScript, dan Erlang bahasa yang sama sekali berbeda? Bagaimana mereka bisa dibandingkan?
FrustratedWithFormsDesigner
3
@FrustratedWithFormsDesigner, node.js adalah bagian dari mode / sensasi mendapatkan javascript baru-baru ini di sisi server, dengan pendekatan multi-utas, sehingga mereka sebanding
lurscher
5
@ lurscher: Anda tidak dapat membandingkan Erlang (bahasa) dengan Node.js (JavaScript sisi server). Itu akan seperti membandingkan Java (bahasa) ke Django (server python). Belum lagi Erlang dan JS juga sangat berbeda.
Josh K
10
Sebagai seseorang yang menggunakan erlang dan node, mereka pasti sebanding dalam masalah yang mereka pecahkan
Dale Harvey
3
@Noli ada perbedaan antara node.js dan erlang. Anda berarti perbandingan antara node.js dan server web berbasis erlang. Erlang memiliki banyak pengguna di luar server web.
Raynos

Jawaban:

46

Pertama-tama, saya setuju dengan jawaban OPINI SAYA yang benar tentang mempelajari Erlang. Ini sebagian besar bahasa fungsional (meskipun concurrency memainkan peran besar), dan semua fitur-fiturnya ditambahkan untuk menuju toleransi kesalahan dan kekokohan, yang tidak persis sama dengan tujuan desain seperti Javascript.

Kedua, meninggalkan Node.js untuk masuk ke Erlang agak salah tempat. Node.js adalah satu server / kerangka kerja yang berfungsi untuk melakukan segala sesuatu dengan cara yang digerakkan oleh peristiwa dengan bantuan panggilan balik. Erlang memiliki kerangka kerjanya sendiri (OTP), tetapi tidak pada tingkat yang sama sekali.

Jika Anda berencana untuk belajar Erlang, saya sarankan entri blog saya Surat Terbuka untuk Pemula Erlang (atau Penonton) sebagai bacaan intro sebelum menyelam ke tutorial.


Satu-satunya hal yang dapat Anda bandingkan dengan Erlang dan Node.js, dalam hal pola dan penggunaan adalah bagaimana mereka dikendalikan oleh peristiwa. Namun, ada dua perbedaan besar di sini. Model Node.js didasarkan pada callback yang terikat pada acara. Erlang didasarkan pada antrian pesan dan penerimaan selektif. Apa implikasinya di sana?

Pertama-tama, jika Anda melakukan hal-hal dengan cara berbasis panggilan balik, satu-satunya cara Anda membawa negara sekitar adalah baik itu global atau masuk ke pemrograman gaya kelanjutan-lewat. Kedua, Anda harus merawat matriks acara lengkap sendiri. Salah satu contohnya adalah jika kita membayangkan sebuah mesin state hingga yang sangat sederhana: sebuah mutaph semaphore, event-driven.

Semaphore mutex memiliki dua status: terkunci dan gratis. Setiap kali unit perhitungan tertentu (pekerja, proses, fungsi, atau utas) ingin mendapatkan akses ke mutex, ia harus memecat suatu peristiwa yang memberi tahu 'Saya tertarik'. Sekarang Anda harus memperhatikan jenis acara berikut:

  • Mutex gratis dan Anda meminta untuk mendapatkan kunci
  • Mutex dikunci oleh orang lain dan Anda ingin mendapatkan kunci
  • Mutex dikunci sendiri dan Anda ingin membebaskan mutex

Kemudian Anda memiliki acara tambahan untuk dipertimbangkan, seperti penghentian waktu untuk menghindari kebuntuan:

  • Mutex telah dikunci dan Anda menunggu terlalu lama, timer untuk melepaskan api
  • Mutex telah dikunci dan Anda menunggu terlalu lama, mendapatkan kunci, lalu batas waktu dipadamkan

Kemudian Anda juga memiliki acara yang tidak terikat:

  • Anda baru saja mengunci mutex sementara beberapa pekerja mengharapkannya gratis. Sekarang permintaan pekerja harus antri sehingga ketika gratis itu ditangani kembali
  • Anda harus membuat semua pekerjaan tidak sinkron

Matriks acara menjadi kompleks sangat cepat. FSM kami di sini hanya memiliki 2 negara. Dalam kasus Erlang (atau bahasa apa pun dengan penerimaan selektif dan asinkron dengan peristiwa yang berpotensi sinkron), Anda harus memperhatikan beberapa kasus:

  • Mutex gratis dan Anda meminta untuk mendapatkan kunci
  • Mutex dikunci oleh orang lain dan Anda ingin mendapatkan kunci
  • Mutex dikunci sendiri dan Anda ingin membebaskan mutex

Dan itu saja. Pengatur waktu ditangani dalam kasus yang sama seperti penerimaan dilakukan, dan untuk segala sesuatu yang berkaitan dengan 'tunggu sampai gratis', pesan-pesan secara otomatis diantrekan: pekerja hanya perlu menunggu balasan. Modelnya jauh, jauh lebih sederhana dalam kasus ini.

Ini berarti bahwa dalam kasus umum, CPS dan model berbasis callback seperti yang ada di node.js baik meminta Anda untuk menjadi sangat pintar dalam cara Anda menangani acara, atau meminta Anda untuk mengurus seluruh matriks peristiwa kompleks secara penuh, karena Anda harus dipanggil kembali pada setiap kasus tidak penting yang dihasilkan dari masalah waktu aneh dan perubahan negara.

Penerimaan selektif biasanya memungkinkan Anda untuk fokus hanya dalam subkelompok dari semua peristiwa potensial dan memungkinkan Anda untuk mempertimbangkan dengan lebih mudah tentang peristiwa dalam kasus itu. Perhatikan bahwa Erlang memiliki perilaku (pola desain / implementasi kerangka kerja) dari sesuatu yang disebut gen_event. Implementasi gen_event memungkinkan Anda untuk memiliki mekanisme yang sangat mirip dengan apa yang digunakan di node.js jika itu yang Anda inginkan.


Akan ada poin lain yang membedakan mereka; Erlang memiliki penjadwalan preemptive sementara node.js membuatnya kooperatif, Erlang lebih cenderung untuk beberapa aplikasi skala besar (distribusi dan semua), tetapi Node.js dan komunitasnya biasanya lebih web-apt dan berpengetahuan tentang tren web terbaru. Ini masalah memilih alat terbaik, dan ini akan tergantung pada latar belakang Anda, jenis masalah Anda, dan preferensi Anda. Dalam kasus saya, model Erlang sangat cocok dengan cara berpikir saya. Ini belum tentu demikian untuk semua orang.

Semoga ini membantu.

SAYA MEMBERIKAN NASIHAT YANG MENGERIKAN
sumber
Lebih lanjut tentang pemrograman reaktif dan melakukannya di JS: blog.flowdock.com/2013/01/22/…
Bart
"Karena Anda harus dipanggil kembali pada setiap kasus ngawur yang dihasilkan dari masalah waktu aneh dan perubahan negara." - di Erlang, Anda masih perlu menangani penghitung waktu, dan fakta bahwa Anda melakukannya "dalam kasus yang sama dengan penerimaan dilakukan" tidak mengubah kompleksitas (sama sekali). Dari sudut pandang saya (sebagai arsitek sistem yang memproses permintaan miliaran per hari), satu-satunya perbedaan yang realistis antara penerimaan selektif dan gaya node.js adalah (a) pertanyaan "apa yang ingin kita lakukan secara default" (dengan node.js memproses kejadian secara default, dan Erlang menunda acara kecuali jika terjadi pertandingan) ...
No-Bugs Hare
... dan (b) keterbacaan, termasuk jumlah boilerplate (yang cukup buruk di node.js klasik, tetapi menjadi jauh lebih baik - dan IMNSHO lebih baik daripada Erlang - dengan operator menunggu yang baru diperkenalkan) ... Dan dalam hal apa pun , perbedaan-perbedaan ini cukup banyak kosmetik (terlepas dari fanatik pada kedua sisi memberitakan sebaliknya).
No-Bugs Hare
38

Erlang tidak rumit untuk dipelajari, itu hanya asing bagi pola pikir bahwa Constant Chambers (99,44%) dari coders telah belajar sebagai cara kerja pemrograman. Masalah yang Anda hadapi kemungkinan hanya disorientasi konseptual daripada kompleksitas yang sebenarnya.

Berikut adalah beberapa fitur alien dari Erlang yang akan menggigit programmer yang khas:

  • Erlang adalah bahasa pemrograman fungsional (kebanyakan-). Kebanyakan bahasa pemrograman yang umum hampir secara imperatif penting.
  • Model konkurensi Erlang adalah model Aktor. Sebagian besar bahasa pemrograman umum menggunakan penguncian berbasis penguncian atau beberapa bentuk pendekatan berbasis "reaktor" untuk konkurensi. (Saya pikir Node.js adalah yang terakhir, tapi jangan panggil saya - saya tidak tertarik pada JavaScript di sisi mana pun dari hubungan klien / server.)
  • Erlang memiliki pendekatan "biarkan crash" untuk pengkodean dengan fitur runtime yang kuat yang tersedia untuk menangkap crash ini, mendiagnosisnya, dan menambalnya saat sistem berjalan. Kebanyakan bahasa pemrograman yang umum mendukung gaya pemrograman yang sangat defensif.
  • Erlang hampir, tetapi tidak cukup, tidak terpisahkan dengan perpustakaan yang besar dan agak memutar otak dari arsitektur yang umum digunakan untuk server yang andal dan stabil (OTP). (Ada alasan mengapa Erlang biasanya disebut sebagai Erlang / OTP.) Selanjutnya perpustakaan ini dibangun di atas fitur alien yang disebutkan sebelumnya dan dengan demikian buram bagi pendatang baru. Kebanyakan bahasa pemrograman memiliki lebih sedikit perpustakaan yang mencakup semua (Java EE meskipun) untuk bekerja dengan dan mengatakan perpustakaan, secara alami, dibangun di atas konsep yang lebih akrab bagi kebanyakan programmer.

Jadi, belajar Erlang akan lebih menjadi tantangan bagi sebagian besar programmer daripada belajar Node.js - terutama jika programmer sudah terbiasa dengan JavaScript. Pada akhirnya, bagaimanapun, setelah Anda melewati penghalang konseptual, saya serahkan bahwa pengkodean Erlang akan menjadi lebih kompleks daripada pengkodean Node.js yang setara. Ini untuk beberapa alasan:

  • Model konkurensi Erlang membuat aliran logika jauh lebih jelas daripada konkurensi gaya tipikal "reaktor" dan membuat konkurensi jauh lebih stabil dan benar daripada konkurensi berbasis kunci biasa. Hampir tidak ada masalah sama sekali bagi programmer Erlang untuk menjatuhkan ribuan proses dalam program tipikal sementara menjatuhkan ribuan utas, katakanlah, Jawa akan menjadi mimpi buruk pertengkaran (belum lagi memori dan CPU overhead yang terlibat) dan setara dengan mempertahankan ribuan status terpisah dalam pengaturan berbasis "reaktor" akan menjadi mimpi buruk untuk dibaca.
  • Menjadi bahasa fungsional (kebanyakan-), Erlang sangat banyak pengaturan "apa yang Anda lihat adalah apa yang Anda dapatkan". Variabel, setelah diset, tidak berubah. Pernah. Tidak ada OOP "aksi seram di kejauhan" untuk membingungkan Anda: apa pun yang bekerja dengan Anda secara eksplisit diletakkan di depan Anda. Tidak ada variabel turunan dari X dan tidak ada variabel kelas dari Y dan tidak ada variabel global dari Z yang menjadi perhatian Anda. (Poin terakhir ini tidak 100% benar, tetapi benar dalam jumlah kasus yang begitu banyak sehingga cukup baik untuk fase pembelajaran Anda.)
  • Fasilitas hebat yang dimiliki Erlang untuk menangani kesalahan berarti Anda mengacaukan kode Anda dengan pemrograman yang kurang defensif, sehingga menjaga logika lebih jelas dan menjaga kode tetap kecil.
  • Pustaka OTP, setelah Anda grok, adalah tumpukan kuat kode umum yang membuat seluruh aplikasi Anda tetap teratur dan mencakup banyak masalah dan menggunakan kasus-kasus server yang tahan lama yang kemungkinan besar tidak akan Anda pikirkan sampai terlambat. Pustaka OTP itu sendiri adalah, IM (ns) HO alasan yang cukup baik untuk belajar Erlang.

Lanjutkan slogging di Erlang jika Anda bisa, dan jika Anda belum melakukannya, kunjungi Visit You Some Erlang for Great Good untuk pengenalan yang lembut dan (kebanyakan-) lucu untuk konsep-konsep Erlang.

HANYA PENDAPAT SAYA yang benar
sumber
Terima kasih untuk posting ini. Saya membaca Pelajari Anda beberapa Erlang sekarang, dan saya setengah jalan di buku, tapi saya merasa bahwa saya harus tahu semua itu sebelum saya dapat benar-benar mulai melakukan sesuatu secara moderat signifikan, dan tidak hanya mengambilnya sepotong demi sepotong
Noli
1
Sebenarnya begitu Anda masuk ke bagian concurrency dari buku Anda akan mulai dapat melakukan hal-hal yang cukup signifikan dengan cukup mudah.
HANYA SAYA PENDAPAT benar
"Model konkurensi Erlang membuat aliran logika jauh lebih jelas daripada" konkurensi gaya "reaktor" yang khas "- Saya berpendapat bahwa sementara pemrosesan reaktor async memang berantakan selama beberapa dekade, dengan munculnya masa depan dan terutama dari operator yang menunggu itu bukan kasus lagi. Dengan menunggu, Anda dapat memiliki coroutine ultra-ringan Anda bertindak "seolah-olah" mereka agak-threads (dan saya tidak yakin tentang JS, tetapi dalam C ++ co_await dirancang untuk skala tidak hanya ribuan, tetapi miliaran yang luar biasa coroutine).
No-Bugs Hare
"Itu hanya asing bagi pola pikir bahwa Chambers Constant (99,44%)" - dan untuk proyek industri apa pun, ini memenuhi syarat sebagai Masalah Gemuk Besar. Masalah Gendut Besar ini akan bertahan bahkan jika tidak ada alasan obyektif untuk tidak populernya bahasa fungsional (yang tidak saya sukai, tapi ini adalah cerita yang sangat berbeda dan panjang).
No-Bugs Hare
10

Ada beberapa perbedaan signifikan antara Erlang dan Node

Yang pertama adalah simpul itu Javascript, yang artinya adalah bahasa yang sangat umum yang berbagi banyak sifat dengan bahasa yang banyak orang kenal sehingga biasanya lebih mudah untuk bangkit dan berjalan. Erlang memiliki sintaksis yang sering aneh dan asing bagi kebanyakan orang, dan meskipun sebagai bahasa jauh lebih sederhana daripada javascript, Erlang sedikit lebih terbiasa karena keunikannya.

Yang kedua adalah bahwa Erlang memiliki model konkurensi berbagi apa pun yang sangat khusus, mengharuskan Anda untuk berpikir dengan cara yang berbeda untuk menyelesaikan masalah, yang merupakan hal yang baik (TM)

Yang penting terakhir adalah bahwa Erlang dikembangkan oleh perusahaan komersial dan open source setelah fakta, hanya 2 tahun yang lalu atau lebih orang dapat benar-benar melihat komitmen individu dalam kontrol sumber dan bahkan sekarang saya tidak berpikir semua pengembang erlang telah pindah untuk repo github publik untuk perkembangan mereka. node.js dibangun di dalam komunitas sejak awal, ini berarti dukungan komunitasnya jauh lebih baik, sudah ada jauh lebih banyak perpustakaan untuk node, lebih banyak dokumentasi komunitas, lebih banyak contoh langsung, manajer paket yang ada di mana-mana dll. Erlang mengejar ketinggalan dalam hal ini tetapi masih jauh lebih besar untuk bangkit.

Node akan membiarkan Anda memprogram hal-hal yang menyenangkan dengan cukup cepat dan relatif bebas rasa sakit, itu masih memiliki rasa sakit yang tumbuh sehubungan dengan aplikasi besar yang erlang telah dipecahkan untuk waktu yang lama. Erlang akan mengubah cara Anda memprogram dan (imo) menjadikan Anda seorang programmer yang lebih baik, namun itu tidak akan membuat hidup Anda lebih mudah pada awalnya. Keduanya menyenangkan dengan cara yang berbeda.

Dale Harvey
sumber
2
Layak disebutkan bahwa utas Node juga 'berbagi apa-apa'.
Tamlyn