Как создать язык в эти дни?

Мы используем.Net 2.0 и вытаскиваем информацию о версии из блока. Возможно, не идеальный, но мы используем описание для хранения даты сборки.

Assembly assembly = Assembly.GetExecutingAssembly();
string version = assembly.GetName().Version.ToString();
string buildDate = ((AssemblyDescriptionAttribute)Attribute.GetCustomAttribute(
    assembly, typeof(AssemblyDescriptionAttribute))).Description;

процесс сборки использует asminfo nant задача генерировать файл AssemblyInfo.cs, который содержит эту информацию.

    <asminfo output="Properties\AssemblyInfo.cs" language="CSharp">
        <imports>
            <import namespace="System" />
            <import namespace="System.Reflection" />
            <import namespace="System.Runtime.CompilerServices" />
            <import namespace="System.Runtime.InteropServices" />
        </imports>
        <attributes>
            <attribute type="AssemblyVersionAttribute" value="${assembly.version}" />
            <attribute type="AssemblyInformationalVersionAttribute" value="${assembly.version}" />
            <attribute type="AssemblyDescriptionAttribute" value="${datetime::now()}" />
            ...
        </attributes>
    </asminfo>
9
задан Mike 11 October 2009 в 06:43
поделиться

16 ответов

Not an easy answer, but..

You essentially want to define a set of rules written in text (tokens) and then some parser that checks these rules and assembles them into fragments.

http://www.mactech.com/articles/mactech/Vol.16/16.07/UsingFlexandBison/

People can spend years on this, The above article talks about using two tools (Flex and Bison) That can be used to turn text into code you can feed to a compiler.

0
ответ дан 4 December 2019 в 07:47
поделиться

Одним из новых соображений, появившихся в эпоху перфокарт, является существование виртуальных машин, которые уже в изобилии снабжены «стандартными библиотеками». Ориентация на JVM или .NET CLR вместо старого «сада с языковой стеной» избавляет вас от многих проблем с начальной загрузкой. Если вы создаете скомпилированный язык, вы также можете найти байт-код Java или MSIL более простой целью компиляции, чем машинный код (конечно, если вы занимаетесь этим ради удовольствия от создания жесткого оптимизирующего компилятора, вы увидите это как ошибка, а не функция).

С другой стороны, идиомы JVM или CLR могут не соответствовать вашему языку. Таким образом, вы все равно можете создавать «стандартные библиотеки» только для обеспечения идиоматических интерфейсов на платформе. (Примером является то, что каждый язык и его собака, кажется, предоставляют свой собственный метод для записи в консоль, вместо того, чтобы оставлять пользователей вручную вызывать System.out.println или Console.WriteLine.) Тем не менее, он позволяет постепенно развивать идиоматику. библиотеки, и означает, что более непонятные библиотеки, для которых вы никогда не дойдете до создания идиоматических интерфейсов, по-прежнему доступны, даже если уродливым способом.

Если вы рассматриваете интерпретируемый язык, .NET также поддерживает эффективную интерпретацию через Среда выполнения динамического языка (DLR). (Не знаю, есть ли эквивалент для JVM.) Это должно помочь вам сосредоточиться на дизайне языка, не беспокоясь об оптимизации интерпретатора.

вместо того, чтобы оставлять пользователей вручную вызывать System.out.println или Console.WriteLine.) Тем не менее, он позволяет постепенно разрабатывать идиоматические библиотеки и означает, что более непонятные библиотеки, для которых вы никогда не дойдете до создания идиоматических интерфейсов, по-прежнему доступны даже если уродливым способом.

Если вы рассматриваете интерпретируемый язык, .NET также поддерживает эффективную интерпретацию с помощью среды выполнения динамического языка (DLR). (Я не знаю, есть ли эквивалент для JVM.) Это должно помочь вам сосредоточиться на дизайне языка, не беспокоясь об оптимизации интерпретатора.

вместо того, чтобы оставлять пользователей вручную вызывать System.out.println или Console.WriteLine.) Тем не менее, он позволяет постепенно разрабатывать идиоматические библиотеки и означает, что более непонятные библиотеки, для которых вы никогда не дойдете до создания идиоматических интерфейсов, по-прежнему доступны даже если уродливым образом.

Если вы рассматриваете интерпретируемый язык, .NET также поддерживает эффективную интерпретацию с помощью среды выполнения динамического языка (DLR). (Я не знаю, есть ли эквивалент для JVM.) Это должно помочь вам сосредоточиться на дизайне языка, не беспокоясь об оптимизации интерпретатора.

и означает, что более непонятные библиотеки, для которых вы никогда не дойдете до создания идиоматических интерфейсов, по-прежнему доступны, даже если они уродливы.

Если вы рассматриваете интерпретируемый язык, .NET также поддерживает эффективную интерпретацию через динамический Языковая среда выполнения (DLR). (Я не знаю, есть ли эквивалент для JVM.) Это должно помочь вам сосредоточиться на дизайне языка, не беспокоясь об оптимизации интерпретатора.

и означает, что более непонятные библиотеки, для которых вы никогда не дойдете до создания идиоматических интерфейсов, по-прежнему доступны, даже если они уродливы.

Если вы рассматриваете интерпретируемый язык, .NET также поддерживает эффективную интерпретацию через динамический Языковая среда выполнения (DLR). (Не знаю, есть ли эквивалент для JVM.) Это должно помочь вам сосредоточиться на дизайне языка, не беспокоясь об оптимизации интерпретатора.

7
ответ дан 4 December 2019 в 07:47
поделиться

Real coders still code in C. Just that it's a litte sharper.
Hmmm... language design? or writing a compiler? If you want to write a compiler, you'd use Flex + Bison. (google)

0
ответ дан 4 December 2019 в 07:47
поделиться

You should not accept wimpy solutions like using the latest tools. You should bootstrap the language by writing a minimal compiler in Visual Basic for Applications or a similar language, then write all the compilation tools in your new language and then self-compile it using only the language itself.

Also, what is the proposed name of the language?

I think recently there have not been languages with ALL CAPITAL LETTER names like COBOL and FORTRAN, so I hope you will call it something like MIKELANG with all capital letters.

2
ответ дан 4 December 2019 в 07:47
поделиться

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

Стандартные библиотеки - включают эквивалент всего, что есть в стандартных библиотеках C99, кроме setjmp. Добавьте все, что вам нужно для своего домена. Разработайте простой способ сделать это, например, SWIG или встроенный FFI, такой как Ruby '

2
ответ дан 4 December 2019 в 07:47
поделиться

Как человек, только что построивший очень простой ассемблер, такой как язык и интерпретатор, я бы начал с .NET framework или подобного. Ничто не может сравниться с мощным синтаксисом C # +, который поддерживает все сообщество .NET при попытке написать большинство вещей. Отсюда я разработал простой формат байт-кода и синтаксис ассемблера и приступил к написанию своего интерпретатора + ассемблера.

Как я уже сказал, это был очень простой язык.

2
ответ дан 4 December 2019 в 07:47
поделиться

I'm pretty sure you do what's always been done.

Write some code, and show your results to the world.

As compared to the olden times, there are some tools to make your job easier though. Might I suggest ANTLR for parsing your language grammar?

2
ответ дан 4 December 2019 в 07:47
поделиться

На самом деле я ребенок, ха-ха. Я' Я никогда раньше не писал настоящий компилятор и не разрабатывал язык, но я закончил «Книгу Красного Дракона», так что я полагаю, что у меня есть какая-то идея (надеюсь).

Это будет зависеть в первую очередь от грамматики. Если это LR или LALR, я полагаю, что инструменты вроде Bison / Flex будут работать хорошо. Если это больше LL, я бы использовал Spirit , который является компонентом Boost. Он позволяет вам писать грамматику языка на C ++ в синтаксисе, подобном EBNF, так что не нужно путаться с генераторами кода; компилятор C ++ компилирует грамматику за вас. Если что-то из этого не сработает, я напишу грамматику EBNF на бумаге, а затем продолжу выполнять тяжелый рекурсивный анализ спуска, который, кажется, работает; если C ++ может быть хорошо проанализирован с использованием RDP (как это делает GCC), тогда, я полагаю, при наличии достаточного количества модульных тестов и терпения вы могли бы написать целые компиляторы с использованием RDP.

Когда у меня запущен парсер и какое-то промежуточное представление, это зависит от того, как он работает. Если это какой-то компилятор байт-кода или машинного кода, я буду использовать LLVM или libJIT для его обработки. LLVM больше подходит для общей компиляции, но мне больше нравится libJIT API и документация. В качестве альтернативы, если я очень ленив, я сгенерирую код C и позволю GCC выполнить фактическую компиляцию. Другой альтернативой является нацеливание на существующую виртуальную машину, например Parrot, JVM или CLR. Parrot - виртуальная машина, разрабатываемая для Perl. Если это просто интерпретатор, я пройдусь по синтаксическому дереву.

Радикальной альтернативой является использование Prolog, который имеет синтаксические особенности, которые замечательно имитируют EBNF. Однако у меня нет опыта с этим, и если я не ошибаюсь (а я почти наверняка буду), Prolog будет довольно медленным, если его использовать для синтаксического анализа тяжелых языков программирования с большим количеством синтаксических конструкций и причуд (читайте: C ++ и Perl).

Все это я сделаю на C ++, хотя бы потому, что я больше привык писать на нем, чем на C. Я бы держался подальше от Java / Python или чего-либо в этом роде для реального производственного кода ( написание компиляторов на C / C ++ помогает сделать его переносимым), но я мог видеть себя использующим их в качестве языка прототипирования, особенно Python, к которому я неравнодушен. Конечно, я никогда раньше ничего подобного не делал, так что не скажу.

Пролог был бы довольно медленным, если бы он использовался для синтаксического анализа языков программирования с большим количеством синтаксических конструкций и причуд (читайте: C ++ и Perl).

Все это я сделаю на C ++, хотя бы потому, что я больше привык писать в нем, чем в C.Я бы держался подальше от Java / Python или чего-либо в этом роде для реального производственного кода (написание компиляторов на C / C ++ помогает сделать его переносимым), но я мог видеть себя использующим их в качестве языка прототипирования, особенно Python, к которому я неравнодушен. Конечно, я никогда раньше ничего подобного не делал, так что не скажу.

Пролог был бы довольно медленным, если бы его использовали для синтаксического анализа языков программирования с большим количеством синтаксических конструкций и причуд (читайте: C ++ и Perl).

Все это я сделаю на C ++, хотя бы потому, что я больше привык писать в нем, чем в C.Я бы держался подальше от Java / Python или чего-либо в этом роде для реального производственного кода (написание компиляторов на C / C ++ помогает сделать его переносимым), но я мог видеть себя использующим их в качестве языка прототипирования, особенно Python, к которому я неравнодушен. Конечно, я никогда раньше ничего подобного не делал, так что не скажу.

d держаться подальше от Java / Python или чего-либо в этом роде для реального производственного кода (написание компиляторов на C / C ++ помогает сделать его переносимым), но я мог видеть себя использующим их в качестве языка прототипирования, особенно Python, который я частично к. Конечно, я никогда раньше ничего подобного не делал, так что не скажу.

d держитесь подальше от Java / Python или чего-либо в этом роде для реального производственного кода (написание компиляторов на C / C ++ помогает сделать его переносимым), но я мог видеть себя использующим их в качестве языка прототипирования, особенно Python, который я частично к. Конечно, я никогда раньше ничего подобного не делал, так что не скажу.

1
ответ дан 4 December 2019 в 07:47
поделиться

Что значительно изменилось, но еще не упомянуто, так это поддержка и совместимость IDE:

В настоящее время мы почти ожидаем Intellisense, пошаговое выполнение и проверку состояния "прямо в окно редактора », новые типы, которые сообщают отладчику, как с ними обращаться, и довольно полезные диагностические сообщения. Старого исполняемого файла "compile .x -> .y" уже недостаточно для создания языка. Среда не на чем сосредоточиться в первую очередь, но влияет на готовность к принятию.

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

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

3
ответ дан 4 December 2019 в 07:47
поделиться

Сначала я потратил год или около того, чтобы реально подумать, как должен выглядеть язык. В то же время я помогал в разработке Ioke (www.ioke.org) для изучения внутренних языков.

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

Поскольку мой язык прост на синтаксическом уровне (без ключевых слов, только литералы, операторы и сообщения), я мог бы использовать Ragel ( http: //www.complang .org / ragel / ) для строительного сканера. Это чертовски быстро и просто в использовании.

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

0
ответ дан 4 December 2019 в 07:47
поделиться

Я написал два компилятора на Haskell для небольших предметно-ориентированных языков и обнаружил, что это невероятно продуктивный опыт. Библиотека parsec упрощает работу с синтаксисом, а интерпретаторы очень просто писать поверх структуры данных Haskell. Есть описание написания интерпретатора Lisp на Haskell , которое я нашел полезным.

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

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

6
ответ дан 4 December 2019 в 07:47
поделиться

Майк -

Если вас интересует эффективный компилятор, генерирующий собственный код для Windows, чтобы вы могли ориентироваться - не пробираясь через все ненужные виджеты, гаджеты, и прочую ерунду, загромождающую современные машины - я рекомендую систему разработки Plain English от Osmosian Order. Он включает в себя уникальный интерфейс, упрощенный файловый менеджер, удобный текстовый редактор, удобный шестнадцатеричный дампер, компилятор / компоновщик (конечно) и приложение для создания макетов страниц wysiwyg для документации. Написанный полностью на простом английском языке, он является быстрой загрузкой (менее мегабайта), достаточно мал, чтобы понять его в короткие сроки (около 25000 строк кода на простом английском языке, всего 4000 строк в компиляторе / компоновщике), но достаточно мощным, чтобы воспроизвести себя на самом дешевом Dell менее чем за три секунды. В самом деле: три секунды. И это бесплатно для всех, кто напишет и попросит копию, включая исходный код и довольно юмористическое ироничное руководство на 100 страниц. Посетите www.osmosian.com для получения подробной информации о том, как получить копию, или напишите мне напрямую с вопросами или комментариями:Gerry.Rzeppa@pobox.com

-1
ответ дан 4 December 2019 в 07:47
поделиться

На lambda-the-ultimate есть ссылка на Create Your Own Programming Language от Марка-Андре Курнуайе, которая, кажется, описывает, как использовать некоторые современные инструменты для создания небольших языков. .

1
ответ дан 4 December 2019 в 07:47
поделиться

Конечно, старые методы все еще распространены (например, использование Flex и Bison). Многие новые языковые реализации объединяют фазы лексирования и синтаксического анализа с использованием синтаксического анализатора, основанного на грамматике синтаксического анализа (PEG). Это работает для парсеров с рекурсивным спуском, созданных с помощью комбинаторов или запоминающих парсеров Packrat. Многие компиляторы также построены с использованием фреймворка Antlr.

0
ответ дан 4 December 2019 в 07:47
поделиться

Just to clarify, I mean, not how do you DESIGN a language (that I can figure out fairly easily)

Just a hint: Look at some quite different languages first, before designing a new languge (i.e. languages with a very different evaluation strategy). Haskell and Oz come to mind. Though you should also know Prolog and Scheme. A year ago I also was like "hey, let's design a language that behaves exactly as I want", but fortunatly I looked at those other languages first (or you could also say unfortunatly, because now I don't know how I want a language to behave anymore...).

1
ответ дан 4 December 2019 в 07:47
поделиться

Прежде чем приступить к созданию языка, вы должны прочитать это:

Ханспетер Мессенбок, Искусство Никлауса Вирта

ftp://ftp.ssw.uni-linz.ac.at/pub/Papers/Moe00b. pdf

1
ответ дан 4 December 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: