3 puan yazan GN⁺ 2024-07-13 | 1 yorum | WhatsApp'ta paylaş
  • Crafting Interpreters, kendi dilini oluşturmayı denemek isteyen okurların tam bir betik dili implementasyonunu baştan sona izleyebilmesi için kurgulanmış bir kitaptır
  • Ayrıştırma ve semantik gibi dil tasarımı kavramlarından bayt kod gösterimi ve çöp toplama gibi çalışma zamanı implementasyonlarına kadar tek bir akışta ele alır
  • Okur main()den başlayarak dinamik tipler, leksik kapsam, birinci sınıf fonksiyonlar, closure’lar, sınıflar ve kalıtım içeren bir dili bizzat implemente eder
  • Birkaç bin satırlık temiz ve hızlı kodun tamamını doğrudan yazdırarak, tamamlanan sonuçtan çok iç işleyişi anlamaya odaklanır
  • Basılı kitap, eBook, PDF ve web formatlarında sunulur; web’de tüm bölümler, ek yazılar ve illüstrasyonlar ücretsiz okunabilir

Kitabın implementasyon kapsamı

  • Crafting Interpreters, kendi programlama dilini oluşturmak isteyen veya dillerin nasıl tasarlanıp implemente edildiğini merak eden okurları hedefler
  • Kitap, tam özellikli bir betik dili implemente etmek için gereken temel konuları birlikte ele alır
    • Ayrıştırma
    • Semantik
    • Bayt kod gösterimi
    • Çöp toplama
  • Implementasyon main()den başlar ve sonunda aşağıdaki özelliklere sahip bir dile genişler
    • Zengin sözdizimi
    • Dinamik tipler
    • Leksik kapsam
    • Birinci sınıf fonksiyonlar
    • Closure’lar
    • Sınıflar
    • Kalıtım

Okuma biçimi ve ortaya çıkan ürün

  • Okur örnek kodu yalnızca görmek yerine her satırı bizzat yazarak dil işleyicisinin iç yapısını takip eder
  • Nihai kod birkaç bin satır ölçeğindedir ve temiz, hızlı bir implementasyonu hedefleyecek şekilde kurgulanmıştır
  • Üst düzey kavramlar ile düşük seviyeli implementasyonu ayrı ayrı açıklamak yerine, tek bir dili tamamlama sürecinde birlikte anlaşılacak şekilde tasarlanmıştır

Sunulan formatlar

1 yorum

 
GN⁺ 2024-07-13
Hacker News yorumları
  • Yazarıyım. Kitabıma gelen olumlu tepkileri görmek gerçekten içimi ısıtıyor. Ona çok zaman ve sevgi harcadım; umduğum etkiyi yarattığını görmek büyük bir tatmin

    • Kendi kendini yetiştirmiş, üstelik programlamaya ancak 21 yaşında başlamış bir yazılım mühendisiyim; ilk işimde bana basit bir sorgu dili ve onun yorumlayıcısını yapma görevi verildi. Yorumlayıcının ne olduğunu hiç bilmiyordum ama 2017’de bu kitabı internette bulup 3-4 gün içinde çalışan bir prototip, 1-2 hafta sonra da gerçek ürünü çıkarabildim
      Bu kaynak sayesinde özgüvenim ciddi şekilde arttı ve o projeyi hâlâ en sevdiğim işlerden biri olarak hatırlıyorum
    • Kitabı yazdığın için teşekkürler. Şu anda 1. bölümü neredeyse bitirmek üzereyim ve sırf denemek istediğim için Haskell ile takip ediyorum; her bölümde, aklıma gelen “akıllı kestirmelerin” sonraki gereksinimler karşısında pek de akıllı olmadığını fark ediyorum
      Lox için derleyici ya da JIT gibi bir devam kitabı yazmayı düşünüp düşünmediğini de merak ediyorum. Bir de lexical analygator müthiş; şirket içi sunumlarda kaynak gösterilerek defalarca yer aldı, hatta bir ara beyaz tahtada fan art’ı bile vardı
    • Game Programming Patterns da harika. İki kitapta da üslubun dürüst ve doğrudan olduğu hissi var
      Bazı yazarlar sanki bu alanın tamamen kara büyüymüş gibi gösterilmesi gerektiğini düşünüyor; belki de GoF tasarım kalıplarını anlayacak kadar iyi olmayan bendim
    • Kitabı henüz tamamen bitirmedim ama internette ücretsiz olarak yayımlamış olman gerçekten minnettar edici. Basılı kitabı, PDF’i ve Kindle sürümünü aldım; başkalarına da yazarı böyle desteklemelerini öneriyorum
    • Bu kitap ve Writing An Interpreter In Go, daha fazla zaman bulduğumda mutlaka okumak istediğim kitaplar. Temel bir dizgi dili yapmakla ilgili epey fikrim var
  • Crumb’ı (https://github.com/liam-ilan/crumb) yaparken Crafting Interpreters’ı okudum; özellikle kapsamlar ve yerel değişkenler bölümü vazgeçilmezdi
    Teknik uygulama ile kavramsal içgörü arasındaki denge iyi olduğu için, kitabın belirlediği yoldan sapmaya çalışırken bile çok yardımcı oluyor. Bu tür teknik yazılar için hedef gösterilecek kadar yüksek seviyeli bir kaynak

    • “Mühendis adayı” demişsin ama Crumb’ı yaptığına göre zaten iyi haber var
    • Kendine şimdiden mühendis diyebilirsin. Mütevazı olmana gerek yok; bilgisayar bilimi diplomasını bitirmek mühendis olmanın şartı değil
      Dokümantasyon da iyi, proje de harika
    • Güzel görünüyor. Hangi veri tiplerini ekleyeceğine nasıl karar verdiğini merak ediyorum
  • Bu kitapta en sevdiğim kısım, aynı dil için iki farklı yorumlayıcı yazmaya yönlendirmesi
    Bu sayede programlama dili yapma sürecinin daha karmaşık ve incelikli kısımlarını iyi anlayabiliyorsunuz. Kitabın ilk yarısında büyük fikirlerle önce karşılaşıp onlara alıştıktan sonra, ikinci yorumlayıcıda tekrar karşınıza çıktıklarında ilginç kısımları gerçekten özümseyebiliyorsunuz. Gerçekten şaşırtıcı derecede iyi bir kitap

  • Diğer derleyici kaynakları da konuşulmuşken, henüz tamamını izlemedim ama Immo Landwerth’in C# ile derleyici yapıp IL ve debug sembolleri vb. ürettiği videolar da iyiydi
    Yaklaşık 5 yıl öncesine ait olduğu için güncel C# sözdizimi değil; sanırım .NET Core 3 civarı bir dönemden, ama çoğu iş için büyük sorun olmayacaktır. Yalnız nullable türlerle ilgili uyarılar çok çıkabilir
    https://www.youtube.com/playlist?list=PLRAdsfhKI4OWNOSfS7EUu...

  • Çoğu programcının bir noktada bu kitabı baştan sona takip etmesi gerektiğini düşünüyorum. Bunu yapınca derleyicilerin ya da dil araçlarının içinde gerçekte neler olup bittiğini çok daha iyi anladım
    Şimdiye kadar takip ettiğim teknik rehberler arasında en iyi yazılmışlardan biri; kavramları gerçekten sahiplenmeme çok yardımcı oldu. Bu kavramlar yalnızca derleyicilerde değil, pek çok yerde işe yarıyor

    • Derleyiciler dışında nerelerde yararlı olduğunu merak ediyorum. Örneğin veri formatı ayrıştırma gibi yerler olabilir
  • Bu kitabın ikincil ama belki de aynı derecede önemli bir avantajı açıklığı öğretmesi
    Metin, kod, yapı ve tempo tamamen açık ve öz. “Crafting” kelimesi tam yerine oturuyor; zanaatkârın zanaatkârlar için yazdığı bir kitap gibi hissettiriyor

  • Bence bu kitap, programlama dili derleyicileri yolculuğunun ikinci ya da üçüncü adımı olmalı
    İlk adım, yorumlayıcılar veya dil tasarımı hakkında hiçbir şey bilmeden, kendi yaptığın basit bir dil için tek başına bir yorumlayıcı yazmaya çalışmak. İkinci adım, daha az hata yaparak onu yeniden yazmak
    Bunu yapmadan bu konunun inceliklerini gerçekten takdir etmek zor; önemli görünmeyen kavramların üzerinden kolayca geçiliyor

    • Benim için bu kitap, bu konuların gizemli görünmesini engelledi; hatta ikinci ve üçüncü adımlara başlayabilmemi sağladı
      Her tekniği en baştan kendin yeniden icat etmek zorunda değilsin. Devlerin omuzlarında yükselmek doğal bir şey
    • Nereden başlayacağımı bilmiyordum ve böyle bir projenin yeteneklerimi aşan büyülü bir şey olduğunu düşünüyordum. Ama Crafting Interpreters’ı okuyunca, düşünceme sadece küçük bir itiş gerektiğini anladım
      CI gibi bir şeyi önce okumasaydım kendi yorumlayıcımı yazmayı denemezdim bile; üçüncü adıma da ulaşamazdım
    • Java’yı yeni öğrenmeye başladığımda kendi dilimi yapmak istediğimi hatırlıyorum. Hiç araştırmadan operatör önceliği algoritması uygulamıştım; token listesini tarayıp her seferinde önceliği en yüksek alt ifadeyi buluyordum
      Özyineleme yoktu; her şeyi doğrudan stack’e koyup çıkarıyordum. Sorun, ayrıştırmayı doğru anlamadığım için dilin çoğunu string.split ve string.replace ile uygulamam ve beklenildiği gibi iç içe geçirilemeyen kavramların ortaya çıkmasıydı. Kaynak kodu saklamadığıma üzülüyorum
    • Ben de tam olarak bunu yaptım. İlk adım olarak TeX benzeri bir dil yapıp makro tanımlama ve değiştirmeyi uyguladım
      Birkaç gün geçmeden o kadar çok hatayla karşılaştım ki daha akademik bir tutum edinip kitap okumaya başladım. Yine de harika bir ilk adımdı; böyle bir deneme olmasa bunun bir kitaplık konu olduğunu bile fark etmeyebilirdim
  • Böyle bir adanmışlığa sahip insanlara ve geliştirme altyapısını sürdüren herkese gerçekten saygı duyuyorum; ama kendi “dilimi yapmak istiyorum” evremin kısa süreli bir heves olarak bitmiş olmasına seviniyorum
    İş yükü gerçekten muazzam

    • Mutlaka muazzam bir iş yükü olmak zorunda değil. Orijinal SICP kitabındaki Lisp-in-Lisp ya da Haskell ile yazılmış lambda kalkülüs yorumlayıcısı tek ekrana bile sığar
  • Parametrik polimorfizm ve temel tür çıkarımı gibi şeylere sahip statik tür denetimli bir dil yapmak için iyi kaynaklar bilen var mı, merak ediyorum

    • Böyle bir kitap yazmam için birçok kez istek aldım, ama hâlâ yazmamış olmamın büyük nedeni konunun çok açık uçlu olması
      Crafting Interpreters’ta değişken kapsamı, fonksiyonlar, closure’lar, sınıflar ve dinamik dispatch, kontrol akışı gibi öğretmek istediğim neredeyse tüm kavramları içerebilecek küçük ve kendi içinde bütünlüklü bir dil yapılabileceğini hissetmiştim
      Buna karşılık tür sistemlerinde tasarım alanında çok fazla yol ayrımı var ve net bir “en iyi” rota yok. Alt türleme var mı, jenerikler siliniyor mu yoksa somutlaştırılıyor mu, jenerik kod derleme zamanında özelleştiriliyor mu, tür çıkarımı yerel mi yoksa Hindley-Milner mı gibi seçimlerin hepsi birer yol ayrımı
      Hangi seçimi yaparsan yap, seçmediğin dallardaki önemli içerikleri kaçırmış ve başka bir yolu bekleyen okurları hayal kırıklığına uğratmış olabilirsin. Belki Types and Programming Languages gibi daha geniş kapsamlı bir genel bakış kitabı daha uygun olabilir, ama o zaman da tek bir tutarlı şeyi adım adım inşa etmenin keyfi kaybolur
    • A. W. Appel’in Modern Compiler Implementation in ML kitabı var
      Aynı kitabın C ve Java sürümleri de var ama bence daha zayıflar. ML sürümüyle birlikte kullanmak daha iyi olur
    • Parametrik polimorfizm ve tür çıkarımının özü nihayetinde Algorithm W uygulamaktır. İnternette oyuncak uygulamalar bulup kendin kurcalayabilirsin
      Ben https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master... içindeki uygulamanın çok eski tarz olduğunu görüp modernleştirerek ve düzenleyerek https://gist.github.com/kccqzy/fa8a8ae12a198b41c6339e8a5c459... hâline kadar getirdim. Sonra algoritmanın nasıl bozulduğunu görmek için çeşitli kısımları bilerek “bozdum”
    • Biraz daha teorik ama Coursera’daki derleyiciler dersini yavaş yavaş takip etmek benim için büyük bir dönüm noktasıydı. Bazı videoları birkaç kez yeniden izlemem gerekti
      Yalnızca sihirbazların yapabileceğini sandığım bir bilgisayar bilimi işini erişilebilir bir şekilde denemeyi şiddetle tavsiye ederim. Bir iki tanesini başardıktan sonra, zor olsa da çoğunlukla dişini sıkıp ilerlemekten ibaret olduğunu fark ediyor ve büyük bir özgüven kazanıyorsun. Bu yola girmek isteyenler zellyn@(most things) üzerinden benimle iletişime geçebilir
    1. kısmı yeni bitirdim ve gerçekten iyi bir kitap. Her bölümdeki önerilen alıştırmalardan birer ikişerini bizzat yapmak içeriği anlamaya çok yardımcı oluyor