Geri qayıt
1024 bayt C koduna sığan Python interpretatoru
SiTech AI Team2 წთ. საკითხავი

1024 bayt C koduna sığan Python interpretatoru

Ostin Henli işlək Python interpretatorunu 1024 bayt C koduna sığdırdı: iç-içə döngələr, funksiyalar və fizzbuzz — sintaksis ağacı, baytkod və xəta idarəetməsi olmadan.

Ostin Henlinin həftəsonu layihələrinin çoxu kodu əl ilə yazmaq üçün bəhanədir; sonuncusunun isə sərt büdcəsi var idi: C dilində 512 bayt koda sığan Python interpretatoru. Bu hədəf əlçatmaz oldu — onun sözləri ilə, code golf bacarıqları yetərli deyildi — buna görə makro hiylələri və işi görən kitabxanalar olmadan 1024 baytda dayandı.

Test proqramı açıq şəkildə Python kimi görünən fizzbuzz idi: def var, iki nöqtə var, abzas var və if şərti mötərizəsizdir. Dilin yalnız bir alt çoxluğu sığır və qaydalar sərtdir.

Interpretator nə edir və nədən imtina edir

Heç bir xəta idarəetməsi yoxdur: interpretator açar sözlərin düzgün yazıldığını və token sərhədlərinin doğru olduğunu fərz edir. Proqramı oxuyarkən boşluqların demək olar hamısını atır; yalnız abzasları və sətir literallarının içindəki boşluqları saxlayır. Dəyişən və funksiya adları bir kiçik hərflə məhdudlaşır; beləcə simvol cədvəlində axtarış skan deyil, birbaşa massiv indeksi olur. Vəziyyət bir neçə qlobalda saxlanılır: 999 baytlıq mənbə buferi, 256 hücrəlik simvol cədvəli və bir neçə mövqe göstəricisi.

Mücərrəd sintaksis ağacı olmadan icra

Dizaynın CPython ilə demək olar heç bir ortaq cəhəti yoxdur: CPython kodu tokenlərə bölür, mücərrəd sintaksis ağacı qurur, təhlil edir, baytkoda kompilyasiya edir və yalnız sonra şərh edir. Henlinin versiyası rekursiv enişlə təhlil edir və ifadələri təhlil zamanı icra edir; blok abzas azaldıqda qayıdır, yəni iç-içəliyi C-nin çağırış steki idarə edir. Heç nə kompilyasiya olunmadığı üçün döngələr geri atlayaraq və hər iterasiyada mənbəni yenidən təhlil edərək işləyir, şərtin başlanğıcını yadda saxlayır. Funksiya çağırışı çağıranın mövqeyini saxlayır, gövdəyə atlayır və sonda mövqeyi bərpa edir.

1024 bayta necə düşdü

4800 baytı keçən oxunaqlı versiyadan 1024-ə enmək adi golf tələb etdi: qısa adlar, lazımsız mötərizələrin atılması və C-də golf haqqında köhnə Stack Overflow mövzusundan götürülmüş, GNU C89 xüsusiyyətlərini də əhatə edən hiylələr. Dörd arqumentli təhlil funksiyası, hansı operatorun oxunduğunu ASCII arifmetikası ilə müəyyən edən bir sətrə çevrildi; sətrin sonuna atlama köməkçisi isə Y(){c&&c-10&&Y(G());} oldu. Növbədə müqayisə operatorları idi — truthiness sayəsində if n%15: yenə işləyir — və Henlinin təxmininə görə, yalnız fizzbuzz üçün yazılmış versiya 800 baytın altına düşə bilərdi. Hər iki versiya GitHub-dadır.

SSiTech

SiTech — AI ilə gücləndirilmiş veb hazırlanması

Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.