Erlang Öğrenme vs öğrenme node.js [kapalı]


41

Erlang'ın düşünülebilecek her kategoride node.js 'kıçını nasıl tekmeleyeceği hakkında çevrimiçi bir sürü saçmalık görüyorum. Bu yüzden Erlang'ı öğrenmek ve bir şans vermek istiyorum, ama sorun bu. Erlang'ı almaktan çok daha fazla zaman geçirdiğimi keşfediyorum. Node.js ile nispeten karmaşık bir proje seçebilirdim ve bir gün içinde çalışan bir şeyim vardı. Erlang ile bariyerlerle karşılaşıyorum ve neredeyse o kadar hızlı gitmiyorum.

Öyleyse .. daha fazla deneyime sahip olanlar için, Erlang'ın öğrenmesi karmaşık mı, yoksa sadece bir şey mi eksik? Node.js mükemmel olmayabilir, ancak bununla işleri halledebileceğim görülüyor.


9
Belki bir şeyleri özlüyorum ama node.js bir JavaScript kütüphanesi değil ve Erlang tamamen farklı bir dil değil mi? Nasıl kıyaslanabilirler?
SinirliFormsDesigner ile

3
@FrustratedWithFormsDesigner, node.js, çok iş parçacıklı bir yaklaşımla, sunucu tarafında javascript almanın moda / yutturmaca bir parçasıdır, bu nedenle karşılaştırılabilir
lurscher

5
@lurscher: Erlang'ı (dil) Node.js (sunucu tarafı JavaScript) ile karşılaştıramazsınız. Bu, Java'yı (dili) Django (sunucu python) ile karşılaştırmak gibidir. Erlang ve JS de çok farklı değil.
Josh K,

10
Hem erlang hem de düğümü kullanan biri olarak, çözdükleri problemlerde kesinlikle karşılaştırılabilirler
Dale Harvey

3
@Noli, node.js ile erlang arasında bir fark var. Node.js ve erlang tabanlı web sunucuları arasında bir karşılaştırma yapmak istemiştiniz. Erlang web sunucuları dışında birçok kullanıcıya sahiptir .
Raynos

Yanıtlar:


46

Her şeyden önce, SADECE DOĞRU fikrimin Erlang öğrenmekle ilgili cevabını kabul ediyorum Çoğunlukla işlevsel bir dildir (eşzamanlılık büyük bir rol oynamasına rağmen) ve tüm özellikleri ilk etapta Javascript ile aynı tasarım hedefleri değil aynı şekilde hata toleransı ve sağlamlığa yönelik olarak eklendi.

İkincisi, Node.js'yi Erlang'a girmek için bırakmak biraz yanlış. Node.js, geri aramaların yardımı ile her şeyi olaya dayalı bir şekilde yapma yoluna giden tek bir sunucu / çerçevedir. Erlang'ın kendi çerçevesi (OTP) var, ancak aynı seviyede değil.

Erlang'ı öğrenmeyi planlıyorsanız, blogumda Erlang Acemi'sine (veya Onlooker'e) Açık Mektup mektubunu öğreticilere dalmadan önce giriş okuma olarak öneririm .


Erlang ve Node.js 'i kalıplar ve kullanım açısından karşılaştırabileceğiniz tek şey, olaylara yönelik olmalarıdır. Ancak, burada iki büyük ana fark var. Node.js modeli, olaylara bağlı geri aramalara dayanıyor. Erlang mesaj sıralarına ve seçici alıcılara dayanmaktadır. Oradaki etkiler neler?

Her şeyden önce, bir şeyleri geri çağırma tabanlı bir şekilde yaparsanız, etrafta dolaşmanızın tek yolu, onu global hale getirmek veya devam eden stil programlamasına girmek. İkincisi, tam olay matrisini kendiniz gözetmek zorundasınız. Buna bir örnek, çok basit bir sonlu durum makinesi hayal edersek: mutex semafor, olaya dayalı.

Mutex semaforunun iki durumu vardır: kilitli ve serbest. Belirli bir hesaplama birimi (işçi, süreç, işlev veya iş parçacığı) mutekse erişmek istediğinde, 'ilgileniyorum' diyen bir olayı başlatması gerekir. Şimdi aşağıdaki etkinlik türlerine dikkat etmeniz gerekiyor:

  • Mutex ücretsizdir ve kilidi almanız istenir.
  • Mutex başkası tarafından kilitlenmiş ve kilidi almak istiyorsunuz.
  • Muteks kendi kendine kilitlenir ve muteksiyi serbest bırakmak istiyorsun.

Ardından, kilitlenmeleri önlemek için zaman aşımına uğramak gibi dikkate alınması gereken ek etkinlikleriniz vardır:

  • Muteks kilitlendi ve çok uzun süre beklediniz, yangınları kesmek için bir zamanlayıcı
  • Muteks kilitlendi ve çok uzun bir süre beklediniz, kilidi aldınız, sonra zaman aşımı sona erdi

Öyleyse aynı zamanda sınır dışı etkinliklere de sahipsiniz:

  • bir işçi serbest kalmasını beklerken muteksiyi kilitledin. Şimdi bu işçinin sorgusu sıraya konmalı, böylece ücretsiz olduğunda geri alınabilsin
  • Tüm işi asenkronize etmeniz gerekiyor

Olay matrisi çok hızlı bir şekilde karmaşıklaşıyor. Bizim FSM’mizde sadece 2 eyalet var. Erlang durumunda (veya seçici alanlara sahip herhangi bir dilde ve potansiyel olarak senkronize olaylarla senkronize olmayan bir dilde), birkaç vakayla ilgilenmelisiniz:

  • Mutex ücretsizdir ve kilidi almanız istenir.
  • Mutex başkası tarafından kilitlenmiş ve kilidi almak istiyorsunuz.
  • Muteks kendi kendine kilitlenir ve muteksiyi serbest bırakmak istiyorsun.

Ve bu kadar. Zamanlayıcılar, alıcıların yapıldığı aynı durumlarda ele alınır ve 'ücretsiz olana kadar bekle' ile ilgili olan her şey için mesajlar otomatik olarak sıralanır: çalışan sadece bir cevap beklemek zorundadır. Model bu durumlarda çok daha basittir.

Bu, genel durumlarda, CPS ve node.js'deki gibi geri çağrı tabanlı modellerin ya olayları nasıl işlediğiniz konusunda çok zekice olmanızı ya da tam bir karmaşık olay matrisine tam olarak bakmanızı isteyeceği anlamına gelir; garip zamanlama sorunlarından ve durum değişikliklerinden kaynaklanan her bir tutarsız duruma geri çağrılmanız gerekir.

Seçici almalar genellikle yalnızca tüm olası olayların bir alt grubuna odaklanmanıza izin verir ve bu durumda olaylar hakkında çok daha kolay bir şekilde karar vermenize izin verir. Erlang'ın bir şeyin davranışına (tasarım deseni / çerçeve uygulaması) sahip olduğunu unutmayın gen_event. Gen_event uygulaması, eğer istersen, node.js'de kullanılana çok benzer bir mekanizmaya sahip olmana izin verir.


Onları farklılaştıran başka noktalar da olacak; Node.js işbirliğine yardımcı olurken Erlang'ın ön planlı zamanlaması var, Erlang bazı çok büyük ölçekli uygulamalara (dağıtım ve diğerleri) daha uygun, ancak Node.js ve topluluğu genellikle daha fazla web uyumlu ve en son web eğilimi hakkında bilgili. Bu, en iyi aracı seçme meselesidir ve bu, geçmişinize, problem tipinize ve tercihlerinize bağlı olacaktır. Benim durumumda, Erlang'ın modeli benim çok iyi düşünme tarzıma uyuyor. Bu mutlaka herkes için durum böyle değil.

Bu yardımcı olur umarım.


Reaktif programlama ve JS'de daha fazlası: blog.flowdock.com/2013/01/22/…
Bart

"çünkü tuhaf zamanlama sorunları ve durum değişikliklerinden kaynaklanan her bir tutarsız davaya geri çağrılmanız gerekiyor." - Erlang'da, hala zamanlayıcılarla uğraşmanız gerekiyor ve bunu “alıcıların yapıldığı durumlarda olduğu gibi” yapmanız da karmaşıklığı değiştirmiyor (hiç de değil). Benim bakış açıma göre (günde milyarlarca istek işleyen bir sistem mimarı olarak), seçici alma ve node.js tarzı arasındaki tek gerçekçi farklar (a) "varsayılan olarak ne yapmak istiyoruz" sorusudur (node.js ile) olayları varsayılan olarak işleme koyma ve eşleşme olmadıkça olayları erteleme Erlang ) ...
No-Bugs Hare

... ve (b) kazan plakası (klasik node.js'de oldukça kötü, ancak çok daha iyi hale geldi - ve IMNSHO Erlang'ınkinden daha iyi - yeni tanıtılan bekleyen operatörle) dahil okunabilirlik ... ... ve her durumda bu farklılıklar hemen hemen kozmetiktir (aksi halde vaaz veren her iki taraftaki zealotlara rağmen).
No-Bugs,

38

Erlang öğrenmek karmaşık değildir, sadece kodlama odalarının (% 99.44) programlamanın çalışma şekli olarak öğrendiği zihniyete yabancıdır. Karşılaştığınız sorun, gerçek karmaşıklıktan ziyade sadece kavramsal kayıtsızlıktır.

Tipik bir programcı ısırmak için Erlang'ın yabancı özelliklerinden bazıları:

  • Erlang (çoğunlukla) işlevsel bir programlama dilidir. En yaygın programlama dilleri neredeyse militan bir şekilde zorunludur.
  • Erlang'ın eşzamanlılık modeli Aktör modelidir. Yaygın olarak kullanılan programlama dillerinin çoğu, eşzamanlılık için kilit tabanlı iş parçacığı veya bir tür "reaktör" tabanlı yaklaşım kullanır. (Node.js'nin ikincisi olduğunu düşünüyorum, ancak beni aramayın - istemci / sunucu ilişkisinin herhangi bir tarafında JavaScript’le hiç ilgilenmiyorum.)
  • Erlang, bu çökmeleri yakalamak, teşhis etmek ve sistem çalışırken düzeltmek için mevcut güçlü çalışma zamanı özellikleriyle kodlamaya "çarpmasın" yaklaşımına sahiptir. Yaygın olarak kullanılan programlama dilleri, ağır savunma amaçlı bir programlama stilini desteklemektedir.
  • Erlang, güvenilir ve istikrarlı sunucular (OTP) için yaygın olarak kullanılan mimarilerin büyük ve hafif beyin bükümlü bir kütüphanesiyle neredeyse tamamen ama tamamen ayrılmaz bir şekilde eşleştirilmiştir. (Erlang'ın tipik olarak Erlang / OTP olarak adlandırılmasının bir nedeni vardır.) Ayrıca, bu kütüphane daha önce bahsedilen yabancı özellikler üzerine kuruludur ve dolayısıyla yeni gelenler için opaktır. Çoğu programlama dili çalışmak için daha az kapsamlı kitaplığa (Java EE) sahiptir ve söz konusu kitaplıklar doğal olarak çoğu programcının aşina olduğu kavramlar üzerine kuruludur.

Bu nedenle, Erlang'ı öğrenmek çoğu programcı için Node.js öğrenmekten çok daha zor olacak - özellikle programcı zaten JavaScript'i biliyorsa. Ancak sonuçta, kavramsal engeli aştığınızda, Erlang kodlamasının eşdeğer Node.js kodlamasından daha az karmaşık olacağını söylüyorum . Bunun birkaç nedeni var:

  • Erlang'ın eşzamanlılık modeli, mantık akışını tipik "reaktör" tarzı eşzamanlılıktan çok daha net hale getirir ve eşzamanlılığı tipik kilit tabanlı eşzamanlılıktan çok daha kararlı ve doğru hale getirir. Bir Erlang programcı için tüm anlamıyla düşmesi neredeyse hiç sorun binlerce diyelim içinde parçacığı binlerce bırakarak iken tipik bir programda süreçlerin Java çekişme kabus olacağını ve (bellek ve CPU yükü dahil saymıyorum) "reaktör" tabanlı bir kurulumda binlerce ayrı durumu korumanın eşdeğeri okumak kabus olurdu.
  • (Çoğunlukla) işlevsel bir dil olan Erlang, "ne görüyorsanız onu alırsınız" kurulumudur. Değişkenler ayarlandıktan sonra değişmez. Hiç. Kafanı karıştırmak için OOP "uzaktan ürkütücü eylem" yoktur: birlikte çalıştığınız her şey açıkça önünüzde düzenlenir. X'ten türetilmiş değişkenler ve Y'den gelen sınıf değişkenleri ve Z ile ilgilenen global değişkenler yoktur. (Bu son nokta% 100 doğru değildir, ancak çok fazla sayıda vakada öğrenme aşamanız için yeterince iyi olduğu durumlarda geçerlidir.)
  • Erlang'ın hataları gidermek için sahip olduğu güçlü olanaklar, kodunuzu daha az savunma programlaması ile karıştırmanız anlamına gelir, böylece mantığı daha temiz tutar ve kodu küçük tutar.
  • Bir kez taktığınız OTP kütüphanesi, tüm uygulamanızı düzenli tutan ve birçok konuyu kapsayan ve muhtemelen çok geç olana kadar düşünmeyeceğiniz uzun ömürlü sunucuların durumlarını kullanan çılgınca güçlü bir ortak kod yığınıdır. OTP kütüphanesinin kendisi, IM (ns) HO, Erlang'ı öğrenmek için yeterince iyi bir nedendir.

Yapabiliyorsanız Erlang'da uzak durmaya devam edin ve henüz yapmadıysanız, Erlang'ın kavramlarına nazik ve (çoğunlukla) komik bir giriş yapmak için Büyük İyi için Bazı Erlang'ı Öğrenin'i ziyaret edin .


Bu yazı için teşekkür ederim. Şu anda bir miktar Erlang Öğreniyorum ve kitabın yarısını okuyorum, ama gerçekten orta derecede bir şeyler yapmaya başlayabilmem için hepsini bilmem gerekecek gibi hissediyorum. önemli ve sadece parça parça almaz
Noli

1
Aslında kitabın eşzamanlılık bölümlerine girdikten sonra, yeterince önemli şeyleri kolayca kolayca ortada yapmaya başlayabilirsiniz.
SADECE DOĞRU AŞAMAN

"Erlang'ın eşzamanlılık modeli, mantık akışını tipik" reaktör "tarzı eşzamanlılıktan" çok daha net hale getirir - reaktör async işleminin gerçekten onlarca yıldır bir karışıklık olmasına rağmen, geleceklerin ortaya çıkması ve özellikle bekleyen operatörün olmadığını iddia ediyorum. dava artık. Beklerken, ultra hafif coroutinlerinize "sanki" sanki iplikler gibi davranıyorlar (ve JS hakkında emin değilim, ama C ++ co_await sadece binlerce değil, milyarlarca sıradışı olacak şekilde tasarlandı. eşyordamlar).
No-Bugs Hare

“Odalar Sabitinin (% 99.44)% 'si zihniyete yabancıdır” - ve herhangi bir endüstri projesi için bu Büyük Yağ Sorunu olarak nitelendirilir. Bu Büyük Yağ Sorunu, işlevsel dillerin popülerliği için nesnel bir sebep olmasa bile (ben buna inanmadım, ama bu çok farklı ve uzun bir hikaye) bile geçerli olacaktır.
No-Bugs Hare

10

Erlang ve Node arasında birkaç önemli fark var

Birincisi, düğümün Javascript olduğu, yani daha fazla insanın aşina olduğu dillerle çok sayıda özelliği paylaşan çok yaygın bir dil olduğu, bu nedenle kalkması ve çalıştırılması genellikle daha kolay olduğu anlamına geliyor. Erlang, çoğu zaman garip ve yabancı bir sözdizimine sahiptir ve bir dil javascript'ten çok daha basit olmasına rağmen, benzersizliği nedeniyle alışmak biraz daha fazla zaman alır.

İkincisi, Erlang'ın çok özel bir paylaşılan hiçbir eşzamanlılık modeline sahip olmamasıdır, sorunları çözmek için farklı bir şekilde düşünmenizi gerektirir, bu iyi bir şeydir (TM).

Son önemli olan, Erlang'ın bir ticari şirket tarafından geliştirilip gerçeğin ardından açık kaynaklı olması, sadece 2 yıl önceydi ya da insanlar kaynak kontrolünde bireysel taahhütler görebiliyorlardı ve şimdi bile tüm erlang geliştiricilerin taşındığını sanmıyorum. halk github repo gelişimleri için. node.js, topluluğun başından beri inşa edilmiştir, bu, topluluk desteğinin çok daha iyi olduğu, düğüm için çok daha fazla kitaplık, daha fazla topluluk dokümantasyonu, daha fazla canlı örnek, her yerde bulunan bir paket yöneticisi vb. olduğu anlamına gelir. Erlang yetişiyor Bu konuda ancak kalkmak için hala çok daha büyük bir rampa.

Düğüm, eğlenceli şeyleri hızlı ve nispeten ağrısız bir şekilde programlamanıza izin verir, erlang'ın uzun süredir çözdüğü büyük uygulamalar konusunda hala acı çekmektedir. Erlang, program şeklini değiştirecek ve (imo) seni daha iyi bir programcı yapacak, ancak başlangıçta hayatı senin için kolaylaştıracak değil. Her ikisi de farklı şekillerde eğlencelidir.


2
Düğümün ipliklerinin de “hiçbir şey paylaşma” olduğunu söylemeye değer.
Tamlyn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.