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

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

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

Да.

На него вроде даже gedit переносят или что-то в этом роде. Но я его не пользовал ещё.

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

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

даже длинная арифметика есть

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

Все, пацаны, я понял. Он - бот. Только бот может писать такой тупняк и с таким гонором. Признаться, когда я в прошлый раз общался с cleverbot'ом, он был не так предсказуем.

anonymous ()

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

Ай, блин… Ты ж так наверное тоже не поймёшь. Переведу… https://i.imgur.com/F4RiRam.png

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

Варнинги то ерунда, я их вообще думаю отключить. У меня анонимные структуры вместо оригинальных имен. Так проще транслятор, и они, ЧСХ, еще и работают!

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

В общем и целом, все работает - и это главное!

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

У меня анонимные структуры вместо оригинальных имен.

И поэтому это вдвойне говно. И поэтому компилятор на это ругается.

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

Ну и что, все работает, а анонимные структуры генерируются корректные.

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

Да, да, братан. Передаю твоим разрабам привет :D

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

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

А в той херне, которую ты нагенерил - течь очень даже чему будет.

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

сам ищи. или думаешь за тебя кто-то будет в твоей отрыжке ковыряться?

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

Говори где конкретно утечки или иди срать в сортире, а не на форуме. Хватит умничать.

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

ПГМ-style

Бога нет.

Где конкретно его нет?

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

Нигде нет (бога). А вот утечки если и есть, то только в конкретном месте. Или же их нет и это баги анализатора.

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

Вот поэтому я Царя и понимаю.

Варнинги то ерунда, я их вообще думаю отключить.

У автомобилистов есть хорошая поговорка — «хороший» стук всегда где-нибудь да вылезет. Так вот. Ворнинги это тот самый «хороший» стук. Который где-нибудь и когда-нибудь вылазит. Всегда. Умные люди останавливают компиляцию и разбираются с источниками этого самого «стука». Ну а... Тут уже только либо в стиле Царя вести «просветительскую работу» (и то не уверен что дойдёт), либо выйти из треда.

Выйду, пожалуй. =))) От греха подале... Всё таки я ПГМнутый, а сейчас идёт Страстная Неделя Великого Поста. Не нужно лишний раз грешить. Выйду...

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

Или же их нет и это баги анализатора

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

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

Варнинги то ерунда, я их вообще думаю отключить

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

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

Мне всё ещё кажется, что идея тупиковая

Не кажется. LabVIEW и его аналоги не случайно не взлетели

XMs ★★★★★ ()

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

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

Варнинги то ерунда, я их вообще думаю отключить.

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

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

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

Что плохого в анонимных структурах, четко соответствующих структурам нужного типа?! Хоть кто-то способен внятно ответить? Это единственные ворнинги.

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

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

Тебе Мойша всё правильно про стук объяснил.

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

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

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

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

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

Проблема в анонимности структур? В чём проблема сделать структуры такие же, но неанонимные? На уровне рантайма никакой неэффективности это не добавит.

Это единственные ворнинги.

Кстати, я точно помню, что при компиляции первого примера было ДВА РАЗНЫХ типа предупреждений. Каких точно, не помню.

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

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

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

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

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

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

Это глюки компилятора. И то можно заставить заткнуться с ворнингами.

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

Это глюки компилятора

Нет, это ты нарушаешь стандарт С! Так делать нельзя.

И то можно заставить заткнуться с ворнингами.

Но они не пропадут, вылеты будут.

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

LabVIEW и его аналоги не случайно не взлетели

Так ведь LabVIEW взлетел. Приличное количество научных приборов с компами идут с LabVIEW, потому что на нём написаны протоколы взаимодействия с этими приборами.

i-rinat ★★★★★ ()
Ответ на: комментарий от hobbit

В чём проблема сделать структуры такие же, но неанонимные? На уровне рантайма никакой неэффективности это не добавит.

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

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

Наверное.

Но я не обижаюсь и не расстраиваюсь в ответ даже на «христанутого». Пофиг как-то. =)

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

Вообще-то, компиль...

Это последнее в чём нужно сомневаться. Компиль и линкер. Во всём остальном сомневаться нужно.

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

Может хоть ты знаешь какая компилятору разница какую структуру ты ему скормил - само нужное название или такую же, только анонимную?

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

И то можно заставить заткнуться с ворнингами.

Ты — лично на своей машине — можешь. Вот только ты не заставишь это делать всех, кому предлагаешь свой код для рассмотрения. Это как на ЛОРе есть кнопка «Игнорировать», которая каждому позволяет создать свои персональные розовые очки. Только на ЛОРе про любителей этой кнопки появилась поговорка «Игнораст хуже анонимуса».

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

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

Всё в порядке, мои предложения отвергнуты ТС`сом ))

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

Это поэзия, сэр, здесь открытость интерпретации.

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

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

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

Я имею в виду за пределы работы со специфическими железками. Как язык общего назначения он не взлетел

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

Не знаю что взлетело или нет, но мне лично Лабвью удобнее всего на свете. Главный недостаток Лабвью - копирастия, закрытость и то, что идиоты из NI сознательно не толкают его как универсальное решение на все случаи жизни. Если б толкали и сделали стандарт открытым - оно бы победило. Майкрософт же толкает сишарп/дотнет как открытый стандарт, а гугл - Go, и только клоунам из NI ничего подобного не надо.

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

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

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

i-rinat ★★★★★ ()
Ограничение на отправку комментариев: