Как работает переводчик WebSharper?
Может кто-нибудь объяснить, как работает переводчик WebSharper совместно с F#? Это перевод кода F# в сам JS или использование для этого компилятора F#?
Во втором случае, что делает компилятор F#, когда в источнике находит атрибут [[]]? Генерирует ли компилятор функции в любом случае и во время выполнения конструирует JS как отражение от скомпилированного байт-кода или что-то еще?
1 ответ
Я разрабатываю WebSharper. Хороший вопрос!
Примерно компиляция выглядит так:
a.dll: a.fs b.fs c.fs
fsc ...
a.dll.js: a.dll
WebSharper.exe ..
Когда функции отмечены [<JavaScript>]
, который является псевдонимом для [<ReflectedDefinition>]
Компилятор F# не только компилирует эти функции в.NET IL, но также сохраняет представление их синтаксиса в метаданных DLL. Это представление имеет тип Quotations.Expr
и может быть восстановлено отражением. Посмотри на Quotations.DerivedPatterns.MethodWithReflectedDefinition
,
Поэтому WebSharper является переводчиком исходного кода, и он довольно прямой (например, сохраняет лямбды). В WebSharper 2.0 у нас есть промежуточный язык, похожий на Scheme, но он только для того, чтобы помочь оптимизировать сгенерированный код.