Küçük diller programlamanın geleceğidir
(chreke.com)"Little Language" nedir?
- 'Küçük diller', belirli bir problemi çözmek amacıyla oluşturulmuş dillerdir
→ SQL, RegEx, Dhall,..
→ Bunlara DSL de denir
Küçük dillere neden ihtiyaç var?
- Uygulamalar çok daha karmaşık hale geldikçe kaynak kodu da büyüdü, ama anlaşılması da zorlaştı
- Yeni çalışanların onboarding süreci zorlaşıyor, bağımlılıkları yeterince anlayamama nedeniyle hatalar çıkıyor ve kod değişikliklerini yönetmek giderek güçleşiyor
- Son 10 yılda kod tabanları 100~500 kat büyüdü
- Linux çekirdeği 1992'de 10 bin satırla başladı, ama 20 yıl sonra 30 milyon satıra ulaştı
- Bunun nedeni sadece "özelliklerin artmış olması" değil. Yazılım geliştirme biçimimizin değişmiş olması
- Yazılım, piramit inşasına benzer; en üstteki son taşı koyabilmek için altta çok daha fazla taş gerekir
Eğilimin üstesinden gelmek
- En yeni işletim sistemini yapmak için gerçekten yüz milyonlarca satır kod mu gerekiyor?
- Alan Kay, 2006'daki STEPS programında bu varsayıma meydan okudu
-
Çözmemiz gereken probleme uygun bir 'dil' oluşturmanın problem çözmeyi kolaylaştırdığını, çözümü daha anlaşılır ve daha küçük hale getirdiğini düşünüyoruz
- STEPS, Nile adlı dili geliştirerek 44.000 satırlık Cairo renderer'ın yaptığına benzer işi yaklaşık 300 satır kodla gerçekleştirdi
Neden yüksek seviyeli diller yetmiyor?
- Daha yüksek seviyeli genel amaçlı bir dil yapmak yeterli olmaz mı?
- Bana göre genel amaçlı dillerin ifade gücü, azalan getiri noktasına zaten ulaştı
- Peki daha üst düzey bir dil nasıl görünürdü? Python'u örnek alırsak, zaten o kadar yüksek seviyede ki neredeyse sözde kod gibi görünüyor
- Genel amaçlı dillerin sorunu, önce probleminizi bir algoritmaya çevirmeniz, sonra da o algoritmayı hedef dilde ifade etmeniz gerekmesi
- Jon Bentley, 1986 tarihli Programming Pearls'ta Donald Knuth ve Doug Mcllroy'dan kelime sıklığını sayan bir program yazmalarını istemişti; Don, Pascal'ın bir varyantı olan WEB ile karmaşık veri yapıları kullanarak 10 sayfalık bir çözüm yazdı
- Buna karşılık Doug, tr, sort, uniq, sort, sed gibi araçları kullanan 6 satırlık bir Unix pipe ifadesiyle bunu gerçekleştirdi
Az daha fazladır: Less is More
- Yukarıdaki Unix komutu, küçük dillerin bir başka özelliğini de gösteriyor.
"Daha az güçlü diller ve daha güçlü bir runtime" - Gonzalez, "The end of history for programming" yazısında bu eğilimden söz ediyor
- Kullanıcı alanındaki problemleri runtime katmanına itmek
- Programı saf matematiksel ifadelere daha benzer hale getirirken runtime karmaşıklığını ciddi biçimde artırmak
- Kullanıcı alanındaki problemleri runtime katmanına itmek
- RegEx ve SQL, sırasıyla metin arama ve veritabanı işlemleri dışında hiçbir şeyi ifade edemez
- Bu, runtime'ı olmayan ve her şeyin ifade edilebildiği C gibi dillerle karşıtlık oluşturur
- Küçük diller, C'nin sahip olduğu güç spektrumunun öteki ucunda durur
- Sadece bilgisayar mimarisini soyutlamakla kalmaz, ifade edilebilecek program türlerini de sınırladıkları için tasarım gereği Turing-incomplete'tirler
- Bu çok kısıtlayıcı gibi gelebilir, ama optimizasyon ve statik analiz için yeni boyutlarda imkanlar açar
Statik analiz
- Daha az güçlü diller üzerinde akıl yürütmek daha kolaydır ve genel amaçlı dillere göre daha güçlü garantiler sunabilir
- Örneğin Dhall, yapılandırma dosyaları üretmek için kullanılan bir "Total Functional Programming Language"dir
- Yani sonsuz döngü riskini ortadan kaldırmak için Dhall programlarının "(1) crash olmaması ve (2) sınırlı zamanda sonlanması" garanti edilir
- (1), exception fırlatmayı yasaklayarak sağlanır. Başarısız olabilecek komutlar Optional sonuç döndürür (bir değer olabilir ya da olmayabilir)
- (2) ise recursive tanımlara izin verilmemesiyle sağlanır
- Diğer fonksiyonel dillerde recursion, döngü kurmanın temel yoludur; ancak Dhall bunun yerine yerleşik
foldfonksiyonuna dayanmak zorundadır - Genel döngü yapılarının olmaması, Dhall'ın Turing complete olmadığı anlamına gelir. Ama bu bir genel amaçlı dil olmadığı için buna ihtiyaç da yoktur
- Dil küçük olduğunda, akıl yürütmek çok daha kolaylaşır
- Örneğin bir Python programının başka yan etkileri olup olmadığını doğrulamak zordur, ama SQL'de sorgunun
SELECTile başlayıp başlamadığına bakmak yeterlidir
- Örneğin bir Python programının başka yan etkileri olup olmadığını doğrulamak zordur, ama SQL'de sorgunun
- Nile için STEPS ekibi bir grafik debugger'a ihtiyaç duyduğu için bunu yaptı ve buradan görülebilir
- Nile, üzerinde akıl yürütmesi kolay bir küçük dil olduğu için bu mümkün oldu
Hız ihtiyacı
- Daha güçlü programlama dilleri sadece hata olasılığını artırmakla kalmaz, performansa da zarar verebilir
- Örneğin program bir algoritma olarak ifade edilmemişse, runtime algoritmayı kendi başına seçebilir
- Yavaş ifadeler daha hızlı olanlarla değiştirilebilir (aynı sonucu verdikleri kanıtlanabildiği sürece)
- Örneğin SQL sorguları, sorgunun nasıl çalıştırılacağını tarif etmez
- Veritabanı motoru, hangi sorgu planının uygun olduğuna özgürce karar verebilir
- İndeks kullanmak, bileşik indeks kullanmak ya da tüm veritabanı tablosunu taramak gibi
- Modern veritabanı motorları her sütundaki değer dağılımlarına ilişkin istatistikleri de toplar; bu sayede istatistiksel olarak en iyi sorgu planını anlık olarak seçebilir
- Eğer sorgu algoritma biçiminde verilmiş olsaydı, bunların hiçbiri mümkün olmazdı
- Veritabanı motoru, hangi sorgu planının uygun olduğuna özgürce karar verebilir
- Nile dilini son derece kısa tutan "gizli sos"lardan biri, grafik render etme için kullanılan Just-in-Time derleyici "Jitblt" idi
- STEPS ve Cairo ekipleri, görüşmeler sonucunda Cairo kodunun önemli bir kısmının piksel birleştirme işlerini elle optimize etmeye harcandığını fark etti
- Bu iş, teoride derleyiciye offload edilebilecek bir işti
- Cairo ekibinden Dan Amelang gönüllü olarak böyle bir derleyici yazdı; buna Jitblt adı verildi
- Bu sayede grafik pipeline'ındaki optimizasyon işi, neyin render edileceğine dair saf matematiksel açıklamadan ayrılabildi
böylece Nile, elle optimize edilmiş orijinal Cairo kodu kadar hızlı çalışabildi
Small languages, Big Potential (Küçük diller, büyük potansiyel)
- Peki STEPS'in sonu ne oldu? Tişörte basılabilecek kadar az kodla çalışan bir işletim sistemi yapabildi mi?
- STEPS'in nihai çıktısı KSWorld oldu
- Belge düzenleyicisi ve elektronik tablo düzenleyicisi yerleşik tam bir işletim sistemi
- 17.000 satır kod
- Bir tişörte sığdırmak için biraz uzun olabilir, ama bence bu bir başarı
- KSWorld'ün ortaya çıkışı, "küçük diller"in büyük potansiyele sahip olduğunu gösteriyor
- Ama hâlâ cevaplanmamış pek çok soru var
- Bu diller birbiriyle nasıl konuşacak?
- Ortak bir ara gösterime mi derlenmeleri gerekiyor?
- Yoksa farklı runtime'lar paralel biçimde var olup standart protokollerle (Unix pipe, TCP/IP gibi) mi iletişim kurmalı?
- Ya da her dil, birden çok host language içinde yeniden uygulanabilecek kadar küçük mü olmalı?
- Belki de ileriye giden yol bunların hepsinin bir kombinasyonudur?
- Her durumda, yazılımı inşa etmenin başka yollarını düşünmemiz gerektiğine inanıyorum
- Belki de "küçük diller" bu hikayenin bir parçası olabilir
- Asıl önemli olan, daha iyisini düşünebilecek kadar uzun süre, her birinin üstüne sadece daha fazla tuğla koymaya devam etmemek
7 yorum
"
Çözmemiz gereken probleme uygun bir 'dil' oluşturmanın, problem çözmeyi daha kolay hale getirdiğini ve çözümü hem daha anlaşılır hem de daha küçük kıldığını düşünüyoruz.
"
Bu kısmı okuyunca hissettiğim şey, sonuçta 'küçük dil' denilen şeyin aslında framework ile aynı anlama gelip gelmediği oldu. Sık kullanılan fonksiyonları ve tasarım kalıplarını zorunlu kılarak onları bir tür gramer haline getiren
JavaScript -> Reactörneğinde olduğu gibi.İlgi çekici bir konu.
Düşününce, yakın zamanda JetBrains'in yaptığı MPS(Meta Programming System) adlı bir DSL oluşturma aracı keşfettim.
Bu da düşündüğümden daha eski bir şeymiş. İlgimi çektiği için biraz daha yakından bakmaya niyetlenmiştim ama çeşitli nedenlerle erteleyip duruyorum; bunu kullanmış biri varsa, kullanım deneyimi gibi şeyler duyabilsem harika olurdu.
Vay canına, teşekkürler
Teşekkürle okudum.
Lisp sırıtarak gülüyor
İlginç bir hikâye olduğunu düşündüğüm için paylaşıyorum.