Geri Dön
1024 baytlık C koduna sığan bir Python yorumlayıcısı
SiTech AI Team2 წთ. საკითხავი

1024 baytlık C koduna sığan bir Python yorumlayıcısı

Austin Henley çalışan bir Python yorumlayıcısını 1024 baytlık C koduna sığdırdı: iç içe döngüler, fonksiyonlar ve fizzbuzz — soyut sözdizimi ağacı, bytecode ve hata yönetimi olmadan.

Austin Henley'in hafta sonu projelerinin çoğu kodu elle yazmak için bir bahane; son projenin ise sıkı bir bütçesi vardı: 512 baytlık kaynak koduna sığan, C ile yazılmış bir Python yorumlayıcısı. Bu hedef ulaşılamaz çıktı — kendi deyişiyle code golf becerileri yeterli değildi — o yüzden makro numaraları ve işi kendisi yapan kütüphaneler olmadan 1024 baytta karar kıldı.

Test programı, belirgin biçimde Python gibi görünen bir fizzbuzz'dı: def var, iki nokta üst üste var, girinti var ve if koşulu parantezsiz. Dilin yalnızca bir alt kümesi sığıyor ve kurallar katı.

Yorumlayıcı ne yapıyor, neyi yapmayı reddediyor

Hiçbir hata yönetimi yok: yorumlayıcı anahtar sözcüklerin doğru yazıldığını ve token sınırlarının doğru olduğunu varsayıyor. Programı okurken boşlukların neredeyse tamamını atıyor; yalnızca girintiyi ve dizge sabitlerinin içindeki boşlukları koruyor. Değişken ve fonksiyon adları tek küçük harfle sınırlı; böylece sembol tablosu araması tarama değil doğrudan dizi indeksi oluyor. Durum birkaç global değişkende tutuluyor: 999 baytlık kaynak tamponu, 256 gözlü sembol tablosu ve birkaç konum işaretçisi.

Soyut sözdizimi ağacı olmadan çalıştırma

Tasarımın CPython ile neredeyse hiçbir ortak yanı yok; CPython önce token'lara ayırır, soyut sözdizimi ağacı kurar, analiz eder, bytecode'a derler ve ancak ondan sonra yorumlar. Henley'in sürümü özyinelemeli inişle ayrıştırıp ifadeleri ayrıştırma sırasında çalıştırıyor; girinti azaldığında blok geri dönüyor, yani iç içe geçmeyi C'nin çağrı yığını üstleniyor. Hiçbir şey derlenmediği için döngüler geriye atlayıp her yinelemede kaynağı yeniden ayrıştırarak çalışıyor ve koşulun başlangıcını hatırlıyor. Fonksiyon çağrısı, çağıranın konumunu kaydedip gövdeye atlıyor, sonunda konumu geri yüklüyor.

1024 bayta nasıl indi

4800 baytı aşan okunabilir sürümden 1024'e inmek sıradan golf gerektirdi: kısa adlar, gereksiz parantezlerin atılması ve C'de golf üzerine eski bir Stack Overflow başlığından alınan, GNU C89 tuhaflıklarını da içeren numaralar. Dört argümanlı ayrıştırıcı fonksiyonu, hangi operatörün okunduğunu ASCII aritmetiğiyle belirleyen tek satıra dönüştü; satır sonuna atlama yardımcısı Y(){c&&c-10&&Y(G());} haline geldi. Sırada karşılaştırma operatörleri vardı — truthiness sayesinde if n%15: yine de çalışıyor — ve Henley'e göre yalnızca fizzbuzz için yazılan bir sürüm 800 baytın altına inebilirdi. İki sürüm de GitHub'da.

SSiTech

SiTech — AI destekli web geliştirme

Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.