Как начать писать очень простой язык программирования

Недавно я собирался искать идеи о том, что я смогу построить, используя C этим летом, и я наткнулся на это сообщение: Интересный проект для изучения C?

Внедрение языка программирования. Эта не должно быть ужасно трудно - я сделал язык, который не должен быть названный - но это заставит вас учиться много важных частей C. Если вы не хотите писать лексер и/или парсер самостоятельно, вы можете использовать lex/flex и yacc/bison, но если вы планируете что вы можете начать с несколько меньший проект.

Я как бы заинтриговал реализацию ответа на языковой язык программирования, и мне интересно, как мне это начать? Я прошел через всю книгу K & R, и я тоже сделал некоторые упражнения. У меня также есть немного опыта работы на С++ и Java, если это имеет значение. Какие-нибудь советы? Спасибо!

Ответы

Ответ 1

Узнайте о регулярных выражениях, грамматиках и хорошем генераторе парсера.

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

Ответ 2

Начните с очень простого (игрушечного) языка; позже вы можете создать более сложный синтаксис.

Вы можете написать интерпретатор для синтаксического анализа строк, например,

integer x
integer y
set x, 2
set y, 5
add x, y // x = x + y
print x

и немедленно оцените каждую строку. Если вы сохраните строки в векторе, было бы легко реализовать циклы с помощью команды goto.


Пример Другой мир (марочная игра)
Script:

alt text

Ответ 3

Я бы начал с простой программы калькулятора, которая может читать такие вещи, как:

5 + 10 * 3

и напечатайте ответ. Затем вы можете продвигать его, чтобы добавить переменные, управлять потоком, даже функциями.

Ответ 4

Могу ли я просто сказать, что я видел много людей, задающих такие вопросы, как "Как создать язык программирования?" или "Как сложно сделать язык программирования", и большинство ответов просто говорят им, что вам нужно пройти годы университета и читать книги длиной 1000 страниц. Я здесь, чтобы рассказать всем, что вы можете опубликовать эти ответы, но это не помогает им в их путешествии, чтобы сделать язык программирования. Мне 16 лет, я занимаюсь программированием почти 2 года, и я пишу языки программирования. Довольно продвинутые объектно-ориентированные, но я не читал ни одной книги, я не делал 8-летнего университета. Чтобы заставить людей начать, вот простой язык программирования, написанный на С#:

string code = "print Hello World";
foreach (string a in code.Split('\n'))
{
    if (a.StartsWith("print "))
    {
        Console.WriteLine(a.Substring(6));
    }
}

любой, кто знает базовый С#, должен уметь это понимать. Вы не можете начинать создавать языки программирования, не имея опыта программирования. Удостоверьтесь, что вы изучаете язык программирования и удостоверяетесь, что знаете об этом много, а затем просто начинайте писать простые кусочки кода, например, я опубликовал, а с экспериментами и практикой вы начнете писать некоторые сложные языки программирования без время:)

Ответ 5

Ну, я думаю, что что-то вроде этого действительно сложно сделать, но это был бы отличный проект для домашних животных. У вас должны быть понятия парсеров, лексеров, управления потоком, парадигмы (императивный, функциональный, OO) и многое другое.

Многие говорят, что Книга Дракона - одна из лучших книг для этого. Может быть, вы можете взглянуть на это:)

Удачи!

Ответ 6

вы можете прочитать несколько хорошо написанных работ Никлауса Вирта:

  • "Конструкция компилятора" (доступно здесь) - краткое, краткое введение в искусство построения компилятора.
  • "Алгоритмы + Структура данных = Программы" (к сожалению, из печати) содержит более простой язык (названный PL/0) в его последней главе.

хотя эти статьи в основном написаны в Паскале, открытые концепции легко перевести на C.

Ответ 7

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

Самый простой способ, которым я нашел такое, - сделать дерево разбора. Это можно сделать легко, используя два стека, стек оператора и стек результатов. После этого вы можете просто проанализировать его рекурсивно с помощью DFS, возможно, используйте шаблон , если вы решите реализовать его на объектно-ориентированном языке.

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

Ответ 8

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

Вот первый взнос: v0.1 - Целые числа.

Ответ 9

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

Ответ 10

Если вы говорите по-французски, вы можете быть заинтересованы в одном из курсов моих коллег (свободно доступны) http://matthieuamiguet.ch/scientifique/enseignement/langages-et-compilateurs, хотя он использует Python для объяснения концепций построения и компиляции языка.

Английский PDF из PyCon 2010 http://matthieuamiguet.ch/assets/files/scientifique/publis/TeachingCompilersWithPython_Paper.pdf

Мне, возможно, придется поговорить с ним о переводе его информации на английский язык 8)

Ответ 11

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

Ответ 12

Чтобы все было просто, я рекомендую внедрить простой постфиксный язык. FORTH или основная часть PostScript - отличный выбор.

Ответ 13

Прочитайте сообщения в сборниках compenpils usenet, они доступны через группы Google. В нем много дискуссий, связанных с построением языка, построением компилятора, lex/yacc, грамматиками и т.п. Разумеется, вам нужно будет хорошо знакомство с такими классиками, как книга драконов, книга тигра из многих книг по компиляторам и хорошие книги по алгоритмам и структурам данных.

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

Ответ 14

Пусть кто-то сделает грязную работу для вас, а именно лексер и парсер. Используйте кубок, yacc или bison для обработки синтаксиса. Это позволит вам сосредоточиться на более важных решениях для языкового дизайна. Существуют даже примеры парсеров для многих языков, которые вы можете использовать в качестве шаблона для своих.