Может ли статически типизированный язык быть разработан с помощью DLR? - PullRequest
6 голосов
/ 06 октября 2011

Мне нужно разработать компилятор для статически типизированного языка для .NET. Я рассматриваю возможность использования DLR для этого вместо построения всех частей (Lexer / Parser, Синтаксис, Семантика, Генерация кода).

Подойдет ли DLR для этого сценария?Или было бы лучше создать компилятор непосредственно для .NET и избежать всех динамических вызовов.

РЕДАКТИРОВАТЬ: я реализовал язык без использования каких-либо динамических выражений, которые предлагает DLR, вместо этого я использовал другиеВыражения.

После этого я могу сказать, что гораздо лучше при реализации компилятора для непосредственного нацеливания на DLR, а не на IL.Сгенерированный код по-прежнему будет очень чистым.

Если вы хотите увидеть некоторые проверки кода: tigerconverters.codeplex.com/

Ответы [ 3 ]

4 голосов
/ 08 октября 2011

Лучшее, что может предложить DLR в этом случае, - это деревья выражений. Это те же самые деревья выражений, которые были введены для LINQ, но они были расширены для поддержки генерации полных программ. Гораздо проще генерировать деревья выражений по сравнению с IL, и вы получаете кучу полезных проверок при генерации дерева вместо сложных для диагностики сбоев при генерации недопустимого IL. Поэтому вы должны проверить System.Linq.Expressions. Чтобы скомпилировать и сохранить в сборке, вам нужно использовать LambdaExpression.CompileToMethod.

Единственное, что динамически при их использовании - это узлы DynamicExpression, которых вы можете полностью избежать.

3 голосов
/ 06 октября 2011

DLR предоставляет много инфраструктуры, которая также полезна для статических языков. Например, он имеет реализации по умолчанию для связывания вызовов методов и разрешения перегрузки. Это нормально, если семантика вашего языка соответствует поведению по умолчанию.

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

DLR не поможет вам с анализом или лексингом.

Есть и другие варианты. Например, вы можете взглянуть на проект Common Compiler Infrastructure , созданный Германом Виттером из MSR. На самом деле это может быть лучшим общим матчем.

2 голосов
/ 06 октября 2011

Кстати, вам нужно реализовать собственный парсер для вас own DSL (Domain Specific Language).Компиляция может быть ретранслирована на CLR, но не ваш парсер.DLR или CLR не будут иметь значения в смысле вашего фактического вопроса.

Полезная ссылка: Создание языкового компилятора для .NET Framework

...