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

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

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

Извини что влезаю. Что там с редактированием темы, работает?

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

Не ту строчку сначала скопировал, обнови страничку.

gen_op == generate opcode, TOK_SAR тут как генерируемое действие.

Зависит не от языка, как ты понимаешь.

Немного зависит, да и у хескеля всякие трюки в стиле '<$>%+W@+.

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

видимо скор виноват, посмотрю в лорсорс позже, отпишусь там.

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

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

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

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

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

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

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

balsoft ()
Последнее исправление: balsoft (всего исправлений: 2)
Ответ на: комментарий от denton

Я хз какой у меня там стиль. Границы между ними весьма условные. Дождись релиза - потыкаеь в «настоящий» Метапрог.

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

Оно и есть относительно просто.

Лол, у тебя запутанный код с генерацией gui вручную и другой ерундой! Вот че это такое?

def subtract(self):
   f = '[shared] sharedGUI.SearchBox.subtract'
      if self.Success:
         if self.i > 0:
   self.i -= 1
Ужс)) Вот взял бы ты нормальный язык, получилось бы классно, и так наверное хорошо, но было бы круче!

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

Может, если релиз «настоящего» метапрога затянется, психану и выдам исходники прототипа.

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

генерацией gui вручную

Это может быть очень даже хорошо. Глянь gi-gtk-declarative . Но про этот случай сказать не могу – лень смотреть код.

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

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

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

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

на хескеле пишут по фану и любознательности

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

Да хоть на pandoc глянь, если хочешь настоящего кода на хаскеле.

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

И вполне себе кровавый ынтерпрайз

Ты слышал о Red? Я когда то читал о нем новость где то, одну, на этом все. Чел выше rebforcer или как то так, говорит что и на нем интерпризе делает серьезные программы. Может и делает, но сколько библиотек на С/C++?

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

сколько библиотек на С/C++

И все можно использовать из хаскеля просто переписав заголовки.

Ты слышал о Red

Да

Чел выше rebforcer или как то так, говорит что и на нем интерпризе делает серьезные программы

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

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

Ахах, серьезно? GIL же.

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

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

И все можно использовать из хаскеля просто переписав заголовки.

С шаблонами, макросами, std::function каллбеками и наследованием?

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

Ну тут видимо как и со схемами, некоторые жалуются что они нечитаемые, другие говорят что класс! Для меня так же и хаскел нечитаем.

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

поэтому для тяжелых вычислений он не особо

Тяжеловесные вычисления это Fortran на суперкомпьютерах, я про любые вычилсения %).

Но много ли прикладного софта, где обязательно требуется многопоточность

Да.

с необходимостью выделить много памяти на поток?

А этот тут причем?

Да даже не все игры могут эффективно эксплуатировать многоядерный процессор.

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

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

С шаблонами, макросами, std::function каллбеками и наследованием?

Это оставляется на совесть компилятору C/C++. std::function колбэки работают нормально.

Ну тут видимо как и со схемами, некоторые жалуются что они нечитаемые, другие говорят что класс! Для меня так же и хаскел нечитаем.

А вы пробовали? Понятно, что чтобы читать язык, нужно изучить синтаксис и стандартную библиотеку. Для хаскеля это делается за пару-тройку дней. (Справедливости ради, я тоже в течение года откладывал нормальное изучение хаскеля, считая его нечитаемым, но потом поменял мнение)

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

Это оставляется на совесть компилятору C/C++.

А покажи код, я чего то не понял. Отнаследуйся от sf::Sprite из <SFML/Graphics/Sprite.hpp>. Типа такого на плюсах:

class sprite : public sf::Sprite { };

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

А вы пробовали?

Читать?) Код на С/C++ мне казался вполне понятным еще когда я совершенно ничего не знал о программировании.

Для хаскеля это делается за пару-тройку дней.

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

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

Ну хескель не подходит для моих задач совсем, с чего начать?

Начать можно с прочтения https://learnyouahaskell.com , по крайней мере первых глав. Одновременно можно начинать писать свои хеловорды, ну и скриптецы можно пописывать вместо башей и перлов на хаскеле (понятно, что смысла не особо много, но всё же). Даже если сам хаскель не пригодится, мышление в функциональном стиле и умение думать типами можно использовать в любом языке.

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

Это соединение является недоверенным

Wtf?

А знаешь какие библиотеки есть для 3d графики? Только не лямбдакубе, это движок уже.

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

Ты умеешь находить каку :) Да, конкретно в shared, особенно в TextBox/SearchBox, надо разделить GUI и логику, но руки еще не дошли. Посмотри другие модули: есть logic.py, gui.py и контроллер mclient.py (Model-View-Controller). Конечно, тоже не идеально, но получше.

Вот взял бы ты нормальный язык, получилось бы классно

Лол, мешанина GUI и логики - это же архитектурная проблема, а не проблема ЯП.

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

Лол, мешанина GUI и логики - это же архитектурная проблема, а не проблема ЯП.

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

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

А можно всё в коде описывать, но при этом красиво.

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

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

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

IDE? Emacs + haskell-mode + flycheck + ghc-mode + company работают на ура – типы показывает, ошибки подсвечивает на ходу, все значения с подходящими типами подсказывает, отладка в ghci встроенном. Вроде в vim тоже есть что-то подобное.

Ну и есть ещё какой-то yi, но там на любителя.

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

Я там уже смотрел, нету ж ничего. Разве что Visual Code ставить, пробовать, но столлман не оценит.

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

привязать бы сигналы к именам функций

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

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

KDevelop не в моде?

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

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

Ну за Red оно не совсем так. Ынтырпрайз (преимущественно французский и швейцарский) таки юзает Rebol 2.7, да. Штабильно, глобально, надёжно, древне, шо тот дебиан, и проприетарно, шо тот лабвью. Зато полную лицуху на SDK купил и ваяй что угодно. Syllable Desktop не даст соврать.

Red же, равно как и Rebol 3, ынтырпрайз ещё не юзает, ибо без network I/O как-то тяжко, да и сами разрабы что одного, что другого говорят, что анстейбл. Зато у Red в итоге по идее получится куда более кроссплатформенный и компактный рантайм, чем у всего того SDK от 2.7.8. Не говоря уж о прозрачной поддержке юникода и прочих фичах, без которых в 2019 году ЯП — не ЯП, а мечта мазохиста.

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

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

Гляну как-нибудь поподробнее. Я ж не ТС, кругозор расширять всегда полезно.

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

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

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

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

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

У дракона ноги растут из программы буран-энергия

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

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