
מפרש 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 דרש גולף רגיל: שמות קצרים, הסרת סוגריים לא הכרחיים וטריקים משרשור ותיק ב-Stack Overflow על גולף ב-C, כולל מוזרויות של GNU C89. פונקציית מנתח עם ארבעה ארגומנטים הפכה לשורה אחת שמשתמשת בחשבון ASCII כדי לזהות איזה אופרטור נקרא; פונקציית עזר רקורסיבית לדילוג לסוף השורה הצטמצמה ל-Y(){c&&c-10&&Y(G());}. אופרטורי ההשוואה היו הבאים בתור — בזכות אמת־ערכיות if n%15: עדיין עובד — ולהערכת הנלי, גרסה ל-fizzbuzz בלבד הייתה נכנסת מתחת ל-800 בייטים. שתי הגרסאות נמצאות ב-GitHub.
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.