Можно ли разработать статически типизированный язык с помощью DLR?

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

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

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

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

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


person Ariel    schedule 05.10.2011    source источник
comment
Какое преимущество вы получите? В любом случае вам понадобятся лексический анализатор и парсер, иначе вы не поймете, что программа пытается сделать. Вы должны определить синтаксис и семантику, и вы должны проверить и то, и другое во время выполнения, даже если вы создаете интерпретатор from-source - намного раньше в компиляторе. И есть вероятность, что вам нужно сгенерировать некоторый код по некоторым причинам, хотя я никогда не создавал ничего, ориентированного на CLR или DLR, поэтому я не могу судить об этом.   -  person    schedule 06.10.2011
comment
Меня это очень интересует. Я создал несколько игрушечных компиляторов с нуля, компилятор tokeniser- ›parser-› planner- ›. Один даже построил довольно обширные деревья выражений в стиле C # и объемный синтаксический анализ методов. Какой синтаксис вы смотрите?   -  person Kieren Johnstone    schedule 06.10.2011
comment
@KierenJohnstone - язык, который я пытаюсь реализовать, - это Tiger , но более простая версия   -  person Ariel    schedule 06.10.2011
comment
@delnan, дело не в том, какие преимущества, если создание нового языка для .NET ничего не значит для вас, то в чем причина существования DLR. Новые языки могут лучше обрабатывать некоторые сценарии, такие как уже перенесенные Python, Ruby, Lisp.   -  person Ariel    schedule 06.10.2011
comment
@Ariel: DLR существует для реализации динамических языков. Если бы это было предназначено для упрощения создания компиляторов для статических языков, это не был бы динамический язык среда выполнения. По крайней мере, это то, что я собрал, поэтому комментарий вместо ответа.   -  person    schedule 06.10.2011
comment
@delnan Но вы можете реализовать статический язык, скомпилированный с помощью DLR, если на семантической фазе выполните весь анализ, проблема заключается в сгенерированном DLR коде по сравнению с кодом, созданным специально для статического языка.   -  person Ariel    schedule 06.10.2011
comment
Ага. Вы также можете скомпилировать код Python для серии вызовов API CPython. Но ни то, ни другое не имеет особого смысла. Главное (или даже единственное) преимущество DLR - динамичность - для такого проекта не требуется.   -  person    schedule 06.10.2011


Ответы (3)


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

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

person Dino Viehland    schedule 08.10.2011

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

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

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

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

person Jeffrey Sax    schedule 05.10.2011
comment
DLR построен на основе CLR, поэтому он предлагает более высокий уровень абстракции при генерации кода. CCI также делает это, но я думаю, что DLR предлагает более высокий уровень абстракции за счет генерации динамического кода. Я хочу знать: действительно ли это того стоит? как это повлияет на производительность созданной программы ?? По сравнению с генерацией кода, зная, что он статичен. - person Ariel; 06.10.2011
comment
Также семантический анализ может быть выполнен до генерации кода, и мы можем проверить такие вещи, как метод M (), принадлежит типу T и другие. а затем сгенерируйте код с помощью DLR. - person Ariel; 06.10.2011
comment
DLR работает с деревьями выражений. При необходимости разрешаются любые динамические выражения. (Раньше это было, когда код компилировался, но теперь есть еще и интерпретатор.) Если все известно статически, то с таким же успехом можно сгенерировать статические деревья выражений и скомпилировать их. В любом случае вам нужно будет выполнить привязку в какой-то момент. Преимущество DLR в том, что он упрощает создание REPL. - person Jeffrey Sax; 06.10.2011

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

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

person Tigran    schedule 05.10.2011
comment
Я никогда не говорил о создании DSL, и есть инструменты, которые помогают с Lexer и Parser. ANTLR - один из них, с его помощью вы можете построить AST, а затем использовать DLR для следующих этапов компилятор. - person Ariel; 06.10.2011
comment
@Ariel: я тоже :) Я говорю, что вы не можете избежать использования парсера и делать то, что вы хотите, только с мощностью DSL. В моем последнем предложении говорится именно об этом. - person Tigran; 06.10.2011