История о том, как я разработал язык программирования

    Привет Хабр! Меня зовут Ильдар. Мне 29 лет. Программирую с 2003 года. За свою жизнь создал 4 фреймворка и язык программирования. В этом посте я поделюсь своим опытом, инсайтами, которые я получил при разработке языка программирования BAYRELL Language. Заранее прощу прощения за возможные синтаксические и пунктуационные ошибки в тексте и отсутствие картинок.


    История создания


    BAYRELL Language я начал создавать летом 2016 года. Тогда я узнал про ангуляр и реакт. Они произвели на меня впечатления прорывных технологий. Я тогда разрабатывал сайты на PHP и использовал Twig в качестве шаблонизатора. И хотел попробовать Angular. Начал искать, как можно прикрутить Angular к Twig.


    В целом Twig+Angular работает, но был эффект моргания. Страница рендерилась через Twig на сервере, передавалась клиенту, и там уже рендерился Angular. И страница, пока рендерится у клиента, она моргала. И я тогда задумался, а есть ли клиент-серверный шаблонизатор, но такой, чтобы работал на PHP и JavaScript?


    Я поискал в интернете, все рекомендовали использовать NodeJS в качестве сервера, либо V8 движок в PHP, либо микро сервисную архитектуру: backend на PHP, frontend на NodeJS. Только вот незадача. Я делал сайты на WordPress, Yii2. А на хостинге, не было поддержки ни NodeJS, ни V8. Тогда и пришла идея, написать кросс язычный шаблонизатор.


    Я начал его делать. Написал за месяц на PHP, потом за другой месяц написал на JS. И быстро понял, что поддерживать два языка, одновременно сложно. Если появлялся, баг, то его нужно было пофиксить и там и там. Очень быстро версии шаблонизаторов стали разными, и расходились по функционалу. У меня было желание добавить Python. Я понял, что разрабатывать отдельно под каждый язык шаблонизатор, очень сложно. Тогда появилась другая идея. Найти транслятор языков, и сконвертировать код шаблонизатора на PHP в JS и в Python.


    Я поискал в интернете про PHP to JS. Нашел несколько решений и опробовал их. Результат оказался дивный. Данные решение не полностью покрывали функционал PHP и JS. И как быстро выяснилось, массивы в PHP и JS отличаются. В JS это массивы, а в PHP это еще могут быть объекты. В JS console.log, а в PHP var_dump. Runtime среда, работа с массивами в языках отличаются друг от друга. И с этой проблемой, те решения, которые я рассматривал, не смогли ничего сделать.


    Меня посетила следующая идея. Написать язык программирования, который будет транслировать код в несколько языков. Все равно большинство и так пользуются TypeScript, CoffeeScript, Dart, Babel, которые транслирует код в JavaScript. Почему бы не создать язык, который также бы транслировался, но не только в JS, но еще и в PHP, Python и т.п.


    Так родилась идея создания BAYRELL Language.


    На разработку у меня потребовалось много времени, я несколько раз переписывал язык с нуля. Рабочую версию 0.3 я получил в середине 2018 года. В ней был шаблонизатор и рабочий транслятор. Но я не стал ее выкладывать, потому что она была сырая, хоть и рабочая.


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


    Возможности языка


    • Код на языке BAYRELL Language транслируется в PHP, NodeJS, JavaScript;
    • Встроенный в язык HTML шаблонизатор;
    • Рендер в браузере и на сервере;
    • Возможность разработки бэкенд api;
    • Функциональное программирование;
    • ООП;
    • Неизменяемые структуры данных;
    • Функциональные цепочки вызовов функций (pipe);
    • Асинхронное программирование async/await;
    • Кэширование результатов функций, через параметр memorize;
    • Лямбда цепочки;
    • Концепция обмена сообщениями между частями системы;

    Более подробно о возможностях я распишу в документации.


    BAYRELL Language содержит Runtime библиотеку, которая позволяет разрабатывать Full Stack программы. Начиная от запросов к базе данных, работа с API, заканчивая компонентами и рендером на клиенте.


    Как начать пользоваться языком


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


    Установка языка осуществляется следующей командой:


    npm install -g bayrell-lang-compiler

    Чистый проект:


    git clone https://github.com/bayrell-tutorials/clear-project
    cd clear-project
    git submodule init
    git submodule update

    Трансляция проекта:


    bayrell-lang-nodejs make_all
    bayrell-lang-nodejs make_symlinks

    Наблюдение изменений в проекте и автоматическая трансляция:


    bayrell-lang-nodejs watch

    Чтобы посмотреть проект, нужно в nginx прописать document root к папке web в проекте.


    Ссылки на проекты примеры:




    HTML Шаблонизатор


    У шаблонизатора несколько отличительных особенностей:


    • Транслятор конвертирует код шаблона в PHP и JS.
    • Можно создавать свои компоненты и переиспользовать их в различных частях системы или в других проектах.
    • Direct патчинг HTML DOM вместо Virtual DOM.

    Более подробное описание работы шаблонизатора, с примерами работы можно найти в документации.


    Если вкратце, то создается модель данных LayoutModel, которая содержит всю информацию о странице (модель всего шаблона). Модель страницы – неизменяемая. Каждый компонент содержит чистую функцию render, которая отображает HTML код на основе модели. Модель может изменяться через JS события (нажатия кнопок мыши, клавиатуры и т.п.) путем создания новой модели с новыми свойствами. При возникновении события, компонент передает событие вышестоящему компоненту, о том, что его модель изменилась. Вышестоящий компонент, изменяет свою модель и передает сообщение выше, пока не дойдет до RenderDriver.


    RenderDriver изменяет LayoutModel, и запускает перерисовку через requestAnimationFrame. Функция отрисовки использует функции render у компонентов, чтобы пропатчить HTML DOM. В функции render не создается VirtualDOM, а происходит прямой патч HTML.


    Функциональное программирование


    Сейчас тренд на функциональное программирование (ФП). Когда я разрабатывал язык, я понял, что такое функциональное программирование. Это, наверное, самый важный инсайт был для меня. Я понял, что ФП, это не Lisp, Haskell, F#, а принципы, которые применимы как к ФП, так и ООП языкам.


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


    Например, у меня, после введения неизменяемых типов данных (структур), исчезла необходимость писать private у переменной, и создавать функции setName(), getName(). Обычно в ООП их всегда пишут. А в функциональном программировании они не нужны. Потому что структура неизменяемая.


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


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


    Принципы функционального программирования


    Данные принципы относятся к языку BAYRELL Language. В других ФП языках некоторых принципов может и не быть.


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


    Второй принцип – отсутствие состояния. Функция не хранит в себе состояний, и изменяемых данных. Не сохраняет файлы и сессии локально, чтобы их потом использовать. Два последовательных запроса от клиента могут отправиться к разным экземплярам функции, и эти экземпляры функции должны одинаковым образом обработать запросы от клиента.


    Состояния лучше хранить во внешних системах: база данных, memcached и т.п. В 12 факторной модели он называются сторонние службы.


    Третьим принципом функционального программирования, является возможность создания асинхронных функций. Что это значит? Пример, из жизни. Пусть нам надо написать письмо человеку с каким-то предложением, и узнать его ответ. А после его ответа принять решение. Но пока человек, отвечает, думает, он может отвечать, допустим сутки, в это время, мы можем заняться другими делами, пойти в кино, сверстать сайт, и т.п. Очень важно, что задачу выполняет один человек, но он делает «параллельно» эти задачи.


    В программировании также. Когда происходит запрос к базе данных, к другому сервису, чтение с диска, можно запустить другую вычислительную функцию. А когда придет результат, от базы, то продолжить выполнение первой функции, с того момента, где остановились. И при этом не обязательно заводить отдельные потоки на каждую функцию. Можно выполнять всё в одном потоке. Это называется кооперативная многозадачность. Кооперативная многозадачность работает в пределах одного потока, одного исполнителя.


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


    У неизменяемых структур данных три важных свойства:


    • Чтобы узнать изменились ли данные, или нет, достаточно сравнить ссылку на объект. Если ссылка изменилась, значит это новый объект, и данные изменены.
    • Их можно использовать в многопоточных системах, и не боятся, что какой-то поток, изменит объект, пока другой им пользуется. Можно обойтись без мьютексов.
    • Если передавать неизменяемые объекты в функции, то можно не бояться, что функции изменят значения объекта. Тем самым алгоритм становится значительно проще. И ошибок гораздо меньше.

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


    Пятый принцип функционального программирования, это чистые функции.


    Чистая функция – это:


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

    Очевидно, что результат выполнения чистых функций можно кэшировать. Если одни и те же входные данные, то достаточно один раз вычислить результат этой функции, и дальше его использовать. Оптимизация HTML рендера может использовать данное свойство, если функция рендера чистая, а модель данных страницы неизменяемая.


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


    Пример на языке BAYRELL Language:


    /**
     * Sum a + b
     */
    lambda int sum(int a) => int (int b) use (a) => a + b;

    или анонимная функция:


    fn sum = int (int a) => int (int b) use (a) => a + b;

    Функции высших порядков удобно применять в map, reduce, array_filter (php), цепочках pipe.


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


    Например:


    ls -la | grep .txt

    Это pipe. Он выводит список файлов с расширением txt. Сначала вызывается функция, которая выводит листинг всех файлов, затем вызывается фильтр, который оставляет только txt.


    В BAYRELL Language можно тоже создавать pipe. Пример:


    User user = new User()
    	|> User::setName('John')
    	|> User::addEmail("john@example.com")
    ;

    Или проще:


    User user = new User()
    	-> setName('John') 
    	-> addEmail("john@example.com")
    ;

    В данном случае создается пользователь, при вызове addEmail, первым аргументом передается объект пользователя и меняется имя, а вторая функция, добавляет email «john@example.com» и возвращает новый измененный объект. Сама передача объекта не указывается, поэтому функции содержат один аргумент, а не два. Это сделано для облегчения читаемости кода.


    Pipe может быть асинхронным.


    Более подробные примеры в документации.


    Функциональное программирование очень хорошо подходит для разработки облачных систем. Есть даже целое направление FaaS – функция как сервис.


    Концепция обмена сообщениями


    Сейчас в BAYRELL Language обмен сообщениями работает во Frontend: события JavaScript, нажатие мыши, события компонентов. И отправка Ajax запросов на Backend.


    Пример отправки сообщения:


    MessageRPC msg = await @->sendMessage
    (
    	new MessageRPC
    	{
    		"api_name": "App",
    		"space_name": "ApiInterface",
    		"method_name": "getDocument",
    		"data":
    		{
    			"document": "/ru/" ~ prefix,
    		},
    	}
    );
    Document document = msg->isSuccess() ? msg.response : null;

    К сожалению, REST Api не полностью может покрыть необходимый функционал. REST это всего лишь CRUD. А иногда, требуется запускать запросы, которые, например, компилируют какой-то модуль, загружают файл на сервер, или отправляют уведомления о событиях. И использовать методы HTTP (GET,POST,PUT,DELETE) для передачи команды запроса не очень хорошая идея.


    Поэтому, при разработке концепции обмена сообщениями, была взята концепция D-BUS за основу. Есть объект, который получает сообщения. У него есть некий интерфейс, а у интерфейса метод.


    Интерфейсы позволяют стандартизовать обращения. Например, CRUDInterface. Если объект обладает этим интерфейсом, то все веб компоненты, в которых реализован этот интерфейс, смогут отображать данные из этого объекта. И свободно обращаться в этому объекту по API.


    Работу обмена сообщениями планируется в будущем сделать, через различный транспорт: WebSocket, DBus, RabbitMQ. Пока реализован транспорт через Ajax в качестве вызова API.


    О языках


    Я понял, во время разработки языка, что концепции языков С++, C#, Python, Java, PHP похожи. Отличается синтаксис, комьюнити и библиотеки, под эти языки.


    Для себя я определил следующие правила, к которым нужно прислушиваться при выборе языка или фреймворка:


    • Размер сообщества и наличие обилия библиотек. Писать все с нуля самому сложно. Я написал 4 фреймворка, и теперь понимаю, что порой лучше взять готовые решения.
    • Оценить будущие затраты на сопровождения и доработку кода, который вы написали.
    • Легко ли найти программистов под этот язык или фреймворк, и захотят ли они с ним работать. И сколько они будут просить зарплаты.
    • Сможете ли вы найти решение возникшего вопроса в интернете за несколько минут, касательно выбранной технологии?
    • Выдерживает ли этот язык или фреймворк нагрузку, которая предполагается при размещении в продакшн.

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


    Будущие направления развития языка BAYRELL Language


    То, зачем я начал разработку, это интеграция кода написанных на разных языках (Java, Python, C#, C++, NodeJS, JavaScript, Go, Lua). Или разработка библиотек под эти языки программирования. В рамках создания BAYRELL Language, я планирую максимально интегрировать его с этими языками. В идеале, я вообще задумываюсь, о свободной конвертации программ из одного языка в другой. Языки похожи, но они имеют свои различия и нюансы. Из-за этого транслятор из одного языка в другой создать сложно.


    Я изучал данную проблему переиспользования исходного кода, в разных языках. Это называется Language Binding. В компилируемых языках есть dll, и все решается просто. Но появились интерпретируемые языки, и использование кода из одного языка другим, становится проблемой.


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


    Еще одним направлением, является развитие FaaS системы и визуального программирования.


    Это разработка мышкой функциональных программ в облаке. Я как программист очень много времени трачу на печатание кода, на постоянные сборки и компиляции. Хотя нужно тратить время на создание алгоритмов. Мне нравятся конструкторы сайтов, автоворонок продаж, чат ботов. Где можно мышкой потыкать, и получить готовую рабочую версию. Только зачастую, в некоторых конструкторах, нельзя писать кастомный код. Либо конструктор не дает выгрузить разработанный код. И еще в конструкторах нет Git.


    Визуальное программирование сокращает время на создание программы. Так, к примеру, создать лэндинг на конструкторе можно за 2-3 дня. А если делать макет, дизайнить и верстать, то уйдет месяц, а то и больше.


    Более подробно TODO List я написал в документации


    Итог


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


    По вопросам сотрудничества и вступления в сообщество пишите в ЛС.


    Буду рад, если подпишитесь на меня в соц сетях.


    Ссылки на соц сети доступны на странице.

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

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

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

      +1
      Сначала не понял, но потом как заорал
        0
        До этого не понимал, как работает масштабирование в функциональном языке, но после прочтения статьи я наконец-то понял. Спасибо.
        +3
        А чем Haxe не устроил?
        +8
        Интересно почему назвали BAYRELL?

        Без поддержки IDE вероятность взлёта кроме как лично для вас, примерно равна нулю.

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

        Если же лично для себя, то супер. Очень хороший способ поглубже погрузиться в нижние уровни. Главное вовремя вынурнуть.
          0

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


          Я согласен, что в мире и так много языков, а здесь еще один. И практическая значимость языка на данный момент, довольно странная и не понятная.


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


          Например, я думал создать програмку, которая делать расчет roi, каналов эффективности в маркетинге. Тянуть данные из метрики, аналитики, Adwords, директа, коллтрекинга, и сводить их в единой системе. Да такие сервисы уже есть, например roistat. Но мне всегда нравился Excel и Access своей элегантностью, где за вечер — два можно создать простую систему.
          У меня знакомый написал на Access за 3 дня срм для своей компании, и спокойно работал на ней.


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

            0
            А я думал, что вы кросс-языковый ЯП придумали (ну или транслятор хотя бы)…
              0
              Про визуальное программирование: luna-lang.org

              На мой вкус штука сейчас безумно кривая, но мб в ней можно найти полезных концептов

            –11
            Интересная статья.

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

            Что касается вашего языка, я обязательно возьмусь за его обучение когда у меня появится время после изучения других 19 языков для тех, кто недавно только начал программировать и хочет без лишних трат у себя дома изучить основы программирования за 24 часа.

            Ваш язык выглядит очень интересно и надеюсь, что он сможет помочь мне устроиться на работу без опыта для студентов.
              +3
              >поскольку считаю, что на сегодняшний день всем молодым программистам стоит ознакомиться с ними и не поддаваться давлению со стороны отстающей толпы.

              А я бы посоветовал всем молодым программистам изучать основы, и не поддаваться волнам модного хайпа :) Часто они проходят, не оставляя следа. Хотя, иногда, и могут оставить после себя крупинки чего-то полезного.
              –6
              Привет Хабр! Меня зовут Ильдар. Мне 29 лет. Программирую с 2003 года

              — Привет, меня зовут Вася, мне 30 лет и я не программирую уже 10 дней!
              — Здравствуй, Вася. Похлопаем Васе

              У меня было желание добавить Python


              Чтобы было?

                +1

                Неужели Вы были так привязаны к хостингу, который поддерживал только PHP, что были вынуждены разрабатывать собственный язык? Или это было всего лишь поводом?


                Если хостинг с прибитым PHP был необходим, то не проще ли было написать свой конвертер PHP <-> JS, чем писать целый язык?


                А если ограничение хостинга было всего лишь поводом, то подобное можно было бы реализовать, помимо предложенных решений (NodeJS, ...), на котлине, он и хорош как язык для бакенда, и транслируется в JavaScript.


                Его синтаксис поддерживает те принципы, которые Вы описали в разделе "Принципы функционального программирования".


                Асинхронность реализуется через корутины:


                val user = getUser(name)
                val postsCountAsync = async { getUserPostsCount(user.id) }
                val commentsCountAsync = async { getUserCommentsCount(user.id) }
                println("Постов: ${postsCountAsync.await()}, комментариев: ${commentsCountAsync.await()}")

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


                Неизменяемость структур данных реализуется через неизменяемые коллекции и неизменяемые переменные (val). Функции высших порядков присутствуют.


                Цепочки вызовов можно реализовать схожим образом:


                val user = User().apply {
                        setName('John')
                        addEmail("john@example.com")
                }

                В отличии от BAYRELL Language, для этой функциональности котлину не требуется специальный синтаксис, т.к. apply это всего лишь функция, которая принимает на вход лямбду.


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

                  0

                  В какие языки Kotlin умеет транслироваться, помимо JavaScript?

                    0

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

                      0
                      В теории во все, которые могет LLVM.
                        0
                        То что при трансляции X-lang для LLVM он сначала превращается в IR, совсем не говорит о том что существуют средства превращающие IR обратно в X-lang.

                        Сама же LLVM из IR создает машинный код.
                        0
                        Почему ты думаешь, что язык должен уметь во что-то транслироваться? Трансляция в js это от безысходности, потому что браузеры только его умеют.
                          0

                          Изначально я хотел шаблонизатор php -> js, WebAssembly, а получил функциональный язык с шаблонизатором -> php, js

                      +1
                      В статье не хватает более детального разбора синтаксиса.

                      К примеру, почему используется ключевое слово `lambda`? Это разве не добавляет многословности?

                      Ещё было бы интересно узнать, с какими проблемами столкнулись при разработке компилятора и как их решили.
                        0

                        Спасибо за комментарий.


                        Детальный разбор синтаксиса, я напишу в документации. И так пост большой получился. А так согласен, интересно было бы. Можете ознакомится с примером CRUD List.


                        Слово lambda, это как static. Есть статические функции, есть обычные. Только lambda говорит о функциональном стиле. Сейчас синтаксис на стадии осмысления. Возможно что-то уберу в будущем. Сделаю лаконичнее.


                        Разработку компилятора, еще не начинал делать. Но смотрю в сторону WebAssembly и LLVM. Как сделаю, обязательно поделюсь опытом.

                          0

                          А чем статические функции отличаются от обычных?

                            0

                            Видимо, речь о статических методах?

                              0

                              Да статические методы, они же статические функции. В ООП, функция должна принадлежать к какому-то классу. А язык ООП.

                                0

                                Статические методы это функции в пространстве имен класса. Такого понятия как статические функции не припомню.

                        +1
                        BAYRELL -> PHP -> C/C++
                        BAYRELL -> JS -> C/C++
                        Нам нужен еще один язык который будет транслироваться в BAYRELL. И желательно с синтаксисом С :)
                          +6

                          Как по мне, фатальный недостаток в действии.

                            –2
                            Очередной ЯП? Ну зачем? Что то не заработало, давай пилить свое, хотя можно же поискать (да займет время) уже готовые решения. Но именно новый ЯП писать, ну такое… :)
                              0

                              Честно говоря, по принципам ФП у меня есть некоторые вопросы к вашему языку.


                              Во-первых, я правильно понимаю, что вывода типов в BAYRELL нет?


                              Во-вторых, судя по этому фрагменту:


                              Document document = msg->isSuccess() ? msg.response : null;

                              в языке нет сумм-типов и сопоставления с образцом. Это так?

                                –1

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


                                Пока так. Это связано с тем, что транслятор пока, не умеет анализировать все файлы, строить зависимости между используемыми файлами, и объявленными в них типами. Да и IDE нужно, чтобы типы показывать и отлаживать.


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

                                –5
                                Честно скажу. Статью не читал, и можно сказать залогинился впервые за N лет чтобы это написать, но: пожалуйста, перестаньте плодить языки программирования!
                                  +2
                                  Свои фреймворки создавал как и многие, язык еще нет, респект автору. :-)
                                  Тоже хотел бы попробовать создать что-то более высокоуровневое.

                                  Круто было бы объяснять машине то что я хочу, примерно так как пишем
                                  спеки на разработку.
                                    0

                                    Спасибо :)


                                    Я думал про визуальный UML, который конвертируется в код.

                                      0

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

                                        0

                                        У меня такие идеи:


                                        Можно попробовать развиваться в сторону проектирования базы данных мышкой.
                                        Создать возможность конвертировать UML диаграмму классов в ORM, CRUD api и схему базы. С поддержкой миграции. и с возможностью наполнить эту базу мышкой данными. Я создавал свои ORM, и понимаю как это сделать в конструкторе.


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


                                        Визуальное создание HTML интерфейсов. Сейчас это технология хорошо отработана в конструкторах типа тильда. А если верстать на основе компонентов, где их можно компоновать, и менять их свойства. А сами компоненты свободно распространять на гитхабе, например. То вот он конструктор получается.


                                        Если все эти системы в одну объединить, то получится что-то интересное. У меня сейчас, по визуальному программированию больше вопросов чем ответов, но я считаю, это реально сделать.


                                        И понимаю, что все мышкой сделать не получится, но упростить какие-то вещи. В yii2 есть генератор CRUD. Очень сильно помогает.


                                        Думаю начать с чего-то подобного, а потом видно будет, как развивать дальше.

                                          0

                                          Так я вам о том и говорю, сделать crud генератор труда не составляет, таких уже если не тысячи, то сотни точно, но как только надо сделать хоть какую-то простую бизнес логику, то начинается свистопляска. И получается такая каша костылей, такая странная система, что никакой разработчик не хочет работать с очередной ограниченной системой. Low coding конструктор интересен лишь самому разработчику конструктора, разработчики же с ним работать не хотят, а не разработчики не могут в силу отсутствия компетенций.
                                          Говорю по собственному опыту, сам такой делаю и мы целенаправленно уходим от конструктора в сторону фреймворка.

                                            0

                                            А как называется ваш конструктор и фреймворк?

                                              0

                                              https://pmforesight.ru/
                                              Но он пропиетарный, мы сами разрабатываем платформу и сами же на ее основе внедряем проекты.
                                              9 лет назад это был low coding crud & gui генератор, но требования к его функциональности превратили его в лоумышинг и норм так кодиг фреймворк.

                                            0
                                            вы встроили в язык html (шаблоны), на мой взгляд sql также хорош для работы
                                            с данными как html для структуры, не лишнее ли это звено — ORM?

                                            специализированные языки (html,sql,css) хороши без надстроек в виде орм
                                              0

                                              Я имею ввиду простое ORM, без излишек. Желательно обертку, чтобы sql отправлять, и приятный синтаксис для базовых sql запросов.


                                              Что-то в виде:


                                              OrmQuery q = new OrmQuery()
                                                  -> query ("select * from table_name where id=:id", { "id": 5 } )
                                              ;
                                              OrmResult res = await provider -> execute(q);

                                              или:


                                              OrmQuery q = new OrmQuery()
                                                  -> select ( "users", "*" )
                                                  -> where ( "id=:id", { "id": 5 } )
                                                  -> offset ( 0, 10 )
                                              ;
                                              OrmResult res = await provider -> execute(q);

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

                                            0
                                            История стара, как мир, собственно в сам uml вкладывали такую функциональность, в visual studio была глубокая поддержка этого, но оно не заработало от слова вообще. Визуальное программирование имеет такое огромное количество ограничений, что не справляется почти ни с какой задачей, больше чем вывести поле из базы без какой либо логики.
                                            Имхо, UML-системы годятся только для DSL, так как внутренняя логика у ЯП общего назначения слишком сложна для графического представления. Вот если такой DSL, плюс работа с БД, плюс возможно ORM (и все это мышкой) — то будет интересно, но сначала надо определиться с предметной областью.
                                              0

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

                                                0
                                                Так ЯП общего назначения потому и сложны так, что для каждой предметной области свои требования по возможностям и функциям. Поэтому и DSL общего назначения пока популярных нет. А уж тем более UML для них.
                                                Имхо проще взять одну предметную область, но очень популярную, и запилить UML-DSL для нее. А там уже видно будет…
                                        +1

                                        Сделать такую работу — это очень круто для саморазвития и достойно уважения, но есть вопросы:
                                        Раз вы обладаете такими фундаментальными знаниями в программировании, то почему вы продолжаете верстать сайты на бесплатной цмс, а не занимаетесь более серьезными делами, такие компетенции редки и высоко ценятся.
                                        JetBrains потратили 10 лет и более $100 млн на разработку котлина огромной командой, я предвзято не верю, что один интузиаст по вечерам за пару месяцев может сделать хоть сколько то пригодный язык программирования. Вы хотели привести пример crud, но этого недостаточно, на уровне "hello word" любой яп и любой фраемворк прекрасен, а как только нужно сделать что-то посложнее, то сразу одни препятствия.

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

                                          Сам задаю этот вопрос каждый день. Я живу в городе с населением в 200тыс и тут работы для IT специалистов мало. По удаленке я нашел работу только по сайтам. Вот так и живу, делая сайты, зарабатывая деньги, и параллельно развивая проект.


                                          А так да, согласен. Одному сложно. Я прикинул TODO лист, что нужно сделать, и очень большой объем работ получился. И это не считая работ по визуальному конструктору.


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


                                          А какие еще есть варианты как развивать свою идею?

                                            +1

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

                                              0
                                              Я бы даже больше сказал, что эта статья в резюме — это уже билет на senior-место. Поэтому считаю, что автор не прав насчет удаленки.
                                          +2
                                          Блин, как же я обожаю PHP'шников :) У них всегда самые интересные велосипеды!

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

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