Раньше я пробовал компилировать с языками 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.