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

Все дело в том, что я занимаюсь программированием достаточно давно, и знаю несколько языков программирования. И несмотря на их различия, я в любом языке умудряюсь наворотить сложных конструкций (даже в 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)


  1. izzholtik
    03.10.2016 16:28
    +13

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


    1. Keyten
      03.10.2016 18:31
      +7

      Хотя бы часть из этого нужно сделать на регулярках. Нап?р?имер,? ?X?M?L?.?


    1. Dolbe
      04.10.2016 11:56
      +2

      А игру? Игру тоже надо сделать!


  1. malinichev
    03.10.2016 16:34
    +2

    Поправьте код, не красиво)


  1. KlimovDm
    03.10.2016 16:56
    -5

    >>> Доброго времени суток

    Первые три слова статьи о разработке языка программирования… Только у меня нет оптимизма?


    1. MacIn
      03.10.2016 18:59
      +5

      Доброго времени суток!
      Хотите поговорить об этом?


      1. KlimovDm
        03.10.2016 19:22
        -6

        У меня есть уверенность, что человек, который пишет «доброго времени суток» не сможет разработать язык программирования даже на уровне архитектуры.
        Видимо, со мной согласны не все. Не вопрос, не претендую. А говорить тут не о чем, особенно с юмористами.


        1. MacIn
          03.10.2016 20:16

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


          1. KlimovDm
            03.10.2016 20:28
            -2

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


            1. MacIn
              03.10.2016 21:20
              +5

              «Доброго времени суток» — вполне обычный «макрос». Такой же, как и «Привет, %UserName%».


              1. KlimovDm
                04.10.2016 06:19

                Вот именно. Только он не выполнился. Вы видите сам макрос, а не его результат. Ошибка в программе?


                1. MacIn
                  04.10.2016 13:05
                  -1

                  Вот именно. Только он не выполнился. Вы видите сам макрос, а не его результат

                  Потому что это программа, а не ее вывод. Процессор — это вы, читатель. Прочитали «времени суток», подставили, скажем, «вечер», с поправкой на падежи.


                  1. KlimovDm
                    04.10.2016 14:01

                    Увольте.
                    Если в шаблоне «Привет, %UserName%!», то читатель Хабр должен прочитать «Привет, Хабр!», а не изображать из себя «процессор».
                    Как мне кажется, вы меня поняли. И закончим.


                    1. MacIn
                      04.10.2016 14:49

                      Если в шаблоне «Привет, %UserName%!», то читатель Хабр должен прочитать «Привет, Хабр!»

                      Читатель не может прочитать в шаблоне значение с подстановкой. По определению. Шаблон — это шаблон, результат подстановки — это результат подстановки.
                      «Привет, %UserName%» — это шаблон. Сделать подстановку — ваша задача, как интерпретирующего текст.
                      а не изображать из себя «процессор».

                      Отчего же? Вы читаете текст, вы его разбираете, интерпретируете. Процессор в чистом виде, работающий по своей внутренней программе. Текст, который вы читаете — входные данные.

                      Как мне кажется, вы меня поняли. И закончим.

                      Я понял, что вы не поняли.


                      1. KlimovDm
                        04.10.2016 15:31
                        +1

                        >>>Сделать подстановку — ваша задача, как интерпретирующего текст.

                        Произошла подмена понятий. Не надо путать мягкое с тёплым. (с)

                        Сделать нужную подстановку, это не моя задача, а того, кто этот текст пишет и отправляет. Макрос должен выполняться на стороне отправителя (автора). Если макрос не работает, это у него проблема, его программы, а не моя (как читателя).

                        По моему вы сами запутались.


                        1. MacIn
                          04.10.2016 17:58
                          -1

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

                          Ни разу. Вы — автор — написали текст программы. Или, например, XML файл со ссылкой на какой-то объект данных. Вы (автор) будете подставлять данные или тот (та сущность), кто будет выполнять/интерпретировать эту программу/шаблон?

                          Если макрос не работает, это у него проблема, его программы, а не моя (как читателя).

                          Так это он у вас в голове не работает. Это шуточный макрос, который подставляется читателем во время чтения. By design.

                          По моему вы сами запутались.

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


                          1. KlimovDm
                            04.10.2016 18:13
                            +1

                            >>>Это шуточный макрос

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


            1. Leopotam
              03.10.2016 21:30
              +1

              Доброго времени суток.
              Такое может называться скрипт-языком, годящимся в качестве клея для вызова апи? Реализация (coco/r + обертка).


            1. Dolbe
              04.10.2016 12:00
              +4

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

              Честно, тоже хочу такую супер-способность. Вы, наверное, часто проводите собеседования?


              1. MacIn
                04.10.2016 13:06
                +1

                Такая зависимость есть по моему опыту — если человек не может связно изложить мысли, он не сможет написать программу. Но тут, кмк, перебор, натяжка.


    1. baldr
      04.10.2016 23:58
      +1

      Доброго времени суток!
      Вам сюда, чтоб два раза не повторяться. Уже достаточно обсосали, вроде…


  1. Swamp_Dok
    03.10.2016 17:02
    +8

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


  1. Durimar123
    03.10.2016 17:48
    +5

    >Для этого определимся с минимальным синтаксисом языка:
    >2. Есть два типа данных (integer, string).

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


  1. yury-dymov
    03.10.2016 17:57
    +7

    <зануда-mode-on>
    У меня недавно был юбилей — elixir стал 20м языком программирования, на котором я написал что-то для использования в продуктиве.


    Так вот, на почти любом распространенном языке можно писать хорошо и аккуратно. То есть это не проблема языка. Обычно новый язык создают, когда существующих не хватает для решения какой-то задачи, либо они фундаментально не решают ее хорошо. Например, elixir очень эффективно использует ресурсы сервера и отлично работает в многопроцессорных/многоядерных системах, в то время как ruby в силу своей природы так не может. Поэтому вместо того, чтобы "накостылять" ruby и попробовать с помощью него решать задачи, для которых он не очень приспособлен by design, сделали elixir.


    Вместо того, чтобы научиться аккуратно писать код, вы пишите свой язык. Это полезное упражнение, но выносить его на общее обозрение — это не самая хорошая идея.


    P.s. я тоже писал свой язык программирования лет 10 назад, поэтому не вижу в вашем начинании ничего плохого, но выносить его из песочницы все же следует после того, как вы поймете, что это действительно может быть полезно.
    </зануда-mode-off>


    1. 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 программистом — ведь здесь цель — обучение "чистописанию"..


      1. yury-dymov
        04.10.2016 07:21

        Ну в JS же сделали eslint :)


  1. saboteur_kiev
    03.10.2016 18:28
    +4

    А где практика?
    Почему строки заканчиваются с точкой запятой?
    Почему одинарные кавычки?
    Почему print со скобками? Это функция? А где вы описали реализацию функций? А где она подключается, или она встроенная?
    А почему первая и остальные строки сдвинуты табуляцией?
    А как вы строку складываете со сторокой? Чем реализованы?
    Как реализованы типы данных? Как вы определяете их размерность, особенно в случае со строкой?

    Где демонстрация хоть чего-либо?


  1. MacIn
    03.10.2016 19:02
    +7

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

    О, боги! Это называется транслятор. Транслятор в язык виртуальной машины.

    То есть к созданию языка программирования, который будет транслироваться

    Это не создание ЯП, это создание среды для его реализации. Где описание терминалов, лексем, синтаксиса? Где БНФ или аналоги?


  1. Amsand
    03.10.2016 20:14

    Полное отсутствие типизации в Python???!!!


    1. lnroma
      03.10.2016 23:33
      -1

      мож c php перепутал?


    1. synedra
      04.10.2016 06:28

      Наверное, имеется в виду, что она динамическая. Можно сваливать все переменные целевого языка в один массив/словарь/что там у автора и не заморачиваться заранее его типизацией, аллокацией достаточного количества памяти и т.п.


  1. mmMike
    04.10.2016 11:30

    Когда я учился — создание простого компилятора языка типа basic было одним из типов курсовиков 3-го курса.
    (АВТФ автоматики и телемеханики)


    Интересно, а сейчас это сойдет за курсовик и какие вообще курсовики дают на 3-м курсе.


    1. MacIn
      04.10.2016 13:09

      Такие же. У нас по ТЯПиМТ (Теория ЯП и Методы Трансляции) на 4м курсе был курсовик по созданию транслятора простого ЯП по заданной спецификации. С использованием генераторов парсеров по заданной грамматике.


  1. potan
    04.10.2016 13:56

    «сократить количество переменных используемых при написании кода.» — но зачем?! От куда такой критерий?