Как сделать параллельный компилятор для .NET

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

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

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

--

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


person TheXenocide    schedule 16.09.2008    source источник


Ответы (3)


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

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

Чтобы обеспечить согласованное взаимодействие как на стороне клиента, так и на стороне сервера, у него есть набор эталонных сборок, написанных на .NET, но также скомпилированных в javascript. Однако это не проблема конкретного компилятора, эти эталонные сборки являются средой выполнения script#. Тем не менее, среда выполнения, вероятно, отвечает за большую часть магии script #, которую вы воспринимаете.

person sirwart    schedule 30.09.2008
comment
Магия, которая меня интересует, заключается в том, что он делает в процессе сборки, чтобы сборка, которую он генерирует из вашего кода, ссылалась на javascript, который он генерирует из вашего кода. Он может просто изменить исходный код, прежде чем передать его в CSC, или, может быть, CodeDOM для компиляции графа на основе исходного кода, но с изменениями. - person TheXenocide; 02.10.2008
comment
Большое спасибо за реальный ответ на вопрос, хотя я надеялся, что кто-нибудь доберется до этого. Если вы можете уточнить, существует ли что-то для выполнения этой магии или это просто легкая рука, я готов принять этот ответ. (Ключ: один источник - два взаимозависимых выхода) - person TheXenocide; 02.10.2008

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

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

person ibz    schedule 16.09.2008

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

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

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

person Lars Truijens    schedule 16.09.2008
comment
Не совсем то, что я искал здесь (см. выше), но я ценю информацию о Volta, так как это еще одна захватывающая реализация в этом направлении, о которой я хотел бы узнать больше. - person TheXenocide; 17.09.2008