How to make a Side-by-Side Compiler for .NET
Сценарий Никхила Котари #, возможно, является одной из самых удивительных концепций, которые я видел на арене JavaScript в течение достаточно долгого времени. Этот вопрос не о JavaScript, а о компиляции языка во время выполнения.NET.
Меня довольно интересовало, как с помощью платформы.NET можно написать компилятор для языка, который уже имеет компилятор (например, C#), который будет генерировать отдельный вывод от исходного компилятора, в то же время позволяя исходному компилятору генерировать вывод для один и тот же источник во время той же самой операции сборки, все время ссылаясь / используя выходные данные другого компилятора.
Я не совсем уверен, что даже достаточно хорошо понимаю процесс, чтобы задать вопрос с правильными деталями, но именно так я сейчас и вижу процесс, как показано на схемах в Script # docs. Я думал о многих вещах, связанных со сложным языковым дизайном и компиляцией, которые могли бы использовать преимущества таких концепций, и мне интересно, что другие люди думают о концепциях.
-
Изменить: Спасибо за комментарий, пока; Ваша информация сама по себе очень интригует, и я хотел бы исследовать ее больше, но мой вопрос на самом деле о том, как я смогу написать свой собственный компилятор (ы), который может быть запущен на одном и том же источнике одновременно создание нескольких различных типов (потенциально) взаимозависимых выходных данных с использованием CLR. Скрипт # служит примером, поскольку он генерирует JavaScript и сборку, используя один и тот же источник C#, в то же время заставляя скомпилированную сборку взаимодействовать с JavaScript. Мне любопытно, каковы различные подходы и теоретические концепции в разработке чего-то такого рода.
3 ответа
Важно понимать, что все, что делает компилятор, - это берет исходный язык (в данном случае C#), анализирует его, чтобы у компилятора было представление, которое имеет смысл для него, а не для людей (это абстрактное синтаксическое дерево), а затем выполняет генерация наивного кода на целевом языке (msil является целью для языков, работающих в среде выполнения.NET).
Теперь, если код script# превращен в сборку и взаимодействует с другим кодом.NET, это означает, что этот компилятор должен генерировать msil. скрипт # использует для этого csc.exe, который является просто стандартным компилятором C#. Теперь, чтобы сгенерировать javascript, он должен взять C# или msil, проанализировать его и сгенерировать javascript для отправки в браузер. В документации сказано, что у него есть собственный компилятор C# -> js под названием ssc.exe.
Чтобы все взаимодействовало как на стороне клиента, так и на стороне сервера, у него есть набор ссылочных сборок, которые написаны на.NET, но также скомпилированы в javascript. Это не специфическая проблема компилятора, эти ссылочные сборки являются скриптом # runtime. Время выполнения, вероятно, ответственно за большую часть магии сценария, которую вы воспринимаете.
Допустим, вы хотите скомпилировать C# в Javascript. Вы спрашиваете, можете ли вы воспользоваться существующими компиляторами C#, поэтому вместо компиляции C# в Javascript вы фактически конвертируете MSIL, сгенерированный компилятором C#, в Javascript?
Конечно, вы можете сделать это. Получив двоичный файл MSIL, вы можете делать с ним все, что захотите.
У Microsoft есть исследовательский проект под названием Volta, который, помимо прочего, компилирует msil в JavaScript.
набор инструментов разработчика для создания многоуровневых веб-приложений с использованием существующих и знакомых инструментов, методов и шаблонов. Декларативное разделение уровней Volta позволяет разработчикам откладывать архитектурные решения о распределении до последнего возможного ответственного момента. Кроме того, благодаря общей модели программирования для нескольких уровней Volta обеспечивает новое сквозное профилирование и тестирование для более высоких уровней производительности, надежности и надежности приложений. Используя декларативное разделение уровней, разработчики могут уточнить архитектурные решения на основе этих данных профилирования. Это экономит время и затраты, связанные с ручным рефакторингом. По сути, Volta расширяет платформу.NET для дальнейшей разработки приложений программного обеспечения и услуг, используя существующие и знакомые инструменты и методы.
Вы проектируете и создаете свое приложение как клиентское приложение.NET, назначая части приложения, которые выполняются на уровне сервера и уровне клиента в конце процесса разработки. Вы можете выбрать в качестве клиентов веб-браузеры или CLR, а Volta справится со сложностями разделения уровней. Компилятор создает кросс-браузерный JavaScript для клиентского уровня, веб-сервисы для серверного уровня и все средства связи, сериализации, синхронизации, безопасности и другой стандартный код для связывания этих уровней. По сути, Volta предлагает лучший опыт работы в разных средах без необходимости индивидуальной настройки приложения.