scriptc؛ تایپاسکریپت بدون رانتایم
خلاصهٔ کاملتر
scriptc یه کامپایلر از vercel-labs هست که تایپاسکریپت عادی رو به فایل اجرایی نیتیو کوچیک و سریع تبدیل میکنه؛ نه Node توی باینری هست، نه V8، نه هیچ موتور جاوااسکریپت دیگهای. ادعای پروژه اینه که کدت رو تغییر نمیدی، انوتیشن اضافه نمیکنی و با هیچ دیالکت خاصی طرف نیستی: همون تایپاسکریپتی که روی Node اجرا میشه، با کامپایلر واقعی TypeScript تایپچک میشه و هرچی کامپایل بشه بایتبهبایت مثل Node رفتار میکنه.
function fib(n: number): number {
return n < 2 ? n : fib(n - 1) + fib(n - 2);
}
console.log(fib(30));ایدهٔ اصلی اینه که بیشتر تایپاسکریپتی که مینویسیم از چیزی که فکر میکنیم ایستاتیکتره، و scriptc سازهبهسازه تصمیم میگیره چی نیتیو میشه و همون رو هم بهت گزارش میده. دستور scriptc coverage نشون میده چند درصد دستورها ایستا کامپایل میشن و بلاکرها با کد خطای مشخص چیان. سه حالت وجود داره: کامپایل ایستا (پیشفرض)، اجرای داینامیک با --dynamic که یه موتور کوچیک quickjs-ng حدود ۶۲۰ کیلوبایت رو جاسازی میکنه، و رد شدن با خطای دقیق. هیچوقت چیزی بیسروصدا اشتباه کامپایل نمیشه.
پوشش زبانی هم کم نیست: کلاس با ارثبری و دیسپچ داینامیک، کلوژرها، جنریکها، یونیونهای تفکیکشده، async/await روی فایبر، استثناها با finally و ریجکس. از کتابخونهٔ استاندارد هم رشته با سمنتیک دقیق UTF-16، آرایه و Map و Set، JSON، Buffer و تایپدارریها پشتیبانی میشه. مهمتر اینکه بخش خوبی از API خود Node پیاده شده — fs، path، process، child_process، crypto، zlib و همینطور net، http، https و tls — پس سرور پروکسی واقعی هم کامپایل میشه. وابستگیهای npm فقط با --dynamic کار میکنن و کدشون موقع بیلد داخل باینری جاسازی میشه.
برای درستی، دو سازوکار روی هر تغییر اجرا میشن: تست تفاضلی روی بیش از ۸۰۰ برنامه که خروجی استاندارد، خطا و کد خروج نسخهٔ نیتیو باید بایتبهبایت با Node یکی باشه، و یه لاین جداگانه که همون مجموعه رو زیر AddressSanitizer با ممیزی شمارش ارجاع میبره؛ نشتی و use-after-free بیلد رو میشکنه. چند ده مورد اختلاف عمدی با Node هم مستند و شمارهگذاری شده. از نظر عملکرد، مصرف حافظه ۱ تا ۴ مگابایت گزارش شده در برابر ۶۷ تا ۱۱۶ مگابایت Node. برای موارد خاص هم راه فرار هست: comptime() برای اجرای کد موقع بیلد، FFI نیتیو با --ffi، و کستهای چکشده که مثلاً خروجی JSON.parse رو موقع اجرا اعتبارسنجی میکنن.
نکات کلیدی:
- تایپاسکریپت معمولی بدون تغییر کد به باینری نیتیو کامپایل میشه
- استارتاپ حدود ۲.۴ میلیثانیه و باینری ۱۷۰ تا ۲۰۰ کیلوبایت در حالت ایستا
- سه حالت شفاف: ایستا، داینامیک با موتور جاسازیشده، یا رد شدن با خطای دقیق
- پوشش خوبی از API نود شامل fs، path، child_process و استک شبکه و TLS
- تست تفاضلی مقابل Node و اجرای کل کورپوس زیر AddressSanitizer




