2008-09-16 2 views
7

Nikkil Kothari's Script# вполне возможно является одной из самых удивительных концепций, которые я видел на арене JavaScript в течение довольно долгого времени. Этот вопрос касается не JavaScript, а скорее компиляции языка в среде выполнения .NET.Как создать сторонний компилятор для .NET.

Мне было интересно, как с помощью платформы .NET можно написать компилятор для языка, на котором уже есть компилятор (например, C#), который будет генерировать отдельный вывод из исходного компилятора, позволяя исходному компилятору для генерации вывода для одного и того же источника во время одной и той же операции сборки, все время ссылаясь/используя вывод другого компилятора.

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

-

Edit: Спасибо за комментарий, до сих пор; ваша информация сама по себе очень интригующе, и я хотел бы исследовать ее больше, но мой вопрос заключается в том, как я смогу написать свои собственные компиляторы, которые могут запускаться на одном и том же источнике одновременно производя несколько различных типов (потенциально) взаимозависимых результатов с использованием CLR. Сценарий # служит в качестве примера, поскольку он генерирует JavaScript и сборку с использованием того же источника C#, и все это время скомпилированная сборка взаимодействует с JavaScript. Мне любопытно, что различные подходы и теоретические концепции в разработке чего-то такого рода.

ответ

2

Важно понимать, что все компилятор делает это взять исходный язык (C# в данном случае), разобрать его, так что компилятор имеет представление, что имеет смысл к ней, а не людям (это абстрактное синтаксическое дерево), а затем генерирует наивное генерирование кода на целевой язык (msil - это цель для языков, работающих в среде выполнения .NET).

Теперь, если код сценария # превращается в сборку и взаимодействует с другим кодом .NET, это означает, что этот компилятор должен генерировать msil. script # использует csc.exe для этого, что является стандартным C# компилятором. Теперь, чтобы сгенерировать javascript, он должен взять либо C#, либо msil, проанализировать его и сгенерировать javascript для отправки в браузер. Документы говорят, что у него есть собственный компилятор C# -> js, называемый ssc.exe.

Чтобы все взаимодействовать последовательно на стороне клиента и на стороне сервера, у него есть набор ссылочных сборок, которые написаны на .NET, но также скомпилированы в javascript. Это не проблема, связанная с компилятором, хотя эти ссылочные сборки - это время выполнения сценария #. Время выполнения, вероятно, несет ответственность за многие магии скрипта #, которые вы воспринимаете.

0

Итак, скажем, вы хотите скомпилировать C# в Javascript. Вы спрашиваете, можете ли вы использовать существующие компиляторы C#, поэтому вместо компиляции C# в Javascript вы фактически конвертируете MSIL, сгенерированный компилятором C# в Javascript?

Несомненно, вы можете это сделать. Когда у вас есть бинарный файл MSIL, вы можете делать все, что хотите.

0

У Microsoft есть исследовательский проект под названием Volta, который, среди прочего, компилирует msil для JavaScript.

набор инструментов разработчика для создания многоуровневых веб-приложений с использованием существующих и знакомые инструменты, методы и модели. Volta's декларативное разделение уровня позволяет разработчикам откладывать архитектурные решения о распределении до последний возможный ответственный момент. Кроме того, благодаря общему программированию модели на несколько ярусов, Вольта позволяет новому профилирования конца в конец и тестирования на более высокие уровни производительности приложений, надежность, и надежность. Используя декларативное разделение уровня , разработчики могут уточнить архитектурные решения на основе данных профилей . Это экономит время и расходы, связанные с руководством рефакторинг. По сути, Volta расширяет платформу .NET, чтобы дополнительно активировать разработку программных приложений + , используя существующие и знакомые инструменты и методы.

Вы архитектор и построить свой приложение в качестве приложения .NET клиент , назначая части приложение, которое работает на сервере уровня и клиентского уровня в конце процесса развития. Вы можете настроить таргетинг на как на веб-браузеры, так и на CLR, так как клиенты и Volta обрабатывают сложности разбиения уровней между уровнями . компилятор создает кросс-браузерные JavaScript для клиентского уровня, веб услуг для уровня сервера, и все связи, сериализации, синхронизацию, безопасность и другие шаблонный код, чтобы связать ярусы вместе. Фактически, Volta предлагает наилучшее усилие в нескольких окружениях , не требуя пошив приложения.

+0

Не совсем то, что я искал здесь (см. Выше), но я ценю информацию о Вольте, поскольку это еще одна захватывающая реализация в этом направлении, о которой я хотел бы узнать больше. – TheXenocide 2008-09-17 03:31:24

+0

MS сломал Volta, но вы можете делать аналогичные вещи с помощью http://jsc.sourceforge.net/ – mcintyre321 2009-08-06 11:35:45

Смежные вопросы