1 puan yazan GN⁺ 2025-02-27 | Henüz yorum yok. | WhatsApp'ta paylaş
  • 1993 yapımı DOOM oyununu çalışma zamanı koduyla değil, yalnızca TypeScript tür sistemiyle başlatıp ilk kareyi üreten bir deney
  • İlk kareye kadar TypeScript type checker 3,5 trilyon satır, toplam 177 TB işledi; ilk tahmin 1,25 PB ve 3 aydan fazlaydı
  • Temel uygulama, türlerle oluşturulmuş bir WebAssembly sanal makinesi; DOOM için gereken 116 komutu tür düzeyi mantıkla uygulayıp 18 milyon komutu değerlendirdi
  • Geliştirme sırasında derleyicinin özyineleme, union, tuple ve derin tür örnekleme sınırları kaldırıldı; ancak nihai çıktı kullanıcıların çalıştırabileceği saf TypeScript biçiminde kaldı
  • Sıradan uygulamaların type checking ölçeğinin çok ötesinde bir iş olduğundan mevcut geliştirme araçları neredeyse tamamen işlevsiz kaldı; 12.364 test ve özel araçlar doğrudan geliştirilmek zorunda kaldı

TypeScript tür sisteminin içinde yapılmış bir bilgisayar

  • DOOM, normal JavaScript çalıştırmasıyla değil, yalnızca TypeScript tür sistemi içinde çalışıyor
  • Amaç, hilelere veya başka bir yürütme diline başvurmadan, yalnızca türlerle başka programları da çalıştırabilen bir WebAssembly sanal makinesi oluşturmaktı
  • Tür düzeyi bilgisayar, çalıştırma için gereken temel bileşenleri türler olarak içeriyor
    • RAM
    • Disk alanı
    • Çağrı yığını
    • Alt rutinler
    • Bellek işaretçileri
    • Yürütme bağlamı
    • Özel geliştirme araçları
  • DOOM’u çalıştırmak için gereken 116 WebAssembly komutu TypeScript türleriyle mantıksal olarak uygulandı
  • Yalnızca bu mantık bile type checker’ın tek tek değerlendirmesi gereken 18 milyon komut üretti; her komut sistemin benzersiz bir makine durumunu temsil ediyor

İlk kareye kadarki ölçek

  • İlk DOOM karesini elde etmek için 3,5 trilyon satır tür gerekti ve toplam tür boyutu 177 TB oldu
  • TypeScript derleyicisi TSC, oyunu başlatıp ilk kareyi almak için 12 gün boyunca kesintisiz çalıştırıldı
  • İlk hesaplamalara göre bilgisayarın 1,25 PB TypeScript türü işlemesi gerekiyordu ve çalışma süresinin 3 aydan fazla olacağı tahmin ediliyordu
  • Aşırı optimizasyonların ardından işlenecek miktar 177 TB ve 12 güne indirildi
  • Sıradan bir uygulamada TSC type checking genellikle 200 bin–500 bin tür örneklemesi düzeyindedir; bu çalışmada ise 12 gün boyunca saniyede 20 milyon örnekleme sürdürüldü
  • Nihai çıktı bir TypeScript nesnesi; her değer bir piksel satırını temsil ediyor
    • Çıktı karesi 320×200
    • Toplam 128.000 piksellik bir ASCII kare
  • Oyunu klavye girdisiyle kontrol etmenin de bir yolu var

Geliştirme sırasında kaldırılan TypeScript koruma mekanizmaları

  • Nihai çıktı, kullanıcıların doğrudan çalıştırabileceği saf TypeScript
  • Deneyi mümkün kılmak için TypeScript derleyicisi değiştirilerek çeşitli sınırlar kaldırıldı
    • Tür karşılaştırması sırasında aşırı yığın derinliği sınırının kaldırılması
    • Aşırı derin veya sonsuz olabilecek tür örnekleme sınırının kaldırılması
    • Union ve tuple için maksimum boyutun Infinity olarak ayarlanması
    • Çıktı kırpma sınırının kaldırılması
    • Meşhur TypeScript özyineleme sınırının kaldırılması
  • Bilgisayarın kendi yığın sınırı da yükseltildi
  • Bu koruma mekanizmaları kaldırılınca type checker’ın 100 GB bellek kullanması kolay hale geldi
  • Sınırları kaldırmanın bedeli büyüktü
    • import yazım hatası gibi küçük sorunlar bile sonsuz döngü yaratabiliyordu
    • Heap allocation tüm belleği kullanıp her şeyin çökmesine yol açabiliyordu
    • Stack trace’ler son derece büyüktü ve çoğu hata yalnızca donup kalma şeklinde gerçekleşiyordu

DOOM’u çalıştırmak için ayrıca yapılanlar

  • 6 aylık çalışmanın ardından küçük C programları çalıştırılabiliyordu; ancak DOOM’u çalıştırmak çok daha fazla uygulama gerektirdi
  • DOOM’un tüm bileşenlerinin türler olarak kodlanması gerekiyordu
    • Oyun haritaları
    • Dokular
    • Sprite’lar
    • Ses
    • Düşman AI’ı
    • Silahlar
    • Eşyalar
    • Fizik motoru
    • Ses alt sistemi
    • Oyun içi metinler
  • Tür düzeyinde çalışma zamanına yakın işlevler bile uygulandı
    • Garbage collector
    • L1 CPU cache
    • Çalışma zamanı dead code elimination
    • Gerçek zamanlı bellek compactor’ı
    • Stack underflow koruması için derinlik sayımı içeren global değer stack’i
    • Dinamik dispatch tabloları
    • Modül düzeyi global değişkenler
    • labeled goto
    • Tür düzeyi exception handling
    • Çalışma zamanı stack tracing
    • Tam core dump
  • Doğrusal RAM, 32 bit adres anahtarları ve bayt değerleri olan, sıralanamayan devasa bir nesne olarak temsil edildi
  • Tür kullanıcı alanında tür değerlendirmesini geçici olarak durdurmanın bir yolu bulunarak core dump, exception handling ve stack tracing mümkün hale getirildi

Araç sınırları ve uygulama kısıtları

  • Dosya boyutlarının 1 GB’a kadar çıkması gerektiğinden Prettier’ın işleyebileceği kapsam aşıldı
  • Dil sunucusu entegrasyonu veya linter’lar hemen çöküyordu; pratikte yalnızca sözdizimi renklendirme zar zor çalışıyordu
  • Motorun içi, string literal’larda saklanan iki tümleyen ikili sayılarla uygulandı
  • TypeScript string’leri yalnızca soldan itibaren gezebildiği için tüm ikili algoritmaların ters yönde uygulanması gerekti
  • Motorun içinde dizi, nesne, string veya boolean yok; yalnızca ikili sayılar kullanılıyor
  • DOOM yalnızca 64 bit ve 32 bit tam sayılar kullanıyor; bu tam sayılar ne signed ne de unsigned olduğundan bunu anlamak bir gün sürdü
  • Yapımcı başlangıçta gerekli bilginin %10’unu bile bilmiyordu; kendi araçlarını geliştirip 12.364 testi elle yazarak birçok programlama dilini yeniden öğrendi

Henüz yorum yok.

Henüz yorum yok.