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)
Ответ на: комментарий от rebforce

я вот тоже честно, хоть убей — не понимаю. где-то в третьем топике, или во втором, в середине советовал ему: возьми лисп или red. написаны сами на себе, кросплатформенны подо всё. сразу бы везде заработало.

Тот пост я писал.

а этот — я. ещё в первом топике, на 13-й странице.

Справедливости ради, Red только частично написан сам на себе на данный момент. Ядро всё ещё собирается через второй ребол

интересно, а третьим реболом собирается?

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

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

Зачем? И так все ясно. Я вон выше спрашивал как реализовать простецкие задачи на этих язычках.

в RED — свой реактивный GUI

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

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

но для metaprog это будет плохой выбор.

он же и си толком не знает. и ещё будет на всякие грабли с кодогенерацией наступать. и неочевидные моменты си. логичнее же взять язык, в котором кодогенерировать просто (Red или lush лисп, например). и разгрузить компиляцию в исполняемый бинарник на этот язык. например, типизированный лисп в Lush автомагически компилируется в си, прозрачно под капотом. тоже самое с red и red/system.

и двигаться уже дальше по прототипу. главное понять, что во что должно транслироваться, на примерах.

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

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

Зачем? И так все ясно.

ну раз не пробовал — значит не ясно.

Я вон выше спрашивал как реализовать простецкие задачи на этих язычках

какие задачи?

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

если не поленишься спрашивать. и пробовать его применить самостоятельно, а не чисто кукаретически.

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

какие библиотеки? как парсить? для чего?

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

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

metaprog как IDE парсит инклюды, что делать с этими лиспами то?

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

Ну решения я не вижу не в твоей базе скриптов, не тут на ЛОРе %)

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

Для особенно тупых: https://pastebin.com/16bq1Jbs

Это лажа школьная какая-то с UB и вырвиглазными идентификаторами.

1. вырвиглазные идентификаторы.

2. char строка почему-то массив байтов. нечитабельно нифига.

3. типы вроде GtkWidget зачем-то развёрнуты. наверное специально: чтобы наступить на грабли с выравниванием.

4. форматирование identation кривое.

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

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

а что означает «8» и «68»? какой в этом сакральный смысл?

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

Особенно когда объекты на форме создаются динамически.

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

Но ведь хаскель - чистый функциональный, а не декларативный.

Одно другому не мешает. Чистое функциональное программирование — подвид декларативного.

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

Зачем ты распинаешься перед ними? Это ведь феерическое ламерьё, которое на любой здравый аргумент вскрикнет «НИНУЖНА!!! Напишите на вашем недоязычке очередную бесполезную похабень, тогда посмотрим». Да и толку распинаться, если:

  1. Суть этого поделия уже понятна и подтверждена Самим Великим Мегапрогером: никаких уровней абстракции (аффтар в силу своей дремучести считает это вселенским злом - удивляюсь, как он на ассемблер не перешёл), тупо трансляция лабвьюшных диаграмм в чистый, но крайне корявый Си.
  2. Аффтар и его подзвёздыш (если это не одно и то же лицо) свято уверены в том, что Си в графике понятнее Си в тексте, и пофиг, что телодвижений на более-менее сложные алгоритмы в среднем будет затрачено куда больше, чем при написании в тексте.
  3. Аффтар собирается выложить самоподдерживаемую Мегапрогу через месяц-два, но (возможно, искренне) не понимает, что с таким подходом он и за год-два её не напишет - впрочем, см. п. 4;
  4. С вероятностью 99% всё это было задумано исключительно с целью развести кого-нибудь на донат, а готового решения мы никогда так и не увидим.
rebforce
()
Ответ на: комментарий от rebforce

Си в графике понятнее Си в тексте

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

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

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

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

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

Мои темы уже знаешь сколько раз так «закрывали»? Только не закрываются что-то, а все ростут как на дрожжах, уже три моих темы в топе ЛОРа:)

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

Когда человек не знает про валгринд и мультипарадигменность, ленится гуглить простейшие вещи, относящиеся к программированию, но при этом хорошо знает, что такое /thread — это наводит на мысль, что это не первый его аккаунт на ЛОРе. :)

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

Еще посмотрим. Сейчас матан не в приоритете, сейчас нужнее графика и раскрутка Метапрога - вчера прочитал в вики что это https://ru.wikipedia.org/wiki/Раскрутка_компилятора

Сначала буду делать лишь то, что необходимо для переноса кода Метапрога с Лабвью «сам на себя».

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

Я тебе про эту раскрутку, она же bootstrap, ещё во второй теме писал:

написать работающий компилятор из внутреннего представления в Си. Опять-таки, я не стал бы писать монстра, который весь графический проект загоняет в функцию main(), а сделал бы концепцию «одна схемка - один исходник», что дало бы возможность применять существующие отладчики, тот же валгринд и др. И написал бы я его тоже на Си, чтобы максимально расширить потенциальную аудиторию. Бутстрапом можно будет заняться попозже.

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

Матан?! Лексер - матан, quicksort - матан?

нужнее графика и раскрутка Метапрога

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

переноса кода Метапрога с Лабвью «сам на себя».

Это всё пустяки. Рекомендую шиповник — витамин C.

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

Этот комнатный тукан еще неделю назад не знал (да и сейас не знает) что такое список и чем он от массива отличается. А бинарные деревья для него так это вообще что-то из батаники

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

Что такое КА, лексер, генератор перестановок?

И вообще, как я смею лезть в программирование, не защитив кандидатскую по матану? Фу таким быть)))))

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

А граф для него - это, наверное, писатель такой, Лёвой зовут.

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

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

Что-то типа «Дискретная математика в картинках для самых маленьких».

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

Тащемта, не удивлюсь, если его «мегапрога, написанная на мегапроге» в итоге окажется не Тьюринг-полной, хотя по идее транслируется в Си.

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

Как же я без этого сделаю Метапрог, схемы которого уже успешно транслируются в Си? То есть, как я это уже сделал?))

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

И вообще, как я смею лезть в программирование

Имеешь, имеешь. Всё хорошо. В наше время каждый имеет своё право.

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

Твои эзотерические язычки Тьюринг-полные (все кроме одного)? Тогда почему я их названий не видел даже краем глаза до того как ты показал ссылки на них?

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

Как же я без этого сделаю Метапрог, схемы которого уже успешно транслируются в Си? То есть, как я это уже сделал?))

И что ты можешь на нём написать? Текстовый редактор сможешь? Андроид-приложение сможешь? Сколько гигабайт исходников оно будет занимать?

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

не Тьюринг-полной

Почто такими словами кидаисси, Тьюринг - это супермегаматан!, «фу таким быть» (с).

Какой-такой Тьюринг, главное — это графика.

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

Текстовый редактор уже наполовину сделан. Редактируемый виджет текста выводится, только кнопку созранить/загрузить прикрутить, если б нужен был именно текстовый редактор.

Андроид-приложение - задача посложнее и, конечно же, к раскрутке Метапрога отношения не имеющая (то есть, не в приоритете). Однако такие планы есть. Наверное, через NDK (там чистый Си) плюс затычки для дурацкой джавы, вшитой в андроид до мозга костей.

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

Текстовый редактор
Сколько гигабайт исходников оно будет занимать?

Гигабайты оттранслированных в Си это ладно, сколько сотен картинок это будет занимать?

Вот эта сотня картинок — это реализация регулярных выражений, вот эти полторы — это меню. А вот эта группа из полутора тысяч — моя личная гордость: реализация синтаксической подсветки.

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

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

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

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

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

Товарищ Ершов (вспоминали его уже?) со своим лексиконом, кстати, имел схожие идеи (по духу). Да много кто. И можно было оттуда что-то почерпнуть. Но это не интересно. Итого, очередной «первооткрыватель» сепермегавелосипеда, презирающий инженерное дело и не желающий выяснять, что было до него.

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

Пытался читать википедию по Тьюринг-полноте. Там такие заумные формулировочки...

Вот https://ru.wikipedia.org/wiki/Теорема_Бёма_—_Якопини понятнее. Любой алгоритм можно реализовать через последовательное выполнение, ветвления (if, switch+case) и циклы. Вот этов Метапроге будет.

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

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

Абстракции, школоло ты махровое, делаются не ради абстракций, а ради упрощения как создания, так и понимания уже созданного. Там, где ты, школоло махровое, будешь раскидывать по схемке свои gpointer-ы, NULL-ы и callback-и, нормальный человек просто сделает блок View, привяжет компоненты и к ним события. Это тоже абстракция, в общем случае к ООП головного мозга в классическом страуструпном понимании отношения не имеющая, но крайне облегчающая жизнь в современном мире. И только такие дубины, как ты, ничего сложнее хей-лох-ворлда в этой жизни не писавшие, неспособны это осознать.

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

железная дорога

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

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

Подааааайте 100 баксов, я вам метапрог покажу...

Так и есть. Обычная попрошайка, ничего не умеющая и не имеющая.

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

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

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

Поднимаю ставку. 500 баксов. Теперь можете смело называть меня попрошайкой:))))))

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

Кстати, а тема тестирования поднималась? Без абстракций будет особенно весело.

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

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

Кстати, как тут не упомянуть такую вот цитату:

https://habr.com/ru/post/442112/

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

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

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

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

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

...

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

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

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

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