TypeScript türleriyle çalışan DOOM [video]
(youtube.com)- 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
TSCtype 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.