En sevdiğim Erlang programı (2013)
(joearms.github.io)- Verilen not aralığına bakıldığında başlıktaki Erlang programının ne olduğu ya da neden önemli olduğu doğrulanamıyor
- Doğrulanabilen metin çoğunlukla Shell betiği parçalarından ve kısa bir düzeltme cümlesinden oluşuyor
- Betik, mevcut dizindeki
*.png.png.metadosyalarını dolaşıyor ve dosya adından ilk noktadan önceki kısmı çıkarıyor - Fiilen çalıştırılan komut
git mv $i $j.png.meta;$j.png.pngdosyasını$j.pngolarak değiştiren komut ise yalnızca çıktılanıyor - Orijinal metnin 5-104 numaralı parçaları atlandığı için, başlıkla ilgili temel iddialar veya Erlang koduna dair açıklamalar doğrulanamıyor
Doğrulanabilen içerik
- Verilen kapsamla “en sevdiğim Erlang programının” ne olduğu, neden tercih edildiği veya kod yapısı hakkında hüküm vermek zor
- Doğrulanabilen kod parçası,
#!/bin/shile başlayan bir dosya adı değiştirme amaçlı Shell betiği*.png.png.metadosyaları üzerinde dönüyorj="${i%%.*}"ile dosya adında ilk noktadan önceki kısmı çıkarıyorgit mv $i $j.png.metagerçekten çalıştırılıyorgit mv $j.png.png $j.pngise sadeceechoile yazdırılıyor
- “Actually you don't need the really do this. It should have been water the plants.” cümlesi yer alıyor; bu, önceki talimatın ya da örneğin aslında gerekli olmadığı ve bunun yerine “water the plants” olması gerektiğine dair bir düzeltme gibi okunuyor
- Son kısımda Joe Armstrong ve Jeremy Ruston birlikte anılıyor
Yargıyı sınırlayan bağlam
- Birden fazla parça TiddlyWiki durum/kenar çubuğu meta verilerinden, JPEG/PNG gibi görünen Base64 verilerinden ve boş içerikten oluştuğu için gövdedeki olguları çıkarmak zor
- Verilen notlarda Erlang programının davranışı, kodu, tasarım gerekçesi, örnekler, sayılar, iş akışı veya iddialar gibi temel bilgiler yer almıyor
- Shell betiği parçası da çevresindeki açıklama olmadan kısmen verildiği için, hangi işin parçası olduğu kesinleştirilemiyor
Atlanan aralık
- Girdide, orijinal metnin 5-104 numaralı parçalarının uzunluk/maliyet sınırı nedeniyle atlandığı açıkça belirtiliyor
- Bu özet yalnızca verilen not aralığını yansıtır; orijinal metnin tamamındaki ayrıntıları veya sonucu kapsamaz
1 yorum
Hacker News yorumları
Sunucu kapanışı
F, kendi mesajına ek olarak{become, F}mesajını da alabiliyorsa, sunucuyu sürekli yeni davranışlara dönüştürmek mümkünTamamen başka bir konu ama Erlang konferansında Joe ile konuştuğum zamanı hatırlıyorum. Her zaman teknoloji konusunda heyecanlıydı ve herkesle konuşmaya istekliydi. Windows’un her yıl daha kötü ve daha az kullanışlı hâle gelmesine üzülüyordu; bir gün dosyaları görmek için kilidin açılması adına bir süre reklam izlemek gerekeceğini söylemişti, neredeyse haklı çıkıyor. Windows 11’de zaten reklamlar var ve kaldırmak için özellikle ayarları aramak gerekiyor; Windows 13 civarında gerçekten böyle olacak gibi
Bir kulaklığın sesinin diğerinden çok daha yüksek olması, Microsoft uygulamalarının garip şekilde çökmesi, Windows dokümantasyon sayfasının hiçbir tarayıcıda açılmayıp arşiv sitelerini kullanmayı gerektirmesi, eskiden düzgün algılanan harici monitörün birden algılanmaması ya da ekranın titremesi gibi. Office, varsayılan olarak yerel yerine buluta kaydetmeye yönlendiriyor; ben ise dosyaların önce yerelde olmasını, bulutun yedekleme görevi görmesini tercih ederim. WSL epey derme çatma ama yine de Windows’u kullanılabilir kılan neredeyse tek sebep
Joe’nun harika biri olduğunu hep duyardım ve buna ikna oldum. Kodlamayı kendi kendime öğrenmeye başladığımda onun Erlang kitabını okumuştum; oyunbazlığı, alçakgönüllülüğü ve hayal gücü bende büyük etki bıraktı. Erlang’ı neredeyse hiç kullanmadım ama yazıları kod hakkındaki düşünme biçimimi değiştirdi; matematik, yazılım mühendisliği ve bilgisayar bilimi kültürünün oyunbazlığı ve alçakgönüllülüğü daha çok benimsemesini isterim
BEAM’in JVM veya Node gibi diğer sanal makinelerden neden farklı olduğunu açıklayan 35 dakikalık kısa genel bakış videosu: https://www.youtube.com/watch?v=pO4_Wlq8JeI
Joe’yu özlüyorum. Bilişimi daha iyi hâle getirmeye yönelik bulaşıcı tutkusu, gençliğimdeki beni ve bugünkü teknolojiye yaklaşımımı derinden etkiledi
universal_server() -> receive {become, F} -> F() end.Açıkçası bu universal_server’ın gücünü tam olarak anlayamıyorum. Biri açıklayabilirse iyi olur
Erlang’da problemi çözmek için çok sayıda süreç başlatılır ve çoğu süreç mesaj bekler. Önemli fark, Erlang süreçlerinin uzak makinelerde de sorunsuz çalışabilmesidir. Bu süreç, içinde
becomeadlı atom ve bir fonksiyon bulunan tuple mesajını alır; başka bir süreç bu mesajı ne zaman gönderirse o fonksiyona “dönüşür”Yani bekleme döngüsünün mantığını istediğiniz protokol mantığıyla değiştirebilirsiniz. Örnekte bu döngüyü birden çok makinede çalıştırıp gossip protokolü uygulayan bir fonksiyon göndermişti; ama aynı şekilde BitTorrent istemcisi olmasını sağlayan bir mesaj da gönderebilirsiniz. Joe hem bir dahiydi hem de çok nazik bir insandı; Erlang şimdiye kadar gördüğüm en güzel teknik yaratımlardan biri. Eşzamanlılığa tamamen yeni gözlerle bakmamı sağladı
receiveanahtar sözcüğü gelen mesajlar için birswitchdeyimi gibi görünür ama aslında pattern matching yaparÖrneğin
{From, N}alıp sonucuFrom ! factorial(N)ile geri döndüren bir faktöriyel sunucusu yapabilirsiniz.!, sonucu geri dönüş sürecine gönderen operatördürTest kodu
universal_server’ı başlatır,Pid ! {become, fun factorial_server/0}ile onu faktöriyel sunucusuna dönüştürür, ardından{self(), 50}gönderip 50’nin faktöriyelini geri alır. Erlang’ın büyük avantajları dağıtık paralellik ve hot code update’tir; burada bu,universal_server’ın alma döngüsünüfactorial_server’ın alma döngüsüyle üzerine yazmak şeklinde görünür. Yine de gerçek hot code update’in tam olarak böyle çalışmadığını düşünüyorumAma Erlang’da dağıtık bir Erlang sunucu ağı kurabilir ve sunucuları istemcinin istediği işi yapabilen genel amaçlı hesaplama kaynağı olarak bırakabilirsiniz. Kod istemciden gelir; tüm makinelere ikili dosya kurması için sistem yöneticisinden ricada bulunmaya gerek kalmadan fonksiyonu iletirsiniz ve uzak makine onu çağırır
Sunucuyu çalıştıracak gerçek fonksiyon istemci tarafından gönderilir ve Erlang süreci bu fonksiyona dayanarak o sunucu hâline gelir. Erlang’ın hot reloading yeteneği de düşünülünce bu basit yapı daha da güçlenir. Erlang süreci işi bekleyen bir hesaplama kaynağıdır; o işin de eksiksiz bir sunucu çalıştırmak olduğunu düşünürseniz epey havalı
Bu yüzden süreç, gönderdiğiniz koda göre her şey olabilir. Bir mikrodalga fırını kontrol edip sonra kuantum hesaplama yapması, ertesi gün de futbol maçının kazananını tahmin etmesi gerekiyorsa, her iş için gereken kodu gönderirsiniz ve aynen çalıştırır
BEAM’in neden özel olduğunu, Erlang/Elixir gibi sistemlerdeki eşzamanlılığın Go veya Java’daki eşzamanlılıktan neden farklı olduğunu açıklamaya çok zaman harcıyorum
Bundan sonra Joe’nun en sevdiği Erlang programına ve bu HN başlığına link vermem yeterli olacak gibi
Bu blog yazısı yakın tarihli harika bir sunumda da ele alındı: https://youtu.be/pQ0CvjAJXz4
Erlang hakkında yalnızca üst düzey bir anlayışım var, doğrudan programlamış değilim; bu kodun neden gerekli olduğunu merak ediyorum
universal_server() -> receive {become, F} -> F() end.Uzak makinede doğrudan
F()yi başlatmak yeterli olmaz mı diye düşünüyorum. Uzak sanal makinedeFkodunun zaten bulunması gerektiği için, bu örnekFkodunun serileştirilip iletildiği anlamına da gelebilir. Ortak boilerplate’i ele alıyorsa faydasını anlarım; ama şu andabecome Fmesajını bekleyip ardındanF()yi çalıştırıyormuş gibi görünüyorBurada
Fbir closure olduğu için yalnızca kodu değil, yakaladığı değişkenleri ve oluşturulduğu andaki ortamı da içerebilir.F()çağrıldığında bu kod çalışır veFoluşturulduğunda etrafındaki ortama erişebilirErlang’da closure’ları ağ üzerinden başka Erlang düğümlerine gönderebilirsiniz. Ancak closure’ın başvurduğu modül kodunun tüm düğümlerde bulunması gerekir. Üretim kodunda muhtemelen söylediğiniz gibi
Fmodülünü doğrudan çağırır ve argümanları açıkça geçirirsiniz; bu daha çok olasılığı gösteren havalı bir demo gibiF(), önceki herhangi bir bağlam kadar iyi bir üst düzey bağlam olabilir; bu da güzelMevcut istekler eski mantıkla doğal biçimde işlenirken yeni isteklerin yeni mantıkla başlaması sağlanabilir ve sonunda eski mantık garbage collection’a tabi tutulabilir
Fkodunun zaten bulunması gerektiği doğru, ama kodu uzak sanal makineye göndermek de mümkünÖrneğin Elixir’de
Code.compile_stringile modül adını ve BEAM bytecode ikilisini alabilirsiniz. Bu bytecode’u başka bir sanal makineye gönderip:rpc.call('node@remote_host', :code, :load_binary, [the_module_name, "filename_doesnt_really_matter", binary_code])ile uzak sanal makineye yükledikten sonraspawn('node@remote_host', my_module, my_function, [args])ile başlatabilirsinizBurada
F, serileştirilip süreçler arası mesaj olarak gönderilen yeni programı temsil eden bir değişkendir; bu durumda ağ üzerinden de iletilirJoe’nun Erlang ile temel bir sunucu yazmayı anlattığı bir ders de var: https://gioorgi.com/2015/erlang-lesson1/
Kendim not alıp biraz daha açıklamıştım; Erlang/Elixir gibi asenkron dillerin diğer dillere kıyasla sahip olduğu gücü gösteriyor. Ne yazık ki bugünlerde pek kullanılmıyor
Son zamanlarda Julia’ya sardım; dağıtık modelinde Erlang’ın fikirlerinden epey ödünç almış gibi görünüyor
Birden çok düğüm üzerinde sihirli biçimde çalışan bu tür anlık sunucuları Julia’da da oldukça kolay yeniden oluşturmak mümkün. Emin değilim ama Julia’nın
Distributedmodülünün Erlang’dan az da olsa esinlenmemiş olması pek olası görünmüyorErlang’ı gerçekten seviyorum ve daha fazla kullanma fırsatım olmasını isterdim; ama kavramlarının başka platformlara sızdığını görmek de güzel