Раньше я пробовал компилировать с языками JS. Много лет назад это был Clojurescript. Совсем недавно я много профессионально взаимодействовал с Purescript на уровне сгенерированного JS.

Самая большая проблема, с которой сталкиваются эти языки, заключается в том, что кодогенератор обычно не оптимизирован по размеру, что критично для работы, связанной с UX.

Сгенерированный JS-файл bucklescript

Кстати, недавно я использовал ReasonML и bucklescript в действии. И кодогенерация действительно великолепна. В качестве игрушечного примера рассмотрим этот обход двоичного дерева в первую очередь.

Этот редактируемый пример позволяет увидеть генерацию кода в реальном времени. Между прочим, jaredly проделал отличную работу с REPL ❤. Однако для полноты он включен ниже.

Здесь не так много. Благодаря webpack и treehaking, самый большой штраф, понесенный, заключается в том, что каррирование по умолчанию привело к появлению одного дополнительного модуля, curry.js. Другие экспорты в этих файлах не используют назначение прототипа или this и просто вытряхиваются. Практически абстракция с нулевой стоимостью.

Свойства объекта обычно не уменьшаются с помощью Uglify (если только вы не хотите погрузиться в mangle-props болото). bucklescript рассматривает варианты как просто целочисленные теги для приличной экономии места.

Версия машинописного текста

Я был удивлен, узнав, что Typescript не поддерживает определения рекурсивных типов.

type Tree<a> = null | a | [a, Tree, Tree];

Этот код не будет компилироваться с Type alias 'Tree' circularly references itself.

Вы, конечно, можете проделать тот же игрушечный пример с классами, но классы Typescript используют this при переносе в ES5. По крайней мере, на момент написания, поддержка IE 11 все еще жива и работает в этом отношении ...

Purescript

В качестве контрпримера к кодогенерации bucklescript есть Purescript. Важное предостережение: Purescript, как и большинство (?) Компилируемых на JS языков, не поддерживает древовидное соединение в стиле ES-модуля и опирается на собственный внутренний набор инструментов для связывания.

Тем не менее, он поддерживает, как часть этапа постобработки, purs-bundle сброс мертвого кода. Но только если он сгенерирован psc.

Короче говоря, если вы пытаетесь внедрить purescript в существующий проект JS, будьте готовы к гораздо большим пакетам.

Обратите внимание, что в приведенном ниже примере модульной системой является CommonJS, который Clojurescript также поддерживает только. Есть несколько модулей / модулей Javascript (6)? Проблемы с модулями / ESM в трекере Purescript.

В моем примере я импортировал <> (прекрасный оператор cons), который даже при квалифицированном импорте приводит к втягиванию всего Prelude. Из-за модульной системы вы в основном получаете штраф библиотеки среднего размера в JS.

instanceof используется для сопоставления с образцом, а не для простых проверок в Bucklescript. А каррирование, о котором также позаботился purs-bundle, означает, что каррирование является частью вывода JS. this и IIFE, которые делают удаление мертвого кода с помощью Uglify невозможным.

Вяз (?), По-видимому, страдает теми же проблемами, но не цитируйте меня по этому поводу.

Заключение

Я думаю, что быстрый и легкий кодогенератор bucklescript - это пример, которому другие компиляторы для языков JS должны попытаться подражать. В то время как использование Bucklescript было более подходящим для использования в существующих приложениях JS, что позволяет вашему языку использовать и извлекать выгоду из обновлений пакетов JS.