Каковы преимущества компилятора как сервиса - PullRequest
10 голосов
/ 04 июня 2010

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

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

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

[1]: http://www.simple -talk.com / мнение / выродок недели / андерс-хейлсберг-выродок-week / Компилятор как сервис

Ответы [ 4 ]

4 голосов
/ 13 июля 2010

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

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

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

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

4 голосов
/ 04 июня 2010

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

2 голосов
/ 04 июня 2010

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

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

0 голосов
/ 05 октября 2011

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

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

...