Как создать свой язык программирования
Перейти к содержимому

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

H Как создать язык программирования в черновиках Из песочницы

Куда же без него! Он требуется для «разделения» всего на токены. Если объяснить зачем он тогда представим: у нас есть код (CoffeScript).

И лексер превращает этот код в это(сокращенная запись):

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

Он превратит в читабельное (!):

Парсер

Самое сложное только начинается… Сделать токенезацию легко, а обработать это сложно. В теории мы должны проверять команду, потом ее аргументы. Кажется это легко, но нет! По началу все было примерно так:

Но ничего не работало, точнее не печатало текст, потом я попробовал так:

Но приходилось писать в конце любой символ. Потом я понял, что, если узнать длину строки и обрезать с 7-го символа по последний все должно работать.

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

Но все равно ничего не работало 😐 и с таким лицом я пытался что-то сделать… Целый час. И спустя около полутора часа я сделал это!

Написание языка программирования: с чего начать? [закрыт]

Вопросы-опросники запрещены на Stack Overflow на русском. Для получения ответа, перефразируйте ваш вопрос так, чтобы на него можно было дать однозначно правильный ответ.

Закрыт 6 лет назад .

Я далеко не ас, но хочется попробовать написать какой-то простой язык программирования для веба. Никакой мании величия, просто хочется попробовать. Подскажите, с чего можно начать?

user avatar

  1. Если хотите создавать язык для веб, очевидно будете писать инструмент для интерпретатции/компиляции приложений получающих данные от сервера и выдающих текст в поток стандартного вывода, с тем, чтобы иметь возможность выводить результаты работы программы (веб страницу, например) — здесь могу посоветовать почитать о технологии CGI, написать парочку простых CGI-скриптов (на чем угодно).
  2. Определитесь, какой язык будете создавать — интерпретируемый или компилируемый. Каков будет результат работы «компилятора» (например, Вы можете просто написать транслятор, который будет переводить программу на ВАШЕМ языке в эквивалент на PHP, который и будет в дальнейшем использоваться).
  3. Наконец, по синтаксическому анализу, компиляции и прочему — советую (не в первый раз) — Дж. Креншоу, «Давайте создадим компилятор» — для человека, который не собирается заморачиваться теорией формальных языков, обратной польской записью, формами Бэкуса-Наура и пр. пр. пр. — в самый раз. Если хотите серьезно заниматься компиляторами — А.Ахо «Компиляторы: принципы, технологии и инструменты» («Dragon book»).

P.S. Если интересуетесь скриптами (в частности, для игр) и скриптовыми языками, советую также обратить внимание на Alex Varanese «Game Scripting Mastery» — хорошо написана и легко читается (на мой вкус)

Язык программирования — просто его идея, спецификация описывающая синтаксис, семантику и стандартную библиотеку.

Реализация языка программирования — программа, которая траслирует программу из исходного текста этого языка в код какого-либо другого выходного языка. При этом выходной язык может быть ассемблер, байткод виртуальной машины или любой другой язык.

Реализация языка программировая — программа которая получает самый обычный текст, преобразует и выводит результат преобразования (текстовый или бинарный). Т.е. здесь нет никакой магии.

Сам язык программирования придумать можно и не написав ни строчки кода (хотя и чертовски сложно, ведь код можно тестировать). То чего хотите вы — написание реализации языка программирования.

Программу которая переводит текст вида

Вполне можно считать примитивным вариантом транслятора.

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

Как создаются языки программирования

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

В первые десятилетия развития компьютерных технологий потребность в новых языках программирования объяснялась, прежде всего, сложностью написания программ в машинных кодах или даже средствами ассемблера. По мере того, как росли мощность вычислительных машин и удобство работы с ними, менялись и требования, предъявляемые к языкам. Некоторые были ориентированы на интенсивную работу с математическими вычислениями (Fortran), некоторые — на легкость освоения и учебные цели (Basic, Pascal), некоторые — на универсальность и быстроту (Си).

Появления в мире программирования тех или иных достижений провоцировали бурный рост новых языков. Так, открытие парадигмы объектно-ориентированного программирования привело в 1980-1990-е гг. к появлению таких языков, как C++, Objective C, Java. В 2000-е гг. получило импульс развитие скриптовых языков для быстрого создания веб-приложений (PHP, JavaScript, Python). Даже в наши дни появляются новые мощные языки программирования, сочетающие в себе высокую скорость разработки и быстродействие написанных на них программ (Go, Swift, Rust).

Появление новых языков программирования может быть обусловлено не только компьютерной «модой». Они возникают и как средства решения специфических задач. Например, Prolog появился как язык автоматизации логических умозаключений. Отраслевым стандартом в разработке ПО для сетевых коммуникаций является Erlang и т.д.

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

Прежде всего нужно определиться с тем, будет ли новый язык компилируемым или интерпретируемым. В первом случае текст, написанный программистом, преобразуется в машинный код и сохраняется в этом виде на каком-либо носителе для дальнейших применений. Во втором скрипт преобразуется в процессорные инструкции «на лету» и превращается в алгоритм, исполняемый процессором сразу же. Для создания компиляторов и интерпретаторов используют какой-нибудь универсальный высокоэффективный язык, чаще всего C/C++.

Рисунок 1. Лексический анализ. Автор24 — интернет-биржа студенческих работ

Готовые работы на аналогичную тему

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

Следующий необходимый инструмент для преобразования текста программы в последовательность машинных инструкций — синтаксический анализатор (парсер). Он служит для контроля правильности объединения токенов в более сложные конструкции, описывающие исполняемый алгоритм. Список токенов, связанных синтаксическими знаками (скобками, точками с запятыми, пробельными отступами, ключевыми словами вроде begin и end ) парсер преобразует в абстрактное синтаксическое дерево.

Существуют готовые программы, облегчающие создание лексических анализаторов, например, Flex. Для создания синтаксических анализаторов также имеются готовые инструменты, например, Bison.

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

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

Особенности разработки компилятора

Рисунок 2. Преобразования исходного кода в исполняемую программу. Автор24 — интернет-биржа студенческих работ

Создание компилятора требует дополнительных усилий, поскольку необходим учет специфики операционной системы, архитектуры процессора и т.п.

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

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

Рисунок 3. Языки и архитектуры, поддерживаемые LLVM. Автор24 — интернет-биржа студенческих работ

Задачу создания компилятора для нового языка программирования можно облегчить, задействовав метод транспайлинга, когда исходный код одного языка преобразуется в исходный код другого, и уже он «пропускается» через имеющиеся надежные интерпретаторы или компиляторы. Так работает, например, язык Coffeescript, программы на котором преобразуются в стандартный JavaScript. Похожий принцип используется в популярах фронтенд-фреймворках для веб-разработки (React, Angular, Vue).

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *