LINUX.ORG.RU

Metaprog: универсальная графическая среда программирования [в разработке] часть 4

 , , ,


4

3

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

FAQ

1. Где скачать?

Релиза еще не было. Идет разработка, темы посвящены ей. Есть сделанный на LabVIEW прототип (его работа показана в примерах).

2. Почему не открыт код LabVIEW-прототипа Метапрога?

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

3. Почему не Дракон, MIT App Inventor, Unreal Blueprints?

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

4. Чем плохи LabVIEW или MyOpenLab?

LabVIEW пропиетарный, а MyOpenLab - хоть и опенсорсный, но какой-то недоделанный (пытался у себя запустить - выдало джава эксепшоны). Да-да, опенсорсный «клон» LabVIEW написанный на джаве! LabVIEW хотя бы на C++, а это все же меньшее зло. Обе эти системы даже не сделаны «сами на себе» в графике. Они даже не пытаются претендовать на универсальную замену всем текстовым языкам, хотя LabVIEW могло бы, если бы не тупость копирастов. Эти системы написаны на текстовых языках, их код (даже если б LabVIEW был опенсорсным) невозможно редактировать, ни разу не обращаясь к текстовым языкам. Метапрог изначально предполагает полный отрыв от текста и текстовых языков, за исключением Си как бэкенда. И то пользователям никогда не придется иметь дело с текстовым Си за исключением блоков сишных вставок (для особых случаев типа арифметических операций, ассемблерных вставок итп).

5. Почему как бэкенд выбран именно Си?

Си - это по сути мощный «кроссплатформенный ассемблер». На нем сделано огромное количество кода, готовых библиотек, в Линуксе (и вообще UNIX) Си - общепринятый стандарт для системного программирования. Кроме того, на Си делаются прошивки микроконтроллеров. Си работает быстро, не требует тяжелых и глючных рантаймов, и в то же время дает наиболее полный контроль над поведением программы (из кроссплатформенных языков).

6. В Си указатели и ручное управление памятью. Это же так сложно!

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

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

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

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

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

http://zone.ni.com/reference/en-XX/help/371361R-01/glang/flatten_to_string/

http://zone.ni.com/reference/en-XX/help/371361R-01/glang/unflatten_from_string/

Что-то подобное будет и в Метапроге. При открытом коде никаких сложностей с чтением бинарных файлов не будет.

9. А как будет обеспечиваться совместимость со старыми файлами, сетевыми протоколами итп, если будет изменен тип?

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

Примеры

Metaprog: универсальная графическая среда программирования [в разработке]

Metaprog: универсальная графическая среда программирования [в разработке] часть 2

Metaprog: универсальная графическая среда программирования [в разработке] часть 3

Прокручиваемая и выделяемая строка с автопереносом

https://i.postimg.cc/Gm6KMJBs/image.png

https://pastebin.com/SWJJwvvC

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

Скрины подфункций в следующем примере.

Тот же пример, но покрасивее

Что можно сделать для большего удобства? Убрать инициализацию, подвязку коллбэка на закрытие окна и главную петлю гтк в подддиаграму «главное окно»:

https://i.postimg.cc/vm5DYjsw/image.png

На сей раз не поленюсь сделать скрины и объяснить их суть.

В подфункциях есть три вида контейнеров с данными: константа (стала, constant), контроль и индикатор (сверху вниз):

https://i.postimg.cc/gJkfRVBd/image.png

Значение константы задается прямо в диаграмме. В Си константа превращается в объявление переменной с инициализатором. Контроли и индикаторы в теле подфункции превращаются в терминалы, к которым можно подключаться в «вызывающей» функции.

Сама подфункция «главное окно»:

https://i.postimg.cc/fbsDKR61/image.png

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

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

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

Подфункция для подцепки асинхронных функций:

https://i.postimg.cc/3r0rYVCS/image.png

Добавить объект в контейнер:

https://i.postimg.cc/SNGBhf51/image.png

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

https://i.postimg.cc/xjv7vP0j/image.png

Делаем лейбл (и любой другой нужный виджет) прокручиваемым:

https://i.postimg.cc/R0PtCmkd/image.png

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

https://pastebin.com/16bq1Jbs

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

Каст типов и тактическая победа над нуль-терминированными строками

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

https://i.postimg.cc/s2hrDj6b/image.png

Беззнаковое 32-битное, означающее размер массива (темно-синий провод) кастуется в знаковое 32-битное (светло-синие провода и пустая константа, задающая тип). Функция gtk_text_buffer_set_text в качестве размера строки берет беззнаковое, а не знаковое, как принято - видимо, чтобы через "-1" говорить, что строка нуль-терминированная. Но из-за этого вместо 4 гб строки туда можно подать лишь 2 гб - аж в 2 раза меншье! Что за люди?

Тем не менее, с нуль-терминированными функциями в текстовых полях покончено - и это победа!

https://pastebin.com/hQRMSZ1s

Также там был изменен текст. В остальном пример соответствует скринам выше.

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

Ребол, судя по всему, сложнее, всякие там гомосексуальности или как их там, которых в Си нет (кстати, риск по безопасности). Это Си просто как двери.

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

с неким синтаксическим сахаром

Где ты видел синтаксический сахар на моих диаграммах? Там вообще синтаксиса как такового нет!

а сахар есть.

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

А что бы ты хотел видеть в такой системе?

Это не особо важно...

не, это как раз самое важное. полезные юзкейзы.

а то вы так слона ещё 10 топиков за х хвост ощупывать будете.

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

ну кстати, Red/System соответствует сишке почти «один в один». так что запилить дополнительный текстовый синтаксис, изоморфный первому и графическому — не проблема. так что кодогенерация в Red/System должна быть не сложнее сишки. в какой-нибудь «лисп транслируемый в си» типа lush — тоже.

Зачем, если Метапрог уже успешно транслируется ПРЯМО в Си?!

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

Я вот тоже склоняюсь к варианту генерить выхлоп в Red/System, а не в высокоуровневый Red. Но это на первых порах.

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

«Высокоуровневый» - это всякие там объектные модели и прочая раздутая ерундень?

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

Ой-ё, какая же у тебя каша в голове…

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

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

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

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

Ахаха, мда... Это одинаково выглядит, смотри примеры. Только вместо привязки destroy события к GtkApplication будет привязка к clicked у GtkButton.

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

На гтк с коллбэками. Тоже, конечно, не идеальное решение, но, видимо, самое оптимальное.

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

Меня, кстати, это улыбнуло потому что в Лабвью есть Event Structure, работающая подобным образом.

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

Можно глянуть, как это визуально смотрится? Ну что вот объект, а вот к нему коллбэк на клик прицеплен.

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

Что-то мне это конкретно напоминает…

Lolgenos? как это мило...

... а между тем, на лиспе же запилили: MonaOS,гитхаб, на схеме Mosh.

там init и shell на схемке. ГУЙ, кстати, тоже схемой отрисовывается. каким-то графическим диалектом.

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

Перехостил на нормальный ресурс без говнобаннеров. И теперь держите меня семеро…

Знаете, почему? Потому что у меня сейчас открыта самая первая тема. И там написано знаете, что?

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

Это финиш. Просто. Это ахтунг. На этой схеме изображены ВСЕ те детали, которые любая ВМЕНЯЕМАЯ визуальная среда скроет: gpointer, название сигнальной структуры, указатели и т.д…

И после этого ТС ещё смеет заявлять, что:

Простота программирования и эффективность, не меньшая, чем у Си, убьет C++, Python, Java, Javascript и прочую ерунду с раздутыми и полными багов абстракциями

Санитары, ау!

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

Конечно, потому и хочет Rebol вместо С. Но с дизайном реально надо будет поработать, сильно. %)

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

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

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

Какой стиль в Си? Императивный походу. А что такое декларативный? По функциональному мне пытались объяснять

нагугли книгу Непейвода Н. Н., Скопин И. Н. «Основания программирования». там про парадигмы программирования хорошо расписано. хорошая книжка, основательная.

например, про декларативную он пишет как «сентенциональная». позволяющая делать различные предложения-утверждения на каком-то языке. который можно вычислять не сразу, а лениво, каким-то вычислителем.

ещё он пишет, что по сути, требуются для разработки не IDE всякие, среды разработки, языки программирования и их синтаксисы. а некая «система программирования» — то есть, навыки, наработки, технологические приёмы, ноу-хау как надо и как не надо на какие грабли наступать, библиотеки, например.

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

Ершов в чём-то похожие идеи выдвигает про «лексикон программирования». Броуди и прочие в форте — про лексикон форта.

опять же, с literate programming для создания базы такого лексикона тоже идея хорошо ложится.

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

Перехостил на нормальный ресурс без говнобаннеров

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

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

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

программируешь методом тыка?

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

Кому-то уже удалось сделать язык, на котором одинаково хорошо получаются императивщина и ФП?

императивщина в ФП — это монады.

ну или объекты, и «функционально-объектное» программирование типа Scala, Ocaml, F#.

и там, и там — это способ локализации побочных эффектов (=императивности).

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

Может не замечал, или только jpg и мелкие png лил. Попробуй закинуть какой нибудь скриншот (только не с терминалом, а с обоиной видной, чтоб png не столько мелкий был) в png, даже в 1920×1080, не говоря о 4k.

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

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

Хм, да и сам устаканенный набор блоков тоже.

и способ композиции блоков. например, когда в ДРАКОН говорят, что есть «ветвление по шампуру», «операция пересадка лианы», «макроиконы для композиции» (при этом в макроикону новые блоки можно вставлять не куда попало, а в конкретные места). частично, сюда же про минимизацию самопересечений и стрелок.

то говорят про «эргономичный» синтаксис (графический, да).

в который входят и правила. если не эргономично — преобразовывается эквивалентными преобразованиями (рефакторится) пока не станет эргономичным.

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

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

Lingua Latina non penis canina.

Lingua Latina non penis canina est. неуч.

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

Я ни разу не говорил о намерении скрыть указатели и прочие вещи, до смерти пугающие адептов всяких джав и питонов. Метапрог просто делает это все нагляднее. Позволяет программировать на том же уровне, что и Си, но в графике! Я не должен ручками писать:

window GtkWidget* = gtk_widget_new(забув_вже_значення_енуму_яке_в_графіці_можна_обрати_в_меню);//ще й срані ";" не дай боже забути поставити
gtk_widget_add_або_window_add_я_вже_забув(window,ще_якийсь_сраний_параметр_назву_якого_треба_вигадати_і_не_дай_боже_хоч_на_буковку_помилитись);//і ще одна срана крапка з комою, мені вже набридло, добре що є Лабвью і прототип Метапрога на ньому!

Я просто соединяю блоки линиями - и все работает!!!

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

Когда вспомнил было уже поздно исправлять. И вообще Homo homimi zalupus est.

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

Или уже компилятор превращает рекурсии в циклы?

рекурсии специального вида. хвостовые рекурсии.

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

Это как? Делать сам алгоритм, не вдаваясь в мелкие нюансы?

автотулзы и configure.sh  — это декларативное программирование. в config.sub, Makefile.am, *.in пишется, что должно быть в системе. потом генерится ./configure — шелл скрипт, который методом тыка всё это обнаруживает. он генерится M4 макрогенератором, по настроенным модулям.

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

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

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

и что уже наклепал?

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

Я ни разу не говорил о намерении скрыть указатели и прочие вещи Позволяет программировать на том же уровне, что и Си, но в графике! Я просто соединяю блоки линиями - и все работает!!!

Именно поэтому ты идиот ©

Нет, ты просто не представляешь, что тебе предстоит. И «метапрог на метапроге» ты таким образом точно не сможешь сделать.

P.S. И именно поэтому MetaLOL/AMP обставит твою поделку даже в самой прототипной версии…

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

или таким

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

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

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

Есть ли декларативный язык программирования на все случаи жизни?:)

что именно он должен «декларировать»? эти самые случаи? анти-«теорию всего» ? :))

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

есть ли универсальный декларативный язык?

Конечно, русский например поддерживает декларативность, можно сказать что ты хочешь, а человек сделает. С приходом ИИ, и компьютер сможет что то делать.

или Дональд Эрвин Кнут, «literate programming»/грамотное программирование:

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

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

Приходится инструктировать, а это уже императивный стиль или как его там?

да, императивный. и даже если на примерах и «делай как я» — это тоже императивный. вот если известно что, неясно как — декларативный.

ясно что, неясно как — проблема. ясно как, неясно (или ясно) что — задача. неясно ни как, ни что — нуууу.... проблема в постановке проблемы :))

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

(для невладеющих мовой: «вирок» читается как «вырок» с ударением на первый слог и значит «приговор»)

о, кстати. из правил грамматики украиньской мовы: «пишемо, як чуемо». это декларативная грамматика или нет?

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

А так да, чувствую, что надо уже заказывать в кузнице ещё один орден имени Д. Попова.

чугуниевый? на пару пудов весом

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

в лабвью нет даже встроенной интерактивной обучалки и возможности ее вкрутить! Нет возможности устроить интерактивную «экскурсию» по коду.

видео запили и выложи куда-нибудь.

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

Rebol, red неюзабельные, там ничего нет

*ROFL* валяюсь под столом

а ты его хотя бы пробовал?

примеры тыкал? это ещё REBOL v2, кстати.

в REBOL v3 всё те же принципы, но немного другой синтаксис, про модули и объекты. ну и VID диалект немного другой, движется в сторону акторов и реактивного GUI.

в RED — свой реактивный GUI, покомпактнее язык чем REBOL v3, но и интерпретатор меньше всего умеет (хотя для него это не важно, т.к. немного другая архитектура: не нужно всё запихивать в интерпретатор, если есть модули. не нужно 10500 функций, если есть Red/System).

и это всё ещё не подключая сишные .dll-ки, как правило. в основном, используется встроенная функциональность интерпретатора REBOL v2 которому лет 20 скоро уже будет.

из актуальных REBOL v3 и RED где-то один более фичастый, где-то другой.

но, уже в REBOL v2, фич было достаточно. если тебе примеров по первой ссылки не хватило, держи вторую простейший язык программирования, с 68 обучающими видео на ютубе.

anonymous ()
Ограничение на отправку комментариев: