خالق Valen «سنبله طلایی» را برای اتصال زبانهای جدید با Rust هدایت میکند
آزمایشی برای کنار گذاشتن C به عنوان زبان قابلیت همکاری با Rust در حال انجام است
به لطف کار آزمایشی ایوان اوادیا، مشارکتکننده اصلی Mojo، اکنون میتوانند از یک کامپایلر زبانی به کامپایلر زبان دیگر و دوباره برگردند. این مهندس سابق گوگل تلاش کرده است تا Rust را به کتابخانهای تبدیل کند که زبانهای دیگر بتوانند از آن بسازند و راهی برای انتقال انواع دادههای عمومی و توابع بین Rust و زبان دیگر نشان دهد، اقدامی که C ABI از آن پشتیبانی نمیکند.
مجری کانال یوتیوب Let's Get Rusty با تشریح این اثر که او آن را به عنوان "Rust++" توصیف کرد، گفت: "از نظر فنی، این جذاب ترین چیزی است که در چند ماه اخیر خوانده ام." مطمئنا این یک پیروزی عجیب اما سخت به دست آمده است. اوادیا کار خود را در یک پست وبلاگی توضیحی به عنوان «سنبله طلایی» توصیف میکند که دو زبان مختلف را در هم میپیچد و اشاره به آخرین سنبله در اولین خط راهآهن بین قارهای ایالات متحده دارد.
کتابخانههایی با قابلیتهای غنی میتوانند بهجای اینکه در مواد اولیه خام صرفا در واگنهای درشت C ABI انباشته شوند، روی ریلهای محکم و پرسرعت به سمت اکوسیستمهای خارجی حرکت کنند. در نهایت حذف C ABI این کار در تلاش اوادیا برای ایجاد زبان خود، Valen (شاخهای از تلاش قبلی به نام Vale) به وجود آمد، که او آن را نسخهای سریعتر و سازگارتر از Rust در نظر میگیرد. او استدلال کرد که مشکل ایجاد یک زبان جدید از ابتدا این بود که نمی توانست از کتابخانه های Rust مورد علاقه خود (به ویژه کتابخانه گرافیکی Rust’s bitchin’ wgpu) استفاده کند.
امروزه، یک راه رایج برای استفاده از کتابخانه از یک زبان در برنامهای که به زبان دیگر نوشته شده است، از طریق C ABI (رابط باینری برنامه)، یک لایه قابلیت همکاری عملی است که قراردادهایی را برای انتقال دادهها و فراخوانیهای تابع بین کدهای کامپایل شده تعریف میکند. (Rust دارای ABI خاص خود است، اگرچه تضمین پایداری ارائه نمی دهد.) با C ABI، اگر یک کتابخانه Rust عملکردهای خود را به عنوان "C" خارجی و انواع آن را به عنوان repr(C) در معرض نمایش قرار دهد، می توان از زبان دیگری با استفاده از یک رابط تابع خارجی (FFI) به آنها دسترسی داشت.
همه چیز خوب و خوب است، اما مشکل Ovadia این بود که C ABI مفهوم ژنریک (یا متغیرهایی برای انواع دادهها که بعدا ارائه میشوند) را درک نمیکرد، زیرا C خود مفهوم ژنریک را نمیفهمد. اما Rust تا حدودی از ژنریک ها استفاده می کند، و Valen هم همینطور، البته نه به یک شکل. "بنابراین سوال اصلی، معمای اصلی که باید حل شود، این است که چگونه ژنریک های بین زبانی را انجام دهیم؟" اوادیا نوشت. کلیات بین زبانی بالاخره جذب دو کامپایلر برای همکاری بسیار دشوار است، زیرا کامپایلرها تمایل دارند موجودیت های منزوی باشند، پادشاهان منفرد دنیای فردی خودشان.
بنابراین Ovadia باید راهی برای Valen برای فراخوانی یک تابع عمومی Rust بیابد، اما همچنین یک تابع عمومی Rust داشته باشد که برای مقادیر مورد نیاز به Valen برگردد. پس از نشخوار فکری زیاد، Ovadia به یک راه حل دو قسمتی برای ژنریک های متقابل زبان رسید: ابتدا کامپایلر Rust را به عنوان یک کتابخانه اجرا کنید. با کمال تعجب، Rust در حال حاضر دارای این قابلیت (rustc_driver) است که به Valen اجازه می دهد rustc را مستقیما در فضای حافظه خود جاسازی کند.
مرحله دوم وصله Rust است تا وقتی با انواع غیر Rust Valen روبرو می شود، کنترل را به کامپایلر Valen می دهد تا قسمت آن را مدیریت کند و منتظر نتیجه کامپایل شده باشد. Ovadia اعتراف می کند که وصله کامپایلر Rust "گزینه هسته ای" بود. او نوشت: «راستش را بخواهید، این مخاطره آمیزترین بخش از کل تلاش بود. این وصله فقط حدود 100 خط کد دارد، اما هک است و فرض میکند که Rust از LLVM برای تولید کد ماشین استفاده میکند، که همیشه اینطور نیست. اوادیا نوشت: "این کار می کند، اما قطعا قابل بالادستی نیست."
با این وجود، ژنریک های دوطرفه چند زبانه Ovadia یک گام واقعی رو به جلو در قابلیت همکاری زبان برنامه نویسی است. Ovadia در این مرحله دست خود را با Valen پر کرده است، اگرچه کار بین زبانی عمومی او امکان استفاده از Rust را برای راهاندازی زبانهای جدید دیگری که میتوانند از کتابخانههای Rust ساخته شوند، باز میکند. با توجه به تغییراتی در خود Rust، اتکا به C ABI ترسناک ممکن است روزی به گذشته تبدیل شود. در انجمن برنامهنویسان Reddit و Lobste.rs، ناظران Ovadia را برای مقابله با چنین مشکل دشواری تحسین کردند، حتی اگر از جزئیات نگران بودند.
یکی از کامنتکنندگان نوشت: «من از حرکت برای جایگزینی C بهعنوان «زبان جهانی FFI» قدردانی میکنم. "این یک انتخاب بسیار جسورانه است و نیاز به تلاش دارد." خواننده دیگری اظهار داشت که Rust ممکن است با توجه به محدودیتهای سیستم نوع خودش، زبان ایدهآل برای قابلیت همکاری نباشد. آنها نوشتند: "با این حال، تصور کنید که می توانید روی آدا پابند بسازید! اکنون این شگفت انگیز خواهد بود." ®
متن اصلی (انگلیسی)
Valen creator drives 'Golden Spike' to connect new languages with Rust
An experiment is afoot to sidestep C as the language of interoperability with Rust