
שכתוב הקומפיילר של Roc מ-Rust ל-Zig הגיע לשוויון תפקודי אחרי 487 ימים
צוות שפת התכנות Roc השלים שכתוב של כ-300,000 שורות קוד מ-Rust ל-Zig והגיע לשוויון תפקודי עם הקומפיילר המקורי בתוך 487 ימים. הפוסט משווה זמני בנייה, בטיחות זיכרון והתאמה לאקוסיסטם.
הצוות שמפתח את שפת התכנות Roc עבד בשנה וחצי האחרונות על שכתוב של כ-300,000 שורות קוד מ-Rust ל-Zig, וכעת הגיע לשוויון תפקודי עם הקומפיילר המקורי. זו אינה מהדורה רשמית — גרסה 0.1.0, המהדורה הממוספרת הראשונה של Roc, מתוכננת להמשך השנה — אבל הקומפיילר החדש כבר יודע לבנות ולהריץ תוכניות אמיתיות.
אחד המבחנים הראשונים היה Rocci Bird, משחק ל-WASM-4 שנכתב בפחות מאלף שורות של Roc. עם הקומפיילר החדש, הפקודה roc build --opt=size מייצרת קובץ WebAssembly בנפח 31 קילובייט — פחות ממחצית מהנפח שהפיק הקומפיילר הישן. כדי שהמשחק יעבוד בכלל נדרשו תכונות רבות בקומפיילר.
שכתוב של 487 ימים
השכתוב ארך 487 ימים, לעומת 11 ימים בפורט של Bun בכיוון ההפוך, שהעביר כ-500,000 שורות מ-Zig ל-Rust. המחבר מכנה את ההשוואה מטעה: אצל Bun מדובר היה בפורט ישיר, בעוד Roc בחרה בשכתוב מאפס דווקא מפני שחלק גדול מהקומפיילר עמד להשתנות. ההחלטה נבעה מבעיה ארכיטקטונית במערכת ה-lambda set specialization של Roc, שהשתרעה על כמה שלבים בקומפיילר.
למה Zig ומה קרה לבטיחות הזיכרון
ארבעה שיקולים הכריעו את הבחירה: זמני בנייה, שליטה בזיכרון — Roc נשענת על arenas ופריסות struct-of-arrays, בעוד האקוסיסטם של Zig מעביר מקצי זיכרון במקום להניח מקצה גלובלי אחד — רלוונטיות אקוסיסטמית, וסיוע בקוד שאינו בטוח לזיכרון. בקומפיילר ב-Rust היו כ-1,200 שימושים ב-unsafe מתוך 300,000 שורות, והצוות ציפה שימשיך לכתוב קוד כזה.
בפועל המעבר לא הזיק. דיווחי באגים שסווגו בידי Claude Opus 4.8 מראים 2,596 באגים בקומפיילר ב-Rust, מהם 21 שקשורים לפגיעה בזיכרון, לעומת 431 בקומפיילר ב-Zig, מהם 10 שקשורים לפגיעה בזיכרון. שמונה מתוך העשרה היו קומפילציות שגויות; השניים האחרים היו שגיאות use-after-free בדיווח שגיאות, שגרמו לשמות קבצים להיראות כתווי החלפה ב-roc check וב-roc bundle.
זמני בנייה ומה הלאה
על מחשב שולחני עם Intel והרצת Ubuntu 26, הקומפיילר ב-Rust בגודל 354 אלף שורות לקח 25.4 שניות לבנייה קרה ו-3.4 שניות לבנייה אינקרמנטלית. השכתוב ב-Zig, בגודל 464 אלף שורות, לוקח 32.1 שניות בבנייה קרה וכ-35 אלפיות השנייה בבנייה אינקרמנטלית — אבל רק ב-Zig 0.17.0, משום שבאג בגרסה היציבה 0.16.0 שובר בנייה אינקרמנטלית בקוד הזה. במקום לתלות בקומפיילר nightly, הצוות ממתין למהדורה היציבה הבאה.
הקומפיילר גם שומר תוצאות במטמון על הדיסק באמצעות דה-סריאליזציה בלי פענוח: מבני הנתונים שלו הם מערכים של אינדקסים בני 32 סיביות במקום מצביעים, כך שתוצאות שמורות נטענות לזיכרון ישירות בלי פענוח. הרצה כפולה של roc check עושה שימוש חוזר בתוצאות ההרצה הקודמת בערך במהירות memcpy.
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.