Gleam 1.19 دیگه کد Erlang تولید نمیکنه
خلاصهٔ کاملتر
Gleam یه زبان type-safe هست که هم روی ماشین مجازی Erlang (یعنی BEAM) اجرا میشه و هم روی JavaScript. تو نسخهٔ v1.19.0، تیم Gleam میگه Giacomo Cavalieri بخش تولید کد Erlang رو از صفر بازنویسی کرده. قبلاً کامپایلر سورس Erlang تولید میکرد، ولی حالا Erlang abstract forms میسازه؛ یعنی همون درخت سینتکسی که خود کامپایلر Erlang بعد از parse کردن کد درست میکنه. این خروجی به شکل باینری ذخیره میشه و مستقیم لود میشه، پس نیمهٔ اول کامپایلر Erlang کلاً رد میشه.
سه تا فایدهٔ اصلی داره. اول، زمان بیلد پروژههای Erlang خیلی کمتر شده. دوم، اطلاعات مکان کد حالا به سورس Gleam اشاره میکنه، نه به کد Erlang تولیدشده؛ یعنی شماره خط تو crash report و stacktrace دقیقاً درسته، در حالی که قبلاً فقط تا نزدیکترین تابع رو نشون میداد. این اطلاعات حتی میتونه راه رو برای پشتیبانی از دیباگرهایی مثل edb باز کنه. سوم، کیفیت کد خود کامپایلر بالاتر رفته.
برای سنجش سرعت، نویسنده از بنچمارک langcompilebench جوزه والیم استفاده کرده: کامپایل 100 ماژول که هر کدوم 100 تابع ساده دارن. مقایسهٔ v1.17 با v1.19 بهبود قابل توجهی نشون میده، اونم برای بیلد کامل بدون کش. نویسنده تأکید میکنه این بنچمارک ساختگیه و نباید ازش نتیجهٔ قطعی گرفت. چرا مستقیم BEAM bytecode تولید نکردن؟ چون bytecode با هر نسخهٔ VM عوض میشه و Gleam که با اسپانسر جامعه میچرخه، منابع همگام موندن باهاش رو نداره. Elixir هم دقیقاً همین مسیر abstract forms رو میره.
سمت JavaScript هم John Downey خروجی case رو صافتر کرده: چند تا if تودرتو حالا یه شرط واحد با && میشن. حجم باندل بعد از gzip تقریباً عوض نمیشه، ولی شاخههای کمتری برای موتور JS میمونه. لیستهای کوتاه هم دیگه از آرایه تبدیل نمیشن و مستقیم ساخته میشن، که برای کتابخونههایی مثل Lustre که کلی لیست کوتاه دارن سرعت خوبی میاره:
const numbers = arrayToList([1, 2, 3])
const numbers = prepend(1, prepend(2, prepend(3, empty)))بقیهٔ تغییرات: تو تعریفهای TypeScript، تابعهایی مثل Box$isFull حالا overload دارن و type parameter رو به unknown تبدیل نمیکنن. دستور compile-package فلگ --no-dev گرفته و gleam خودش فایل .app رو برای BEAM میسازه، با این هدف که Gleam به Mix و rebar3 اضافه بشه. language server حالا go-to-definition و rename رو برای labelها هم داره، نسخهٔ WebAssembly کامپایلر تابع format_source گرفته، و پیامهای خطای مخصوص برای merge conflict marker، عملگرهایی مثل += و ترتیب غلط record update اضافه شده.
نکات کلیدی:
- Gleam v1.19.0 به جای سورس Erlang، خروجی Erlang abstract forms تولید میکنه
- شماره خط stacktraceها روی BEAM حالا دقیقاً به سورس Gleam اشاره میکنه
- بنچمارک کامپایل 100 ماژول × 100 تابع بین v1.17 و v1.19 بهبود قابل توجهی نشون داده
- لیستهای کوتاه تو خروجی JS با prepend ساخته میشن؛ لیستهای بلند هنوز از arrayToList استفاده میکنن
- دستور compile-package فلگ --no-dev گرفته و gleam فایلهای .app رو خودش تولید میکنه




