deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (hnrss.org)

Gleam v1.19.0 Erlang kaynak kodu üretmeyi bıraktı, artık abstract form hedefliyor

Gleam v1.19.0, Erlang kaynak kodu yerine Erlang abstract form üreten sıfırdan yazılmış bir Erlang backend ile geliyor; derleme sürelerini kısaltıyor ve BEAM stack trace'lerinin gerçek Gleam satırlarını göstermesini sağlıyor.

Gleam v1.19.0 Erlang kaynak kodu üretmeyi bıraktı, artık abstract form hedefliyor

Gleam v1.19.0 Erlang kaynak kodu yerine Erlang abstract form hedefliyor

Erlang sanal makinesi ve JavaScript runtime'larında çalışan, tip güvenli bir dil olan Gleam 1.19.0 sürümünü yayımladı. 6 Ekim'de Hacker News'in ana sayfasına ulaşan, Gleam'ın web sitesindeki duyuruya göre öne çıkan değişiklik, tamamen baştan yazılmış ve artık hiç Erlang kaynak kodu üretmeyen Erlang kod üreteci.

Bu yeniden yazım işlemi son aylarda Giacomo Cavalieri tarafından gerçekleştirildi ve temelden farklı bir tasarımı izliyor. Gleam'ın önceki sürümleri Erlang derleyicisine verilen Erlang kaynak metni üretirken, yeni backend Erlang abstract form üretiyor: yani Erlang derleyicisinin normalde kendi tokenizer ve parser'ını çalıştırarak oluşturduğu, metadata ile açıklanmış sözdizimi ağacı. Abstract form, Erlang'ın external term formatına dayalı bir ikili kodlamaya sahip olduğundan, Gleam ürettiği kodu doğrudan yükleyebilir ve Erlang derleyicisinin ön yarısını tamamen atlayabilir.

Yeni backend'in sağladıkları

Duyuru somut birkaç kazanç sıralıyor:

  • Derleyici performansı: Erlang'ı hedefleyen Gleam projelerinde derleme süreleri belirgin şekilde azaldı.
  • Doğru runtime metadata: Konum bilgisi artık üretilen Erlang koduna değil özgün Gleam kaynağına işaret ediyor. BEAM çökme raporlarındaki ve stack trace'lerdeki satır numaraları tam olarak doğru; daha önce kesin olmayabiliyor ve yalnızca en yakın fonksiyonu gösterebiliyordu. Duyuruya göre bu metadata, edb gibi debugger'larda tam Gleam desteğini mümkün kılabilir; ancak ekip bu çalışmayı kendisi yapmamış.
  • Daha temiz derleyici iç yapısı: Eski üreteç, Gleam kod tabanının en eski ve en istikrarlı parçalarından biriydi ama artık projenin güncel standartlarına ve kurallarına uymuyordu; yerine gelen yapının derleyicinin bütününü bir üst seviyeye taşıdığı belirtiliyor.

Yazar ayrıca, dil artık başka bir dilin kaynağını üretmek yerine Erlang derleyicisine bir ara temsil (intermediate representation) verdiğinden, artık kimsenin Gleam için "transpiler" ifadesini hakaret olarak kullanamayacağı şakasını yapıyor.

Kısıtlarıyla birlikte benchmark'lar

Performans iddiaları, her biri "hello world" dizesi döndüren 100 fonksiyon içeren 100 modülün derlenme süresini ölçen, José Valim'in langcompilebench projesine dayanan bir benchmark ile destekleniyor. Duyuru, bu tür benchmark'ların yapay olduğundan ve her dilin özelliklerinin yalnızca küçük bir kısmını yokladığından açıkça söz ediyor.

Yeniden yazımın ilk aşaması v1.18.0'da geldiği için karşılaştırma, önbelleksiz, sıfırdan tam derlemelerde v1.17.0 ile v1.19.0'yı karşı karşıya getiriyor ve duyurunun "kayıda değer bir iyileşme" diye nitelediği sonucu gösteriyor. Gleam'ın derlemesi artımlı olduğundan, tipik geliştirme derlemeleri daha da hızlı.

Bağlam için benchmark, başka dillerle de genişletildi: eşlik eden grafik, hem JavaScript hem Erlang'a derlenen Gleam'ı hızlı uçta, Go, Erlang, Java, Elixir, Elm, Rust, C# ve TypeScript 7'nin önünde gösteriyor. Duyuru, bu verinin tek başına o diller hakkında kesin sonuçlar çıkarmak için yeterli olmadığı uyarısında bulunuyor.

Neden doğrudan BEAM bytecode üretilmiyor?

Doğal bir soru, Gleam'ın neden Erlang derleyicisini hâlâ işin içinde tuttuğudur. Duyuruda açıklandığı gibi BEAM bytecode, Erlang kaynak kodu ve abstract formun aksine sabit bir hedef değildir: her VM sürümü bytecode işlevselliği ekleyip çıkarabilir; bu yüzden bir bytecode backend'i, Gleam ekibinin Erlang'ı geliştirenlerle yakından çalışarak VM geliştirmesini takip etmesini ve her VM sürümüyle eş zamanlı derleyici güncellemeleri yayımlamasını gerektirirdi. Ayrıca Gleam'ın statik analizinin yardımıyla bile, Erlang derleyicisinde hâlihazırda bulunan on yıllık optimizasyonları yeniden uygulamak anlamına gelirdi.

Gleam sponsorlukla finanse edilen bir topluluk projesi olduğundan ve kurumsal ya da kurumsal olmayan büyük destekli dillerin kaynaklarının çok küçük bir bölümüne sahip olduğundan, abstract form bugün için maliyet-fayda dengesinin en iyi seçeneği olarak tanımlanıyor. Duyuru ayrıca, BEAM üzerinde Gleam'ın ağabeyi olan Elixir'in de Erlang'a abstract form üzerinden derlendiğine dikkat çekiyor.

JavaScript çıktısı da iyileşti

Sürüm yalnızca Erlang hakkında değil. John Downey, desen eşleştirme karar ağaçlarının JavaScript'e derlenme biçimini iyileştirdi: iç içe if ifadeleri, daha az ara değişkenle tek koşullara indirildi; böylece iki belirli alanıyla bir constructor'ı eşleştiren bir case ifadesi artık dört düzey iç içelik yerine tek bir birleşik if'e dönüşüyor. İlginç bir şekilde duyuruya göre bu, minify edilmiş ve gzip'lenmiş bundle boyutlarında neredeyse hiç fark yaratmıyor ama JavaScript motorlarının optimize etmesi gereken dal sayısını azaltıyor.

Sürüm ayrıca JavaScript hedefindeki liste sabitlerini (list literal) optimize ediyor; Gleam'ın değişmez, kalıcı liste türü JavaScript'te düz diziler olarak yazılamadığından runtime veri yapıları olarak kurulmak zorunda.

Neden önemli

Derleyici mimarisindeki değişiklikler kullanıcılar için genelde görünmezdir — ta ki görünmez olmayı bırakana kadar. Kaynak kodu üretiminden abstract form'a geçişle Gleam daha hızlı derlemeler kazanıyor ve günlük iş için daha da önemlisi, çökme raporları ile stack trace'lerin yaklaşık bir değere değil tam Gleam satırına işaret etmesini sağlıyor. Araç zincirini Elixir'in kanıtlanmış yaklaşımıyla hizalarken, doğrudan BEAM bytecode üretmenin bakım yükünü açıkça reddetmek, bilinçli kapsam kararları alan bir projeyi gösteriyor. Sponsorlukla finanse edilen ve çok daha büyük ekosistemlerle ilgi için yarışan bir dil için bu ölçülülük hikâyenin bir parçası: ekip her kararın yıllarca, on yıllarca ayakta kalması gerektiği çerçevesinde değerlendiriyor.

  • #gleam
  • #erlang
  • #compilers
  • #beam
  • #javascript

İlgili yazılar