Каковы преимущества компилятора как Службы

в презентации .NET 4.0 Андерса Хейлсберга он обсуждал в NET 5.0 ("или какой-то будущей версии"), они работают над моделью "компилятор как Служба".

состояния Андерса Хейльсберга: [Источник][1] "Мы хотим открыть наш компилятор, чтобы он стал API, который вы можете вызвать, чтобы скомпилировать кусок кода и вернуть деревья выражений и/или IL. Это позволяет использовать целый ряд сценариев, таких как программируемость приложений, интерактивное приглашение, пользовательские рефакторинги и домен языки, в которых есть маленькие островки C#."

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

[1]: http://www.simple-talk.com/opinion/geek-of-the-week/anders-hejlsberg-geek-of-the-week/ компилятор как сервис

4 ответов


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

в других случаях вы можете генерировать код на лету, который может быть адаптирован для обеспечения оптимальной производительности при работе с определенным типом данных, о свойствах которого вы только что узнали во время выполнения, отражая его метаданные. Один пример, который я могу вам привести, это мой Modelshredder. В основном он принимает все поля и свойства объекта и упаковывает их значение в массив объектов.

моим первым подходом к этой проблеме была ручная закодированная инъекция MSIL с использованием Reflection.Emit. Второй подход был немного более динамичным и опирался на деревья выражений, которые могут быть эффективно построены и скомпилированы во время выполнения, чтобы обеспечить ту же функциональность, что и моя ручная закодированная инъекция MSIL. Вы можете видеть, что реализовано в Morelinq trunk (просто посмотрите на сайт Modelshredder, для этого есть ссылка). Наличие компилятора в качестве службы фактически позволит мне повысить уровень абстракции и испустить код C#, который затем будет скомпилирован в MSIL.

случай для конкретных языков домена уже сделан, также я думаю, что императивный язык, такой как C#, не подходит для сценария "командной строки", а не для больших сценариев. Существует аккуратная система make на основе F# DSL под названием подделка, который заимствует много концепций компилятора как Службы. Аналогичные понятия используются в интерактивном окне F# (это называется так?) внутри VisualStudio.


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


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

предположим, что я использую ваш серийный номер в качестве параметра при расчете налога. Копию программы сделать легко и совершенно бесполезно.


также это делает написание программ, которые имеют аналогичную функциональность Linqpad очень легко.

другой вариант использования может быть использован для использования фрагментов исходного кода, хранящихся в базе данных и вызываемых на основе конкретных данных на основе конфигураций, подобно тому, как Workflow Foundation можно вызвать прямо сейчас. Это может помочь в автоматизации рабочего процесса для CRMs, ERPs и других приложений для хранения данных (хотя при злоупотреблении это будет эпическим антипатерном).