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

Ничего не знаю

Это с самого начала было заметно.

для программирования в Лабвью я в книги не втыкал, а софт делаю, при этом весьма сложный

Именно потому, что см.п.1, ты считаешь свой выхлоп софтом, при этом весьма сложным. Ни к чему реально сложному твоё невежество приблизиться не позволит.

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

Зачем? Зачем вы продолжаете это?

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

Дохлая же тема, пока не будет работающей альфы, которую можно будет опробовать всем.

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

Именно потому, что см.п.1, ты считаешь свой выхлоп софтом, при этом весьма сложным. Ни к чему реально сложному твоё невежество приблизиться не позволит.

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

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

т.е. тему можно закрывать. Потому что вероятность что ТС выкатит что-то КРАЙНЕ МАЛА.

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

Тему уже знаешь сколько раз так «закрывали»? Только растет как на дрожжах, даже без анонимусов.

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

Ты предлагаешь писать Hello World как массив пикселей

Массив байтов.

SAX и DOM

Бинарный формат еще быстрее.

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

Массив байтов.

И как ты это пишешь? Если в диаграмме есть буковки, то это ж ненавистный тебе текст! И даже циферки - тоже текст!

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

Посмотри мои примеры, там строки инициализируются как массивы байтов.

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

Растет только благодаря тебе с котечкой. Ну и еще 2-3 человека, которые ради прикола заходят..

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

Я вот только что реализовал на базовом уровне ветвление (if+else). Выглядеть оно будет так:

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

Полноценный пример делать пока лень. Теперь пора делать циклы, будут на днях.

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

Так скучно же, да и интересно чем все закончится.

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

Почитай что-то про Zero-cost abstractions. Вот первая ссылка из поисковика. Заодно и посмотришь как компилятор с циклами работает.

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

Не вижу я в твоих диаграммах никаких массивов байтов, только буковки. Это не расходится с твоей идеологией?

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

По теореме Бёма-Якопини можно реализовать любой алгоритм, имея последовательное исполнение, ветвление и циклы. Осталось сделать только циклы. Еще несколько дней - и на Метапрог-диагарммах можно будет реализовать любой алгоритм.

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

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

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

Красиво же. Я вот Rust вообще не знаю (хотя в планах изучить, ибо кое-какой api-daemon именно на нём написан), но пример почти сходу понял. Не сразу, правда, въехал, что делает zip.

ТСу до такой красоты и выразительности — как до Плутона раком.

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

Меня сишный уровень мало колышет. Ты представляешь свои хеллоуворлды в виде диаграмм, но с такими же текстовыми блоками. Ты ж в этих блоках просто пишешь Hello World, а не придумываешь способ эту самую строку представить не в виде текста, как ты это декларируешь. Не кажется ли тебе, что это расходится с твоей концепцией «текст — зло» и не слишком уж и отличается от того же AppInventor?

Не говоря уж о том, что обрекаешь бедных погромиздов на страдания изучения того, что такое указатель, да не просто указатель, а gpointer. Где ж тут простота, а?

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

ТСу до такой красоты и выразительности — как до Плутона раком.

macro_rules! diagnostic_method {
    ($name:ident, $level:expr) => (
        #[unstable(feature = "proc_macro_diagnostic", issue = "54140")]
        pub fn $name<T: Into<String>>(self, message: T) -> Diagnostic {
            Diagnostic::spanned(self, $level, message)
        }
    )
}
pub struct Context<'a> { _marker: PhantomData<fn(&'a ()) -> &'a ()> }

fn arg_local_refs<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>>(
    bx: &mut Bx,
    fx: &FunctionCx<'a, 'tcx, Bx>,
    memory_locals: &BitSet<mir::Local>,
    va_list_ref: &mut Option<PlaceRef<'tcx, Bx::Value>>,
) -> Vec<LocalRef<'tcx, Bx::Value>> {
   let ty = if let (true, &ty::Ref(_, ty, _)) = (by_ref, &ty.sty) {
       ty
   } else {
       ops = &ops[..ops.len() - 1];
       ty
   };
}

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

Да мне вот теперь интересно, как аффтар собирается представлять текстовые данные в графическом виде. Если он этого не делает — значит, он, мягко говоря, нас намахивает со своими намерениями. Если делает — значит, пусть покажет, как. Ибо по его же словам, если текст обернули в квадратик, то текстом он от этого быть не перестаёт. Вот мне и интересно, как он этот парадокс решает (с сохранением простоты понимания, естественно)…

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

Если ты найдешь что то похожее в Mojolicious (веб-фреймворк на Perl) дам медаль.

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

Попытался прочитать. Да, правда, попытался. Но мне очень тяжело дается понимание текстового кода, особенно на незнакомых языках с незнакомыми понятиями. Что такое let например? Целое новое незнакомое понятие, что-то там весомое обозначающее, и чтобы это понять мне неизбежно придется лезть в мануалы. А делать это мне лень. То же самое качается всяких там as (так и хочется добавить вторую «s», но не скомпилируется ведь). Черт побери, в графике блоками было бы понятно сходу, чаще всего с чтением короткой всплывающей справки.

Сишку я и то еле освоил, к счастью понятий там не так уж и много и большинство касаются числовых типов. И то всякие там дополнительные extern и volatile до сих пор не до конца понимаю, но без них полнота по Бёму-Якопини не пострадает - когда будет альфа, найдутся знающие люди, чтобы вкрутить эти понятия в Метапрог вместе со справкой и интерактивной обучалкой к ним.

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

Указатель это переменная с адресом, что тут учить то?

Тебе — пунктуацию, как минимум, ну и ться.

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

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

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

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

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

А что такое gpointer?

void*

А gconstpointer?

И так ясно.

Почему в глыбе не используют обычные указатели

Так захотели.

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

Ну так в Red нужно понять а что такое объект, а как там таблица методов сделана, а с какой точностью fpu инициализирован? (в си тоже не особо нужно понимать че такое gpointer)

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

Ты за деревьями потерял лес. Там смысл вообще не в let. И даже не в расте. На C++ тоже можно zero-cost abstractions изобразить.

полнота по Бёму-Якопини

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

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

Что такое указатель и коню понятно должно быть. Ничего в этом сложного. Что такое gpointer мне еще самому въехать надо, но не думаю что это будет тяжело.

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

Zero-cost abstractions это принцип. Который состоит в том, что код не обязательно транслировать в машинный код построчно. Долгое время люди программировали либо со слабыми абстракциями (assembler, C), либо с оверхедом (Haskell, Java). Но этот выбор не обязателен. Можно (и нужно) программировать создавая и используя мощные абстракции, при этом имея производительность и требовательность к ресурсам на уровне аккуратно написанного ассемблерного кода.

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

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

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

Я только за абстракции с нулевой стоимостью и это одна из целей Метапрога. Главное чтобы эти абстракции были просты для человека. Мне лично тяжело даются сложные «сферические абстракции в вакууме».

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

Если что, я в курсе, что такое gpointer и gconstpointer. Просто это явный пример того, как ради чуть более читабельного кода плодятся совершенно лишние сущности.

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

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

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

Мне лично тяжело даются сложные «сферические абстракции в вакууме».

Тогда ты не сможешь сделать метапрог с заявленными целями.

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

Если что, я в курсе, что такое gpointer и gconstpointer.

Я ваще проблемы не понял, я как впервые увидел gpointer (в первом треде metaprog), так сразу и понял что это void*, ну и логично что оно определенно через typedef, хотя я даже не смотрел так ли это.

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

Мне это не интересно. Я здесь пишу только потому что «в интернете кто-то не прав».

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

Тебе — пунктуацию, как минимум, ну и ться.

В украинском с этим проще. Правда в белорусском еще проще - «как слышу так и пишу» - надо брать пример.

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

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

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

Сущностей даже с этим намного меньше чем в высокоуровневых языках.

Видели ли Вы когда-нибудь Го?

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

struct x {
    uint32_t age;
    char     name[255];
};

Когда появляется джентльмен с именем более 255 символов, то начинаются проблемы — причём настолько закостенелые, что проще послать его нах. Это просто пример, но скорость и «простота» (да фиг там) Си — многого стоит в плане гибкости.

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

Дело в том, что Си сам по себе провоцирует на всякую фигню

Нет.

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

Иногда это оправданно.

Это просто пример, но скорость и «простота» (да фиг там) Си — многого стоит в плане гибкости.

В любом языке с массивами можно такое сделать.

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

Я ещё 4 страницы назад предлагал разойтись всем по своим IDE и сюда показывать либо что-то работающее, либо действительно интересные технические вопросы, а не «нет ты»...

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