Недавно я собирался искать идеи о том, что я могу построить, используя C этим летом, и я наткнулся на этот пост: Интересный проект по изучению C?
Внедрение языка программирования. Это не должно быть ужасно сложно – я сделал язык, который нельзя назвать, но он заставит вас изучить многие важные части C. Если вы не хотите писать лексер и / или парсер вы можете использовать lex / flex и yacc / bison, но если вы планируете, что вы можете начать с несколько меньшего проекта.
Я был немного заинтригован внедрением ответа на языковой язык программирования, и мне интересно, как мне это начать? Я просмотрел всю книгу K & R, и я тоже сделал некоторые упражнения. У меня также есть немного опыта работы на C ++ и Java, если это имеет значение. Какие-нибудь советы? Спасибо!
Узнайте о регулярных выражениях, грамматиках и хорошем генераторе парсеров.
Даже если вы в конечном итоге реализуете свой собственный парсер, это фундаментальные концепции для реализации любого языка программирования.
Я бы начал с простой калькулятор калькулятор, который может читать такие вещи, как:
5 + 10 * 3
и напечатайте ответ. Затем вы можете продвигать его, чтобы добавить переменные, управлять streamом, даже функциями.
Начните с очень простого (игрушечного) языка; позже вы можете создать более сложный синтаксис.
Вы могли бы написать интерпретатор для синтаксического анализа строк, например,
integer x integer y set x, 2 set y, 5 add x, y // x = x + y print x
и немедленно оценивайте каждую строку. Если вы сохраните строки в векторе, было бы легко реализовать петли с помощью команды goto
.
Пример, Другой мир (марочная игра)
Редактор скриптов:
Могу ли я просто сказать, что многие люди задавали такие вопросы, как «Как мне создать язык программирования?» или «Как сложно сделать язык программирования», и большинство ответов просто говорят им, что вам нужно пройти годы университета и читать книги длиной 1000 страниц. Я здесь, чтобы рассказать всем, что вы можете опубликовать эти ответы, но это не помогает им в их путешествии, чтобы сделать язык программирования. Мне 16 лет, я занимаюсь программированием почти 2 года, и я пишу языки программирования. Довольно продвинутые объектно-ориентированные, но я не читал ни одной книги, я не делал 8-летнего университета. Чтобы начать работу, вот простой язык программирования, написанный на C #:
string code = "print Hello World"; foreach (string a in code.Split('\n')) { if (a.StartsWith("print ")) { Console.WriteLine(a.Substring(6)); } }
любой, кто знает базовый C #, должен уметь это понимать. Вы не можете начинать создавать языки программирования, не имея опыта программирования. Удостоверьтесь, что вы изучаете язык программирования и удостоверяетесь, что знаете об этом много, а затем просто начинайте писать простые кусочки кода, например, я опубликовал, а с экспериментами и практикой вы начнете писать некоторые сложные языки программирования без время 🙂
Ну, я думаю, что что-то вроде этого действительно сложно сделать, но это был бы отличный проект для домашних животных. У вас должны быть понятия парсеров, лексеров, управление streamами, парадигмы (императивные, функциональные, ОО) и многое другое.
Многие люди говорят, что книга Дракона – одна из лучших книг для этого. Может быть, вы можете взглянуть на это 🙂
Удачи!
вы можете прочитать несколько хорошо написанных работ Никлауса Вирта:
хотя эти статьи в основном написаны на Паскале, представленные концепции легко перевести на C.
Некоторое время назад я сделал простой парсер языка Java, в основном оценил математические выражения, заменил константы и переменные и предоставил некоторую обратную связь по ошибкам синтаксиса / типа.
Самый простой способ, которым я нашел такое, – создать дерево parsingа . Это можно сделать легко, используя два стека, стек оператора и стек результатов. После этого вы можете просто проанализировать его рекурсивно с помощью DFS, возможно, используйте шаблон посетителя, если вы решите реализовать его на объектно-ориентированном языке.
Об этом можно многое сказать, и если вы хотите, чтобы я мог объяснить их более подробно, я не сделал этого, потому что думал, что вы захотите попробовать реализовать вышеупомянутое, но если вы это сделаете, просто сообщите мне об этом и мы можем говорить.
Схема из Scratch – это хорошая серия сообщений в блогах о внедрении схемы в C. Код очень читабельен, и каждая версия основывается на предыдущем, что легко поддается наблюдению.
Вот первый взнос: v0.1 – Целые числа .
Другой вариант – построить язык, не глядя ни на что другое. Выясните, что вы можете сделать легко, и оттуда. Например, вы можете разобрать выражения в списке токенов, разделяя их пробелами и использовать префиксную нотацию (с которой достаточно просто справиться). Такого рода вещи – огромное удовольствие, и вы можете многому научиться экспериментировать.
Если вы говорите по-французски, вас может заинтересовать один из курсов моих коллег (свободно ansible) http://matthieuamiguet.ch/scientifique/enseignement/langages-et-compilateurs, хотя он использует Python для объяснения концепций построения и компиляции языка.
Английский PDF из PyCon 2010 http://matthieuamiguet.ch/assets/files/scientifique/publis/TeachingCompilersWithPython_Paper.pdf
Мне, возможно, придется поговорить с ним о переводе его информации на английский язык 8)
Один старый учебник по компиляции – вот этот . Хотя это в Паскале, это очень хороший источник информации. Если вы хотите что-то более недавнее, вы должны взглянуть на ANTLR .
Чтобы все было просто, я рекомендую внедрить простой постфиксный язык. FORTH или основная часть PostScript – отличный выбор.
Прочитайте сообщения в compilationах comp.compiles usenet, они доступны через группы Google. В нем много дискуссий, связанных с построением языка, построением компилятора, lex / yacc, грамматиками и т. П. Разумеется, вам придется хорошо знакомство с такими classиками, как книга драконов, книга тигра среди многих книг по компиляторам и хорошие книги по алгоритмам и структурам данных.
Оригинальному компилятору C дается новая жизнь. Большая часть его переписывается, а его кодовая база достаточно мала, чтобы ее можно было читать и понимать в летние каникулы. Рассмотрите возможность чтения кода вместе с документами, которые использовались для написания кода этого или любого рабочего компилятора, и я уверен, что вы получите представление о том, с чего начать и т. Д.
Пусть кто-то другой сделает для вас грязную работу, а именно лексер и парсер. Используйте кубок, yacc или bison для обработки синтаксиса. Это позволит вам сосредоточиться на более важных решениях для языкового дизайна. Существуют даже примеры парсеров для многих языков, которые вы можете использовать в качестве шаблона для своих.