- Programlama verimliliğinin özü, dilin kendisinden çok zengin bir kütüphane ekosisteminde yatar
- Ruby on Rails gibi dilin ileri seviye özelliklerinden yararlanan çerçeveler, uzman olmayanlara bile yüksek verimlilik sunar
- Ancak dilin yapısal sınırlamaları nedeniyle, Rails düzeyinde bir çerçeveyi Java veya C ile gerçekleştirmek zordur
- Dil tasarımı, yazılabilecek kütüphanelerin biçimini ve karmaşıklığını doğrudan belirler; dil gelişiminin özündeki amaç da budur
- Stanza dili bu bakış açısından, güçlü ve kullanımı kolay kütüphaneler üretmeyi mümkün kılan dil tasarımının önemini gösterir
Programlama dili ile kütüphaneler arasındaki ilişki
- Çoğu programlama dili; değişkenler, diziler, döngüler, fonksiyonlar gibi benzer temel bileşenlere sahiptir
- Bazı diller birinci sınıf fonksiyonlar veya coroutine gibi ileri özellikler sunar, ancak uzman olmayanlar bunları pek kullanmaz
- Birçok geliştirici için verimliliği artıran etken dilden çok kütüphanelerdir
- Örneğin Ruby on Rails, veritabanı tabanlı web uygulamalarını kolayca kurmayı sağlar
- Rails sayesinde Ruby dilinin kendisinden çok çerçevenin kendisi tercih edilir
Ruby on Rails ile dil özelliklerinin etkileşimi
- Rails; Ruby'nin metaprogramlama, çalışma zamanında değerlendirme, birinci sınıf fonksiyonlar, garbage collection gibi çeşitli özelliklerinden yararlanır
- Örnek: ActiveRecords metaprogramlamayı, şablon sistemi ise çalışma zamanında değerlendirmeyi kullanır
- Olay işleme, birinci sınıf fonksiyonların callback olarak aktarılmasıyla gerçekleştirilir
- Java veya C'de bu özellikler eksik olduğundan Rails düzeyinde bir çerçeve gerçekleştirmek mümkün değildir
- Java'nın metaprogramlama yetenekleri, ActiveRecords'u uygulayacak kadar güçlü değildir
- Dolayısıyla Rails, Ruby dilinin yapısı sayesinde mümkündür ve dil tasarımı kütüphane olanaklarını belirler
Dil tasarımı kütüphanelerin biçimini belirler
- C dili yalnızca fonksiyon bildirimi ve çağrısı üzerinden yeniden kullanımı desteklediği için, C kütüphanelerinin çoğu bir fonksiyonlar kümesi biçimindedir
- Ruby, birinci sınıf fonksiyonları desteklediğinden “butona tıklandığında çalışacak davranışı” kısa ve anlaşılır biçimde ifade edebilir
- Buna karşılık Java'da handler sınıfı tanımlamak gerektiği için kod daha karmaşık hale gelir
- Bir dilin ifade gücü, kütüphanenin yapısını ve kullanılabilirliğini doğrudan belirler
Etkileşimli yazılım ve genişletilebilir çerçevelerin ortaya çıkışı
- 1970'lerin toplu işleme odaklı bilişiminde, fonksiyon merkezli kütüphaneler yeterliydi
- Günümüzün etkileşimli yazılımlarında ise genişletilebilir kütüphaneler gerekir
- GUI veya olay tabanlı sistemlerde, “kullanıcı tıkladığında benim kodumu çalıştır” yapısına ihtiyaç vardır
- Java ve C++, kalıtım ve method overriding ile genişletmeyi destekler; bu yapı zamanla çerçevelere dönüşmüştür
Stanza tasarımının arka planı ve dil sınırları
- Stanza'nın tasarım motivasyonu, Java'da kullanımı kolay bir oyun programlama kütüphanesi yazmanın zorluğundan doğdu
- Java'da eşzamanlılık bir durum makinesi (state machine) olarak ifade edilmek zorundaydı
- Scheme, continuation desteği sayesinde daha sezgisel bir uygulamayı mümkün kılıyordu
- Ancak Scheme statik tip denetimini desteklemediği için hata ayıklama verimliliği düşüktür
- Günümüzde çoğu dil, tip sisteminin kütüphane olarak genişletilmesine izin vermez
- Stanza; isteğe bağlı tip sistemi, garbage collection ve çoklu yöntem tabanlı nesne sistemi sunar
- Ancak kullanıcı tanımlı yeni bir nesne sistemi yazmaya izin vermez
Dilin amacı ve araştırma yönü
- Genel amaçlı programlama dillerinin amacı, güçlü ve kullanımı kolay kütüphanelerin üretilmesini desteklemektir
- Dil ne kadar güçlüyse, kütüphane kullanımı da o kadar özlü hale gelir
- Kod, iyi tasarlanmış bir kütüphaneyi kullandığında bir iş arkadaşına talimat veren cümleler gibi okunan doğal bir akışa sahip olur
- Racket, Shen ve meta-nesne protokolü araştırmaları, genişletilebilir tip ve nesne sistemlerini inceliyor
- Sonuçta diller, “hangi kütüphanelerin kullanılabildiği ve hangilerinin kullanılamadığı” ile ayrışır
- Zarif kütüphanelerin arkasında onlarca yıllık dil araştırması ve tasarım emeği bulunur
1 yorum
Hacker News yorumları
En iyi örnek Prolog. Genelde mantık programlamasının temsilci dili diye anılır ama aslında fiilen çeşitli algoritmaların bir derlemesinden ibaret ve her dilde bir kütüphane olarak uygulanabilir. Bence Prolog’un sözdizimsel ifadesini her dilin kendi sözdizimine uyarlayarak sunmak yeterli olur
10 yıl önce bir Scala hayranıydım. Tip sistemi içinde DSL oluşturabilen “Scalable Language” fikri çekiciydi. Ama topluluk JVM üzerinde Haskell gibi kullanmaya başlayınca ilgimi kaybettim. Bugünlerde WASM ve Graal gibi teknolojilerin dil seçiminde daha fazla esneklik sağlayacağını umuyorum. Çoğu durumda JS yetiyor ama gerektiğinde Rust gibi düşük seviyeli bir dil kullanabilmek güzel bir seçenek
Tipli bir betik dili ile bash’i değiştirebilsek harika olurdu. Elixir’le basit bir JSON ayrıştırıcı betiği yazdım ve oldukça iyiydi
#!/usr/bin/env ocamlile doğrudan çalıştırılabilir. Yalnız tek dosya içinde dış bağımlılıkları otomatik kurma özelliği yokDil ve kütüphane birbirini dışlayan şeyler değil. Bazı kütüphaneler fiilen dil gibi çalışır, bazı diller de belirli kütüphaneler için tasarlanır. Örneğin Julia, performans ve kullanılabilirlik arasında iyi denge kuran bir örnek. Yüksek performanslı kodu doğrudan Julia’da yazabilir, JIT düzeyinde tipe özelleşmiş derleme ile optimize yürütme elde edebilirsiniz. Model basit bir fonksiyon çağrısı gibi görünür ama içeride çok incelikli işler döner
Raku, birden çok alt dili (slang) birbirine bağlayan bir yapı olarak tasarlanmış. Örneğin regex, PEG, quoting gibi şeyler ayrı mini diller olarak ele alınıyor ve Slangify ile kendi DSL’inizi kolayca ekleyebiliyorsunuz
Bir zamanlar kıdemli bir geliştiricinin “özgeçmişte Rails görürsem direkt çöpe atarım” dediğini duymuştum. İnsanları kullandıkları dille değerlendirmek ne kadar saçma, bunu yeniden fark ettim
Dil ya da kütüphane sonuçta hem makineyle hem insanlarla iletişim kurma aracı. Makineyle bitler ve voltajlar üzerinden, insanlarla ise niyet ve kavramlar üzerinden iletişim kuruyoruz. Bu yüzden bir dil ya da kütüphane insanlara açık ve hızlı bir ifade aracı sunuyorsa, onun dil mi yoksa kütüphane mi olduğu çok önemli değil. Rails de olsa Stanza da olsa, amaca uyuyorsa ve ekip kolayca anlayabiliyorsa doğru seçim odur
Ben “kütüphane nihai dildir” diye düşünüyorum. Örneğin Ruby on Rails, Ruby tabanlı harika bir web servis dili. Ruby ve Rails birbirleri için evrildi. Sonuçta programlama, diller arasında süregelen bir çeviri süreci gibi
“Dil ne kadar güçlüyse kütüphane kullanımı o kadar kolay olur” sözü doğru. Eski Java ile Express benzeri bir framework yapmak zordu
C dili için web framework derseniz, PHP var sonuçta, değil mi? ;)