تایپ اسکریپ در گولنگ Typescript in Golang

چند روز پیش مایکروسافت مطلبی غافلگیر کننده منتشر کرد و اعلام کرد که شروع کردن تایپ‌اسکریپت رو به گولنگ پورت کنن. با عنوان تایپ‌اسکریپت ۱۰ برابر سریع‌تر حالا این یعنی چی؟ و چرا میخوان اینکار رو کنن؟ و یه سوالی که خیلی‌ها توی کامیونیتی پرسیدن: چرا راست (Rust) نه؟ چرا C#/.Net که برای خود مایکروسافت هست نه؟ چرا با گولنگِ گوگل؟

توی توییتر خیلی بحث و صحبت بود از چرایی این تصمیمی که گرفته شده. احتمالا بیشتر کسایی که با این پروژه مواجه شدن اول ریپو گیت‌هاب این پروژه رو دیدن (خودم هم همینطور) و متن خبر رو شاید هنوز ندیده باشن.

این ریپو تاریخ ۱ اکتبر ۲۰۲۴ ایجاد شده و کار رو از همون موقع شروع کردن، کِی این ریپو عمومی شده رو نمیدونم. خبر رو ۱۱ مارس ۲۰۲۵ به همراه یه ویدیو منتشر کردن که تقریبا تمامی سوالات رو جواب میده.

ویدیو مذکور 👆

حواشی و چرایی انتخاب گولنگ

اولین چیزی که توجه من رو جلب کرد یکی از خود توسعه دهنده ها بود که توی صفحه این ریپو توی گیت‌هاب تاپیک بحثی اینجاد کرده بود با عنوان چرا گولنگ؟ که این سوال رو قبل از عمومی شدن ریپو جواب بده. حالا این چه فرقی داره با صحبت‌ها توی توییتر؟ اینجا رو خود توسعه‌دهنده ها و کسایی که مشارکت دارن توی پروژه به صورت مستقیم میبینن، نظر بقیه رو می‌خونن، توی صحبت‌ها شرکت میکنن و از سمت خودشون و تیمشون صحبت میکنن.

این توسعه دهنده همون اول توضیحات لازم رو داده بود که چرا گولنگ، ولی خب دوستان راضی نشدن و از کامیونیتی‌های مختلف اومده بودن و نظرشون رو گفته بودن، خیلی ها، خصوصا با کامیونتی راست (ًRust)، شوخی کرده بودن و میم فرستاده بودن.

شاید فکر کنین مثل توییتر (و تقریبا همه جا) اینجا هم صدای کامیونتی راست بلندتر بود، ولی این دفعه نارضایتی کامیونیتی دات‌نت از همه شدیدتر بود و ناراحت و نگران بودن که مایکروسافتی که خودش حاضر نیست از سی‌شارپ و دات‌نت استفاده کنه، چرا ما استفاده کنیم؟ مایکروسافت اکثر پروژه های موفقش رو با هر چیزی جز دات‌نت میزنه، وقتی خودش به اکوسیستمی که درست کرده اعتماد نداره چرا ما داشته باشیم؟

در انتهای این صحبت‌ها، تک لید (Tech Lead) پروژه، آقای Anders Hejlsberg، شخصی که توی ویدیو می‌بینید، که مسئولیت انتخاب ابزارهای تیم هم با اون هست ورود کرد و یه پاسخ کلی به این سوالات داد.

خلاصه دلایلی که آورده بود این بود که ما از دید عملگرایانه و فنی به موضوع نگاه میکنیم و مایکروسافت در حال کنار گذاشتن دات‌نت نیست. همچنین تاکید کرد که سیاست مایکروسافت همیشه روی انتخاب بهترین ابزار برای کار بوده.

یه نکته مهم‌تر که هم ایشون هم اون توسعه دهنده ای که این تاپیک رو آغاز کرده روی اون تاکید داشتن که کامیونیتی شاید کمتر بهش توجه کرده، این بود که اینا دارن تایپ‌اسکریپت رو پورت میکنن، بازنویسی نمیکنن و گولنگ، بخاطر قابلیت هایی که داشته، براشون بهترین انتخاب بوده و نیاز نبوده کد رو اونقدر تغییر بدن و از نظر راحتی پورت کردن و حفظ رفتار و ساختار قبل بهتر بوده. همچنین استفاده از Concurrency توی گولنگ راحت تره (خدایی اینو راست میگن).

توی ویدیو نشون میده که چقدر کد کامپایلر تایپ‌اسکریپت توی گولنگ شبیه هم در میاد، که خب اینا یه سری if/else هستن و توی اکثر زبون ها همین شکلی شبیه در میاد. مثال جالبی نبود.

چرا تصمیم به پورت گرفتن

یه مسئله ای که مطرح هست، که شاید شما هم بهش خورده باشین اگر روی پروژه های بزرگی که با تایپ‌اسکریپت نوشته شدن کار کرده باشین، من خودم زخم خورده ام، اون هم مشکل مصرف رم و کندی شدید موقع بیلد کردن پروژه هست. ما پروژه ای داشتیم با بیش از یک میلیون خط کد که موقع بیلد شدن ارور کمبود حافظه هیپ (Heap Memory) می‌داد و حدود ۱:۳۰ دقیقه بیلد شدنش روی چیپ M1 اپل زمان می‌برد.

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

کامپایلر تایپ‌اسکریپت از node استفاده میکنه که اونم به صورت پیش فرض حداکثر حدود ۲ گیگ رم رو استفاده میکنه و ما مجبور بودیم دستور tsc رو به شکل زیر بنویسیم که بهش ۴ گیگ رم بدیم.

node -max-old-space-size=4096 ./node_modules/.bin/tsc

نکته‌: با environment variable هم میشه این مقدار رو تغییر بدی. با دستور 👇

export NODE_OPTIONS="--max-old-space-size=4096"

جدا از این مشکل، به مشکلات دیگه ای هم اشاره کردن، مثل کُندی در ادیتورها. زمانی که پروژه های بزرگ تایپ‌اسکریپتی رو روی ادیتور مورد علاقه ت باز می‌کردی، تا کل پروژه چک بشه، ارورها و اخطار ها مشخص شه و Language Server Protocol برای شما کار Linting (فارسیش رو واقعا نمیدونم) انجام بده زمان می‌برد.

نکته: تایپ‌اسکریپت و جاوا‌اسکریپت در حال حاضر از معماری LSP (Language Protocol Server) استفاده نمیکنن ولی قراره برای این تایپ‌اسکریپت پورت شده LSP بزنن.

همین مشکلات باعث محدودیت و جلوگیری از این می‌شد با تایپ‌اسکریپت پروژه‌های بزرگ بزنن.

و به همین دلایل و سریع‌تر کردن و بهبود بخشیدن به تجربه توسعه با تایپ‌اسکریپت تصمیم گرفتن که پورتش کنند به گولنگ.

بیلد کردن ۱۰ برابر سریع‌تر

با نوشتن کامپایلر تایپ‌اسکریپت میگن که تونستن اون رو ۱۰ برابر سریع‌تر کنن، که خب اگه ویدیو رو ببینید توی همه ی شرایط هم اینطور نیست ولی چیزی بین ۸ الی ۱۰ برابر هست نسبت به فایل هایی که دارین که همین هم فوق‌العاده ست و کار همه‌مون رو سریع‌تر و راحت‌تر میکنه.

توی ویدیو و مطلبی که منتشر کردن کلی بنچ‌مارک نشونمون دادن که چندتاشو اسکرین شات گرفتم که اگر ویدیو رو ندیدید اینجا ببینید.

اول میاد سورس‌کد VSCode که با تایپ‌اسکریپت نوشته شده رو با کامپایلر قبلی و بعد اونو با کامپایلر پورت شده به گولنگ کامپایل میکنه.

کامپایلر فعلی:

  • مصرف رم -> ۳.۳۸۹ گیگابایت
  • زمان -> ۶۳.۱۱ ثانیه

کامپایلر جدید:

  • مصرف رم -> ۳.۰۱۵ گیگابایت
  • زمان -> ۵.۷۶ ثانیه

از نظر مصرف رم خیلی Wow نیست ولی از نظر زمانی فوق‌العاده خوبه، دقیقا ۱۰.۹۵ برابر سریع‌تره.

بعد از اون میاد خود کامپایلر رو کامپایل میکنه،‌ ولی این دفعه گولنگ رو تک ثرد (Single-Threaded) اجرا میکنه، یعنی از Concurrency گولنگ اصلا استفاده نمیکنه.

کامپایلر فعلی:

  • مصرف رم -> ۴۸۷ مگابایت
  • زمان -> ۷.۳۱ ثانیه

کامپایلر جدید:

  • مصرف رم -> ۲۷۰ مگابایت
  • زمان -> ۲.۰۳۱

همچنان کامپایلر فعلی رو له میکنه و این دفعه مصرف رم هم ۱.۸ برابر بهتر میشه.

و در آخر همون تست کامپایلر جدید ولی همراه Concurrency:

  • مصرف رم -> ۳۳۲ مگابایت
  • زمان -> ۰.۹۶ ثانیه

بسیار عالی.

خب کِی میتونیم استفاده کنیم؟

ورژن فعلی تایپ‌اسکریپت ۵.۸ هست و بزودی ۵.۹ هم داره میاد، پس ورژن ۶ باید این یکی باشه؟ نخیر!

این کامپایلر به عنوان تایپ‌اسکریپت ورژن ۷ منتشر خواهد شد و احتمالا تا اون موقع سریع‌تر و بهینه‌تر هم خواهد شد.