Все дело в том, что я занимаюсь программированием достаточно давно, и знаю несколько языков программирования. И несмотря на их различия, я в любом языке умудряюсь наворотить сложных конструкций (даже в Python мой код иногда настолько закручен, что я сам не понимаю что я курил когда писал его). В связи с тем что мой код полностью противоречит всем канонам правильного кода, мне стало интересно как же компиляторы и интерпретаторы понимают мой кривой код.
В связи с этим, сразу даю ответ на вопросы «Зачем это надо?! Очередной велосипед написать? Заняться что ли нечем?» — делается это с целью удовлетворения интереса, а так же для того что бы такие же интересующиеся как я имели представление о том как это работает.
Теперь собственно к теории языков программирования. Посмотрим что на этот счет всеми любимая Википедия:
Язык программирования — формальная знаковая система, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, которые выполнит исполнитель (обычно — ЭВМ) под её управлением.
С этим все понятно, ничего сложного, все мы знаем что это такое.
О том, что предстоит сделать
1. Лексический анализатор. Модуль который будет проверять правильность лексических конструкций, которые предусмотрены нашим языком программирования.
2. Парсер. Данный модуль будет переводить код понятный человеку в поток токенов, которые в последующем будут исполняться или переводиться в машинный язык.
3. Обычно на этом месте стоит оптимизатор, но так как наша поделка является скорее игрушкой чем крупным проектом, я откажусь от оптимизатора. И теперь наши пути расходятся:
3.1. Транслятор. Данный модуль будет транслировать поток токенов полученных от парсера в машинный код. Данный подход используется в компиляторах
3.2. Исполнитель. Данный модуль выполняет команды записанные в виде потока токенов. Данный подход используется в интерпретаторах.
Я больше склоняюсь к созданию некоего промежуточного звена между интерпретатором и компилятором. То есть к созданию языка программирования, который будет транслироваться в байт-код виртуальной машины, которую так же предстоит написать.
Немного о реализации
1. Для реализации транслятора будет использован язык программирования Python. Почему именно он? Потому что его я знаю лучше всех. К тому же, его типизация, а точнее ее полное отсутствие позволит сократить количество переменных используемых при написании кода.
2. Для реализации виртуальной машины так же будет использован Python.
3. Для сборки проекта будет использован PyInstaller, так как он позволяет упаковывать все в один файл, к тому же на данный момент можно собрать для Linux и Windows без особых заморочек.
Теперь к практике
Предлагаю поставить перед собой минимальную задачу, при выполнении которой мы будем считать задачу условно выполненной и дальше можно не идти. Для этого определимся с минимальным синтаксисом языка:
1. Есть однострочные комментарии, начинаются со знака диеза (#) и продолжаются до конца строки.
2. Есть два типа данных (integer, string).
3. Есть возможность вывода информации на экран.
4. Есть возможность ввода значений с клавиатуры.
Напишем простенькую программу на нашем новом языке, с учетом правил которые мы только что сформулировали:
int a = 10;
int b;
str c;
str name;
c='Hello!!!';
b=a+a+10;
print(a);
print(b);
print(c);
input(name);
c = 'Hello '+name;
print(c);
Вод собственно и все. Простенькая программка, которая демонстрирует возможности только что придуманного языка. На этом я думаю следует закончить.
В следующей части начнем написание своего велосипеда, который сможет выполнить код приведенный выше.
Комментарии (34)
KlimovDm
03.10.2016 16:56-5>>> Доброго времени суток
Первые три слова статьи о разработке языка программирования… Только у меня нет оптимизма?MacIn
03.10.2016 18:59+5Доброго времени суток!
Хотите поговорить об этом?KlimovDm
03.10.2016 19:22-6У меня есть уверенность, что человек, который пишет «доброго времени суток» не сможет разработать язык программирования даже на уровне архитектуры.
Видимо, со мной согласны не все. Не вопрос, не претендую. А говорить тут не о чем, особенно с юмористами.MacIn
03.10.2016 20:16Про фасон шляпы и очков не забудьте уточнить, одного вашего критерия может быть недостаточно, слишком погрешность велика.
KlimovDm
03.10.2016 20:28-2Моя проблема в том, что я вижу связь между тем, как человек говорит и тем, как он программирует. Потому что разницы между языком общения и языком программирования практически никакой. И в том и в другом случае человек обращает свою мысль в определенную форму. Вам оставляю право оценивать погрешность.
MacIn
03.10.2016 21:20+5«Доброго времени суток» — вполне обычный «макрос». Такой же, как и «Привет, %UserName%».
KlimovDm
04.10.2016 06:19Вот именно. Только он не выполнился. Вы видите сам макрос, а не его результат. Ошибка в программе?
MacIn
04.10.2016 13:05-1Вот именно. Только он не выполнился. Вы видите сам макрос, а не его результат
Потому что это программа, а не ее вывод. Процессор — это вы, читатель. Прочитали «времени суток», подставили, скажем, «вечер», с поправкой на падежи.KlimovDm
04.10.2016 14:01Увольте.
Если в шаблоне «Привет, %UserName%!», то читатель Хабр должен прочитать «Привет, Хабр!», а не изображать из себя «процессор».
Как мне кажется, вы меня поняли. И закончим.MacIn
04.10.2016 14:49Если в шаблоне «Привет, %UserName%!», то читатель Хабр должен прочитать «Привет, Хабр!»
Читатель не может прочитать в шаблоне значение с подстановкой. По определению. Шаблон — это шаблон, результат подстановки — это результат подстановки.
«Привет, %UserName%» — это шаблон. Сделать подстановку — ваша задача, как интерпретирующего текст.
а не изображать из себя «процессор».
Отчего же? Вы читаете текст, вы его разбираете, интерпретируете. Процессор в чистом виде, работающий по своей внутренней программе. Текст, который вы читаете — входные данные.
Как мне кажется, вы меня поняли. И закончим.
Я понял, что вы не поняли.KlimovDm
04.10.2016 15:31+1>>>Сделать подстановку — ваша задача, как интерпретирующего текст.
Произошла подмена понятий. Не надо путать мягкое с тёплым. (с)
Сделать нужную подстановку, это не моя задача, а того, кто этот текст пишет и отправляет. Макрос должен выполняться на стороне отправителя (автора). Если макрос не работает, это у него проблема, его программы, а не моя (как читателя).
По моему вы сами запутались.MacIn
04.10.2016 17:58-1Сделать нужную подстановку, это не моя задача, а того, кто этот текст пишет и отправляет.
Ни разу. Вы — автор — написали текст программы. Или, например, XML файл со ссылкой на какой-то объект данных. Вы (автор) будете подставлять данные или тот (та сущность), кто будет выполнять/интерпретировать эту программу/шаблон?
Если макрос не работает, это у него проблема, его программы, а не моя (как читателя).
Так это он у вас в голове не работает. Это шуточный макрос, который подставляется читателем во время чтения. By design.
По моему вы сами запутались.
Да нет. Просто вы отчего-то не можете понять простую шутку, которую из-за этого приходится объяснять формально.KlimovDm
04.10.2016 18:13+1>>>Это шуточный макрос
Вы уже начинаете придумывать новые сущности, пытаясь аргументировать свою позицию. Любите оставлять за собой последнее слово? Ок, оно за вами.
Leopotam
03.10.2016 21:30+1Доброго времени суток.
Такое может называться скрипт-языком, годящимся в качестве клея для вызова апи? Реализация (coco/r + обертка).
Dolbe
04.10.2016 12:00+4я вижу связь между тем, как человек говорит и тем, как он программирует
Честно, тоже хочу такую супер-способность. Вы, наверное, часто проводите собеседования?MacIn
04.10.2016 13:06+1Такая зависимость есть по моему опыту — если человек не может связно изложить мысли, он не сможет написать программу. Но тут, кмк, перебор, натяжка.
Swamp_Dok
03.10.2016 17:02+8Все-таки лексический анализатор преобразует исходный код в набор токенов, а после него синтаксический анализатор (парсер) на основе полученного списка токенов генерирует иерархическую структуру, руководствуясь правилами данного языка.
Ошибки большей частью уже ищет семантический анализатор. Затем работает генератор промежуточного кода и так далее.
Не вводите людей в заблуждение.
Durimar123
03.10.2016 17:48+5>Для этого определимся с минимальным синтаксисом языка:
>2. Есть два типа данных (integer, string).
Сразу типы данных? без лексем, операций, разделителей?
не серьезно
yury-dymov
03.10.2016 17:57+7<зануда-mode-on>
У меня недавно был юбилей — elixir стал 20м языком программирования, на котором я написал что-то для использования в продуктиве.
Так вот, на почти любом распространенном языке можно писать хорошо и аккуратно. То есть это не проблема языка. Обычно новый язык создают, когда существующих не хватает для решения какой-то задачи, либо они фундаментально не решают ее хорошо. Например, elixir очень эффективно использует ресурсы сервера и отлично работает в многопроцессорных/многоядерных системах, в то время как ruby в силу своей природы так не может. Поэтому вместо того, чтобы "накостылять" ruby и попробовать с помощью него решать задачи, для которых он не очень приспособлен by design, сделали elixir.
Вместо того, чтобы научиться аккуратно писать код, вы пишите свой язык. Это полезное упражнение, но выносить его на общее обозрение — это не самая хорошая идея.
P.s. я тоже писал свой язык программирования лет 10 назад, поэтому не вижу в вашем начинании ничего плохого, но выносить его из песочницы все же следует после того, как вы поймете, что это действительно может быть полезно.
</зануда-mode-off>Vjatcheslav3345
03.10.2016 22:24+1Но тут то проблема в том, что автор статьи не никак не может писать правильно.
Думаю, ему надо не просто язык изобрести, но придумать для себя язык-"сержант", который будет стоять у него над душой и его дисциплинировать: "Делай раз!!!, Делай два!!! Делай три!!! Переходим к подтягиваниям: 1, 2, 3, 4, 5, 6, 7, 8, 9!!! Упал-отжался: 1, 2, 3, 4, 5, 6, 7, 8, 9!!! Встать!!! Три круга — на время — бегоооом… арш!!!". А потом, после разработки языка, всласть на нём пописать что нибудь опенсурсное — чтобы выработать таки хороший стиль, как в старину вырабатывали каллиграфы свой почерк.
Нечто подобное представляет собой язык Ada но тут этого "сержанта" надо сделать куда жёсче: можно на основе компилятора от ады или её спарк-разновидности разработать такой вот свой велосипед, А если автор возьмётся за разработку велосипеда с С/С++ подобным синтаксисом — то у его велика и своя аудитория может появится — преподы вузов, которым надо научить по человечески писать на С/С++ своих студентов. Можно, например, прямо в таком велосипедном языке начать реализовывать автоматические проверки компилятором соблюдения стандартов MISRA программистом — ведь здесь цель — обучение "чистописанию"..
saboteur_kiev
03.10.2016 18:28+4А где практика?
Почему строки заканчиваются с точкой запятой?
Почему одинарные кавычки?
Почему print со скобками? Это функция? А где вы описали реализацию функций? А где она подключается, или она встроенная?
А почему первая и остальные строки сдвинуты табуляцией?
А как вы строку складываете со сторокой? Чем реализованы?
Как реализованы типы данных? Как вы определяете их размерность, особенно в случае со строкой?
Где демонстрация хоть чего-либо?
MacIn
03.10.2016 19:02+7Я больше склоняюсь к созданию некоего промежуточного звена между интерпретатором и компилятором. То есть к созданию языка программирования, который будет транслироваться в байт-код виртуальной машины, которую так же предстоит написать.
О, боги! Это называется транслятор. Транслятор в язык виртуальной машины.
То есть к созданию языка программирования, который будет транслироваться
Это не создание ЯП, это создание среды для его реализации. Где описание терминалов, лексем, синтаксиса? Где БНФ или аналоги?
Amsand
03.10.2016 20:14Полное отсутствие типизации в Python???!!!
synedra
04.10.2016 06:28Наверное, имеется в виду, что она динамическая. Можно сваливать все переменные целевого языка в один массив/словарь/что там у автора и не заморачиваться заранее его типизацией, аллокацией достаточного количества памяти и т.п.
mmMike
04.10.2016 11:30Когда я учился — создание простого компилятора языка типа basic было одним из типов курсовиков 3-го курса.
(АВТФ автоматики и телемеханики)
Интересно, а сейчас это сойдет за курсовик и какие вообще курсовики дают на 3-м курсе.
MacIn
04.10.2016 13:09Такие же. У нас по ТЯПиМТ (Теория ЯП и Методы Трансляции) на 4м курсе был курсовик по созданию транслятора простого ЯП по заданной спецификации. С использованием генераторов парсеров по заданной грамматике.
potan
04.10.2016 13:56«сократить количество переменных используемых при написании кода.» — но зачем?! От куда такой критерий?
izzholtik
Как говорится, каждый программист должен написать свой парсер XML, компилятор и браузер, а также много думать об искусственном интеллекте.
Keyten
Хотя бы часть из этого нужно сделать на регулярках. Нап?р?имер,? ?X?M?L?.?
Dolbe
А игру? Игру тоже надо сделать!