Վերադառնալ
Python ինտերպրետատոր՝ տեղավորված 1024 բայթ C կոդում
SiTech AI Team2 წთ. საკითხავი

Python ինտերպրետատոր՝ տեղավորված 1024 բայթ C կոդում

Օսթին Հենլին աշխատող Python ինտերպրետատորը տեղավորեց 1024 բայթ C կոդում՝ ներդրված ցիկլեր, ֆունկցիաներ և fizzbuzz՝ առանց ծառի, բայթկոդի և սխալների մշակման։ Երկու տարբերակներն էլ՝ ընթեռնելին ու գոլֆածը, GitHub-ում են։

Օսթին Հենլիի հանգստյան օրերի նախագծերի մեծ մասը կոդը ձեռքով գրելու առիթ է, իսկ վերջինը խիստ բյուջե ուներ՝ Python ինտերպրետատոր C-ով, տեղավորված 512 բայթ կոդում։ Այդ նպատակը անհասանելի դարձավ. ըստ նրա՝ code golf-ի իր հմտությունները բավարար չէին, ուստի կանգ առավ 1024 բայթի վրա՝ առանց մակրո հնարքների և առանց գրադարանների օգնության։

Փորձնական ծրագիրը fizzbuzz-ն էր, որը հստակ Python-ի տեսք ունի. կա def, երկու կետ, նահանջ և if-ի պայմանը՝ առանց փակագծերի։ Տեղավորվում է լեզվի միայն մի ենթաբազմություն, ու կանոնները խիստ են։

Ինչ է անում ինտերպրետատորը և ինչից է հրաժարվում

Սխալների մշակում ընդհանրապես չկա. ինտերպրետատորը ենթադրում է, որ բանալի բառերը ճիշտ են գրված, իսկ թոքենների սահմանները՝ ճշգրիտ։ Կարդալիս այն հեռացնում է գրեթե բոլոր դատարկ տարածությունները՝ թողնելով միայն նահանջները և տողային լիտերալների ներսի բացատները։ Փոփոխականների ու ֆունկցիաների անունները սահմանափակված են մեկ փոքր լատինական տառով, ինչի շնորհիվ սիմվոլների աղյուսակում որոնումը դառնում է զանգվածի ուղիղ ինդեքս։ Վիճակը պահվում է մի քանի գլոբալներում՝ 999 բայթանոց աղբյուրի բուֆեր, 256 բջիջանոց սիմվոլների աղյուսակ և մի քանի դիրքի ցուցիչ։

Կատարում առանց վերացական շարահյուսական ծառի

Դիզայնը գրեթե ոչինչ չունի ընդհանուր CPython-ի հետ, որը կոդը բաժանում է թոքենների, կառուցում ծառ, վերլուծում, կոմպիլյացնում բայթկոդի և նոր միայն մեկնաբանում։ Հենլիի տարբերակը ռեկուրսիվ վայրէջքով վերլուծում է և արտահայտությունները կատարում ընթացքում. բլոկը վերադառնում է, երբ նահանջը նվազում է, ուստի ներդրումը մշակում է C-ի կանչերի ստեկը։ Ոչինչ չի կոմպիլյացվում, ուստի ցիկլերը աշխատում են հետ ցատկելով և ամեն իտերացիայում աղբյուրը կրկին վերլուծելով՝ հիշելով պայմանի սկիզբը։ Ֆունկցիայի կանչը պահպանում է կանչողի դիրքը, անցնում մարմնին և վերջում վերականգնում դիրքը։

Ինչպես հասավ 1024 բայթի

4800 բայթը գերազանցող ընթեռնելի տարբերակից 1024-ին հասնելը պահանջեց սովորական գոլֆ՝ կարճ անուններ, ավելորդ փակագծերի հեռացում և C-ում գոլֆի մասին Stack Overflow-ի հին թեմայից վերցված հնարքներ՝ ներառյալ GNU C89-ի առանձնահատկությունները։ Չորս արգումենտով վերլուծիչը դարձավ մեկ տող, որը ASCII-ի թվաբանությամբ որոշում է կարդացվող օպերատորը. տողի վերջին անցնելու ռեկուրսիվ օգնականը դարձավ Y(){c&&c-10&&Y(G());}։ Համեմատության օպերատորները հաջորդն էին հերթում՝ truthiness-ի շնորհիվ if n%15:-ը միշտ աշխատում է, և ըստ հեղինակի գնահատականի՝ միայն fizzbuzz-ի համար նախատեսված տարբերակը կտեղավորվեր 800 բայթից քիչում։ Երկու տարբերակն էլ GitHub-ում են։

SSiTech

SiTech — AI-ով հզորացված վեբ մշակում

Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։