חזרה
Eurydice: קומפילציה של Rust ל-C קריא לתוכנות בטיחותיות
SiTech AI Team3 דק׳ קריאה

Eurydice: קומפילציה של Rust ל-C קריא לתוכנות בטיחותיות

Eurydice, חלק מפרויקט Aeneas, ממיר קוד Rust לקוד מקור ב-C תוך שמירה על מבנה התוכנית. הוא מיועד לתוכנות בטיחותיות שבהן כלי אימות והתאמה דורשים C כקלט, ומספק מעבר חלק לסביבות שכבר תומכות ב-C.

קוד בטיחותי גבוה מ-Rust ל-C

Eurydice הוא פרויקט מחקר שממיר תוכניות Rust לקוד מקור C ושומר על המבנה המקורי של הקוד ללא שינוי. הוא מכוון לפרויקטי תוכנה בטיחותיים שבהם כלי אימות והתאמה קיימים דורשים C כנתון קלט. עד שכלים כאלה ילמדו לעבוד ישירות עם Rust, Eurydice מציע מעבר חלק יותר, והוא יכול גם לשמש כשלב ראשון בסביבות שיש בהן מהדר C אבל לא מהדר Rust זמין. הפרויקט כבר נוצל לקומפילציה מחדש של כמה שגרות בקריפטוגרפיה פוסט-קוונטית מ-Rust ל-C.

Eurydice הוא פרויקט מחקר שממיר תוכניות Rust לקוד מקור C ושומר על המבנה המקורי של הקוד ללא שינוי. הוא מכוון לפרויקטי תוכנה בטיחותיים שבהם כלי אימות והתאמה קיימים דורשים C כנתון קלט. עד שכלים כאלה ילמדו לעבוד ישירות עם Rust, Eurydice מציע מעבר חלק יותר, והוא יכול גם לשמש כשלב ראשון בסביבות שיש בהן מהדר C אבל לא מהדר Rust זמין. הפרויקט כבר נוצל לקומפילציה מחדש של כמה שגרות בקריפטוגרפיה פוסט-קוונטית מ-Rust ל-C.

שמירה על המבנה במקום אופטימיזציה

כמו רוב המהדרים, Eurydice לוקח תוכנית Rust, ממיר אותה לייצוג ביניים, מבצע סדרת טרנספורמציות ומפיק קוד בשפה נמוכה יותר, במקרה הזה C. המטרה המבדלת שלו היא שהפלט הקריא ישמור את המבנה הכללי של המקור ובו זמנית יסיר את המבנים שקיימים ב-Rust אבל לא ב-C. שם שבו סדר ההערכה של המקור חייב להישמר, הכלי מכניס משתנים זמניים נוספים. קומפילציה של אותן פונקציות עם rustc, לעומז, יוצרת לולאות מסובכות ופעולות מניפולציה על ביטים מלאים, שמתאימות להפקת קוד מכונה אבל קריאות פחות בהרבה.

איפה התרגום מתקשה

לא ניתן לייצג נאמן כל תוכנית Rust ב-C. לולאות for המבוססות על איטרטור, במקום טווח, חייבות להתקמפל ללולאות while, ש-Eurydice מטפל בהן בעזרת קוד עזר כדי לנהל את מצב האיטרטור. מכיוון שב-C אין מושג גנריים, בהמרה קוד Rust חייב לעבוד מונומורפיזציה, שעשויה ליצור כמה יישומים של פונקציות שנבדלות רק בסוג. טיפוסים בגודל דינמי יוצרים אתגר גדול במיוחד: Eurydice מפיק שני ייצוגים, אחד עם חבר מערך גמיש והשני עם חבר מערך באורך ידוע. מעבר ביניהם בזמן הריצה לא עושה כלום, אבל מבחינה טכנית מפר את כלל ה-aliasing החמור של C, ולכן הפרויקט ממליץ לקמפל את הקוד המתקבל עם -fno-strict-aliasing.

מגבלות נוכחיות וכלים מלווים

Eurydice מבוסס על KaRaMeL, שמשתמש באותה גישה לקומפילציה מחדש ל-C מובנה שפה יותר מופשטת, במקרה הזה לשפת התכנות F*. במקום להטמיע מפענח ובודק טיפוסים משלו, Eurydice נשען על Charon, כלי נוסף של Aeneas, כדי לחלץ מ-rustc את התוכנית המעובדת והמעובדת מראש ולהוציא את הייצוג הביניים ברמה הבינונית כ-JSON. בפועל Charon לעיתים קרובות נכשל בתכונות חדשות יותר של Rust כמו const generics, ולכן Eurydice כרגע עובד הכי טוב על תוכניות קטנות ועצמאיות שלא נוגעות בתכונות מורכבות של Rust. מחבר המקור מציין שהכלי שווה ביותר כשקוד Rust ממשיך להשתנות ויש צורך בדרך אוטומטית לשמור על סנכרון גרסת C. Eurydice הוא רק התיעד העדכני ביותר באוסף כלים שמתפתח מהר ומתאים קוד Rust ליותר סביבות.

מקורות: lwn.net

SSiTech

SiTech — פיתוח אתרים בכוח ה-AI

אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.