OCaml için daha iyi bir derleme sistemine, Dune’a giden yol
(blog.janestreet.com)- Jane Street, OMake’e duyduğu memnuniyetsizlikten Jenga’yı geliştirdi; ancak dışarıda benimsenmesi zayıf kaldı. Uyumluluk için oluşturulan Jbuilder ise beklenmedik şekilde OCaml topluluğunun temel araçlarından birine dönüştü
- Jbuilder’ın ilk çekiciliği özelliklerinden çok hızı ve taşınabilirliğiydi; Jane Street projelerinde OCamlbuild’e göre yaklaşık 5 kat daha hızlı derleme, benimsenmesini sağladı
- Jbuilder, OCaml Labs ile iş birliği içinde tam teşekküllü bir derleme sistemine evrildi ve mevcut Borland Java IDE’siyle yaşanan ad çakışması nedeniyle topluluk tartışmalarının ardından Dune adını aldı
- Jane Street bir süre Jenga ve Dune’u birlikte sürdürdü; ancak kod tabanı 65M satır OCaml ve 5M satır Python düzeyine büyüyünce kurum içi geçişin zorluğu ciddi ölçüde arttı
- Bir yılı aşan yoğun çalışmanın sonunda Jane Street’in kod tabanı Dune ile derlenir hale geldi; önbelleğin büyük ölçüde dolu olduğu derlemeler 2–3 kat hızlandı
OMake memnuniyetsizliğinden doğan Jenga
- Derleme sistemi, birden çok kaynak dosyadan çalıştırılabilir programlar üreten; derleyici çağrılarını ve test çalıştırmayı da üstlenen, geliştiricilerin günlük aracıdır
- Jane Street, 2012 civarında OCaml’in standart derleme sistemlerinden biri olan OMake’ten memnun kalmayarak kendi derleme sistemi Jenga’yı geliştirdi
- Jenga kurum içinde iyi çalıştığı için Jane Street, topluluğun da bundan faydalanabileceğini düşünerek onu açık hale getirmeye karar verdi
- Dış kullanıcıların Jenga’yı deneyip katkıda bulunmasını bekledi
- Jane Street kodunu açık kaynak olarak yayımlamanın da kolaylaşacağını düşündü
- Gerçekte dışarıdaki benimsenme beklentilerin altında kaldı
- Windows’ta çalışmıyordu
- Jenga’yı benimsemek, fiilen OCaml derlemenin Jane Street yönteminin tamamını kabul etmeyi gerektiriyordu
- Dış kullanım artmayınca Jane Street, Jenga’yı yeniden kapalı hale getirdi; açık kaynak kodu derleme sorunu ise devam etti
Uyumluluk katmanı olarak geliştirilen Jbuilder
- 2016’da Jane Street, dış kullanıcıların Jenga’nın tamamını benimsemeden kendi kodlarını derleyebilmesini sağlayacak basit, çapraz platform bir araç olan Jbuilder’ı geliştirmeye karar verdi
- Bu araç aynı zamanda, o dönemde OCaml projelerini derlemede yeni standart olarak öne çıkan OCamlbuild’e uyacak şekilde derlemeleri yeniden yazma yükünü azaltmayı amaçlıyordu
- Jbuilder, Jenga’nın derleme yapılandırması için kullandığı
jbuilddosyalarını anlıyor ve gerekli derleme komutlarını topolojik sıralama düzeninde çalıştırıyordu - İlk Jbuilder, genel anlamda bir derleme sistemi olmaktan uzaktı
- Yalnızca girdisi değişen komutları seçip yeniden çalıştırmıyordu
- Her seferinde tüm komutları yeniden çalıştıran bir yaklaşıma sahipti
Jbuilder’ın Dune’a dönüşme süreci
- Jbuilder başlangıçta küçük bir uyumluluk katmanı olarak tasarlanmıştı; ancak kullanıcılar onu Jane Street paketlerinin ötesinde kendi projelerini derlemek için de kullanmaya başladı
- Benimsenmeyi sağlayan en büyük etken hızdı
- Jane Street projelerini derlerken OCamlbuild’e göre yaklaşık 5 kat daha hızlıydı
- Taşınabilirliği iyiydi
- Yapısı basitti, bu yüzden değiştirmesi kolaydı
- Jane Street, Jbuilder’ı daha eksiksiz bir derleme sistemine dönüştürmek için OCaml Labs, bugünkü Tarides ile iş birliği yapmaya başladı
- Ad ayrı bir sorun haline geldi
- Borland’ın Java IDE’si JBuilder zaten vardı
- Bu sistem uzun zaman önce fiilen ortadan kalkmış olsa da, adın kullanımı için telif hakkı sahibine başvurulduğunda izin alınamadı
- Topluluk tartışmalarının sonunda yeni ad olarak Dune seçildi
- İlgili tartışma yeni Jbuilder adı önerisi başlığında yürütüldü
İki derleme sistemini birlikte sürdürmenin maliyeti
- Dune’un popülerliği arttıkça Jane Street, kendi geliştirdiği iki eksiksiz derleme sistemi olan Jenga ve Dune’u aynı anda sürdürüp destekler hale geldi
- Dune; yeniden tasarlanmış yapısı, çoğu kullanıcı derlemesindeki yüksek performansı, daha geniş benimsenmesi, daha iyi API’leri ve kullanıcı deneyimiyle yerleşik bir sistem haline geldi
- İçeride ne zaman Dune’a geçileceği doğal bir konuya dönüştü; ancak derleme sistemi ekibi, büyüyen kod tabanına yetişmekle bile meşguldü
- Dune’un başladığı 2016’da OCaml kodu 4M satırdı
- Bugün 65M satır OCaml ve 5M satır Python bulunuyor
- Dune’a geçiş büyük bir yük olduğu için ciddi şekilde ele alınamadı; yalnızca “önümüzdeki 6–12 ay içinde mümkün olabilir” şeklindeki iyimser tahminler tekrarlandı
- Geçen yıl Jane Street, derleme sistemi ekibini 5 tam zamanlı mühendise çıkardıktan sonra uzun süredir ertelenen geçiş çalışmasına başladı
Jane Street içinde Jenga’nın yerini alan Dune
- En büyük işlerden biri, Dune’un Jane Street’in dev kod tabanına uygun şekilde ölçeklenmesini sağlamaktı
- Dune’un dışarıda hızlı olmasının nedenlerinden biri, çoğu kullanıcının Jane Street’in 70M satırlık deposundan çok daha küçük projeler derlemesiydi
- Jenga da 10 yıl boyunca yerinde saymamıştı
- Jane Street, kod tabanının büyümesine paralel olarak Jenga uygulamasını sürekli iyileştirdi
- Jenga, büyük ölçekli monorepo gereksinimlerine göre oldukça optimize edilmiş durumdaydı
- Bu optimizasyon çalışmalarının önemli bir kısmının Dune’a taşınması gerekiyordu
- Günlük entegrasyon çalışmaları da hiç kolay değildi
- Derleme sistemi birçok iş akışında çağrılıyordu
- Vim, Emacs ve VSCode adlı üç editörün her birinde Jenga için özel entegrasyonlar vardı
- Her entegrasyonun tek tek Dune’a geçirilmesi gerekiyordu
- Bir yılı aşan yoğun çalışmanın sonunda Jane Street’in kod tabanı artık Dune ile derleniyor
- Geçiş anındaki Dune performansı genel olarak Jenga ile aynıydı ya da daha iyiydi
- Bazı durumlarda çok daha iyi performans gösterdi
- Derleme işlerinin çoğu zaten önbellekte olduğunda derlemeler 2–3 kat hızlandı
Tek bir sistem üzerinde mümkün hale gelen sonraki iyileştirmeler
- Jane Street, Dune performans iyileştirmelerinin önemli bir bölümünü açık kaynak olarak yayımlamayı planlıyor; bazıları şimdiden yayımlandı
- Jane Street’e özel bir Dune fork’u ve dışarıdaki Dune olmak üzere yeniden iki sistem oluşmaması için, mümkün olan değişiklikleri upstream’e aktarmaya özen gösteriyor
- Dune, yeni özellikler geliştirmek için daha uygun bir temel haline geldi
- Kod tabanı daha basit ve üzerinde çalışması daha kolay
- Tek bir sisteme odaklanmak mümkün
- Aşağıdaki özellikler de artık daha yakın
-
Dağıtık derleme
- Sığ derleme, yani “builds without the bytes”
- Derleme grafiğinin kendisinin önbellekten yüklenmesi
- Derleme sistemi ekibi New York, Londra ve Singapur’daki 12 tam zamanlı mühendise büyüdü ve Dune iyileştirme hızı da arttı
-
1 yorum
Hacker News yorumları
Dune’un çökme mesajı:
https://github.com/ocaml/dune/issues/2767
Jane Street’in teknoloji podcast’i Signals and Threads’te 2020’de build sistemlerini ele alan bir bölüm vardı; şiddetle tavsiye ederim
Diğer bölümler de iyi; özellikle Richard Eisenberg’in konuk olduğu The Future of Programming ve Anil Madhavapeddy’nin konuk olduğu What is an Operating System?’ı da öneririm
¥https://signalsandthreads.com/build-systems/
°https://signalsandthreads.com/future-of-programming/
§https://signalsandthreads.com/what-is-an-operating-system/
https://signalsandthreads.com/multicast-and-the-markets/
Jane Street’in HM tipli fonksiyonel programlamanın da üzerine yeterince emek verildiğinde production’a hazır ve çok hızlı olabileceğini kanıtlamış olması saygıyı hak ediyor
Hâlâ bazen daha akademik tarzdaki fonksiyonel dillerin production’da kullanılamayacağı söyleniyor, ama OCaml yüksek performans gereksinimleri olsa bile bunun gayet mümkün olduğunu gösteriyor
https://mercury.com/
Mevcut sistemlerle geniş çapta birlikte çalışırken yüksek kaliteli programlar üretmek için harika bir seçenek
Birkaç yıl önceki bir blog yazısına göre Roc ile de ilgilenmişlerdi; şu anda kullanıyorlar mı bilmiyorum
[0] https://blog.noredink.com
Janestreet blog yazılarını her gördüğümde, Jane’de finans sektöründe çalışmanın sözde teknoloji sektörü işlerindeki pozisyonların %90’ından daha eğlenceli ve daha iyi ödüllendirilen bir iş olabileceğini düşünüp içimden gülüyorum
Finans alanındaki teknoloji işlerinde, bırak Jane Street’i, ortalama bir teknoloji şirketi kadar bile eğlenceli ya da iyi ücretli olmayan çok daha fazla iş var
Finans sektöründeki işlerin çoğu 20 yıllık Java kodunu düzeltmekten ya da özel raporlar için Excel dosyalarına veri koyup çıkarmanın yeni yollarını bulmaktan ibaret
Ayrıca JS’ye girmenin Google/Meta’ya girmekten çok daha zor olduğunu duydum
Ben de eskiden başvurmuştum; mülakatçı oldukça nahoştu ve Big Tech mülakatlarında böyle bir şey yaşamamıştım, o yüzden iyi bir izlenim bırakmadı
Yine de insanlara reklam tıklatmaya çalışmaktan daha değerli görüyorum
Diğer şirketlerde olduğu gibi ilginç projelerle sıkıcı işlerin bir karışımı var
Karmaşık bir kod tabanından daha kötü olan tek şey karmaşık bir build sistemidir. CMake tiksindirici
“Bu dili derlemek için bir de başka yeni bir dil öğren!” durumu
Doğru yaptığı birkaç şey var ve yanlış yaptığı bazı şeyler yönetilebilir
İnsanların düzenleyebileceği tek bir yapılandırma dosyası setiyle birden fazla platform için build süreci elde edebiliyorsam, bir miktar acıya katlanabilirim
Korkunç script dili ayağına dolanıyor, ama yeterli motivasyon olursa iyileştirilebilir
Eskiden Lisp’ten sonraki ilk fonksiyonel programlama deneyimim olarak birkaç yıl Haskell tarafında geçirdim.
OCaml bana pek hitap etmemişti; ayrıca nadir görülen türden bir noktalı virgül alerjim vardı, bu yüzden Haskell gözüme çok daha iyi görünüyordu.
Ama yakın zamanda Reason’ı denedim ve çok hoşuma gitti; birden OCaml ile ilgili her şey ilgimi çekmeye başladı.
https://learn.microsoft.com/en-us/dotnet/fsharp/language-ref...
https://ocaml.org/docs/toplevel-introduction#loading-librari...
https://reasonml.github.io/ havalı görünüyor; JavaScript hissi veren OCaml gibi.
O çizgiyi kavrayınca sorun olmayabilir; ama sanki Lisp’te olduğu gibi o yapıyla düşünmeyi öğrenmek gerekiyor. Yine de ekranı kaplayan Haskell kodu görünce gözüm korkuyor.
Bunların arasında SML/NJ bana en okunabilir geleniydi.
Jane Street’in açık kaynak OCaml kütüphanelerini ve araçlarını az çok ciddi bir projede kullanan var mı merak ediyorum.
Kısa bir bakıştan edindiğim izlenim, ekosistem oluşturmak ve kodu açık kaynak yayımlamak için çok çaba harcadıkları; ancak Jane Street dışındaki insanların kullanması için “hazır” durumda olmadığı yönündeydi.
Bir şeyi bulmak için fonksiyon imzalarını epey iyi okuyabilmeniz gerekiyor; bunun dışında şikâyetim yok. Örneğin tüm temel tipler için s-expression’a dönüştürme ve geri dönüştürme fonksiyonları, varlıklarını bilip önceden plan yaparsanız muazzam zaman kazandırıyor.
Başka kütüphanelerini de kullandım; logging ve birim testi ppx’leri, OCaml dünyasında böyle bir şey mümkünse fiilen standarda yakın. Kod biçimlendirici, bir test framework’ü ve gelişmiş veri yapısı implementasyonları da kullandım.
Bazen, başka bir yorumda söylendiği gibi, gerçekten çalışmayan şeylerle de karşılaşıyorum. Ayrı dağıtılan, dokümante edilmemiş bir şeye bağımlı olması ya da gizli bir ayar gerektirmesi gibi. Kötü niyet yok; issue açıp 1-2 yıl sonra geri dönerseniz çoğu zaman çalışır hale gelmiş oluyor.
Hiç hayal kırıklığı yok değil; ama kaynakları daha az sayıda sürümü test edip cilalamaya harcamak yerine her şeyi açık yayımlama yaklaşımlarını takdir ediyorum. Kod kalitesi genel olarak çok yüksek ve kendiniz çalıştıramasanız bile titiz, doğrulanmış örnek implementasyonlar oluyor.
API’sinin standart stdlib’den çok daha iyi olduğunu düşünüyorum.
Lean 4’ü seviyorum ama yapay zekadan yardım almak kolay değil. Bugünkü işim, referans kılavuzunu 200K bağlam penceresine güzelce sığacak şekilde sindirmek. Faydalı olup olmayacağını göreceğim.
Kendi yeni build sistemini geliştirip ona migrate etmenin, buck2 ya da bazel gibi hazır araçları benimsemekten hâlâ daha mantıklı olabilmesi epey şaşırtıcı.
Bu tür gelişmiş build araçlarını devreye almanın kolay olduğu anlamına gelmiyor; ama kendiniz yapmakla kıyaslayınca durum nasıl? dune’u çok farklı kılan özel bir şey var mı merak ediyorum.
Bazel’in ilk sürümü 2015’te, Buck’ınki 2013’te çıktı.
JS’de biraz NIH kültürü var ama burada bunun etkili olup olmadığını bilmiyorum. O dönemde iyi build araçları çok değildi; özellikle de alışılmışın dışında teknoloji yığını kullanan şirketler için.
Özellikle önceden ocamldep çalıştırabilmek ya da iki kez derlemek gerektiğini biliyorum; buck2 bunu yapabiliyor, Bazel’de ise yanlış hatırlamıyorsam hack gerekiyor.
İkisi kabaca benzer. OCaml build araçlarını çağırma saf hızı açısından dune hızlı; çok şeyi yeniden build etmek gerektiğinde ve dağıtık build sistemi kullanıldığında buck2 kazanıyor.
Büyük acı noktası LSP entegrasyonu. LSP sunucusunun bir dosyanın bağımlılıklarını bilmesinin tek yolu build olduğu için build sistemiyle sıkı sıkıya bağlı olması gerekiyor. dune’da her şey temiz şekilde sağlanıyor. buck2 ile de bir şekilde bağladık ama o kadar iyi değil.
Dune, build sistemi adı olarak açık ara en iyisi; yanına yaklaşan bile yok.
Daha iyi bir build sistemi yapmak için yola çıkıp “tesadüfen” daha iyi bir build sistemi yapmışlar; böyle tesadüflerin ortaya çıkma şekli gerçekten tuhaf.