Язык программирования моей мечты

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

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

Число 1 = 1;
Число номер 2 = 2;
Сумма = Число 1 + Число номер 2;
print Сумма; print; 
function Открытие двери в поезде() {
  print "Дверь открыта"; print;
}
Открытие двери в поезде();

Неплохо, да? Но явно не дотягивает до мечты. Поэтому пришлось добавить синонимы.

synonym "равно", "=";
synonym "равна", "=";
synonym "плюс", "+";
synonym "Вывод", "print";
synonym "Функция", "function";

Число 1 равно 1;
Число номер 2 равно 2;
Сумма равна Число 1 плюс Число номер 2;
Вывод Сумма; Вывод; 
Функция Открытие двери в поезде() {
  Вывод "Дверь открыта"; Вывод;
}
Открытие двери в поезде();

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

Эта простенькая программа выглядит просто изумительно. Не правда ли?

// 
// Нахождение наибольшего общего делителя двух чисел
//
Первое число = 57;
Второе число = 1332;
while (Первое число <> 0 and Второе число <> 0)
{
  if (Первое число > Второе число)
    Первое число = Первое число % Второе число;
  else
    Второе число = Второе число % Первое число;
}
print(Первое число + Второе число);

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

function озеро() {}
озеро = "глубокое";

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

бухгалтер = "глупый";
if(бухгалтер = "глупый") {
  function summa() {
    return 10;
  }
} else {
  function summa() {
    return 20;
  }
}
print summa(); print;

Между словами в именах может стоять различное количество пробелов, символов табуляции или перевода строки.

Куда
будем 
перемещать
этот   стол = "на свалку";
print Куда будем перемещать этот стол; print;

Язык программирования имеет много самых различных встроенных функций. По крайней мере он может быть неплохой заменой бейсику. В настоящий момент существует только онлайн версия языка. Язык написан на PHP.

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

Подробнее
Реклама

Комментарии 79

    +7
    Кажется, кто-то переизобрел Literate Programming
      +4

      А мне это очень похоже на 1С и 1С++.

      +22
      По ссылке в конце статьи: "Эбал (Ebal англ.) — язык программирования нового поколения".

      По-моему, нас тонко троллят…
        +2

        Надеюсь, что да.
        С языком, похожим на естественный, довелось иметь дело (AppleScript). Более неудобного языка программирования в жизни не видел.

          +6
          Тонко ли? Я бы сказал — неумело
            +1
            Это было настолько толсто, что стало слишком тонко…
            –1

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

            +6
            Ничего не изобретая.
            <?php
            
            $первоеЧисло = 123;
            $второеЧисло = 234;
            $сумма = $первоеЧисло + $второеЧисло;
            
            print $сумма;
            


            первоеЧисло = 123
            второеЧисло = 234
            сумма = первоеЧисло + второеЧисло
            
            alert(сумма)
            


            Постоянное переключение между разными раскладками это полнейшая дичь, даже для написания трех строк.
              +2
              Постоянное переключение между разными раскладками это полнейшая дичь

              А если учесть ещё одинаково выглядящие символы разных алфавитов, то это не просто дичь, а снятый с предохранителя взведённый пистолет, постоянно таскаемый за поясом.
                +7
                Потому что надо не $, а ₽
                +8
                В этой задумке прекрасно всё! Остаётся единственный вопрос — зачем?
                  +1

                  А ещё у Вас лексер не справляется с вложенными комментариями.

                    –2
                    Отразил эту особенность языка в документации.
                  +3
                  Вы изобрели язык 1С
                  Первый же пример не имеет ни одного русского слова. Ссылка
                    +4

                    Не знаю почему, но после первого же примера и вопроса "Неплохо, да?" хочется ответить "нет".
                    Возможно действительно троллинг

                      +6
                      Знаете, мне когда было лет от силы 13-14, я на полном серьёзе продвигал в IT-сообществе идею перехода с шестнадцатеричной системы счисления на мою, альтернативную, с нескучными обоями и возможностью грабить караваны.

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

                      Конечно, люди были недовольны. Я тогда не понимал ещё, отчего. Мне в то время казалось, что любая идея (в том числе и моя) имеет право на жизнь, вне зависимости от того, будет она потом где применяться или нет. В чём-то я действительно был прав — например, любая идея действительно имеет место быть.

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

                      Поэтому, вполне вероятен тот факт, что автор не тролль, а просто воодушевлённый своей задумкой человек. Возможно, пока что он просто не может осознать и принять свою ошибку.
                        +2

                        Так это вы были тем малолетнем долб человеком, который форсил wct! Помню, этим были завалены сообщества в вк вроде "типичного программиста". Я не понимал, это так троллят или кто-то на полном серьезе топит за это.

                          +4
                          Каждый из нас когда-то был ${_тем_самым_}. Главное вовремя эволюционировать.
                      +1
                      Ну, не сказал бы, что легче стало — даже читать трудно два языка одновременно. Тем более, что в школе проходят все имена переменных на латинице, и я себя так и не заставил отличать русские слова, как операторы (правда недолго пробовал, но ведь должно было быть легче?).
                        +6
                        Что из этого вышло судить вам.

                        Вы бы хоть сначала цели озвучили.


                        Неплохо, да?

                        Плохо. Как при чтении понять, где закончился идентификатор?


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

                        … который, как известно, неоднозначен и избыточен — а это ровно то, чего мы в языках программирования избегаем. Вот и пример:


                        Вывод Сумма

                        Это один идентфиикатор "вывод сумма" или идентификатор "Вывод", за которым идет идентификатор "Сумма"?


                        (это не говоря о том, что это, на самом деле, не читается)


                        Данная особенность языка позволяет начать программировать человеку без специального образования.

                        Удивительно, но люди без специального образования программируют и без данной особенности. Интересно, как?


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

                        Нет, нельзя. Синтаксис у вас все равно есть, и его все равно надо соблюдать.


                        Эта простенькая программа выглядит просто изумительно. Не правда ли?

                        Нет. Чем она лучше, чем


                        while a <> 0 and b <> 0:
                          if a > b:
                            a = a % b
                          else:
                            b = b % a
                        print(a + b)

                        … тем, что надо постоянно переключать язык, на котором читаешь код?

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

                          А, например, в Алгол-68 синтаксис более однозначный: между идентификаторами всегда либо ключевые слова, либо операторы, либо спецсимволы; а ключевые слова и операторы отличались от идентификаторров — не содержали пробелов и набирались в верхнем регистре, либо брались в кавычки, либо выделялись жирным шрифтом (например в печати).
                            –1
                            > Это один идентфиикатор «вывод сумма» или идентификатор «Вывод», за которым идет идентификатор «Сумма»?
                            ЯП спокойно справляется с таким.
                            Первое = 12;
                            Первое число = 57;
                            print(Первое);
                            print(" ");
                            print(Первое число);

                            Вывод — «12 57»
                              0

                              Не справляется.


                              synonym "число", "=";
                              Первое = 12;
                              Первое число = 57;
                              print(Первое);
                              print(" ");
                              print(Первое число);

                              Синтаксическая ошибка в строке 4 на символе '='.

                              И это даже без учета того, что синонимы (которые тоже идентификаторы) не могут содержать пробел:


                              synonym "равно справа", "=";

                              Ошибка времени выполнения в строке 1. Неверно задан синоним.
                                0
                                Синонимы не идентификаторы. Синонимы — это синонимы ключевых слов или символов. В документации все описано.
                                  +1
                                  Синонимы не идентификаторы.

                                  Это называется "произвольное ограничение". В том смысле, что вы так сказали, но никакого логичного объяснения для внешнего пользователя в этом нет.

                            +2

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

                              +21
                              Просто напрашивается...

                              А вообще, вам сюда.
                                +4
                                #define типа {

                                потерялось
                                  +1
                                  ещё кое-где «сказал» пропущено
                                    0

                                    Не, там на двадцатой строке юзинг стоит.

                                  +5
                                  Вот и у меня были свои мечты

                                  Данная особенность языка позволяет начать программировать человеку без специального образования.

                                  Серьезно? Вот честно признайтесь, вы хоть раз в языке своей мечты озвучивали поинт "чтобы на языке мог писать кто угодно без образования и обучения"


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

                                  Эта штука никогда не работала. Объясните манию программировать на человеческом языке?


                                  Даже если представить, что появится Идеальный_Все_понимающий_компилятор_русского_языка_в_машинный_код — вот вам охота писать такие программы?


                                  Скажи "Здравствуй Мир"! Возьми из переменную окружения "Хост Программного Интерфейса" 
                                   и запусти ППГ сервер. Прикрепи к нему следующие конечные точки: 
                                  1) /пользователь. К нему прикрепи обработчик конечной точки:
                                  Сохрани пришедший идентификатор под именем Айди. Дальше сделай запрос к базе данных "Получить пользователя" "База, база, получи мне пользователя с идентификатор Айди"

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

                                    0
                                    Так такая постановка задачи — очень даже ничего!
                                      0
                                      Если программу будет выполнять/интерпретировать ИИ, который понимает речь, то почему бы и нет) Тогда действительно все от мало до велика будут программистами
                                      +2
                                      А мне нравится ваш пример. Писать, возможно, будет не слишком удобно, зато легко читать. Мы (ну, по крайней мере я) в любом случае при чтении кода в голове неявно преобразуем его во что-то подобное. Если оно будет уже так написано, то шаг с преобразованием исчезнет и немного ресурсов освободится
                                        0
                                        Мне кажется, это классная идея для высокоуровневого кода. Например, какой-нибудь Jenkins job можно было бы описать:

                                        Клонируем репозиторий git://github.com/милые/котятки в папку "тестовые_котятки"
                                        В папке "тестовые_котятки":
                                            - Устанавливаем зависимости командой "yarn"
                                            - Запускаем тесты командой "yarn test"
                                        В случае ошибки отправляем письмо Геннадию <геннадий@милота.рф>
                                        с темой "Вороны клюют твои посевы, Джузеппе!"
                                        

                                        Получается словно и скрипт, и инструкция как это всё сделать руками, если Дженкинс окуклился.
                                          0

                                          Имхо, так кажется потому что идея DSL на нестандартном языке программирования — полное говно.

                                        0
                                        "Сделай, чтобы пользователь был счастлив"
                                          +1
                                          После чего в календаре на утро вторника появляется лоботомия.
                                        0
                                        Сумма равна Число 1 плюс Число номер 2;

                                        Если задать переменные «Число», «Число номер 2», «номер 2», то как эта строка отработает?
                                          +1

                                          Хех, это только для нас языки программирования выглядят как чужеродные конструкции, которые надо осваивать. А для англоязычных жителей все эти for, while, if самые обычные слова.


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


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


                                          массив = 1, 2, 3
                                          цикл массив: если элемент равен 2, то выход

                                          А на практике это будет:


                                          пусть массив будет от одного до трех. надо перебрать все элементы, и чтобы на двойке выйти. но не раньше

                                          Ну и как прикажете такую фразу переводить в машинный код? И каждый будет перефразировать по-своему. Пока что парсить алгоритмы, написанные разговорным языком, нереально. А если заставлять учить синтаксис… То лучше с for, if, while. Они хотя бы короткие и хорошо выделяются в тексте.

                                            0
                                            Пока что парсить алгоритмы, написанные разговорным языком, нереально.

                                            А вот когда станет реально, разработкой будут заниматься аналитики, которые пишут требования.
                                              0
                                              Ну нет. Аналитики пишут достаточно высокоуровневые требования. Чтобы их транслировать в код таки нужен сильный (И)И
                                            –1
                                            Хабр, который мы заслужили
                                              0
                                              Каждый программист хотя бы раз в своей жизни мечтал об идеальном языке программирования.

                                              Абсолютно неверно.
                                              Большинству программистов пофиг на идеальный язык программирования. И уж тем более, никто не хочет создавать свой собственный язык.
                                              Это мечты джуниоров.
                                                +3
                                                Мне кажется, большинство программистов хотя бы раз в жизни были джуниорами, так что все сходится.
                                                0
                                                Можно отвлечься от изучения синтаксических конструкций языка, а сосредоточиться на изучении алгоритмов программирования.
                                                Но даже в вашем «языке» есть синтаксическая конструкция, нарушив которую программа не скомпилируется.
                                                  +1

                                                  Я недавно столкнулся с Robot Framework, где тоже идентификаторы с пробелами и много всяких ненужных слов, так прям сил нет, какая хрень.

                                                    +2

                                                    Вот вы минусите. А у человека там судя по косвенным данным (по интерпретатору в веб-морде) — довольно большая работа проделана. Не обычный транспайлер вида "фигак-фигак", как делают новоиспечённые адепты секты "совершенных языков программирования", а примитивная виртуальная машина.


                                                    Я бы даже на исходники взглянул. Вдруг что интересное попадётся, всё же подобная реализация требует особых знаний на этом поприще. Тем более, судя по задаче — это реализация с КЗ-грамматикой (Тип 2 по иерархии Хомского), что повышает сложность парсера и семантического анализа.


                                                    P.S. А если там всё сделано ещё грамотно: лексер, парсер, ast, ir-код, таблица символов и прочие прелести, то вне зависимости от результата (как мы видим — довольно плачевного) — это очень круто.


                                                    P.P.S. Хотя, может я и ошибаюсь =)

                                                      –6
                                                      Два LR(1) парсера. Один для лексем, другой для грамматики. Тот что для лексем не стандартный, а немного переделанный. AST. Все по науке. Исходники не будут выложены никогда. Это тайна.
                                                        +5

                                                        Ну и кому в таком случае ваш язык вообще нужен?

                                                          0

                                                          А как вы парсите heredoc строки только с помощью LR парсера?

                                                            –1
                                                            В языке нет heredoc строк.
                                                              0

                                                              Ну, объективно, HEREDOC можно считывать и обычной регулярной грамматикой:


                                                              <<<\h*(\w+)[\s\S]*?\n\h*\g{-1}

                                                              А внутрянку считывать дополнительным проходом уже после.

                                                            +2

                                                            Большая работа — не обязательно полезная работа.

                                                            0

                                                            Очень похоже на 1с 7.7. Подиразбери почему уровень() метод, а наименование свойство. Подробностей не вспомню. Но там часто была путаница в этих понятия.

                                                              –4

                                                              Неплохо, но:
                                                              1) Засуньте куда-нибудь кириллицу, ее там не должно быть
                                                              2) Знак равенства для всех нормальных людей без образования все равно лучше чем писать "равно"
                                                              Ну и конечно то, что он написал на php, я так понимаю, массив из 10000 элементов он будет минуту заполнять? Если да, то это бесполезный язык. Переписывайте на что-то нормальное.

                                                                0

                                                                Я щас посчитал, python (медленный язык) 13'500'000 элементов массива в секунду. Ваш язык хотя бы четверть этой скорости осилит?

                                                                  –1
                                                                  Насколько знаю, медленный питон, php далеко нет, так как его реализация на плюсах сделана
                                                                    –1

                                                                    php вроде медленнее питона. Они оба на + реализованы. Но какая разница, если ТС писал не на +, а на нестроготипизированном интерпретируемом языке интерпретатор другого языка?

                                                                      –7
                                                                      спасибо за минус в карму
                                                                        +2

                                                                        Передаю от лица того, кто поставил вам минус: "пожалуйста". Впрочем, теперь я тоже это сделаю

                                                                        0
                                                                        php вроде медленнее питона.

                                                                        Так было в бородатых 2000х. Сейчас же на алгоритмических задачках (т.е. CPU-bound) PHP может вполне конкурировать с аналогичными на C, где питону по скорости до пыха как до луны, и тормоза возникают лишь в синхронном IO.


                                                                        P.S. https://gist.github.com/dstogov/12323ad13d3240aee8f1


                                                                        PHP7-JIT (JIT=on)                  0.011
                                                                        gcc -O2 (4.9.2)                    0.013
                                                                        ...
                                                                        python-2.7.8                       1.128
                                                                          –2

                                                                          Презабавнейше, не знал. Но стоит заметить, что все php кроме как jit (то есть скомпилированного) где-то там внизу. Ну хотя тс может и на jit писал

                                                                            +1
                                                                            Но стоит заметить, что все php кроме как jit (то есть скомпилированного) где-то там внизу.

                                                                            Да, ровно после джавы. Т.е. можно считать на этом тесте самым быстрым интерпретируемым языком без JIT.


                                                                            А если учитывать что это тест от 2015го года и после 7.0 ещё были 7.1, 7.2, 7.3 релизится 7.4 и в разработке 8.0, то тем более. Там по скорости не такие значительные отличия как между 5 и 7, то тоже скорость процентов на 20 повыше будет этих результатов.


                                                                            P.S. А то что вы там внизу видите — это как бы PHP 5.0, о чём я и намекал, говоря о "бородатых 2000х", когда был PHP 4/5.

                                                                              0

                                                                              Он может и самый быстрый, но все равно медленный для написания яп. Опять же, не рассматривая, если тс писал на jit

                                                                                0

                                                                                Во-первых, "на JIT" никто не пишет. Это всего лишь флаг в настройках языка.


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


                                                                                Для начала в мире не существует ни одного языка общего назначения, который бы был медленным для "написания ЯП". Как бы ЯП — это всего лишь frontend компиляторов: Совокупность грамматики и IR-кода. А в качестве бека никто не мешает использовать какой-нибудь LLVM.


                                                                                Если же вы хотели написать не ЯП, а "интерпретатора", то это вполне оправдано, когда разница по скорости раза в полтора два от сишной реализации не является критичной.


                                                                                Согласен что на уровне языка не хватает возможностей прямой работы с памятью и инструкциями CPU, вроде AVX. Ну или другими узкими местами, вроде прямой работой с GPU для рендера сцен а-ля Crysis в 60 fps. Но это и не критично особо, а всякие фичи обмазываются FFI-бриджами.


                                                                                Хотя народ упарывается, это да: https://stitcher.io/blog/php-jit


                                                                                А если говорить про опыт, то больше всего производительности мне удалось выжимать за счёт оптимизации алгоритмов. Например, ускорение в 36 раз за счёт перехода с LL(k) с построением AST из трейса парсера на метод рекурсивного спуска с параллельным построением AST (я хрен знает как его назвать, потому что сам выдумывал и реализация ближе к парсер-комбинаторам, нежели к классическому LL):


                                                                                Заголовок спойлера

                                                                                image

                                                                                  0

                                                                                  Кстати я вообще не понимаю, почему я решил, что тс интерпретатор пишет. Впрочем, как неочевидно и обратное.

                                                                                    0
                                                                                    Кстати я вообще не понимаю, почему я решил, что тс интерпретатор пишет.

                                                                                    Иначе достаточно мало смысла в утверждении "Так это же PHP. Что вы хотели?"

                                                                    –4
                                                                    Массив из 1000 элементов заполняет в среднем за 0.001 сек. (сервера Google очень быстрые). В онлайн версии установлено ограничение на количество элементов массива — 1000 элементов максимум. Скорость можете сами проверить.
                                                                    a = adim(1000);
                                                                    afill(a, 10);
                                                                      0

                                                                      Ну я имел ввиду цикл вообще-то, а не встроенную функцию.
                                                                      Но даже без цикла — 1'000'000 в секунду, это в 13 раз медленнее питона.

                                                                    0
                                                                    Куда
                                                                    будем
                                                                    перемещать
                                                                    этот стол язык программирования= «на свалку»;
                                                                    print Куда будем перемещать этот стол язык программирования; print;
                                                                      –4
                                                                      Цикл за 0.01 сек.

                                                                      a = adim(1000);
                                                                      while(i <= 1000) begin i = 1; step i = i + 1; {
                                                                      a[i] = i;
                                                                      }

                                                                      Так это же PHP. Что вы хотели?
                                                                        +1
                                                                        Что вы хотели?

                                                                        Чтобы выгоды от использования языка перекрывали его недостатки.

                                                                        Какие конкретно плюсы вашего языка перекрывают минусы в виде низкой скорости выполнения, закрытого исходного кода и сложности печати (постоянно переключать раскладку) и чтения (постоянно переключать мозг)?
                                                                          +1
                                                                          Что вы хотели?

                                                                          Мы хотели идеальный язык программирования.

                                                                            0

                                                                            Как интересно, а мне кинули, что за 0.001. Ну тогда разговор ни о чем)

                                                                              0
                                                                              Так это же PHP. Что вы хотели?

                                                                              У меня на рабочем ноуте этот цикл отрабатывает за 0.01мс (0.000013 сек) без JIT, opcache и прочих приблуд. Есть подозрения, что это у вас реализация тормозит.


                                                                              Да и даже если виртуальную машину написать скорость будет ~0.0003 сек (извиняюсь за говнокод): https://gist.github.com/SerafimArts/ce7e0ca28b325e4c8794aede4ffd8a74

                                                                                –2
                                                                                Возможно и так. Мне все равно. Это прототип языка. Задача получить высокую скорость не стоит. Когда буду вылизывать ассемблерный код, тогда и буду думать как повысить производительность. Но до этого еще очень далеко…

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

                                                                            Самое читаемое