Как сделать параллельный компилятор для .NET - PullRequest
7 голосов
/ 16 сентября 2008

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

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

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

-

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

Ответы [ 3 ]

2 голосов
/ 01 октября 2008

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

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

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

0 голосов
/ 16 сентября 2008

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

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

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

0 голосов
/ 16 сентября 2008

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

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

...