TypeScript 7 با یک کامپایلر مبتنی بر Go عرضه شده است که زمان بررسی نوع (type-checking) را به یکدهم زمان قبلی کاهش داده و میزان مصرف حافظه را تا یکچهارم کم میکند؛ تغییری که لحظهای که توسعهدهنده در VS Code کلید «save» را میزند، خود را نشان خواهد داد.
تصمیم مایکروسافت برای بازنویسی هسته سرویس زبان (language service) با استفاده از Go، پس از سالها شکایت از این موضوع صورت گرفت که بررسیکننده افزایشی (incremental checker) تایپاسکریپت در مخازن بزرگ (monorepos) دچار کندی میشود. تیم توسعه با انتقال کارهای سنگین — یعنی تجزیه (parsing) و بررسی نوع (type-checking) — از پیادهسازی قدیمی جاوااسکریپت، امکان موازیسازی را در سطح زبان فراهم کرده و سربار زمان اجرای Node.js را کاهش داده است.
چرا این بازنویسی اهمیت دارد
اپلیکیشنهای وب مدرن که با فریمورکهایی مانند Next.js یا Nuxt ساخته میشوند، بهطور معمول هزاران ماژول را فراخوانی میکنند. در چنین محیطهایی، زمان نمایش اولین خطای نوع (type error) میتواند چرخه «ویرایش-کامپایل-دیباگ» را مختل کند. کامپایلر جدید زمان یافتن اولین خطا در VS Code را از ۱۷.۵ ثانیه به کمتر از ۱.۳ ثانیه کاهش داده است که تنها در این ویرایشگر، شاهد ۱۱.۹ برابر افزایش سرعت هستیم. بنچمارکهای مستقل از پروژههای مختلف، دستاوردهای مشابهی را تأیید میکنند:
- VS Code: ۱۱.۹ برابر سریعتر
- Sentry: ۸.۹ برابر سریعتر
- Bluesky: ۸.۷ برابر سریعتر
- Playwright: ۸.۷ برابر سریعتر
- Tldraw: ۷.۷ برابر سریعتر
میزان مصرف حافظه نیز بهبود یافته است. سرور TypeScript در VS Code اکنون ۱۸٪ رم کمتری مصرف میکند، Bluesky شاهد کاهش ۲۶ درصدی است و Tldraw نیز ۱۵٪ صرفهجویی دارد.
این اعداد به بهرهوری در دنیای واقعی تبدیل میشوند: توسعهدهندهای که هر چند ثانیه یکبار فایلی را ذخیره میکند، اکنون میتواند ده برابر سریعتر کار کند و اصطکاک روزانه در کدهای حجیم را بهشدت کاهش دهد.
تنظیمات جدید برای کنترل دقیقتر
کامپایلر Go مجموعهای از پرچمهای خط فرمان (command-line flags) را معرفی میکند که به تیمها اجازه میدهد عملکرد را متناسب با سختافزار و گردش کار خود تنظیم کنند:
- پردازش موازی (
--checkersو--builders) عملیات تجزیه (parsing) و بررسی نوع را بهصورت همزمان انجام میدهد و به کاربران اجازه میدهد بین سرعت و فشار حافظه تعادل برقرار کنند. - حالت تکرشتهای (
--singleThreaded) فرآیند دیباگ را سادهتر کرده و برای محیطهای با منابع محدود مناسب است. - ورکرهای مقیاسپذیر (Scalable workers) اجازه میدهند ورکرهای بررسی نوع بهطور مستقل از ورکرهای سازنده (builder workers) مقیاسبندی شوند که این امر امکان ایجاد خط لوله ساخت (build pipelines) سفارشی را فراهم میکند.
- بهبود حالت مشاهده (watch mode) جایگزین اسکنر فایل قدیمی مبتنی بر Node با یک فایلواچر (file watcher) مبتنی بر Go شده است که اسکنهای بازگشتی و هزینهبر درختهای عظیم
node_modulesرا حذف میکند.
این گزینهها به سازمانهای بزرگ این توانایی را میدهد که بدون بازنگری در کدهای موجود، عملکرد بیشتری را از خط لولههای CI استخراج کنند.
ریسکها و مخالفتها
بازنویسی یک مؤلفه اصلی با زبانی متفاوت بدون جنجال نیست. برخی از توسعهدهندگان نگران هستند که مهاجرت به Go ممکن است باگها یا ناسازگاریهای جدیدی ایجاد کند که پیادهسازی بالغ جاوااسکریپت قبلاً آنها را برطرف کرده است. این تغییر همچنین یک وابستگی به زمان اجرای Go را به زنجیره ابزار (toolchain) تایپاسکریپت اضافه میکند که ممکن است محیطهایی را که بهشدت به Node.js وابسته هستند، پیچیده کند. کاربران اولیه باید تأیید کنند که پلاگینهای سفارشی و افزونههای سرویس زبان (language server extensions) آنها بدون تغییر همچنان کار میکنند.
آنچه باید در آینده زیر نظر داشت
مایکروسافت کامپایلر مبتنی بر Go را به حالت پیشفرض در نسخه عمومی قرار داده است، اما موتور قدیمی جاوااسکریپت همچنان برای استفاده در صورت نیاز (fallback) در دسترس است. نظارت بر نرخ پذیرش در IDEهای اصلی و سرویسهای CI نشان خواهد داد که آیا دستاوردهای عملکردی بر دشواریهای مهاجرت غلبه میکند یا خیر. علاوه بر این، بازخوردهای جامعه برنامهنویسان درباره پرچمهای جدید، نحوه تکامل کامپایلر را شکل خواهد داد؛ اگر توسعهدهندگان تنظیم گزینههای موازی را دشوار بیابند، مایکروسافت ممکن است تنظیمات پیشفرض (presets) سطح بالاتری را معرفی کند.
نکته کلیدی: بازنویسی تایپاسکریپت ۷ با Go، بررسی نوع را تا ده برابر سریعتر و صرفهجویی قابل توجهی در حافظه فراهم میکند؛ تغییری که میتواند توسعه جاوااسکریپت در مقیاس بزرگ را بلافاصله روانتر کند — مشروط بر اینکه اکوسیستم بهراحتی با زمان اجرای جدید سازگار شود.
