3 puan yazan GN⁺ 2023-07-19 | 1 yorum | WhatsApp'ta paylaş
  • Hylo, değer semantiği temelinde güvenli sistem ve jenerik programlamayı hedefliyor; derleyici ve standart kütüphane henüz erken aşamada olsa da örnekler Compiler Explorer üzerinde çalıştırılabiliyor
  • Dil araştırmaları, Swift subscript’inin inout projection ile genişletilmesi, method bundles, yapısal eşzamanlılık ve değer semantiği tabanlı çift bağlı liste gibi konulara odaklanıyor
  • Derleyici LLVM kullanıyor ve buna ek olarak coherence sağlayan jenerik derleme, program durumunun önbelleklenmesi ve serileştirilmesi ile C birlikte çalışabilirliği araştırmalarını ele alıyor
  • Geliştirme ortamı, VSCode eklentisi, dokümantasyon derleyicisi ve Language Server prototipi sunuyor; SPM/CMake, Ninja/Xcode, Windows/Linux/macOS ve Docker geliştirme araç zinciri imajlarını destekliyor
  • Örnekler, güvenli projection ve sink method aracılığıyla sahiplik ve serbest bırakma kurallarını kod düzeyinde görünür kılıyor ve bir sistem dilinin güvenliği nasıl zorunlu kılabildiğini gösteriyor

Hylo’nun kapsamı ve mevcut durumu

  • Hylo’nun derleyicisi ve standart kütüphanesi hâlâ erken aşamada
  • Gelişmiş Hylo kod örnekleri Compiler Explorer üzerinde çalıştırılabiliyor
  • Açılış ekranında da Hylo’yu Compiler Explorer üzerinde deneyebileceğiniz bir bağlantı sunuluyor

Değer semantiği ve dil araştırmaları

Derleyici ve standart kütüphane

  • Derleyici çalışmaları, LLVM tabanlı derleme, jenerikler, durum saklama ve C birlikte çalışabilirliği alanlarına yayılıyor
  • Standart kütüphane tarafında ise şu anda uygulama dokümantasyonu ve koleksiyon algoritmalarıyla ilgili çalışmalar yayımlanıyor

Geliştirici deneyimi ve derleme ortamı

  • Düzenleyici, dokümantasyon ve dil sunucusu için araçlar birlikte sunuluyor
  • Derleme ve geliştirme ortamı, birden fazla işletim sistemi ile konteyner tabanlı akışları destekliyor
    • Development Containers desteği başlangıç adımlarını azaltıyor
    • SPM/CMake, Ninja/Xcode, Windows/Linux/macOS desteği
    • Test üreten derleyici eklentisi
    • Önceden derlenmiş Hylo development toolchain Docker imajı
    • Derleyici Swift 6.2 ile yazılıyor

Hylo ile ilgili araştırmalar ve sunum materyalleri

Kod örnekleri: güvenli projection ve açık serbest bırakma

  • Subscripts - A Safe Projection Mechanism örneği, Angle türünün radians değerini sakladığını ve degrees özelliğini let ile inout blokları üzerinden sunduğunu gösteriyor
    • degrees içindeki let, radians değerini dereceye çevirip döndürüyor
    • inout, geçici derece değeri d’yi yield &d ile açığa çıkarıyor; ardından değiştirilmiş değeri tekrar radians’a çevirip self.radians içine yansıtıyor
    • main, inout d = &a.degrees ile projection elde ediyor, d’yi 0.0 yapıyor ve ardından a.radians == 0.0 olduğunu doğruluyor
  • Sink Methods - Capability for Deinitializing örneği, Computer türünün shutdown() işlevini sink method olarak sunduğu bir yapıyı gösteriyor
    • shutdown(), bellek içeriğini yazdırdıktan sonra self.ram üzerinde sink işlemi uyguluyor
    • test1, bir Computer oluşturup shutdown çağırmadığı için Cannot deinit computer hatası veriyor
    • test2, shutdown çağrısını yalnızca if random_bool() içinde yaptığı için, if bloğuna girilmeyen yolda Cannot deinit computer hatası oluşuyor
    • test3, while içinde shutdown çağırdığında ilk yinelemeden sonra tüketilmiş nesnenin kullanımı sorunu ortaya çıkıyor; ayrıca while bloğuna girilmeyen yolda deinit yapılamama durumu sürüyor
  • Ek örnekler compiler test suite içinde görülebilir

1 yorum

 
GN⁺ 2023-07-19
Hacker News yorumları
  • C++ halefi olarak, Herb Sutter’ın harika CppFront’undan bile Val daha umut verici olabilir diye düşünüyorum. Şimdilik sadece aşağıdaki iki sunumu izledim ama öne çıkan noktalar statik derleme, statik tipler, C++ ile birlikte çalışabilirlik, bellek güvenliği, tür güvenliği ve veri yarışı olmaması gibi görünüyor
    Bunu anlatırken genelde şöyle diyorum: “Yeni bir C++ projesine başlıyorsun ve performansı dert etmediğini varsayalım; pointer ya da referans kullanmadan her şeyi değer olarak geçirip değer olarak döndürsen, yan etkiler ve veri yarışı konusunda endişe etmemen güzel olmaz mıydı?” Val’ın ilginç yanı, dilde pointer ve referansları kaldırsa bile derleyicinin kendi içinde const referansla geçirme ve dönüş değeri optimizasyonu uygulayarak istenen semantiği ve performansı aynı anda korumasını sağlaması
    Val: A Safe Language to Interoperate with C++ - Dimitri Racordon - CppCon 2022 https://www.youtube.com/watch?v=ws-Z8xKbP4w
    https://cppcast.com/val-and-mutable-value-semantics/

    • Sean Parent’ın Val’ı ele aldığı ADSP Podcast’in son iki bölümünü dinlemek faydalı olur. Adobe Research Labs geliştirmeyi oldukça ciddi biçimde destekliyor
      https://adspthepodcast.com/
    • “C++ ile birlikte çalışabilirlik” kulağa şüpheli geliyor. Başka bir dilin C++ ile gerçekten düzgün şekilde birlikte çalışabildiğine inanmak zor; C++ derleyicileri arasında bile ikili uyumluluk bozuluyor, hatta bazen aynı derleyicinin farklı sürümleri arasında bile
    • Yapı derleyiciye fazla güveniyor gibi geliyor. Küçük bir değişiklik, uzaktaki bir koddaki optimizasyonu bozup performansı mahvetme riskini doğurmaz mı diye endişeleniyorum
    • “Bütün gün değer olarak geçirip değer olarak döndürmek” yaklaşımında, artık bir struct içindeki referansları verimli biçimde değiştirmek ya da saklamak zorlaşır. Program biraz bile alışılmadık ya da karmaşık veri yapıları gerektiriyorsa bu ölümcül bir kısıt gibi görünüyor. Gerçi bu tür veri yapılarını doğru uygulamanın zor olduğunu düşününce, belki de bu bir avantajdır
    • Yıllardır PHP programlarını pratikte tam da bu şekilde yazıyorum; array’leri dert etmeden sürekli geçirip durdum
      PHP yorumlayıcısının aslında copy-on-write kullanacak kadar akıllı olduğunu düşünüyorum ama bunu hiç kendim profillemedim. Yine de sayfa yükleme başına epey karmaşık veri işleme, DSL’leri karakter karakter parse etme, dinamik SQL üretme ve sonuçları keyfi yapılara dönüştürme gibi işler yapmama rağmen hissedilir bir performans sorunu yaşamadım
      PHP 4 döneminde nesneler de değişkenlerde saklanan değerler gibi davranıyordu; sonradan nesne değişkenlerini referans semantiğine çevirirken “değer, değişken referansı, değere pointer” kavramlarını saklama türünden bağımsız değişken özellikleri olarak tasarlamamış olmalarını kaçırılmış bir fırsat olarak görüyorum
      $a = $b; // $b değerini $a içine kopyala
      $a = &$b; // $a ve $b artık aynı değişken
      $a = *$b; // $a, $b ile aynı nesneyi gösterir ama $a = &$b unlike değişkenin kendisi bağlanmaz`
  • Bu kadar çok sıfır maliyetli soyutlama dili çıkması bir yandan güzel ama sistem programcılarının artık bir kazanan seçmesini de istiyorum. Zaten küçük olan sistem programcısı topluluğunun Rust, Zig, Val gibi seçeneklerle daha da bölünmemesini ve sistem dili savaşlarının yakında bitmesini umuyorum

    • Belki de birini çok erken seçtiğimiz için bu alanda yenilik uzun süre yetersiz kaldı. Savaş iyidir
    • Bugün itibarıyla kazananın Rust olduğunu düşünüyorum. Çünkü Linux ve Windows çekirdeklerine gerçekten girebilmek gibi devasa engelleri zaten aşmış durumda. Bu açıdan bakınca yeni bir sistem dilinin kendine yer açması için pek alan kalmamış gibi görünüyor
    • Sanmıyorum. Bu yüzden de wasm + wasi desteğini her yerde daha geniş biçimde yaygınlaştırmak için daha da güçlü bir neden var
  • Val’ı bugün ilk kez öğrenince hissettiklerim şöyle ilerledi: “Aa, yeni bir sistem dili. Belki çok da önemli değildir ama bir bakayım. Dokümantasyon fena değil. Sahiplik konusundaki fikirler oldukça düşünülmüş ve sözdizimi de mantıklı. Peki ama bağımsız varlık sebebi olacak kadar farklı mı? Bunu kim yapıyor?”
    Sonra bunun üzerinde Dave Abrahams’ın çalıştığını görünce ilgim arttı. Apple’da karşılaşmıştım ve Swift hakkında yaptığı Crusty sunumunu da hatırlıyorum[1]. Güçlü görüşlerini sevmiştim ama Apple daha sonra o videoyu, artık eski tavsiyeler içerdiği gerekçesiyle kaldırdı. Şimdi Adobe’de olduğuna göre, bu bir Adobe dili mi acaba diye düşündüm
    Sonuç olarak takip etmeye değer görünüyor; bağlantısı verilen sunumları izledikten sonra bekleyip görmek gerekir
    [1] Crusty sunumunu buldum: "I don't do Object Oriented!" https://www.youtube.com/watch?v=p3zo4ptMBiQ

    • David Abrahams, Apple’a gitmeden önce de Boost için çok önemli katkılar yapmıştı; C++ komitesi üyesiydi ve Stepanov tarzı jenerik programlamanın güçlü bir savunucusuydu. Val projesine katılması şaşırtıcı değil
  • Bir derleyici geliştiricisi olarak aşağıdaki issue’ları görünce sarsıldım
    https://github.com/val-lang/val/issues/758
    https://github.com/val-lang/val/issues/711
    Uygulamanın durumu pek iyi görünmüyor. Mümkün olduğunca çabuk self-hosting yapmaları gerekiyor; böylece bu tür temel hataları daha çok bulurlar. Buna rağmen 500’den fazla yıldızı var

    • Bir başka derleyici geliştiricisi olarak bakınca, fazlasıyla erken self-hosting kadar zararlı az hata vardır. Dil küçük ve orta ölçekli programlarda net kazanç sağlasa bile, derleyici gibi büyük projelere uygun hale gelmesi ve gerekli araçlara kavuşması çok daha uzun sürer. Acele etmemeleri sevindirici
    • Böyle hatalar üretimdeki bir derleyicide olsa endişe verici olurdu ama henüz tanımlanma aşamasındaki bir dilin derleyicisinde o kadar da büyük mesele değil. Rust 1.0 ile 1.71 karşılaştırılınca, “ilk kararlı sürüm” ile “yoğun gerçek kullanım gören kararlı bir dilin derleyicisi” arasında ne kadar büyük fark olduğu görülüyor
      Self-hosting de her şey değil. Her şeyden önce daha çok sembolik bir kilometre taşı; başarıldığında kutlanacak bir şey ama geliştirme döngüsünün oldukça ilerisine kadar dilin bir zayıflığı sayılmamalı diye düşünüyorum
    • Swift’in kendisi de hâlâ self-hosting değil ve sürüm 6 çıkmak üzere. Derleyici geliştiricisi değilim ama Swift topluluğunda bu konu etrafındaki tartışmaların vardığı sonuç, henüz buna değmeyeceği yönündeydi
  • Uzun zamandır “Val ile oynamayı” erteliyordum, bugün sonunda denedim ama 4.000’den fazla commit olmasına rağmen hâlâ kullanılabilir olmaktan uzak. Dil turundaki örneklerin çoğu derlenmiyor, dışarıdan basit görünen örnekler bile başarısız oluyor
    Carbon ise henüz doğru düzgün bir şey ortaya koymuş değil; Sean Baxter, Circle derleyicisinde ciddi ilerleme kaydediyor ve Carbon’un iyi yanlarının birçoğunu da hayata geçiriyor. Hâlâ dil denemeyecek durumdaysa halef olması da zor

  • Artık V, Val, Vala ve Vale var. Unuttuğum başka diller de var mı?

    • VAL de var. 80’lerden bir dil; SISAL üzerinden Haskell’i etkilemişti. Yine de paralel diller topluluğunun dışında o VAL’i bilen çok kişi yoktur herhalde
    • Benzer isimler aslında avantaj da sağlayabilir. Bu tür dilleri öğrenenler büyük olasılıkla “yeni ve popüler şey” arıyordur; benzer adlı başka dilleri de fark edip onlara bakabilirler. JavaScript’te de böyle olmuştu ve sonuç pek de kötü olmadı
    • Ben bunun gerçekten Vale olduğunu sanmıştım. İsim çakışması epey talihsiz
    • Ayrıca V’ye Vlang da deniyor ve Vale de eskiden Vlang diye anılıyordu
  • Her seferinde söylenen şey ama Val’de tek hoşuma gitmeyen nokta, Vale ve V’nin de yeni sistem dilleri olması. İsimler yüzünden üçünü karıştırmak çok kolay

  • İlgili bir yazı var. Başka var mı?
    Val, a new programing language inspired by Swift and Rust - https://news.ycombinator.com/item?id=31788527 - Haziran 2022, 19 yorum

  • “mutable value semantics” makalesine göz gezdirdim; yazarların referanslar ve pointer’lar yerine a) iç içe struct’lar ile Any üzerinden kısmi dolaylı erişim ve çalışma zamanı kontrolleri, b) dizi indeksleri önerdiğini anladıysam doğru mu diye merak ediyorum
    “Çift bağlı liste veya yönlü grafik gibi kendine referans veren veri yapılarını değiştirilebilir değer tipleriyle nasıl ifade edebilirsiniz diye sormak yerindedir. Aslında rastgele bir grafik komşuluk listesi olarak ifade edilebilir…” ifadesi dikkatimi çekti. Uygulamanın içinde bellek yığınını ve bir tür çöp toplayıcıyı yeniden kurmadan çift bağlı listeyi makul biçimde nasıl uygulayabileceklerini pek göremiyorum
    Ek olarak https://github.com/orgs/val-lang/discussions/736 içindeki tartışmayı buldum; Rust’taki unsafe benzeri bir kaçış kapısı gelecek gibi görünüyor. O zaman bütün sorunlar çözülür ama “Val’in güvenli alt kümesi tek başına pratik uygulamalar yazmak için yeterli mi” sorusu daha uzun süre tartışma konusu olacak gibi duruyor

    • Dizi kullanıp pointer yerine dizi indeksleri kullanırsanız belleği fiilen yeniden kurabilirsiniz
      Bunun düşünüldüğünden daha az saçma olmasının nedeni, bu indekslerin belirli bir veri yapısına, örneğin çift bağlı listeye ya da grafa, bağlı olması; dolayısıyla programın başka yerlerine erişecek şekilde manipüle edilmelerinin kolay olmaması. Derleyici bunu denetlediğinde de, programı bozma girişimlerinde de bu geçerli
  • Ana sayfadaki örneğin açıklamasını nasıl okumam gerektiğini bilmiyorum. “Gereksiz tahsisler oluşmaz. longer_of sonucunun daha uzun argümanın projection’ı olması nedeniyle, emphasize z’yi değiştirirse y değeri doğrudan değişir. Değer ne kopyalanır ne de taşınır, ama emphasizee referans olarak da geçirilmez” deniyor.
    Bir string argümanının fonksiyona geçirildiği ve sonuna karakter eklendiği bir durumda, mevcut stringin başlangıçtaki bir uzunluğu ve stack üzerinde belirli bir konumu ile boyutu olurdu; o halde y’nin yeni bir kopyası olmadan bunun nasıl mümkün olduğunu anlamıyorum. Biri ekleme yaparsa diye stringin sonuna fazladan padding mi bırakılıyor? Öyleyse ne kadar padding bırakılıyor ve neden bu genel olarak daha verimsiz olmuyor?

    • Dört boşlukluk girinti alıntı için değil, code/sabit genişlikli blok içindir. HN’de alıntı yapmak için genelde > geleneği kullanılır; parser özel işlem yapmasa da iyi çalışır
    • Değişmez bir değer olmak zorunda stack üzerinde bulunmak zorunda değildir
      Yine de benzer bir sorum var. 1GB’lık bir string değiştirilirse ne olur? Yazma anında kopyalama mı yapılır?
      Vakaların %99’unda optimizasyonla ortadan kalkabilir ama kalan %1’de bulunması çok zor performans düşüşleri yaratacakmış gibi geliyor
    • Birkaç gün sonra kendime yanıt vermeyi deneyeyim: Değiştirilen değişken adını, stack üzerinde daha uzun yeni bir değerle gizlice shadowing etmek mümkünse bu yapılabilir gibi görünüyor. Belki de “projection”un anlamı budur. Bu durumda stack zaten tahsis edilmiş olduğundan yeni bir tahsis gerçekleşmez. Dil veya derleyici uzmanı değilim; bu terim o tarafta iyi biliniyor olabilir
    • Aşağı tarafta daha fazla açıklama var. longer_of bir fonksiyon değil, bir subscript ve subscript değer döndürmek yerine değeri projection ederek çağırana geçici okuma/yazma erişim hakkı veriyormuş
      Bunun nasıl taşımaya girmediğini pek anlamıyorum. Stringler söz konusuysa, Rust’taki gibi değişken boyuta izin vermek için heap üzerinde de tutulabilir