it-swarm.asia

Erlang'ı Öğrenme vs node.js'yi öğrenme

Erlang'ın akla gelebilecek her kategoride Erlang'ın node.js'nin kıçını nasıl tekmelediğine dair bir sürü saçmalık görüyorum. Bu yüzden Erlang'ı öğrenmek ve denemek istiyorum, ama sorun şu. Erlang'ı almak için node.js'yi aldığımdan çok daha zor olduğumu fark ediyorum. Node.js ile nispeten karmaşık bir proje seçebilirim ve bir gün içinde çalışan bir şeyim vardı. Erlang ile engellere koşuyorum ve neredeyse o kadar hızlı gitmiyorum.

Yani .. daha fazla deneyime sahip olanlar için, Erlang öğrenmesi karmaşık mı, yoksa sadece bir şey mi kaçırıyorum? Node.js mükemmel olmayabilir, ancak bununla işleri halledebilirim.

41
Noli

Her şeyden önce, SADECE benim doğru GÖRÜŞ'ün Erlang öğrenmesiyle 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 ilk etapta Javascript ile tam olarak aynı tasarım hedefleri olmayan hata toleransı ve sağlamlığına gitmek için tüm özellikleri eklendi.

İkincisi, Node.js'yi Erlang'a girmek için bırakmak biraz yanlış. Node.js, geri çağrıların yardımıyla her şeyi olay güdümlü bir şekilde yapma yolunda giden tek bir sunucu/çerçevedir. Erlang'ın kendi çerçevesi (OTP) vardır, ancak aynı düzeyde değildir.

Erlang öğrenmeyi planlıyorsanız, blog girişimi Erlang Acemi'ye (veya Onlooker) Açık Mektup) öğreticilere dalmadan önce giriş okuması olarak öneririm.


Erlang ve Node.js'yi desen ve kullanım açısından karşılaştırabileceğiniz tek şey, olay odaklı olmalarıdır. Ancak burada iki büyük fark var. Node.js'nin modeli, olaylara bağlı geri aramalara dayanır. Erlang, mesaj kuyruklarına ve seçici alımlara dayanır. İçindeki etkileri nelerdir?

Her şeyden önce, bir şeyleri geri arama tabanlı bir şekilde yaparsanız, durumu etrafta taşımanın tek yolu ya küresel olsun ya da devam eden stil programlamaya girmektir. İkincisi, tam olay matrisine kendiniz dikkat etmeniz gerekir. Bunun bir örneği, çok basit bir sonlu durum makinesi hayal edersek: mutex semaforu, olay güdümlüdür.

Muteks semaforunun iki durumu vardır: kilitli ve serbest. Belirli bir hesaplama birimi (işçi, süreç, işlev ya da iş parçacığı) mutekse erişmek istediğinde, ona 'ilgilendiğimi' söyleyen bir olay başlatması gerekir. Şimdi aşağıdaki olay türlerine dikkat etmelisiniz:

  • Muteks ücretsizdir ve kilidi almak istersiniz
  • Muteks başkası tarafından kilitlenir ve kilidi almak istersiniz
  • Muteks kendiniz kilitlenir ve muteksi serbest bırakmak istersiniz

Ardından, kilitlenmeleri önlemek için zaman aşımı gibi dikkate alınacak ek etkinlikleriniz vardır:

  • Muteks kilitlendi ve çok uzun süre bekledin, yangınları bırakmak için bir zamanlayıcı
  • Muteks kilitlendi ve çok uzun süre bekledin, kilidi aldın, sonra zaman aşımı başladı

Sonra bağlı olaylar da var:

  • bazı işçi özgür olmasını beklerken muteksi kilitlediniz. Şimdi bu işçinin sorgusunun kuyruğa alınması gerekir, böylece ücretsiz olduğunda geri alınır
  • Tüm işleri zaman uyumsuz hale getirmelisiniz

Olay matrisi çok hızlı bir şekilde karmaşık hale gelir. Buradaki FSM'mizde sadece 2 eyalet var. Erlang (veya seçici eşzamanlı ve potansiyel olarak eşzamanlı olaylara sahip zaman uyumsuzluğu olan herhangi bir dil) durumunda, birkaç duruma dikkat etmeniz gerekir:

  • Muteks ücretsizdir ve kilidi almak istersiniz
  • Muteks başkası tarafından kilitlenir ve kilidi almak istersiniz
  • Muteks kendiniz kilitlenir ve muteksi serbest bırakmak istersiniz

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

Bu, genel durumlarda, CPS ve node.js'deki gibi geri arama tabanlı modellerin, ya olayları nasıl ele aldığınızda çok akıllı olmanızı istediği veya tüm karmaşık bir olay matrisine tam olarak bakmanızı istediği anlamına gelir. garip zamanlama sorunları ve durum değişikliklerinden kaynaklanan her bir önemsiz durum için geri çağrılmanız gerekir.

Seçici alımlar 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 mantık yürütmenize izin verir. Erlang'ın gen_event Adlı bir şeyin davranışına (tasarım deseni/çerçeve uygulaması) sahip olduğunu unutmayın. Gen_event uygulaması, eğer istediğiniz buysa, node.js'de kullanılana çok benzer bir mekanizmaya sahip olmanızı sağlar.


Onları ayıran başka noktalar da olacak; Erlang, node.js'yi işbirlikçi hale getirirken önleyici bir programlamaya sahiptir, Erlang bazı çok büyük ölçekli uygulamalara (dağıtım ve tümü) daha yatkındır, ancak Node.js ve topluluğu genellikle en son web eğilimi hakkında daha web uyumlu ve bilgilidir. Bu, en iyi aracı seçme meselesidir ve bu, arka planınıza, sorun türünüze ve tercihlerinize bağlı olacaktır. Benim durumumda, Erlang'ın modeli sadece düşünme şeklimize çok iyi uyuyor. Bu herkes için geçerli değildir.

Bu yardımcı olur umarım.

46

Erlang'ın öğrenmesi karmaşık değil, kodlayıcıların Oda Sabitinin (% 99.44) programlama yolu olarak öğrendiği sadece zihniyete yabancı. Karşılaştığınız sorun muhtemelen gerçek karmaşıklıktan ziyade sadece kavramsal yönelim bozukluğudur.

İşte Erlang'ın tipik bir programcıyı ısıtacak yabancı özelliklerinden bazıları:

  • Erlang (çoğunlukla) işlevsel bir programlama dilidir. En yaygın programlama dilleri neredeyse militan olarak zorunludur.
  • Erlang'ın eşzamanlılık modeli Aktör modelidir. En yaygın programlama dilleri, ya kilit tabanlı iş parçacığı ya da eşzamanlılığa bir tür "reaktör" tabanlı yaklaşım kullanır. (Sanırım Node.js sonuncusu ama beni aramayın - İstemci/sunucu ilişkisinin herhangi bir tarafında JavaScript'e sıfır ilgi duyuyorum.)
  • Erlang, bu çökmeleri yakalamak, teşhis etmek ve sistem çalışırken bunları düzeltmek için kullanılabilen güçlü çalışma zamanı özellikleri ile kodlamaya "çökmesine izin ver" yaklaşımına sahiptir. En yaygın programlama dilleri, oldukça savunmacı bir programlama stilini desteklemektedir.
  • Erlang, güvenilir ve istikrarlı sunucular (OTP) için yaygın olarak kullanılan mimarilerin geniş ve hafif beyin-büküm kütüphanesi ile neredeyse, ama tam olarak değil, ayrılmaz bir şekilde eşleştirilir. (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 inşa edilmiştir ve bu nedenle yeni gelenler için opaktır. Programlama dillerinin çoğunda çalışmak için daha az kapsamlı kitaplıklar (Java EE'ye rağmen) vardır ve söz konusu kitaplıklar doğal olarak çoğu programcıya daha tanıdık kavramlar üzerine kurulmuştur.

Bu nedenle, Erlang'ı öğrenmek çoğu programcı için Node.js'yi öğrenmekten daha zor olacaktır - özellikle programcı zaten JavaScript'e aşina ise. Ancak, sonunda, kavramsal engeli aştığınız zaman, Erlang kodlamasının daha az eşdeğer Node.js kodlamasından daha karmaşık olacağını belirtiyorum. Bunun birkaç nedeni vardır:

  • 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ısının binlerce tipik bir programdaki süreçlerin tam anlamıyla düşmesi neredeyse hiç sorun değil, örneğin Java bir kabus olurdu çekişme (ilgili bellek ve CPU ek yükünden bahsetmiyorum) ve "reaktör" tabanlı bir kurulumda binlerce ayrı durumu korumanın eşdeğeri okunacak bir kabus olacaktır.
  • (Çoğunlukla) işlevsel bir dil olan Erlang, çok çok "gördüğünüz şey ne elde edersiniz" ayarıdır. Değişkenler ayarlandıktan sonra değişmez. Hiç. Sizi şaşırtacak OOP "uzaktan ürkütücü eylem" yok: birlikte çalıştığınız her şey açıkça önünüze serilir. X'ten devralınan değişkenler ve Y'den sınıf değişkenleri ve kendinizi ilgilendirecek Z'den gelen küresel değişkenler yoktur. (Bu son nokta% 100 doğru değildir, ancak bu kadar çok sayıda durumda öğrenme aşamanız için yeterince iyi olduğu doğrudur.)
  • Erlang'ın hataları ele almak için sahip olduğu güçlü özellikler, kodunuzu daha az defansif programlama ile karıştırmanız, böylece mantığı daha net tutmanız ve kodu küçük tutmanız anlamına gelir.
  • OTP kütüphanesi, bir kez baktığınızda, tüm uygulamanızı düzenli tutan ve sorunların çoğunu kapsayan ve çok geç olana kadar düşünmeyeceğiniz uzun ömürlü sunucuların vakalarını kullanan son derece 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 yutmaya devam edin ve henüz yapmadıysanız, Erlang'ın kavramlarına nazik ve (çoğunlukla) komik bir giriş yapmak için ziyaret edin Büyük İyilik için Bazı Erlang'ları Öğrenin .

Erlang ve Düğüm arasında birkaç önemli fark vardır

Birincisi, düğümün Javascript olduğu, yani daha fazla insanın aşina olduğu dillerle birçok özelliği paylaştığı çok yaygın bir dildir, bu yüzden kalkmak ve çalıştırmak genellikle daha kolaydır. Erlang'ın çoğu için genellikle garip ve yabancı bir sözdizimi vardır ve bir dil javascript'ten çok daha basit olmasına rağmen, benzersizliği nedeniyle biraz daha alışması gerekir

İkincisi, Erlang'ın çok özel bir paylaşılan hiçbir eşzamanlılık modeli yok, problemleri çözmek için farklı bir şekilde düşünmenizi gerektirir, ki bu iyi bir şeydir (TM)

Sonuncusu, Erlang'ın ticari bir şirket tarafından geliştirilip açık kaynaklı olması, sadece 2 yıl önce ya da insanların kaynak kontrolünde bireysel taahhütleri görebilmeleri ve şimdi bile tüm erlang geliştiricilerinin taşındığını düşünmemesi. gelişmeleri için kamu github repo. node.js en başından beri topluluk içinde inşa edildi, bu da topluluk desteğinin çok daha iyi olduğu, düğüm için çok daha fazla kütüphane, daha fazla topluluk belgesi, daha canlı örnekler, her yerde bulunan bir paket yöneticisi vb. anlamına geliyor. Erlang yetişiyor bu konuda ama hala kalkmak için çok daha büyük bir rampa.

Düğüm, eğlenceli şeyleri oldukça hızlı ve nispeten ağrısız programlamanıza izin verir, erlang'ın uzun zamandır çözdüğü büyük uygulamalar için hala artan ağrıları vardır. Erlang, program yapma şeklinizi değiştirecek ve (imo) sizi daha iyi bir programcı yapacak, ancak başlangıçta hayatı kolaylaştıramayacak. Her ikisi de farklı şekillerde eğlencelidir.

10
Dale Harvey