108 puan yazan GN⁺ 2025-05-15 | 1 yorum | WhatsApp'ta paylaş
  • Programlama dilleri ve derleyiciler hakkındaki bakış açımı kökten değiştiren çeşitli yazı, makale ve videolar tanıtılıyor
  • Pratik GC uygulaması, optimizer tasarımı, register allocation, regular expression engine gibi konulara dair anlayışımı büyük ölçüde genişleten kaynaklar
  • Z3 ve abstract domain, SSA form, E-Graphs gibi gerçek dünyadaki algoritma ve yapıların, gerçek kod örnekleriyle birlikte kolay anlaşılır biçimde açıklandığı içerikler
  • Her kaynak, karmaşık kavramları kısa ama genişletilebilir ve anlaşılması kolay bir şekilde ele alıyor

Programlama dilleri ve derleyiciler üzerine bakışı değiştiren yazılar

  • Zaman zaman programlama dilleri ve derleyicilerle ilgili bir konuda düşüncemi tamamen değiştiren makale, blog yazısı ya da videolara rastlıyorum
  • Bazı yazılar o kadar güçlü bir etki bırakıyor ki, onları okumadan önce nasıl düşündüğümü bile hatırlayamıyorum.
  • Aşağıda bu tür kaynaklara bir giriş yer alıyor (sıra önemli değil)

GC, optimizer, abstract domain, register allocation üzerine

  • Andy Wingo’nun a simple semi-space collector yazısı, Cheney/copying/compacting garbage collector kavramını teoriden pratiğe nasıl taşıdığını çok iyi gösteriyor
    • Yazıdaki GC’nin çekirdek uygulaması son derece kısa; genişletilebilir ve yarım günde anlaşılabilecek kadar açık
  • CF Bolz-Tereick’in Implementing a Toy Optimizer yazısı, optimizer’da instruction rewrite yaklaşımına dair bakışı değiştiriyor
    • Basit find-replace yerine forwarding pointer kullanımını vurguluyor ve union-find kavramını tanıtıyor
    • Tüm toy optimizer serisi, her yazıda yeni ve ilginç fikirler içeriyor
  • A Knownbits Abstract Domain for the Toy Optimizer, Correctly yazısı aynı anda yeni bir abstract domain ve Z3 kullanımını tanıtıyor
    • Z3’ün çeşitli sayısal işlem ispatlarında nasıl kullanıldığını göstermenin yanı sıra, Python kodu için bir doğrulama motoru olarak kullanımına da örnek veriyor
    • Z3 karşı örnek bulamazsa bunun kod için doğruluk güvencesi anlamına geldiği fikrini tanıtıyor
  • Chris Fallin’in Cranelift, Part 3: Correctness in Register Allocation yazısında, her girdi için doğru register allocation’ı doğrudan ispatlama yaklaşımı anlatılıyor
    • Production ortamında sonuç ya doğru bir allocation ya da anlamlı bir crash oluyor
    • Fuzzing teknikleriyle durum uzayını tarayıp hata bulma yaklaşımını da tanıtıyor

Parsing, interpreter, JIT, abstract structure üzerine

  • Russ Cox’un Regular Expression Matching: the Virtual Machine Approach yazısı, regular expression engine uygulamasını yaklaşık 50 satırlık okunması kolay kodla sunuyor
    • Bu süreçte coroutine, fiber, scheduler gibi yapıların mantığını da anlaşılır biçimde açıklıyor
  • Andrej Karpathy’nin micrograd projesi, harici kütüphane kullanmadan çalışan neural network için son derece küçük bir uygulama örneği; machine learning’in temel yapı ve prensiplerini kavramaya yardımcı oluyor
  • Fil Pizlo’nun How I implement SSA form yazısı, union-find yapısını geliştiren yeni bir yöntem tanıtıyor
    • SSA dönüşümünde ek pointer’ları nesnenin içindeki Identity tag olarak yönetiyor
    • Bunun dışında Phi/Upsilon formu, TBAA tarzı heap effect’ler gibi üzerinde düşünmeye değer başka fikirler de sunuyor
  • Fil Pizlo’nun Speculation in JavaScriptCore yazısı, JavaScriptCore’daki çeşitli optimizer uygulama yöntemlerini ayrıntılı biçimde ele alıyor
    • Yazıyı her yeniden okuyuşta yeni bir içgörü kazanılıyor

Derleyici tasarımı, parser, IR yapısı, E-Graphs

  • Chandler Carruth’un Modernizing Compiler Design for Carbon Toolchain sunumu (yaklaşık 29. dakikada), son derece hızlı compile time hedefi belirleme ve genel mimariyi tasarlama sürecini açıklıyor
      1. dakikadan itibaren yapıyı katman katman açarak anlatıyor
  • Allison Kaptur’un A Python Interpreter Written in Python yazısı, CPython içindeki bytecode interpreter’ın nasıl çalıştığını kolayca anlamayı sağlıyor
  • Eli Bendersky’nin Parsing expressions by precedence climbing yazısı, geleneksel recursive descent parser’a kıyasla anlaması daha kolay ve geliştirme yükü daha düşük bir Precedence Climbing parsing yöntemi tanıtıyor
  • Takashi Kokubun’un Ruby JIT Challenge projesi, code generation ve yeni bir register allocation yöntemini (compile-time’da stack folding) gösteriyor
  • Abdulaziz Ghuloum’un [An Incremental Approach to Compiler Construction (PDF)(https://bernsteinbear.com/assets/img/11-ghuloum.pdf) çalışması, klasik çok aşamalı derleyici tasarımını tek seferde kavratabilen tek geçişli uygulama yaklaşımını açıklıyor
    • Her özelliği uçtan uca, adım adım ekleyen bir yöntem izliyor
  • Fernando Borretti’nin Lessons from Writing a Compiler yazısı, derleyici uygulama stratejisini açık ve net bir dille anlatıyor
  • egg: Fast and extensible equality saturation makalesi, optimizer ve pass sıralaması hakkındaki bakışı kökten değiştiriyor
    • Bir ifadenin mümkün olan tüm sürümlerini sıkıştırılmış bir hypergraph içinde tutup en iyi sürümü seçme düşünce tarzını sunuyor
  • Chris Fallin’in Cranelift: Using E-Graphs for Verified, Cooperating Middle-End Optimizations metni, e-graphs’ın gerçek ticari derleyicilerde de etkili biçimde çalıştığını gösteriyor
  • Phil Zucker’ın Acyclic Egraphs and Smart Constructors yazısı, acyclic e-graph yapısını ve smart constructor kullanımını inceliyor
    • İlk başta anlaşılması zordu ama zaman geçtikçe giderek daha derin anlaşılan bir yazı

AST saklama, büyük ölçekli paralel dinamik yorumlama ve diğerleri

  • Bob Nystrom’un bu Reddit yorumu ve Adrian Sampson’ın Flattening ASTs yazısı,
    • AST’yi neredeyse bytecode kadar kompakt biçimde saklama yöntemini ve,
    • IR düğümlerinin bu şekilde saklanmasının büyük ölçekli paralel, lock-free yorumlamayı da mümkün kılabileceğine dair kapsamlı bir tartışmayı gündeme getiriyor
    • Cliff Click’in buffer allocation hızı ile ilgili yorumları da bu düşünce biçimini etkilemişti

1 yorum

 
GN⁺ 2025-05-15
Hacker News görüşleri
  • Bu yazıyı gerçekten çok sevdim. Son zamanlarda bilgisayar bilimi araştırmalarına epey daldım ama burada anılan şeylerin bazılarıyla hâlâ karşılaşmamıştım. Benim sevdiğim ama burada yer almayan birkaç makaleyi paylaşmak istiyorum: Ian Piumarta’nın “Open, Extensible Object Models” makalesi, programcıya mümkün olan en yüksek özgürlüğü veren minimal nesne yönelimli bir metaobject sistemi ele alıyor. Temelde yalnızca mesaj gönderme işlemini tanımlıyor ve geri kalan her şey çalışma zamanında değiştirilebiliyor. “Art of the Metaobject Protocol”ün pratik bir sürümü gibi. John Ousterhout’un “Scripting: Higher-Level Programming for the 21st Century” makalesi ise sistem programlama dilleri ile betik dilleri arasındaki ikiliği ele alıyor. Hepimiz hem hızlı hem üretken olmayı sağlayan kusursuz çok paradigmalı bir dil hayal ediyoruz ama derlenen, hızlı ve karmaşık bir sistem dilinin; kullanışlı ve esnek, yorumlayıcılı bir ön yüzle birleşmesi çoğu zaman daha iyi olabiliyor. Hatta çoğu durumda sadece C ile Tcl’yi birlikte kullanmak bile yeterli oluyor. Programlama dili yapan herkesin mutlaka okuması gereken bir yazı. Niklaus Wirth’ün Project Oberon projesi ise üst düzey UI’dan çekirdeğe, derleyiciye ve RISC benzeri CPU mimarisine kadar tüm bir bilgisayar sisteminin nasıl hayata geçirildiğini gösteriyor. “Lean software” için güçlü bir çağrı yaptı ve bunu gerçekten uyguladı. Bugünün bağımlılık cehennemi ve aşırı soyutlama çağında bu, kaybolmuş bir ustalık gibi geliyor

    • Ousterhout’un yaptığı ayrıma ve vardığı sonuca katılmıyorum. Onun temel iddiası, bir dilin ya sistem dili (C) ya da betik dili (Tcl, Python) olduğudur. Sistem dilleri güçlü tiplemeye sahip olup veri yapıları/algoritmalar içindir; betik dilleri ise “tipsiz” oldukları için “yapıştırma” işlerine uygundur. Betik dillerinin “tipsiz” olmaları sayesinde daha kısa ve daha hızlı geliştirme sağladığını öne sürüyor ama bence bu, durumu gerçekçi biçimde açıklamıyor. Örneğin Tcl koduyla C++/MFC kodunu karşılaştırıp Tcl’nin daha iyi olduğunu söylüyor ama aslında bu, sözdizimini daha çok beğenmesinden ibaret. Tipe sahip olmayan dillerin daha hızlı geliştirme sağladığı iddiası doğru değil; mesele sadece kısıtlarla ne zaman karşılaştığınız. Tip hatalarını çalıştırmadan önce topluca denetlemek daha iyidir ve aslında tüm dillerde statik tip analizi yapılabilir, sadece bu karmaşık ve zordur. PL (programlama dili) tasarımcısı olarak tip denetimini yalnızca çalışma zamanında yapmak, dili kolay geliştirmek adına makul bir tercih olabilir ama bunun daha iyi bir tercih olduğu anlamına gelmez
  • Bu yazıyı gerçekten çok sevdim. Programlama dilleri hakkında yazılan şeyler, programlamanın kendisine bakışımı değiştirdi. TAPL(Types and Programming Languages)'daki “güvenlik” alıntısını sık sık hatırlıyorum: güvenli bir dil, programcının kendi ayağına kurşun sıkmasını engelleyen ve kendi soyutlamalarını koruyabilen dildir. Yani önemli olan, dilin sunduğu soyutlamalarla programcının kurduğu üst düzey soyutlamaların bütünlüğünü koruyabilme yeteneği. Örneğin elimizde dizi diye bir soyutlama varsa, yalnızca açıkça güncellendiğinde değişebilmelidir; yanlışlıkla başka veri yapılarıyla oynanırken bozulmamalıdır

  • İlginç geliştirme alışkanlıklarından söz etmişken… APL ile tanınan Aaron Hsu, düşüncelerini toparlamak için dolma kalemle kaligrafi gibi kod yazıyor. Ben de benzer şekilde ucuz bir tükenmez kalemle Python nesnelerinin akış şeması benzeri çizimlerini yaparak düşüncelerimi düzenliyorum. Bir nevi düşük bütçeli UML

    • Ben de en zor problemlerle uğraşırken dolma kalem arıyorum. Dolma kalem kullanınca tamamen farklı bir düşünme alanına geçtiğimi hissediyorum. Düzenleme sınırları daha tutarlı ve daha doğrusal düşünmeyi teşvik ediyor ama aynı zamanda İngilizce, kod, matematik ve diyagramlar arasında serbestçe geçiş yapabildiğim için yaratıcılığı da açıyor

    • El yazısı ile hafızanın güçlenmesi arasında gerçekten kanıtlanmış bir ilişki var. Bilgisayarda not almak, bir kapı koluna parmak izi bırakmak kadar yüzeysel gibi geliyor. OCR teknolojisinin gerçekten çok iyi hâle gelip, tamamen el yazısıyla tutulan notların bile kusursuz biçimde saklanıp aranabilmesini isterdim

  • Rich Hickey’nin konuşmalarını, özellikle ilk dönem konuşmalarını, mutlaka izlemenizi tavsiye ederim. Benim için de bu konuşmalar programlamanın kendisine bakışımı tamamen değiştirdi

    • Benim için Larry Wall’un “Programming Perl” kitabıyla birlikte Rich Hickey’nin konuşmaları en etkili şeylerdi

    • Simple made easy” konuşması son 10 yılda o kadar çok konferans konuşmacısı tarafından alıntılandı ki artık klişeye dönüştü; o yüzden espri olsun diye atlayın demek istiyorum. Şahsen “Hammock driven development” daha çok hoşuma gidiyor ama bunu iş yerinde önermek biraz zor

  • Abdulaziz’in Kuveyt’e döndükten sonra sessizleşmesi üzücü. 2009’da Maxine VM stajyeriydi ve gerçekten çok iyi bir insandı. O makale tam anlamıyla bir mücevher

    • Ben de üzülüyorum ama yakın zamanda bir fırın açtığı ve işlerin iyi gittiği anlaşılıyor. O açıdan bakınca hayalini yaşıyor denebilir
  • Kısa süre önce yorumlayıcıları hızlandıran closure tabanlı yorumlayıcılar hakkında güzel bir yazı vardı. Ben de bu tekniği kullanarak basit bir brainfuck yorumlayıcısı yaptım ve oldukça hızlıydı. Başka yerde işime yarar mı bilmiyorum ama deney olarak yapmak faydalı oldu

    • Closure dizileri ile fonksiyon işaretçisi-veri çiftlerinin dönüşümlü yer aldığı diziler arasındaki farkı merak ediyorum. İkincisi çoğu dilde doğal hissettirmiyor, daha çok C gibi dillere uygun. Ama statik fonksiyonlarla veriyi aynı dizide tutmanın önbellek dostu olabileceğini düşünüyorum
  • Keşke JavaScript ya da .NET gibi daha yüksek seviyeli diller için de böyle yazılar olsa. Bu yazar çok zeki biri ama çoğu kullanıcıdan daha alt seviyede (ya da üst seviyede?) çalışıyor

  • Blogundaki diğer yazılar da gerçekten harika

  • micrograd ile ilgili olarak: GitHub deposundaki kaynak kod dışında daha fazla dokümantasyon olup olmadığını merak ediyorum

  • Bunu bu kişiyi sevdiğim için söylüyorum ama buradaki yazılar PL’nin (programlama dillerinin) kendisiyle ilgili değil; neredeyse hepsi derleyicilerle ilgili (çöp toplayıcı hariç). Elbette derleyicileri de severim ama bu, PL konusundan ayrı bir alan

    • Kastedilen şey programlama dili (uygulaması) değil mi?