В.NET Anders Hejlsberg 4,0 презентации он обсудил в СЕТЕВЫХ 5.0 ("или некоторый будущий выпуск") они работают над моделью "Compiler as a Service".
Состояния Anders Hejlsberg: [источник] [1] "Мы хотим открыть наш компилятор, таким образом, это становится API, который можно назвать, чтобы скомпилировать часть кода и возвратить деревья выражений и/или IL. Это включает большое количество сценариев, таких как программируемость приложения, интерактивная подсказка, написанные пользователем рефакторинги и предметно-ориентированные языки, которые имеют небольшие острова C#, встроенного в них".
Я изо всех сил пытаюсь найти пример реального мира, где это могло на самом деле быть полезно. Я пропускаю главное понятие здесь? или это действительно собирается принести пользу языку?
[1]: компилятор http://www.simple-talk.com/opinion/geek-of-the-week/anders-hejlsberg-geek-of-the-week/ как услуга
Для некоторых проблем проще написать программу, которая может генерировать программу, решающую реальную проблему. Одна из областей, где это особенно полезно, - создание синтаксических анализаторов для компиляторов.
В других случаях можно генерировать код "на лету", который может быть приспособлен для обеспечения оптимальной производительности при работе с определенным типом данных, о свойствах которого вы только что узнали во время выполнения, размышляя над его метаданными. Один из примеров, который я могу привести, это мой проект Modelshredder. По сути, он делает следующее: берет все поля и свойства объекта и упаковывает их значения в массив объектов.
Мой первый подход к этой проблеме заключался в ручной инъекции MSIL с использованием Reflection.Emit
. Второй подход был немного более динамичным и опирался на деревья выражений, которые могут быть эффективно построены и скомпилированы во время выполнения, чтобы обеспечить ту же функциональность, что и моя ручная инъекция MSIL. Вы можете увидеть эту реализацию в стволе MoreLinq (просто загляните на сайт Modelshredder, там есть ссылка на него). Наличие Compiler as a Service фактически позволит мне поднять уровень абстракции и выдать код на C#, который затем будет скомпилирован в MSIL.
Доводы в пользу Domain Specific Languages уже были приведены, также я думаю, что императивный язык, такой как C#, не очень хорошо подходит для сценария "командной строки", а скорее для больших сценариев. Существует изящная система make, основанная на F# DSL под названием FAKE, которая заимствует многие концепции Compiler as a Service. Похожие концепции используются в F# Interactive Window (так ли оно называется?) в VisualStudio.
Думаю, еще один пример - защита от копирования. На вашем компьютере может быть уникальный фрагмент кода, созданный при установке для привязки программы к идентификатору процессора.
Допустим, я использую ваш серийный номер в качестве параметра при расчете налогов. Копию программы легко сделать и она совершенно бесполезна.
Реальный пример того, как это может быть полезно, - это расширяемость игр для пользователей. Большинство современных игр допускают некоторую расширяемость для пользователей с помощью языков сценариев, которые могут быть относительно медленными, или с помощью скомпилированных библиотек DLL, для которых требуется платформа разработки (и знания для ее использования). Это позволит пользователям писать расширения для игры с использованием C #, которые будут компилироваться игрой во время выполнения, без необходимости от пользователя компилировать их самостоятельно. Это также позволит тестировать новые идеи путем ввода, например, кода C # в окно игровой консоли без необходимости перезапускать игру для каждого небольшого изменения. В настоящее время такие вещи действительно возможны только со встроенными интерпретируемыми языками сценариев.