LINUX.ORG.RU

Stodin DSL

 , ,


0

3

Здравствуйте!

В данной теме представляю для обсуждения язык программирования, созданный с использованием принципов разработки предметно-ориентированных языков (по книге Мартина Фаулера). Ссылка на проект языка: https://github.com/kupriyanov-sn/StodinDSL

Язык называю DSL только по методу разработки и по синтаксису. По возможностям он близок к языкам общего назначения. При этом, по лаконичности он близок к Python, хотя и статически типизированный. Назначение языка - ускорение разработки небольших проектов на C++.

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

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



Последнее исправление: cetjs2 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Дискуссия интересная. Она иллюстрирует ситуацию в IT.

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

И в этих областях дают для работы ассемблер, си, а по праздникам с++. И сами ребята из embedded не могут представить, что есть другие языки, кроме си, и разработчикам языков они не интересны. Им интересны ФП, многопоточность, интроспекция и метаданные. А потом происходит переполнение целого числа и робот выдаёт брак. И хорошо, если это робот, а не самолёт.

Что-то пафоса много. Но суть в том, что ещё один язык для документооборота или web я не вижу смысла делать.

Kogrom
() автор топика
Ответ на: комментарий от Kogrom

Что-то пафоса много. Но суть в том, что ещё один язык для документооборота или web я не вижу смысла делать.

Зря с вами дискуссию вел.
«Век живи - век учись».

Владимир

anonymous
()
Ответ на: комментарий от Kogrom

Что-то пафоса много. Но суть в том, что ещё один язык для документооборота или web я не вижу смысла делать.

Вы так ничего и не поняли из того, что вам говорил.
Документооборот …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Я на словах не понимаю, только на примерах. Взять, например, инициализацию структуры json-строкой.

Для C++ я нашёл такой пример: https://github.com/nlohmann/json

Делают так:

namespace ns {
    // a simple struct to model a person
    struct person {
        std::string name;
        std::string address;
        int age;
    };
}
auto p2 = j.get<ns::person>();

Вроде бы красиво. Но чтобы оно работало, необходимо реализовать функции:

namespace ns {
    void to_json(json& j, const person& p) {
        j = json{{"name", p.name}, {"address", p.address}, {"age", p.age}};
    }

    void from_json(const json& j, person& p) {
        j.at("name").get_to(p.name);
        j.at("address").get_to(p.address);
        j.at("age").get_to(p.age);
    }
} // namespace ns

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

Аналогичный проект на Rust: https://github.com/serde-rs/json Там аналогичную инициализацию структуры делают без ручного создания функций, через атрибуты, которые, вероятно, какие-нибудь макросы подключают, которые интроспекцию используют. Возможно, это то, что Вы предлагали.

Kogrom
() автор топика
Ответ на: комментарий от Kogrom

Вы уже несколько раз иронизировали, …
В дискуссии с моей стороны ничего такого не было.
Зачем мне такая дискуссия?

Владимир

anonymous
()
Ответ на: комментарий от Kogrom

Аналогичный проект на Rust: https://github.com/serde-rs/json Там аналогичную инициализацию структуры делают без ручного создания функций, через атрибуты, которые, вероятно, какие-нибудь макросы подключают, которые интроспекцию используют. Возможно, это то, что Вы предлагали.

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

anonymous
()
Ответ на: комментарий от anonymous

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

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

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

Kogrom
() автор топика
Ответ на: комментарий от Kogrom

Вроде бы красиво. Но чтобы оно работало, необходимо реализовать функции:

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

Я беру и пишу: https://godbolt.org/z/nwW4wL , есть реализации и на макросах https://godbolt.org/z/x27_4c

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

И? Компилятор тоже мог бы генерировать эти функции, только вот это никому не нужно. Это говно. Берёшь шланг и пишешь эту генерацию за пол часа.

К тому же объектная модель крестов - это не объектная модель говнораста, которой там нет.

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

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

Такая херня нигде, кроме бездарной скриптухе, не нужна. Опять же - делается на шланге ещё быстрее. Только никому не нужно.

anonymous
()
Ответ на: комментарий от anonymous

Я беру и пишу: https://godbolt.org/z/nwW4wL

Мощно. Хотя гугление пока не помогло мне понять, meta::data_member_range может ли возвратить имена полей вложенных структур. Тут вроде рекурсия нужна или какой-нибудь хитрый цикл.

В тесте (main) все структуры одинаковые, только имена у них разные. Вложенных структур нет, контейнеров нет. Кто его знает, осилит ли эта конструкция сложную структуру с вложенными структурами и контейнерами. И ещё. Не уверен, но это вроде бы сериализация, а не на десериализация.

Kogrom
() автор топика
Ответ на: комментарий от Kogrom

Мощно. Хотя гугление пока не помогло мне понять, meta::data_member_range может ли возвратить имена полей вложенных структур. Тут вроде рекурсия нужна или какой-нибудь хитрый цикл.

Ты ничего не знаешь о С++. Ничего из того о чём ты рассказываешь - там не нужно.

В тесте (main) все структуры одинаковые, только имена у них разные.

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

Вложенных структур нет, контейнеров нет.

Ещё раз, изучи букварь.

Кто его знает, осилит ли эта конструкция сложную структуру с вложенными структурами и контейнерами.

У тебя потекла методичка. Во-первых тебе это сообщали в контексте говнораста и твоей скриптухи, в которой ничего этого нет. С чего вдруг ты начал об этом кукарекать?

А во-вторых, изучи то, о чём пытаешься рассуждать.

И ещё. Не уверен, но это вроде бы сериализация, а не на десериализация.

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

С++ сам может сериализовывать что угодно и как угодно. Ему не нужны для этого какие-либо генераторы - он сам генератор.

Давай ещё раз, попроще. Когда ты в своей скриптухе бездарной пишешь сериализатор - ты генерируешь какой-то мусор для каждой функции. Когда ты делаешь это в С++ - ты можешь написать обобщённую версию чего угодно, которая будет делать что угодно. И ей не важно - структуры там, вектора и прочее говно.

anonymous
()
Ответ на: комментарий от Kogrom

https://godbolt.org/z/QumUqT - сила земли.

Думаю понятно как реализовать что угодно. У тебя у любой структуры данных есть некие базовые типы - числа/строки. Допустим в том же жсоне. Вот для них ты пишешь сериализаторы.

Далее тебе нужно сериализовать объект. Ты создаёшь специализацию для объектов. Пишешь какой-либо предикат(ты можешь узнать сколько там полей, pod структура или нет и прочее), оборачиваешь в концепт.

Ну и всё, далее для каждого поля вызываешь условный proсcess - он сам поймёт куда ему идти.

anonymous
()
Ответ на: комментарий от anonymous

Правда, опять же, в крестах нахрен не нужно это мусорное дерьмо для дошколят. Текст, сериализация - всё это для бездарной скриптухи.

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

Я не занимаюсь этим говном с жсоном и прочим мусором, но когда я писал про api парсеров. В общем код я куда-то просрал, но скрипн остался в пасте про стиль дерьма. Вот.

Соответственно, тут ты можешь видеть как это работает.

Я могу просто пройтись форичом по структуре, далее я пишу руками простенький сериалазтор для базовых типов. А далее его запускают от second(x) - это значение поля, соответственно second(x) - его имя.

В этом смысл всего. С++ позволяет работать с обобщёнными структурами данных. И самый просто способ работать со структорой(которая struct) - это превратить её в тапл tuple{tuple{key, value}, ...} - а далее с нею можно делать что угодно.

Так же понятно как реализовать десериализатор, который тут так же написан руками. Просто реализуешь сериализатор для variant<T…> - это не сложно.

Там я так же реализовывал десериализатор на спирите, вместе с этой портянкой. Если я найду код - я тебе его запощу.

anonymous
()
Ответ на: комментарий от Kogrom

Документооборот и web традиционно привлекают максимум ресурсов.

Вы это серьезно?! Конечно веб-браузеры память жрут как не в себя, но че то я не слышал про создание суперкомпьютеров для документооборота… или о каких ресурсах Вы говорите?

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

AntonI ★★★★★
()
Ответ на: комментарий от Kogrom

Мощно.

Учти что царь тут везде носится с нестандартным экспериментальным расширением clang, для стандартного C++ это все недоступно, а когда будет доступно и в каком виде пока неизвестно.

anonymous
()
Ответ на: комментарий от anonymous

Эти сектанты поехавшие. Они никогда не вылечатся.

Пацан предлагает вообще какой-то левый язык, приводит в пример говнораст. Ни у того ни у другого нету никакого стандарта и все они - нестандартные расширения.

Но тут этот поехавший приходит и говорит «у царя не стандартный С++» - да ты чё, неужели? Ты откуда того гения откапали?

С чего и на каком основании вы, убогие, прибегаете кукарекать про какой-то стандартный С++? Откуда ты его вообще высрал, поехавший? И кому он нахрен нужен?

anonymous
()
Ответ на: комментарий от anonymous

У царя может быть все что угодно, тем более у царя хеловордов, это совершенно неважно, просто нужно предупредить человека чтобы не наступил на какашку подумав что в C++ это уже доступно.

anonymous
()
Ответ на: комментарий от anonymous

Ты совсем поехавший? Как это не доступно, если оно доступно? Я что показываю, клоун? Вас там совсем всех таких одарённых отбирают?

anonymous
()
Ответ на: комментарий от anonymous

Как это не доступно, если оно доступно?

В случае C++ доступно это принято в стандарт и реализовано в нескольких самых массовых компиляторах. Все остальное это на уровне поделки уважаемого топикстартера.

anonymous
()
Ответ на: комментарий от AntonI

Я говорил о деньгах. Возможно, термин «Документооборот» не очень удачно я там применил. Можно было бы сказать Enterprise.

Чтобы не создавать три сообщения отвечу и на другие вопросы тут. Мне было интересно, насколько шаблон на шаблоне в новом C++ может эффективно парсить json. Поэтому все сообщения царя тут по теме. Понятно, что рискованно применять методики не проверенные временем. Ну так и я в процессе разработки.

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

Nim более интересен, но сложен, изменчив и нишу не имеет. Поэтому скорее всего последует за Boo. Проблема в том, что если постоянно менять синтаксис, то для разработки и поддержания библиотек потребуются большие ресурсы (человеческие и временные). Их нет у разработчиков Nim, не было у разработчика Boo (у того хотя бы доступ к .Net был).

Я же хочу сделать примитивную обёртку над C++, которая будет максимально стабильна. Это высвободит ресурсы для разработки «батареек». Возможно, такой подход будет оправдан в небольшой нише.

Kogrom
() автор топика
Ответ на: комментарий от Kogrom

Я же хочу сделать примитивную обёртку над C++, которая будет максимально стабильна.

Что бы это взлетело (и было полезно) придется очень тщательно вылизать идеологию и синтаксис.

Удачи!

AntonI ★★★★★
()
Ответ на: комментарий от Kogrom

Мне было интересно, насколько шаблон на шаблоне в новом C++ может эффективно парсить json. Поэтому все сообщения царя тут по теме. Понятно, что рискованно применять методики не проверенные временем. Ну так и я в процессе разработки.

Это не просто рискованно, это еще хуже, скорее всего именно этот механизм никогда ни будет принят в стандартном C++, возможно примут что-то по мотивам, но точно не в ближайшие три, а скорее и даже шесть лет (по срокам релизов стандарта).

anonymous
()
Ответ на: комментарий от AntonI

Что бы это взлетело (и было полезно) придется очень тщательно вылизать идеологию и синтаксис.

Такое кстати уже есть https://felix-lang.github.io/felix/ правда функциональщина, зато генерирует C++ код и может наоборот и прозрачно встраивать куски C++ кода.

anonymous
()
Ответ на: комментарий от anonymous

Да, у felix-lang батареек много. Странно, что за многие годы разработки (10 лет примерно, насколько я понял) у них не возникло искушение переписать компилятор с окамла на феликс.

Kogrom
() автор топика
Ответ на: комментарий от anonymous

В случае C++

Какое отношение блеяние какого-то анонимного дошколёнка относится к С++? И почему именно к С++?

в стандарт и реализовано в нескольких самых массовых компиляторах

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

anonymous
()
Ответ на: комментарий от Kogrom

Странно, что за многие годы разработки (10 лет примерно, насколько я понял) у них не возникло искушение переписать компилятор с окамла на феликс.

Судя по http://freshmeat.sourceforge.net/projects/flx/releases языку уже 16 лет. А зачем переписывать если все и так работает, тем более OCaml очень хорош как язык для реализации компиляторов.

anonymous
()
Ответ на: комментарий от anonymous

Безусловно, авторы имеют право выбирать подходящие им инструменты. Но сточки зрения уменьшения зависимостей, стоит переписать. У них зависимости такие:

  • Python 3 (???)
  • Ocaml 4.06.1 (only for source build)
  • C++ compiler: g++, clang++, or msvc

Мой опыт говорит, что они не просто так указывают версию 4.06.1. Скорее всего, с 4.02 или 4.10 не соберётся. Поэтому для Windows они таскают с собой бинарики: https://github.com/felix-lang/win64ocaml . Для Linux же в каждом дистрибутиве своя версия OCaml: https://ocaml.org/docs/install.html , соответственно, могут быть небольшие сложности.

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

Kogrom
() автор топика
Ответ на: комментарий от Kogrom

Мой опыт говорит, что они не просто так указывают версию 4.06.1. Скорее всего, с 4.02 или 4.10 не соберётся. Поэтому для Windows они таскают с собой бинарики: https://github.com/felix-lang/win64ocaml . Для Linux же в каждом дистрибутиве своя версия OCaml: https://ocaml.org/docs/install.html , соответственно, могут быть небольшие сложности.

У OCaml есть такая полезная штука как https://opam.ocaml.org/ которая позволяет легко переключаться между версиями компилятора, версия 4.06.1 там есть https://opam.ocaml.org/packages/ocaml/ocaml.4.06.1/

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.