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

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Не нравится ООП? Делайте свой язык программирования!

Писать свой компилятор в native code/IL/bytecode слишком сложно — а и не надо!! Вы понимаете, что существующие компиляторы вроде С или Java оттачивались годами, сотнями людей? Почему бы не воспользоваться всем этим богатством, компилируя ваш язык в тот же С/C++, и потом получая от С/C++ компилятора все оптимизации и плюшки?

Меня не прет идея возиться с кастомными форматами файлов для лексинга и парсинга, это депрессивно — а и не надо!! Просто возьмите фреймворк, который поддерживает парсеростроение прямо в коде.

Язык-то я сделаю, а как насчет поддержки языка в моей любимой IDE? — о, ну это уже высший полет. Для начала, постарайтесь сделать лаконичный маленький язык, для которого инструменты не критичны. А потом можно научиться и тулы поддерживать (или писать свои).

Чтобы показать насколько это все просто, вот небольшой пример: представим, что вы хотите расширить определение С-образной глобальной функции, добавив следующие фичи:

Передавать аргументы в формате x,y : i32 , то есть переиспользуя определение типа для нескольких сразу.

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

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

Наш язык… …станет вот этим

Структуры для языка

Во всех языках есть механизмы построения парсеров. Я возьму C++ и Boost.Spirit, для примера, но вообще язык тут особого значения не имеет. Для начала давайте сделаем новые типы вроде f32 вместо float :

Теперь определяем функцию:

У любой функции есть имя, она берет сколько-то там параметров (ну, деклараций параметров, но краткость сестра таланта), и у нее есть тело, которое в нашем случае будет состоять исключительно из присвоений значений переменным (не очень практично, I know).

Поскольку мы умеем определять аргументы в стиле x,y:i32 , т.е. несколько с одним типом, собственно структур parameter мы определим вот так:

Ну и наконец присвоение значений переменным можно сделать вот так:

Выше показан г~код для определения типа, думаю вы понимаете что в последствии это можно пофиксить.

Всё, структуры готовы, можно строить парсер. (На самом деле есть еще этап их адаптации через Boost.Fusion, но это implementation-specific деталь, если что гляньте в сорцы.)

Парсер

Парсер для нашего языка написать настолько легко что я просто приведу весь код целиком, а потом мы его обсудим, ок?

Для начала, вот эти qi::rule просто говорят парсеру как то что он распарсит ложится на структуры что мы определили ранее. Например, вот хочется распарсить присваивание вроде x = 3 , что это? Это идентификатор (то есть, 1 и более alphanumeric символов), потом = , потом еще раз набор символов и в конце ; .

То же и с другими частями языка. Хочешь распарсить несколько переменных через запятую и запихнуть их в вектор? Пишем +alnum % ',' где оператор % – это как сказать *(+alnum >> ',') , только короче. Что тоже удобно.

Так вот, парсер у нас готов, можно парсить. На Spirit это делается вот так:

…где render() – это функция которая обходит то что мы напарсили и генерит из этого чистейший, готовый к компиляции С (никто не мешает вам выводить сразу в N разных языков).

Pretty print

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

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

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

Заключение

Если хотите сорцы проекта, они тут. Мой пример на С++, но вы можете реализовать свой язык на чем угодно. Мораль в том что создать сейчас свой кросс-компилируемый язык легко, поэтому вместо того чтобы ныть про ООП и воевать с ветряными мельницами, проще сесть и запилить что-то своё. Так что садитесь и пишите спеку вашего чудо-юдо языка. Удачи!

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

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

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


велосипеды. зачем мучить фундаментальные вещи, попробуйте написать что-то типа JSF, думаю будет: доступно (жава код декомпилировать не проблема), интересно, полезно (шанс всегда есть), перспективно (мы верим в вас)

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

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

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

Я так понимаю, мне нужен интерпретатор. То есть, получается, для создания языка программирования, мне нужно использовать другой язык программирования? Замкнутый круг какой то..

> Я так понимаю, мне нужен интерпретатор. То есть, получается, для создания языка программирования, мне нужно использовать другой язык программирования? Замкнутый круг какой то.. Именно так. Все языки написаны так.

"Именно так. Все языки написаны так." Ну почему-же, можно обойтись и без ЯЗЫКОВ ПРОГРАММИРОВАНИЯ - ведь они нужны ЛЮДЯМ. Нужно просто сесть, и написать все в чистом машинном коде. Соблюдая при этом соответствующий формат исполняемого файла (PE, ELF). Ну и далее в том же роде ;) )))

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

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

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

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

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

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

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

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

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

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

3) Выделите назначение языка. Будет ваш язык программирования универсальным инструментом или узкой направленности, решать только вам.

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

5) Выберете язык, на котором будете основываться.

6) Проработайте лексер и парсер.

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

8) Тестируйте язык. Работоспособность всех механизмов языка вам помогут проверить специальные тесты.

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

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

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

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

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

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

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

Определите набор символов документа с исходным кодом на создаваемом языке программирования. Укажите возможные правила и ограничения в использовании символов. Так, например, запись языковых конструкций может ограничиваться только символами из набора ASCII, но при этом в комментариях и строковых литералах допускаться применение символов всего диапазона UTF.

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

Читайте также: