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

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



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

Было бы что у тебя воровать, товарищ анонимус.

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

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

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

Мне аккаунт здесь совершенно безразличен. Захожу сюда редко и just for lulz. Забанят - по барабану вообще. Хотя с чего бы меня банили, если не трогают даже такого гиганта мысли, как топикстартер…

Ну так вот, концепт AMP будет устаканен в течение недели. И дом с крыши начинать строить уж точно не буду.

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

Ну суть таки именно в этом. Поскольку Ненад с компанией раньше страдали таким же диагнозом, что и ТС, они в ранних версиях слишком дофига внимания уделили GUI, а сетевой I/O оставили на потом (на версию 0.7.0). Так что Red как раз для визуальщины на данный момент - что доктор прописал. Да и HTTP-запросы там уже работают. А иного для прототипа и не нужно. А к тому времени, как ТС очухается с чем-то более-менее работоспособным, уже и 0.7.0 выйдет и можно будет развернуться вообще по полной…

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

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

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

А как в твоем реде с вызовом сишных функций? Имеешь ли целью программировать ядро, драйвера, микроконтроллеры (то, что умеет Си)?

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

Имхо, делать ПО не для себя, не за деньги, а чтобы доказать, что кто-то не умеет делать ПО - слабая мотивация. Если это пишется не за недельку. У ТС есть хотя бы «ЗАЧЕМ» - мотивация пилить месяцами, а ты сделаешь максимум прототип, так как дальше нужна мотивация типа «я верю в визуальное программирование, моё решение на базе RED - то, что нужно». Гениальные навыки и знания * нулевую мотивацию = нулевой результат.

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

Абсолютно любой мейнстримныя язык умеет вызывать сишные функции. Кроме JavaScript без Node.js из соображений безопасности. Подавляющее большинство любительских ЯП тоже умеют вызывать сишные функции.

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

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

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

Red/System всё это умеет (интероперабельность с сишными функциями), если вдруг что. Из Red-модулей можно вызывать RedS-модули.

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

Там за гуйню отвечают несколько диалектов, но суть не в ней (пока что). А GTK они вроде уже если не до конца допилили, то близко к.

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

Ну если возможность написать, например, текстовый редактор со встроенным интерпретатором в 10 строчек - не преимущество, тогда я не знаю…

Red [needs: 'view author: Alan Brack]
view/flags  [title "Tiny Red Editor/Interpreter" below  t: text  "My Editor"  200x30  a: area 500x400  {Red [ ] 
          view/flags  [text "Hello World" ]'modal }   text ""  across
          button "Save" [if sf: request-file/save  [unless suffix? sf [append sf %.red]  
          write sf a/text  t/text: "Saved." ] ]
          button "Load" [if Lf: request-file [a/text: read Lf  t/text: "Loaded."  ] ]
          button "Run" [ do a/text  t/text:  "Try some different code" ]
          button "Clear" [a/text: ""   t/text: "Try some more Red code" ]   ] 'modal
rebforce
()
Ответ на: комментарий от rebforce

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

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

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

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

Ну тяжёлую артиллерию в виде пиколиспа я решил не подтягивать (пока что), но так-то да, для внутреннего представления нужен свой графический мини-DSL.

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

дальше нужна мотивация типа «я верю в визуальное программирование, моё решение на базе RED - то, что нужно»

Моё решение на базе Red, если всё пойдёт по плану, пойдёт в апстрим как хелпер-инструмент и единственная в своём роде среда RAD для Red (лол). Да и мотивация освоить Red дальше уровня генератора гугловских OTP-паролей тоже имеется, а такое мегаломанское нечто - как раз неплохой повод... Другое дело, что ближайшие полтора месяца у меня и без того веселья будет хватать. Но насчёт мотивации ты неправ, она есть, иначе бы я этого всего не писал здесь.

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

при желании можешь скомпилировать примеры.

Откуда их брать? И что для этого надо - поставить проприетарщину в виде лабвью?

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

И да, я сомневаюсь, что ты понимаешь, что имеется в виду под таким уровнем абстракции. Я видел на скриншотах аргументы в виде нуль-терминированных строк (!) и указателей (!!!) - это как раз последнее, что уставший от клавиатуры погромизд хотел бы видеть в визуальной среде разработки. До этого даже во всяких билдерах не додумались, если так вспомнить…

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

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

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

А что толку с этих примеров? На некоторые из них смотришь и понимаешь - да, оно скомпилится и запустится. Но что из них можно понять?

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

  1. Блоки бинарных арифметических операций. Входы: 2, выходы: 1, операции: +,-,*,/,^.
  2. Блоки унарных арифметических операций. Входы: 1, выходы: 1, операции: -,√.
  3. Блоки бинарных логических операций. Входы: 2, выходы: 1, операции: and,or,xor,shl,shr.
  4. Блоки управляющих конструкций…
  5. Блоки внешних вызовов…

Ну и дальше в том же духе.

Ибо если ты рассчитываешь на коллективную допилку, то как народу без спецификации-то жить? Как можно допиливать то, не знаю, что?

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

Как можно допиливать то, не знаю, что?

Проект мелкий же, как хочешь так и пили, выбирай лучшее, обсуждай с товарищами... Это если проект большой нужна спецификация, когда нибудь она будет ему нужна, сейчас просто прототипы, пре-альфа! Хотя ОПу нужно нормально в посте объяснить что такое его metaprog, а то люди в основном так и не понимают, даже в 4 треде.

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

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

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

ОПу нужно нормально в посте объяснить что такое его metaprog, а то люди в основном так и не понимают, даже в 4 треде.

И это тоже.

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

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

Ну зум запили, дизайн, много же чего надо.

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

1-3 - сишные вставки:

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

4 - условия и циклы? Пока в разработке. Уже есть задание последовательности выполнения.

5. Внешние вызовы? Вставка сишных функций есть почти на всех скринах.

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

С тем же успехом можно и дверь запилить ©, ибо вопрос был совершенно о другом.

Что есть метапрог этот самый? Визуальная среда разработки, которая подразумевает наличие определённого визуального языка (транслируемого в данном случае в Си), так ведь?

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

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

Я уже примерно понимаю как делать блоки - просто ставить виджеты на drawing area, верно? А как линии делать? Не простые линии, а кликабельные. Есть виджеты линий?

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

Я вообще-то вот что спросил:

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

«Огласите весь список, пожалуйста» ©

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

Рисовать то полбеды, нужно еще и кликабельными их сделать.

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

Все возможности Си плюс множество дополнительных графических плюшек. Ищешь идеи для своего аналога?:)

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

Все возможности Си плюс множество дополнительных графических плюшек.

Яснопонятно, вопросов больше не имею.

Ищешь идеи для своего аналога?:)

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

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

Си - лишь один из возможных бэкендов, ИМХО самый простой в реализации, но в то же время универсальный. В отдаленной перспективе, скорее всего, будет свой компилятор.

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

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

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

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

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

Это не особо важно... Важное другое, нужно сделать возможность расширять metaprog! Делать свои блоки. Что бы можно было сделать блок для уравнений самому, что бы он не был вшит в metaprog!

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

Нет! Нужно сделать возможность это делать без изменения metaprog'a. Ты создаешь в нем проект, и делаешь в проекте блок свой! Тогда ты сможешь делать библиотеки блоков, не функций, а блоков именно!

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