
Python-ის ინტერპრეტატორი 1024 ბაიტ C კოდში
ოსტინ ჰენლიმ შაბათ-კვირის პროექტში Python-ის ინტერპრეტატორი 1024 ბაიტ C კოდში ჩათავსა: ჩადგმული ციკლები, ფუნქციები და fizzbuzz — AST-ის, ბაიტკოდისა და შეცდომების დამუშავების გარეშე.
ოსტინ ჰენლის შაბათ-კვირის პროექტები ხელით დაწერილი კოდის საბაბია, ბოლო გამოწვევას კი მკაცრი ბიუჯეტიც ჰქონდა: Python-ის ინტერპრეტატორი C-ზე, 512 ბაიტ კოდში. სამიზნე მიუღწეველი აღმოჩნდა — მისივე თქმით, კოდ-გოლფში საკმარისად ძლიერი არ იყო — ამიტომ 1024 ბაიტზე შეჩერდა, მაკროს ხრიკებისა და ბიბლიოთეკების დახმარების გარეშე.
სატესტო პროგრამა იყო fizzbuzz, რომელიც აშკარად Python-ივით გამოიყურება: აქვს def, ორწერტილები, ინდენტაცია და if-ის პირობა ფრჩხილების გარეშეა. ენის მხოლოდ ნაწილი ეტევა, წესები კი მკაცრია.
რას აკეთებს ინტერპრეტატორი და რას — არა
შეცდომების დამუშავება საერთოდ არ არსებობს: ინტერპრეტატორი ვარაუდობს, რომ საკვანძო სიტყვები სწორადაა დაწერილი და ტოკენების საზღვრები ზუსტია. კითხვისას ის კოდიდან თითქმის მთელ ცარიელ ადგილს აცილებს და მხოლოდ ინდენტაციასა და სტრიქონულ ლიტერალებში არსებულ ჰარებს ტოვებს. ცვლადებისა და ფუნქციების სახელები შემოიფარგლება ერთი პატარა ლათინური ასოთი — ასე სიმბოლოთა ცხრილში ძებნა პირდაპირ მასივის ინდექსია და არა ძებნა. მდგომარეობა რამდენიმე გლობალურში ინახება: 999-ბაიტიანი წყაროს ბუფერი, 256-უჯრიანი სიმბოლოთა ცხრილი და პოზიციის მაჩვენებლები.
შესრულება აბსტრაქტული სინტაქსის ხის გარეშე
დიზაინს CPython-თან თითქმის არაფერი აქვს საერთო: ორიგინალი კოდს ტოკენებად ყოფს, ხეს აშენებს, აანალიზებს, ბაიტკოდში კომპილირდება და მერე ინტერპრეტირებს. ჰენლის ვერსია რეკურსიული დაშვებით პარსავს და გამოსახულებებს პარსვის პროცესშივე ასრულებს; ბლოკი მაშინ ბრუნდება, როცა ინდენტაცია მცირდება, ამიტომ ჩადგმულობას C-ის გამოძახების სტეკი ამუშავებს. არაფერი კომპილირდება, ამიტომ ციკლები უკან ხტომითა და ყოველ იტერაციაზე წყაროს ხელახალი პარსვით მუშაობს — while და for იმახსოვრებენ, სად იწყება პირობა; ფუნქციის გამოძახებისას ინახება გამომძახებლის პოზიცია, გადადის სხეულში და ბოლოს აღდგება.
როგორ შემცირდა 1024 ბაიტამდე
წაკითხვადი ვერსია 4800 ბაიტს აღემატება; 1024-მდე მისვლა ჩვეულებრივი გოლფინგით მოხდა: მოკლე სახელები, არასავალდებულო ფრჩხილების მოშორება და C-ში გოლფინგის ძველი Stack Overflow-ის თემიდან აღებული ხრიკები, GNU C89-ის თავისებურებების ჩათვლით. ოთხარგუმენტიანი პარსერის ფუნქცია ერთსტრიქონიან გამოსახულებად იქცა, რომელიც ASCII-ის არითმეტიკით წყვეტს, რომელი ოპერატორი კითხულობს; სტრიქონის ბოლომდე გადახტომის დამხმარე ფუნქცია კი Y(){c&&c-10&&Y(G());} გახდა. შედარების ოპერატორები შემდეგი იყო სამსხვერპლოზე — ჭეშმარიტებითობა if n%15:-ს მაინც ამუშავებს — და ავტორის შეფასებით, მხოლოდ fizzbuzz-ისთვის განკუთვნილი ვერსია 800 ბაიტზე ნაკლებიც იქნებოდა. ორივე ვერსია GitHub-ზეა.
SiTech — AI-გაძლიერებული ვებ დეველოპმენტი
ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.