- Как создать свой язык программирования? Теория и практика
- Изучение компьютера
- Каких концепций будет придерживаться новый язык?
- Простые способы выдумать язык
- Варианты посложнее
- Создаем РБНФ (EBNF)
- Компилятор
- Лексический анализатор
- Основные концепции – проблема синтаксиса и лексического ядра
- Лексер поможет разобраться с синтаксисом
- Из чего будет состоять новый язык программирования
- Нужно ли делать стандартную библиотеку для собственного языка программирования
- Стоит ли использовать стороннее ПО, анализаторы и компиляторы
- Что делать с управлением памятью
- Дополнительные особенности: самый простой и самый сложный в написании язык
Также можно написать интерпретатор или компилятор для языка программирования на том же языке. Для этого необходимо сначала создать первый интерпретатор или компилятор на другом языке, а затем использовать новый язык (так называемое продвижение) в новой версии.
Как создать свой язык программирования? Теория и практика
Создание языка программирования — очень сложный проект, но выполнимый. В этом разделе описаны основные факторы, которые необходимо учитывать при создании первого языка.
Желание создать свое и оставить свой след в истории есть у всех, включая разработчиков. Создание собственного языка программирования — это возможность. Мотивы могут быть разными. От ничегонеделания, решения давних проблем на других языках до разработки удобной для вас версии.
Создание языка. — Это жизнеспособный проект, руководствующийся 12-шаговым алгоритмом, который может быть достигнут читателем. Ваш язык может стать будущим.
В этой статье приведена специальная терминология, необходимая для ее понимания. Она включает в себя редакторы словарей, аналитики, интерпретаторы, компиляторы и синтаксические деревья. Гораздо легче понять материал, получив информацию из Интернета или изучив данные вместе с опытными разработчиками. Базовая концепция терминологии является основополагающей для создания собственного языка программирования.
Изучение компьютера
Хотя это совет и необходимость, знание операционной системы поможет вам в работе, изучении нового языка и на пути к становлению программистом. Невозможно создать быстрый, качественный, многофункциональный язык, не понимая, как происходит преобразование и обработка кода. Знание того, как работает движок системы, необходимо для дальнейшего развития.
Заранее определите цель использования языка. Есть два основных направления — универсальные инструменты или очень специализированные решения.
Языки в обоих направлениях востребованы, но мировые языки более распространены. Имейте в виду, что многоцелевой язык требует больше времени и усилий, и у него много конкурентов.
Стоит оценить объем работы, который вам предстоит сделать сейчас, и определить цели и желания. Важно определить, планируете ли вы стать знаменитым или нет? Важно ли определить, должен ли язык быть одним из лучших или вам интересно развлечься и расширить свое мировоззрение?
Каких концепций будет придерживаться новый язык?
На этапе проектирования необходимо ответить на несколько основных вопросов. Это поможет вам
- интерпретация или компиляция? Код для компилирования будет преобразовываться в машинный, затем исполняться. При использовании интерпретатора код обрабатывается построчно. На вопрос нет правильного ответа, перед разработчиком стоит сложный выбор, в какую сторону уклон делать: функциональность, безопасность, скорость работы, удобство и т. д.;
- типизация? Если да, то разработчику будет необходимо вручную устанавливать типы данных. В противном случае придётся описывать систему, которая будет определять типы;
- в языке будет встроен автоматический алгоритм очистки мусора или управление отдать в руки пользователя?
- планируемая модель языка программирования: структурное, ООП, функциональная логика. Кто знает, может вам удастся разработать что-то совсем иное;
- как язык будет себя вести в отношении конкурентов, вставка из других языков планируется? Учитывать этот аспект важно при изначальной разработке языка;
- планируется поддержка базового функционала языка или передать все функции на сторону фреймворков?
- какой ожидается конечный вид архитектуры программы?
Последовательные ответы на поставленные вопросы начнут формировать духовное дитя, но будут и другие последствия, на которые необходимо ответить.
На этом пути я допустил довольно много ошибок, но я уже переписал большую часть кода, на который они могли повлиять. Сейчас язык работает очень хорошо и продолжает развиваться (на момент написания этих строк он был создан на Linux и с переменным успехом на MacOS, но не на Windows).
Простые способы выдумать язык
1. все звуки можно заменить одним. Например, введите ‘O’ в любом месте. Есть «очотолочно скозоло мой, чо постоволо многа дво». Смешно; очень смешно! Вы понимаете; конечно. Именно так Франц, главный герой книги Кристины Норстлингер «История Франца», создал свой «U-язык».
2. вы можете попытаться полностью исключить гласные. Говорить не очень полезно, а вот писать — это хорошо. Многие люди все равно пишут ‘SPSB’, и обычно у них не возникает проблем с пониманием. Вы можете написать: «Чтец сказал мне прочитать два слова», мой друг поймет. Это древний способ написания слов: когда пальмы изобрели свой алфавит, не было букв для обозначения гласных. А некоторые современные языки, например, иврит, до сих пор не имеют их.
3. еще один простой способ — говорить с первым слогом слова. Правда, это ненадолго. Скажите своим друзьям «приди и похвастайся передо мной» и посмотрите, придут ли они и принесут вам шоколад.
4. но попытка начать каждое слово предложения с согласования может быть еще более невыносимой. ‘Кеводня — Ковтул — Ковтулы и Кирожки на завтрак’ Понятно ли, что студент ел сегодня на завтрак?
5. кодовые слова, например, «Суп из каротопа», называя курс физкультуры, «Вы принесли одежду для супа из каротопа?».
На самом деле, есть много простых способов сделать это, например, назвать кодовое слово «Суп Каротоп». Возможно, некоторые из них уже приходили вам в голову, когда вы читали то, что я предлагаю. Главное помнить, что тайное имя не должно быть оскорбительным для других, иначе оно будет воспринято как оскорбление. Иначе столь великая идея изобретенного языка будет уничтожена, превратившись в нарицательное призвание.
Варианты посложнее
Необходимо учитывать два кита: лексику и грамматику. Во-первых, словарный запас. Рассмотрим сами слова, которые могут просто создавать различные наборы символов.
Например, «коргоднал» — это школа. Например, «Тируш» будет работать. Или даже «тиррррус». Поэтому неясно, что это глагол, поскольку он не является глаголом в той же мере, что и «коргоднал», «коргодналь». и «Квак». Оно означает «сейчас». Как только вы найдете эти слова, запишите их в тетрадь и создайте специальный словарь для придуманного языка.
Итак, у вас есть словарный запас. Теперь вы должны строить предложения на его основе. Помните, что основная функция языка — это общение. Поэтому приходится придумывать фразы и рассказывать их друзьям. Что вам нужно; вам нужна грамматика! Он помогает словам соединяться друг с другом в предложениях.
Как и почему я решил изучать Elv (и написал руководство).
На русском языке: «Мы сейчас бегаем по школе. Нам не хватает «мы»! Вы можете быть похожи на древнего римлянина или современного испанца. В обоих случаях используются глаголы для объявления действующих лиц. Например, испанцы говорят «como» — они дают понять, что я «ем», а не просто «ем». Точно так же римляне говорили: «non scolae sed vito discaimus».
Поэтому мы говорим: «Я руковожу школой».
‘Тируш’ — кто кандидаты? Мы, он или они? Что мне добавить к та-а-акому концу! Русские ‘они’ — что вы скажете о ‘сыре’? Или я не могу добавить что-то вроде английского? Нет никакого личного конца, не так ли? ‘run’ — ‘я бегу’ и ‘бежать’. Изменение происходит только в единственном числе. Давайте сохраним «Тируш».
Теперь нам нужно добавить «из школы». Да, нам не хватает намерения! Давайте сделаем это. Скажем, «прыжок». Возможно, нам нужно изменить слово «коргодналл». А может, и нет; это снова английский? (Здесь и студенты жалуются, что он сложнее русского!). В английском языке форма слова не меняется. ‘At school’ означает ‘в школе’; ‘near school’ означает ‘рядом со школой’.
Давайте оставим все как есть! ‘Тируш Прукс Коргодналл Кряпа’.
Сумасшедший. Есть фразы на придуманном языке!
- Словарик для записей.
- Знание других языков (чтобы ориентироваться).
- Употребление выдуманных нами слов (без практики всё улетучится).
Если трудно придумать словарь, возьмите слова из древних языков или английского. Например, Джоан Роулинг придумала весь язык заклинаний «Гарри Поттера» на основе латыни. В мультсериале «Куми-Куми» также используется смесь языков, например, «Лака Лака» (мне нравится). ‘Like’ в значении ‘нравится’, ‘Asta la Vista’ в значении ‘банзай! — от’, ‘shtu -druka’ ‘и ‘Zaka-byaka’, что, конечно же, является нелепым русским словом.
Синтез языка — полезное занятие. Она помогает творчески подходить к языку и развивать системное мышление (ведь вся грамматика — это система!). А также помогает укрепить ваши отношения. Отличный способ поговорить с друзьями на секретном языке. Также важно иметь такой язык только для вашей семьи. Секретный код, который может передаваться годами и объединять всю семью, даже если дети вырастут и найдут язык для своих собственных детей.
Вопросы не являются неактивными. Это совсем не обязательно. Код может быть корректно выполнен без встроенных библиотек. В этом случае, однако, активация базовой команды превращается в настоящий поиск. Есть и другой способ, и для каждой функции нужно создавать свои собственные функции.
Создаем РБНФ (EBNF)
Создайте RBNF, описывающий минимальные функции микропрограммы. Начните с дополнительных функций:.
Поддерживаются следующие форматы RBNF.
Дополните язык операцией вычитания:.
Соответствующий RBNF изменяет первую строку.
Наконец, объясните функцию печати: соответствующий РБНФ изменяет первую строку.
В этом случае в РБНФ появляется новая строка, объясняющая, как обработать выражение.
Таким образом, описание грамматики языка развивается. Как же научить компьютер преобразовывать эту грамматику в двоичный исполняемый код? Для этого необходим компилятор.
Компилятор
Компилятор — это программа, которая преобразует текст языка в машинный или другой язык. Программа TOY в этом руководстве преобразуется в LLVM IR (Intermediate Representation IR) перед преобразованием в машинный язык.
LLVM можно использовать для оптимизации процесса компиляции без необходимости учиться оптимизировать. LLVM имеет отличную библиотеку для манипулирования компилятором.
Наш компилятор можно разделить на три компонента
- лексический анализатор (лексер, англ. lexer)
- синтаксический анализатор (парсер, англ. parser)
- генератор кода
Для анализатора словаря и анализатора мы используем RPLY, который очень похож на PLY. Это библиотека Python с тем же словарем и инструментами анализа, но с лучшим API. Генератор кода использует LLVMLite, библиотеку Python для связывания компонентов LLVM.
Лексический анализатор
Поэтому первым компонентом компилятора является анализатор словарей. Роль этого элемента заключается в разделении текста программы на пункты.
Используйте структуру в конце примера RBNF, чтобы найти лексемы. Рассмотрим следующую команду.
Парсер словаря должен разделить эту строку на следующий список лексем.
Давайте напишем код компилятора. Сначала создайте файл lexer.py с кодом программы, в котором определяются лексемы. Создайте лексер-анализатор, используя класс LexerGenerator в библиотеке RPLY.
Создайте файл main.py. В этом файле объедините функции трех компонентов компилятора. Сначала войдите в созданный вами класс Lexer и определите одну строку программных лексем.
Когда вы запустите файл main.py, в выводе появится вышеуказанный токен. Название бренда можно изменить, но для удобства рекомендуется оставить его как есть.
Чтобы начать работу, создайте файл codegen.py, содержащий класс CodeGen. Этот класс отвечает за настройку LLVM и генерацию/сохранение IR-кода. В нем также объявляется функция print.
Основные концепции – проблема синтаксиса и лексического ядра
Разработка собственной структуры оказывает значительное влияние на конечный вид и ощущение от вашего продукта. Чтобы отобразить Helloworld в Python, нужно набрать print (‘Hello, world!’). В Java это уже выглядит по-другому.
Привет, мир в Java намного больше, чем в Python!
В C ++ он выглядит совершенно иначе, без смысла, что гораздо понятнее для обычного пользователя.
C ++ имеет свои преимущества, но они не включают простоту понимания кода
Язык программирования — «Hello, world!». скорее всего, будет работать что-то вроде По этому принципу все котировки видны. Никто не запрещает творчество.
Некоторые языки внутреннего программирования работают с загадочной логикой. При написании собственного языка разработчик сам решает, какая лексика и принципы редактирования используются в его работе.
Лексер поможет разобраться с синтаксисом
В каждом случае представляется необходимым разработать свою редакцию. Проблема не такая уж сложная. Многие задумываются о том, как создать свой собственный язык программирования. Для них были разработаны словари. Это программы, которые распознают участки текста и анализируют их с помощью таких компонентов, как строки, числа и операторы. Если мы встречаем иероглиф по команде, лексикограф распознает его как оператор.
Фактически, редактор словаря дает каждому числу или символу свое собственное определение, лексему. Только после этого аналитик распознает, какая команда выполняется, если есть оператор, такой как условие или цикл, выполняя его.
Из чего будет состоять новый язык программирования
Поскольку мы уже находимся на этапе разработки концепции, необходимо выбрать основные параметры нового языка. Они касаются набора переменных, управления оперативной памятью, методов применения сторонних программ и выбора библиотек.
Это не так сложно, как может показаться на первый взгляд.
Теоретически, можно изменить будущий выбор, но это требует большой дополнительной работы. Кроме того, изменения в любом из этих элементов повлияют на общие характеристики готового продукта.
Нужно ли делать стандартную библиотеку для собственного языка программирования
Вопросы не являются неактивными. Это совсем не обязательно. Код может быть корректно выполнен без встроенных библиотек. В этом случае, однако, активация базовой команды превращается в настоящий поиск. Есть и другой способ, и для каждой функции нужно создавать свои собственные функции.
Библиотеки — это библиотеки, которые делают языки программирования полезными.
Однако невозможно предсказать все оттенки, которые появятся в будущем. Проще обновить библиотеку, чем при необходимости переписать сам язык. Поэтому стандартная библиотека с набором функций и классов может значительно облегчить задачу.
Есть и другой вариант. Вы можете включить возможность запуска языка на уже известной платформе и использовать ее стандартную библиотеку. Это очень популярный шаг, который дает дополнительный стимул к изучению нового языка. Этот механизм является одним из секретов популярности Java. Все языки, основанные на виртуальной машине Java, используют стандартные библиотеки.
Стоит ли использовать стороннее ПО, анализаторы и компиляторы
Многие программы облегчают разработку собственных языков программирования, например, Flex — генератор лексики. Существует также активная резервная библиотека Bison, которая использует программы, написанные на языке C, и настраивает пользовательские файлы с правилами редактирования.
Сложность заключается в том, что такие костыли делают программиста зависимым от внешних решений и замедляют процесс строительства из-за проблем совместимости. Поэтому невозможно гарантировать предсказуемые результаты.
Аналитики общего назначения сами по себе являются сложной задачей
Если вы только что решили действительно научиться создавать свой собственный язык программирования, вы можете игнорировать эту проблему. Однако если вы планируете создать более или менее популярный продукт, лучше написать собственного аналитика.
Что делать с управлением памятью
Существуют различные принципы работы с компьютерами. Если производительность не важна для вас, вы можете просто игнорировать ее. Достаточно иметь определенное количество ячеек, и операционная система очистит их после закрытия приложения.
Дополнительные особенности: самый простой и самый сложный в написании язык
Другой парадокс заключается в том, что самый простой в написании язык оказывается самым сложным в использовании. Существует множество сложных языков, дистрибутив которых измеряется сотнями байт. Однако использовать их в реальной жизни практически невозможно. Однако они являются прекрасными платформами для творчества. Понять, как создаются самые сложные языки программирования.
Куда рано или поздно попадает каждый разработчик.
Написание чего-то действительно полезного требует больших усилий. И давайте будем честными, в наши дни это невозможно. Достаточно вспомнить, что Microsoft уже много лет использует язык C. Конечно, история информатики полна людей, которые практически в одиночку создали уникальные продукты. Однако в последние десятилетия разработка программного обеспечения стала настолько сложной, что практически невозможно работать в одиночку и создавать что-то новое. Никто не будет поддерживать язык, если нет удобной среды разработки.
Большинство действительно популярных продуктов создаются большими группами. Их несложно найти на Github. До сих пор есть несколько энтузиастов. Присоединяйтесь к одной из них, и ничто не помешает вам применить свои теоретические знания на практике.