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

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

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

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

-

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
755
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

a developer toolset for building multi-tier web applications using existing and familiar tools, techniques and patterns. Volta’s declarative tier-splitting enables developers to postpone architectural decisions about distribution until the last possible responsible moment. Also, thanks to a shared programming model across multiple-tiers, Volta enables new end-to-end profiling and testing for higher levels of application performance, robustness, and reliability. Using the declarative tier-splitting, developers can refine architectural decisions based on this profiling data. This saves time and costs associated with manual refactoring. In effect, Volta extends the .NET platform to further enable the development of software+services applications, using existing and familiar tools and techniques.

You architect and build your application as a .NET client application, assigning the portions of the application that run on the server tier and client tier late in the development process. You can target either web browsers or the CLR as clients and Volta handles the complexities of tier-splitting. The compiler creates cross-browser JavaScript for the client tier, web services for the server tier, and all communication, serialization, synchronization, security, and other boilerplate code to tie the tiers together. In effect, Volta offers a best-effort experience in multiple environments without requiring tailoring of the application.

Не совсем то, что я искал здесь (см. Выше), но я ценю информацию о Volta, так как это еще одна захватывающая реализация в этом направлении, о которой я хотел бы узнать больше.

TheXenocide 17.09.2008 07:31
Ответ принят как подходящий

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

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

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

Волшебство, которое меня интересует, - это то, что он делает в процессе сборки, чтобы сборка, которую он генерирует из вашего кода, ссылалась на javascript, который он генерирует из вашего кода. Он может просто изменить источник, прежде чем передать его в CSC или, возможно, в CodeDOM, чтобы скомпилировать график на основе источника, но с изменениями.

TheXenocide 02.10.2008 00:44

Большое спасибо за реальный ответ на вопрос, хотя я надеялся, что кто-нибудь дойдет до этого. Если вы можете уточнить, существует ли что-то для выполнения этой магии, или это просто незначительное вмешательство, я готов принять этот ответ. (Ключ: один источник - два взаимозависимых выхода)

TheXenocide 02.10.2008 00:46

Другие вопросы по теме