LINUX.ORG.RU

Metaprog: выпуск прототипа (универсальная графическая среда программирования)

 , ,


2

3

Сегодня, как и было обещано, день выпуска LabVIEW-прототипа универсальной графической среды программирования Metaprog.

LabVIEW-прототип не является конечной целью. В дальнейшем с помощью прототипа Metaprog будет собран «сам на себе» и не будет зависеть от LabVIEW.

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

Видео-обзор ( VarfolomeyKote4ka)

https://youtu.be/EcQMgUAm0DE

Скачать: https://www86.zippyshare.com/v/pWggQ91b/file.html

Аннотация

Открывать и запускать !метапрог.vi и !метапрог онлайн.vi

В Метапрог онлайн интегрирован чат и хранилище пакетов с блок-диаграммами. Там идет разработка Метапрога и можно получить консультации.

В Метапрог и Метапрог онлайн встроена справочная система и интерактивные инструкции.

Требования:

1. Для запуска, просмотра и редактирования диаграмм - LabVIEW начиная с 2013.

2. Если не удалось достать линуксовую версию LabVIEW - виртуальная машина с Windows начиная с ХР с кириллической локализацией (иначе будут проблемы с кодировкой символов).

3. Tor Browser или Tor для подключения к серверу:

https://www.torproject.org/

или:

sudo apt-get install tor

4. Для компиляции сгенерированного кода:

sudo apt-get install clang libevent-dev libsdl2-dev

Адрес для добровольных пожертвований:

Bitcoin: 1AYoK2TScSpD5bhf67mv9AxHDJ2RidRvjD

Этот адрес действителен как ключ для электронной подписи от имени разработчика.

Код лицензирован под GNU GPL v3, подробности - по кнопке «Про программу» и в файле LICENSE.txt (на английском). Отдельные файлы могут быть лицензированы под MPL и другими лицензиями.

Описание конструктора диаграмм (часть справочной системы, лучше читать смотря на Метапрог)

В случае вопросов или проблем консультации можно получить в чате программы «Метапрог онлайн».

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

Блок-диаграмма состоит из блоков, линий с данными и особых линий - жестких последовательностей. Каждый блок может иметь входы и выходы.

При клике на терминал начнется рисование провода с данными. Клик на пустом месте при рисовании провода задает точку излома провода. При приближении курсора к терминалам провод автоматически подстраивается под ближайший терминал с совместимым типом (несовместимые типы подключить невозможно). Для окончательного подтверждения соединения кликни и связь будет установлена. Чтобы отменить рисование проводка, нажми Esc.

Подключаться дважды к одному терминалу нельзя - будут ошибки. Используй разветвления. Чтобы создать разветвление, кликни на квадратик, который появляется при приближении к проводу, и рисуй провод как обычно (только отенять кнопкой Esc не надо - будет баг).

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

Очередность выполнения также задается жесткими последовательностями. Это - особые линии, которые проводятся по кнопке блоки - последовательность. Первый клик на блоке - начало последовательности, следующие клики - изломы провода (на пустых местах) либо конец последовательности (на блоке). Места начала и конца провода имеют значение при работе с циклами, условными разветвлениями, переключателями.

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

Чтобы скопировать элемент на диаграмме, нажми на него колесом мыши. Чтобы вставить - жми колесом мыши на пустом месте.

При наведении мышью на элемент диаграммы отображается подробная информация о нем. Элементы подсказок кликабельные. Для дальнейшней справки кликай на "?" в подсказках к элементам.

Описание контейнера с данными и системы типов (часть справочной системы, лучше читать смотря на Метапрог)

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

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

Типы в Метапроге имеют надтип. Может наследоваться интерфейс работы с данными, способ трансляции в Си и цвет (если тип не имеет своего цвета). При работе с диаграммой и ее трансляциями в Си данные разных типов обрабатываются зависимо от корневого типа. Метапрог имеет следующие корневые типы:

Данные - включает в себя числа (знаковые, беззнаковые и бробные разных разрядностей) и логический тип (зеленый). Логический тип совместим со всеми числовыми типами, так как в Си они могут выступать в качестве условия (если ноль - «нет», все другие значения - «да»). Есть типы число (все числа, коричневый), знаковое (голубой), беззнаковое (темно-синий), целое (объединяет знаковое и беззнаковое),дробь (оранжевый).

Неопределенное - аналог типа void в Си. Совместим со всеми типами.

Указатель - содержит адрес данных. Прямо транслируется в указатель на Си. Получается из данных блоком «указатель» (из меню блоков), вытягиваются данные из указателя блоком «вытягивание указателя».

Структура (последовательность и выбор) прямо транслируется в struct или union на Си. Формируется из контейнеров с данными другого типа путем из вытягивания на структуру. Достум к элементам структуры осуществляется через блок «операция над структурой».

Массив - тип, не имеющий прямого аналога в Си. Содержит указатель на первый элемент и длину массива. Доступ к этим переменным осуществляется через блок «операция над структурой». Чтобы задать тип массива, вытащи на него контейнер нужного типа. Массив можно подключить к типованному циклу (блоки - типованный цикл), в котором можно осуществить обработку каждого его элемента.

Структура условного выбора типа не имеет проямого аналога в Си. Состоит из числа-переключателя и структуры выбору (в Си - union) из данных разных типов. Тип данных зависит от значения переключателя. Задается и читается через операцию над структурой. Можно подключить к переключателю (блоки - переключатель), в котором обрабатывать данные зависимо от типа. Для добавления типа вытащи контейнер нужного типа на СУВТ.

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

Функция Си - на уровне Си является указателем на функцию. Над такой константой есть пикторгамма соответствия копии на диске в виде дискетки, как над подфункцией. Ее цвет зависит от соответствия. Кликом по этой пиктограмме можно управлять соответствями. Подобная пиктограмма есть у сложных типов (структур и структур условного выбора типа). В подсказках к константам, содержащим подфункцию, есть 4 цветные цифры. Это суммарное число комментариев определенных видов в поддиаграммах (замечание, известные ошибки, пожелания и «дело сделано»).

------------------------------------------

При клике на пиктограмму перемещения объект можно передвинуть, при этом линии до его терминалов передвинутся за ним (но тут еще возможны баги).

При клике на название объект диаграммы можно переименовать. Название объекта никак не влияет на логику и предназначено для чтения людьми.

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

Предыдущие темы, посвященные разработке Metaprog

Metaprog: универсальная графическая среда программирования [LabVIEW-прототип] часть 9

Там же ссылки на более ранние темы.



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

У Метапрога есть хорошо обозначенная аудитория, под которую и пилится продукт. А именно люди, которые не хотят впутываться в c/c++ для того, чтобы соорудить какой-то проект на ардуино, десктопное приложение, мобильное приложение, серверное приложение, ядро ОС (в том числе под х86 и ARM), компонент ядра, драйвер, веб-приложение и так далее.

Тю... Есть масса способов не впутываться в c/c++, начиная с очевидного питона и заканчивая прекрасным паскалем (современным, естественно). Ну да, питон для ядра ОС и драйверов не подойдёт. Но писатели такого софта вообще штучный товар, и для тех, кто осиливает эту предметную область, осилить один из существующих компилируемых ЯП — вообще не проблема.

А вот если ты напишешь более жёстко — «не хотят впутываться в текстовые языки вообще» — то аудитория тут же перестаёт быть хорошо обозначенной, и её границы уходят куда-то в область психологии. «Люди, у которых проблемы с восприятием текстовых ЯП»? Ну да, почему бы не сделать для них среду разработки. Но вряд ли имеет смысл её делать «саму на себе». И сами для себя они вряд ли её напишут (хотя если я ошибаюсь, посмотреть было бы интересно).

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

Теперь, кажется, я знаю как сделать в Метапроге рекурсивные типы. Но в кастхмл встречается еще и такая «невоплощенная» фигня:

<Unimplemented id="_10041" kind="IndirectField"/>
<Unimplemented id="_11295" type_class="Vector"/>

Насколько это критично?

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

Не знаю, я с CastXML не работал вообще.

И это... доктор, откуда у вас такие картинки, в смысле, Vector? Это точно из Си сгенерировано, а не из плюсов каких-нибудь?

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

не хотят впутываться в текстовые языки вообще

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

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

И сами для себя они вряд ли её напишут (хотя если я ошибаюсь, посмотреть было бы интересно).

Дополнение: подозреваю, что i-rinat сюда заглядывает из того же самого любопытства.

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

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

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

И сами для себя они вряд ли её напишут

Ну так у меня есть Лабвью, на нем и пилю прототип.

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

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

Ну этим уточнением ты просто сделал эту узкую категорию ещё уже. :)

Ну так у меня есть Лабвью, на нем и пилю прототип.

И тем самым отсёк от себя людей, которые не чужды текстовому программированию, но могли бы помочь. Впрочем, если будут решены проблемы 1) строгого описания языка и формата файла, которые можно читать вне метапрога; и 2) читаемости сгенерированного кода, которую уже даже Котечка хочет увидеть — возможно, эти люди и появятся.

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

Ну ты даешь

#include  <stdio.h>

struct A;
struct B;

struct A {
    struct B *bvalue;
};

struct B {
    struct A *avalue;
};


int main(void)
{
    struct A a;
    struct B b;
    a.bvalue = &b;
    b.avalue = &a;
    
    return 0;
}
anonymous
()
Ответ на: комментарий от anonymous

Хотя что этот наркоман имеет ввиду под «рекурсивные типы» только его врачу известно.

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

Он без структ спрашивал. Без структ там типов не сильно много.

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

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

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

превращением Украины в Россию

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

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

Опиши грамматику Метапрога синтаксическими диаграммами Вирта.

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

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

Тебе оно тоже в общем-то не нужно. Ты даже строку перевернуть не можешь на своем мертвопроге, куда уж тебе «ядра ос и драйвера» писать.

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

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

Ты даже строку перевернуть не можешь

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

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

драйвера

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

Только не в виде маняфантазий местного метаваленка, а адекватный концепт.

(И я не про блок-схемы, там понятно все, а что-то типа марковских схем, но на новом уровне с учетом накопленных знаний).

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

Зачем мне этот троян?

Поставь Лабвью на виртуалку, изолированную от сети, вот и весь тебе троян.

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

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

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

metaprog
() автор топика

Что это такое вообще? уже 900 комментов наговорили, а так и не понял, что это. Разумеется, шапку не читал

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

эти кубики банально проще сделать на Си, а не на твоей мазне. Тебе уже 50 раз объяснили, что написать 2+2 быстрее, чем натыкать это мышой. Но если это быстрее, то нужность твоей поделки для кого-то, кроме тебя, очень сомнительна. Даже детей учить не годится ибо уже scratch есть.

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

Я видео смотрел, и не понял что там происходит

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

я не могу сделать «базовые кубики» для Метапрога... Допустим это правда

Это правда, без «допустим».

возьми да сделай, инструмент для этого я уже выложил

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

liksys ★★★★
()

Лол

https://pastebin.com/pdbhKcey

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

Культура программирования просто зашкаливает.

anonymous
()

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

anonymous
()
import sys
import re

with open(sys.argv[1]) as f:
    s = f.read()

idx = 1
while True:
    m = re.search('metaprog_instance_[0-9a-zA-Z_]+', s)
    if m is None:
        break
    old_name = m.group(0)
    new_name = 'var_{:02d}'.format(idx)
    idx += 1
    s = s.replace(old_name, new_name)

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

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

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

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

Замена по списку за один проход для меня концептуально сложная. Допустим, есть шаблоны 123, 234 и 345. Каждый заменяет на aaa. Какой результат будет, если на вход подать 12345? aaa45? aaaaa? 1aaa5? 12aaa? Почему так?

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

Осталось придумать как разруливать такие ситуации:

int v1 = 5;
int v2 = v1;
int v3 = v2;
// Далее используется v3. v1 и v2 в больше не упоминаются. Хотя, фактически, это не мертвый код.
anonymous
()
Ответ на: комментарий от anonymous

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

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat
1. Читаем по строкам
  2. Для каждой строки составляем список metaprog_XXX
     3. Каждый ключ ищем в таблице
     4. Если его там нет - добавляем значение var_YYY
     5. Если он там есть, берем значение
     6. Заменяем в строке
     7. Поехали дальше
   3. Выводим строку
anonymous
()
Ответ на: комментарий от anonymous

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

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

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

Но я испытал душевные страдания от многократного регулярного поиска и поиска/замены по всему тексту. Не мог об этом не сказать.

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

Но я испытал душевные страдания от многократного регулярного поиска и поиска/замены по всему тексту.

Перфекционизм мне тоже жить мешает. Я вижу, что это жуть какой неоптимальный алгоритм. Вижу, что он O(N²), если не хуже. Но если полировать каждый одноразовый скрипт, дело никогда не дойдёт до кода, который по-настоящему нуждается в оптимизации.

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

Я ожидал какой-то готовый метод из стандартной библиотеки

Можно и так:

print(re.sub(r'(metaprog_instance_[a-z0-9_]+_[0-9]+)', replace_var, s))

а replace_var типа

def replace_var(a):
    if a.group(1) not in hashmap: hashmap[a.group(1)] = 'var_%d'%idx
    idx = idx + 1
    return hashmap[a.group(1)]

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

Ну там с отступами фигня, и idx должен быть глобальным, но суть и так ясна.

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

Ну я питон практически не знаю, вот внезапно решил проверить — а вдруг там лямбду можно в re.sub сунуть. Оказалось, что можно. Так-то наверняка ещё можно много чего сократить.

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

Вот блин. Я только сейчас осознал, что этот скрипт — это же тот самый легендарный анти-метапрог. Он берёт выхлоп метапрога и делает его на шаг ближе к нормальному исходнику!

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

Ну просто так не особо интересно. Вот подкинули бы мне задачу... Что бы писать поменьше, а эффекта побольше! А пока я даже не знаю чего бы такого сделать. Демку с рейтресингом может, хм...

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

Демку с рейтресингом может, хм...

Если да, то нужны вектора, можно взять существующую библиотеку, а можно запилить векторные расширения, нужна так же нормальная работа с препроцессором (уже есть?), это для либы и openmp понадобится.

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

Чува-а-ак! Костыли для костылей это суть ай-ти индустрии! Когда-то давно были всякие разные компьютеры. Commodore 64, всякие Amiga, и тому подобное. Производители традиционно выкатывали новые машины, не совместимые со старыми. Они были круче старых, но софт и дополнительное железо под них нужно было делать заново. Всё было хорошо, пока не появились клоны IBM PC. И тут те, кто не понял, что это новая эра, вывалились из бизнеса. Потому что людям не нужно каждый раз новый набор технологий. Им нужны улучшения там и сям, но так, чтобы уже потраченные деньги не улетали в трубу каждый год-полтора.

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