2 puan yazan GN⁺ 2026-02-08 | 1 yorum | WhatsApp'ta paylaş
  • x86-16 assembly ile yazılan SectorC, bir x86 makinenin önyükleme sektörü (512 bayt) içine sığan ultra küçük bir C derleyicisidir ve gerçekten çalışabilen programlar yazmaya yetecek kadar C dilinin bir alt kümesini destekler
  • Global değişkenler, fonksiyonlar, if/while ifadeleri, operatörler, pointer dereference, yorumlar ve inline assembly dahil olmak üzere, en az yapıyla bile tam program yürütmesi mümkündür
  • Tokenizer'ı basitleştirmek için boşluk tabanlı tokenization ve atoi() hash'ini kullanan Barely C dili tasarlandı; böylece mevcut C sözdizimi korunurken aşırı boyut küçültme sağlandı
  • Kod optimizasyonu sürecinde jump kaldırma, call fusion, 8 bit offset kullanımı, stosw/lodsw kullanımı gibi çeşitli assembly düzeyi sıkıştırma teknikleri uygulanarak boyut 468 bayttan 303 bayta indirildi
  • Sonuç olarak 512 bayt içinde tokenizer, parser, code generator ve runtime dahil tam bir C derleyicisi gerçekleştirildi ve yazılım minimalizminin uç bir örneği gösterildi

SectorC'ye genel bakış

  • SectorC, x86-16 assembly ile yazılmış bir C derleyicisidir ve 512 baytlık önyükleme sektörü içine tamamen sığar
    • GitHub deposu: xorvoid/sectorc
    • Desteklenen dil, gerçek program yazımına imkân verecek düzeyde bir C alt kümesidir
  • Desteklenen özellikler arasında global değişkenler, fonksiyonlar, kontrol yapıları (if/while), çeşitli operatörler, pointer dereference, inline assembly ve yorumlar bulunur
  • Örnek program olarak VGA modunda sinüs dalgası animasyonu çizen kod sunulur

Tasarım arka planı ve yaklaşım

  • Mevcut C tokenizer'ları 512 bayta sığmayacak kadar büyük olduğundan, dilin yapısının kendisini basitleştirmek gerekiyordu
  • Big Insight #1: Forth dili gibi boşlukla ayrılmış token yapısı benimsenerek “Barely C” adlı türev bir dil tasarlandı
    • Örnek: int(main)(){while(!done){ gibi bir ifade tek bir “mega token” olarak işlenir
    • Buna rağmen mevcut C derleyicileri tarafından hâlâ geçerli C kodu olarak tanınır
  • Big Insight #2: atoi() fonksiyonu bir hash fonksiyonu gibi kullanılarak token'lar sayıya dönüştürüldü
    • Tamsayı literal'leri, anahtar kelimeler ve tanımlayıcıların tümü atoi() sonuç değeriyle işlenir
    • Tanımlayıcılara 64K dizinin indeksleri üzerinden erişilir

Barely C uygulaması

  • İlk uygulama 468 bayt boyutundaydı ve atoi tabanlı token'lar kullanan bir recursive descent parser yapısına sahipti
    • Sembol tablosu olmadan, 64K segment'e hash değerleri üzerinden doğrudan erişiliyordu
    • Kod üretimi OTCC tarzında yapılıyor, sonuçları tutmak için ax register'ı kullanılıyordu
  • Daha sonra byte-threaded code deneyiyle Forth benzeri bir yapı denendi, ancak 512 bayt sınırı içinde bunun tersine daha verimsiz olduğu görüldü ve vazgeçildi

Kod küçültme teknikleri

  • Daha doğrusal bir yapıya dönülerek boyut 468 bayt → 303 bayt seviyesine indirildi
    • Jump kaldırma (fall-through), tail-call, call fusion, stosw/lodsw kullanımı, 8 bit jump offset'lerini koruma gibi teknikler kullanıldı
  • 207 baytlık boş alan kazanılarak ek özellikler gerçekleştirildi

Tam C özelliklerine genişleme

  • Ek 200 bayt ile tam C sözdizimi desteği sağlandı
    • İç içe if/while blokları, çeşitli ikili operatörler (+, -, *, &, |, ^, <<, >>, ==, !=, <, >, <=, >=)
    • Fonksiyon tanımı ve recursive çağrılar, inline assembly (asm), tek satırlık/çok satırlı yorumlar desteği
    • Operatör tablosu (binary_oper_tbl) üzerinden her operatör 4 bayt olarak tanımlanarak 14 operatör 56 baytta işlendi

Sözdizimi yapısı

  • Tüm dilbilgisi program, var_decl, func_decl, statement, expr gibi parçalardan oluşur
  • Hem // hem de /* */ yorumları desteklenir
  • Dilbilgisi tanım metninin kendisi 704 bayttır; yani gerçek uygulamadan daha büyüktür

Inline assembly ve runtime

  • asm ifadesi ile x86-16 makine kodu doğrudan eklenebilir
    • I/O işleme için gerekli bir özelliktir
  • Runtime (rt/), C ile yazılmış iki dosyadan oluşur
    • rt/lib.c: inline assembly tabanlı kütüphane rutinleri
    • rt/_start.c: program giriş noktası _start()

Örnek programlar

  • examples/hello.c: metni doğrudan 0xB8000 belleğine yazar
  • examples/sinwave.c: VGA modu 0x13'te sinüs dalgası animasyonu gösterir
  • examples/twinkle.c: PC hoparlörüyle “Twinkle Twinkle Little Star” çalar (ses uyarısı içerir)

Sonuç

  • SectorC, imkânsız gibi görünen bir hedefi gerçekleştiren ultra küçük bir C derleyicisidir ve
    yazılım minimalizmi ile yaratıcı dil tasarımının uç bir örneğini gösterir
  • Yazının sonu mizahi bir “ne öğrendik” seçeneğiyle biter ve
    imkânsıza meydan okuma tavrını ve yazılımı sadeleştirmenin değerini hicivli biçimde vurgular

1 yorum

 
GN⁺ 2026-02-08
Hacker News yorumları
  • Eğer böyle bir uygulama 1980'lerde var olsaydı, C standardına farklı token'ların aynı 16 bitlik değerde hash çakışması yaratması durumunda tanımsız davranışa (UB) yol açtığını söyleyen bir kural eklenirmiş gibi geliyor
    2000'lerin optimize edici derleyicileri de muhtemelen böyle token'ları doğrudan no-op olarak optimize ederdi 😉
    • "-wTokenHashCollision seçeneğini açmadın ki! UB senin cehaletin yüzünden oluştu. Spesifikasyon son derece açık!" diye şaka yollu bir yanıt bırakmış
    • Fazla gerçekçi olduğu için kahkaha attım. LMAO
  • Yakın zamanda yaptığım X86-16 boot sector C compiler ile benzer görünüyor
    Boot sector oyunu yapmak gerçekten nostalji uyandıran büyülü bir deneyim. Programlamanın gerçekten eğlenceli olduğu zamanları hatırlatıyor
    Yapay zeka çağında böyle projelerin fazla küçümsenmesine üzülüyorum
    projemin bağlantısı
    • Hmm, yazıda ele alınan şey tam C değil, 512 bayta sığan bir C benzeri dil derleyicisi
      Senin projenin boot sector için kod üretebilen bir seçeneği var gibi görünüyor.
      İkisi de ilginç ama ortak noktaları sadece 'boot sector', 'C' ve 'compiler' kadar
    • "Programlamanın gerçekten eğlenceli olduğu zamanlar" sözüne katılıyorum ama artık çok daha fazla insan aynı şeyi yapabiliyor
      Bu yüzden artık özel olmadığımı hissediyorum
  • Bu tür projeler, modern geliştirmenin donanımdan ne kadar uzaklaştığını hatırlatıyor
    Sürekli soyutlama katmanları ekliyoruz; artık bir "Hello World" çalıştırmak için bile 200MB node_modules gerekiyor
    Ama biri çıkıp 512 bayta bir C derleyicisi sığdırıyor
    Herkesin boot sector kodu yazması gerektiğini söylemiyorum ama böyle projeleri okumak gerçekten insanı mütevazı kılıyor. Eğitsel değeri de çok yüksek
  • Ben tam olarak bu projenin yazarı olabilirim. Yapım süreci gerçekten çok keyifliydi!
    • Gerçekten harika. Ben de minimalist bir C derleyicisi yapıyorum ama boot sector'a sığdırmak yerine 8 bit sistemleri hedefliyorum
      Bu proje, C'nin temel yapısının ne kadar basit olduğunu çok iyi gösteriyor.
      C'nin B dilinden, B'nin de Fortran'ın küçültülmüş bir sürümünden evrilmiş olması ilginç
    • if, while ve for'u basit goto rutinlerine çevirirsek ne kadar daha küçülebileceğini merak ediyorum
      Sonuçta assembly tarafında eninde sonunda sadece jmp var.
      Ayrıca "choose your own adventure" değil, "chose your own adventure" olmalı :)
      Ben minimalizme bayılırım
    • Bu derleyici ya da 'barely-C' fikri, bir bootstrap zincirinde de kullanılabilir gibi görünüyor
      Çok küçük, platforma özel bir ikiliden başlayıp giderek daha karmaşık araçlar ve derleyiciler üretmek gibi
      Örnek olarak mishmashvm ve tcc_bootstrap_alt projelerine bakılabilir
  • Güzel bir proje. Yalnız başlığa 2023 eklenmesi iyi olur
    O zamanki tartışma buradaydı
    • Teşekkürler! Makro genişletilmiş sürüm için bunu
      SectorC: A C Compiler in 512 bytes - bağlantı - Mayıs 2023 (80 yorum) şeklinde toparlayabiliriz
  • Dün HN'de paylaşılan, Claude'un iki haftada 20 bin dolara yaptığı 100 bin satırlık C derleyicisiyle karşılaştırmak ilginç
    • Eğlenceli bir karşılaştırma ama öteki Linux kernel'i derleyebiliyor ve birden fazla mimari için kod üretebiliyor
      Buna karşılık bu proje C'nin yalnızca bir kısmını işleyebiliyor
      Yani bu, tam bir C derleyicisinden çok C'nin bir alt kümesini ele alan bir derleyici.
      Bu derleyiciyle derlenebilen kod, gerçek bir C derleyicisinde de derlenir ama tersi geçerli değil
  • Token hashing kullanarak sözde bir sembol tablosu oluşturma fikri gerçekten zarif
    • Ben de geçmişte test aracı için bir parser yaparken tanımlayıcıları yalnızca sembol hash değerleriyle yönetmiştim
      Neyse ki 32 bit çakışmaya yetecek kadar çok sembol kullanmamışımdır diye umuyorum
    • Ben de aynı şeyi düşündüm. Token hashleme numarası gerçekten çok iyi
      Bu arada 0x01e0~0x01fd arasında 21 bayt boş alan kalmış. Belki oraya başka bir şey daha sığar ;)
  • "atoi()'nin düz metin üzerinde kötü bir hash fonksiyonu gibi davranması" kısmı ilginçti
    Ama hatırladığım kadarıyla atoi(), geçersiz girdi için 0 dönecek şekilde tanımlanmıştı
  • Boot sector derleyicilerine epey ilgim var
    Linux'ta çalıştırırken qemu çağrısında coreaudio yerine alsa kullanmak yeterli
    Bunun için GitHub'a bir pull request gönderdim. Yazar benim ayrıntılı shell script tarzımı sorun etmezse belki merge eder
  • Gerçekten harika bir yazıydı! Bana eskiden yaptığım boot sector OS'u hatırlattı
    Sanırım artık ona bir C derleyicisi eklemeyi deneme zamanı geldi
    OS projemin bağlantısı