LINUX.ORG.RU

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

 , ,


6

7

Почему, несмотря на обилие «чудесных» ООП-языков, Си, разработанный в 1973 году, до сих пор не умер? Потому что не выхдящие за рамки текстового программирования попытки «улучшить» или заменить Си давали и дают проблем больше, чем решали.

Какой из ныне существующих языков программирования позволяет программировать мышкой, а не клавиатурой? На чем можно программировать графически, а не в тексте? Пока что это позволяет на приличном уровне только пропиетарное LabVIEW. Трудно поверить, но это единственная полностью графическая среда программирования серьезного уровня в 2019 году! Но даже в LabVIEW есть куча недостатков (которые невозможно самостоятельно устранить из-за пропиетарности).

Графическое программирование намного проще и понятнее. Если в качестве бэкенда брать Си и манипулировать функциями из сишной стандартной библиотеки, это не будет создавать никаких лишних абстракций, зато серьезно упростит жизнь программистам и особенно людям, имеющим дело с чужим кодом. Код любого уровня и любой сложности, представленный в виде графических блоков, станет открытым не только для узких специалистов, но и вообще любому продвинутому пользователю. Простота программирования и эффективность, не меньшая, чем у Си, убьет C++, Python, Java, Javascript и прочую ерунду с раздутыми и полными багов абстракциями (которые Линус не раз крыл матом).

Я уже делаю некое подобие LabVIEW на самом LabVIEW, назовем его Metaprog. Так же, как в 1991 Линус Торвальдс делал линукс, пользуясь пропиетарным Minix. И так же жаловался на кучу недостатков в Minix, желая устранить их в своей системе.

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

Примеры

Примеры с кодом на Си генерируются автоматически. Они тут же скармливаются компилятору и не предназначены для чтения эстетами, не любящими «абракадабру». Здесь они приведены лишь как пример работы транслятора и для возможности самостоятельно скомпилировать графические диаграммы со скринов. Так сказать, приобщиться к прекрасному.

Самое простое - Hello World. Скомпилируйте (gcc -o ./test ./code.c).

https://i.postimg.cc/YCywWbSh/fwrite.png

#include <stdio.h>

int main(){
char metaprog_array_pointer_10156130170823954432[] = {72,101,108,108,111,32,87,111,114,108,100};
unsigned long int metaprog_variable_13830126042312755200 = 1;
unsigned long int metaprog_array_size_10156130170823954432 = 11;
fwrite(metaprog_array_pointer_10156130170823954432,metaprog_variable_13830126042312755200,metaprog_array_size_10156130170823954432,stdout);

}

Я подписываю терминалы на украинском (сам оттуда), с таким же успехом их можно подписывать на русском, а не только на английском. Можно будет перевести все, кроме, разве что, вызываемых сишных функций, а gcc этого и не заметит (посмотрите код). При работе международной командой можно к каждой подписи/надписи прилагать словарь с нужными языками. Игры ж локализируют, чем визуальное программирование хуже?

Массив декларируется не как строка в кавычках, а как последовательность байтов, а байт - это цифра. Строки редактируются отдельным редактором (пока что средствами LabVIEW, но это временно). Больше никаких проблем и глюков с управляющими символами, кавычками итп (очень серьезная проблема при программировании на Си, Shell scripting и вообще всех текстовых языках).

Константа-массив имеет отдельные терминалы для указателя на массив и длины массива (известной редактору кода). Если терминал длины подключен - декларируется отдельная переменная. Не подключен - незачем и декларировать.

Пример посложнее: запись и в stdout, и в файл ./fwrite-test.txt

https://i.postimg.cc/v8KvKKmQ/fwrite2.png

#include <stdio.h>

int main(){
char metaprog_array_pointer_10156130170823954432[] = {72,101,108,108,111,32,87,111,114,108,100};
unsigned long int metaprog_variable_13830126042312755200 = 1;
unsigned long int metaprog_array_size_10156130170823954432 = 11;
fwrite(metaprog_array_pointer_10156130170823954432,metaprog_variable_13830126042312755200,metaprog_array_size_10156130170823954432,stdout);
char metaprog_array_pointer_12385851444566411264[] = {46,47,102,119,114,105,116,101,45,116,101,115,116,46,116,120,116,0};
char metaprog_array_pointer_16510743873862514688[] = {119,43,0};
fwrite(metaprog_array_pointer_10156130170823954432,metaprog_variable_13830126042312755200,metaprog_array_size_10156130170823954432,fopen(metaprog_array_pointer_12385851444566411264,metaprog_array_pointer_16510743873862514688));

}

В данном примере используется функция fwrite, а не printf. То есть, символ «0» не влияет на запись массива в файл или stdout. Сколько символов писать функция и так знает из длины массива.

Заявки

Принимаю заявки на новые фичи. Пишите в комментариях. Уже приняты заявки:

1. Пример с простым HTTP-сервером.

2. Пример с сортировкой Хоара (quicksort).

3. Простой в пользовании функционал работы со строками (больная тема для Си и С++).

4. Полностью графический функционал работы с регулярными выражениями, без вовлечения PCRE.

Сейчас нужно научить Metaprog «компилировать» блок-схемы прямо в Си и скармливать этот код gcc, получая бинарники. После чего перенести сам Metaprog на Си, чтоб перестать нуждаться в пропиетарном LabVIEW и выложить результаты в опенсорс. И получить за это донат, хотя желательно уже сейчас (для ускорения работы). Bitcoin:1AYoK2TScSpD5bhf67mv9AxHDJ2RidRvjD

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

Но рисовать всякие прямоугольники-кружки лучше с помощью OpenGL/Vulkan, а не на xlib.

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

Я вот сейчас призадумался над тем, чтоб использовать gtk/glib. Как там обстоят дела с аппаратным ускорением?

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

Прекрасно обстоят! Даже Vulkan рендер сделан уже, вроде бы, ну к Gtk4 точно должны сделать.

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

Там еще вижу есть готовые библиотеки для строк, массивов и прочей подобной фигни, чтоб самому велосипеды не изобретать. Но есть ли причины НЕ использовать glib?

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

А с помощью GObject можно реализовать ООП на С, который так нужен комментаторам %)

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

Да не думаю что нужно отказываться, но видел критику!

glib - implements C++ STL on top of C (because C++ sucks so much, let's reinvent it!), adding lots of useless data types for «portability» and «readability» reasons. even worse, it is not possible to write robust applications using glib, since it aborts in out-of-memory situations. glib usage is required to write gtk+ and gnome applications, but is also used when common functionality is needed (e.g. hashlists, base64 decoder, etc). it is not suited at all for static linking due to its huge size and the authors explicitly state that «static linking is not supported». Alternatives: libmowgli, libulz

Взято с https://suckless.org/sucks/

VarfolomeyKote4ka ()
Ответ на: комментарий от VarfolomeyKote4ka
(dmitry/~) ls /usr/include/glib-2.0
gio  glib  glib-object.h  glib-unix.h  glib.h  gmodule.h  gobject

(dmitry/~) grep include /usr/include/glib-2.0/glib.h | head
#include <glib/galloca.h>
#include <glib/garray.h>
#include <glib/gasyncqueue.h>
#include <glib/gatomic.h>
#include <glib/gbacktrace.h>
#include <glib/gbase64.h>
#include <glib/gbitlock.h>
#include <glib/gbookmarkfile.h>
#include <glib/gbytes.h>
#include <glib/gcharset.h>
(dmitry/~) 
VarfolomeyKote4ka ()
Ответ на: комментарий от VarfolomeyKote4ka

Короче, включаю glib.h и не парюсь. Через минут 10 скрин сделаю.

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

Черт, как правильно прописать include? Матюкается

/usr/include/glib-2.0/glib.h:30:10: fatal error: glib/galloca.h: Немає такого файла або каталогу #include <glib/galloca.h>

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

А так чтоб никаких опций не вписывало в конфиги gcc, а просто инклюдилось через командную строку?

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

Непонел, хочешь без $()? Ну так делать неправильно, но можешь просто добавить к gcc те опции что выведет тебе

pkg-config --cflags glib-2.0
А совсем без аргументов не выйдет, разве что менять файлы glib.

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

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

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

Мудрёный синтаксис...

Да вроде все просто. Кстати, нужно еще pkg-config --libs glib-2.0 добавить, но это уже на последней стадии.

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

Обычный тип как и все остальные char, int, short... А true, false это лишь

#define true 1
#define false 0
VarfolomeyKote4ka ()
Ответ на: комментарий от VarfolomeyKote4ka

_Bool - это именно КОРЕННОЙ тип, добавившийся с glib, мне Метапрог так сказал, как только разобрался с инклюдом:)

Значения у _Bool только 1 и 0?

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

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

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

В общем спасибо за подсказку, glib реально уже содержит функции, полезные для массивов, строк, графики и логического типа. Сокращает огромный объем работ. Черт, я даже привыкнуть успел, что логических типов в Си нет, вместо них только целые числа. Можешь идти спать, если хочешь:)

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

Содержит ли glib:

1. Открытие/закрытие/изменение размера окон

2. Рисование прямоугольников, текста и прочих примитивов, необходимых для переноса графики Метапрога с Лабвью

Или надо вызывать еще другие библиотеки? Если да, какие include?

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

Владимир

Из предыдущего диалога следует, что вы не используете /или не имеете/ готового API для прорисовки диаграмм, ...
Не хочу этим сказать, что вы его не разработаете, но ...

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

Я имею его подобие на Лабвью, сейчас разбираюсь с функционалом gtk+. Все же решил работать с gtk+glib вместо xlib, чтобы:

1. Иметь аппаратное ускорение через видеокарту (в xlib его нет, верно?)

2. Готовые типы для строк, _Bool итп (что в общем-то совпадает с моими прошлыми задумками)

3. Готовые элементы интерфейса

И все не выходя за рамки Си. Реальное открытие. Еще разобраться со всем этим...

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

Владимир

Конечно разберетесь, конечно сумеете создать designer диаграмм,
..., но для этого потребуется немало времени.
Имеются два пути:
- учитесь, разбираетесь, ... и реализуете свой API, disigner, ...;
- используете готовые библиотеки

Какой путь изберете?

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

Владимир

В этом вопросе могу сделать только умный вид.

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

Ды я вроде свободный человек, могу и сейчас опять спать пойти. Glib это для массивов, строк итд, это не про графику, графика это gtk, вот в нем есть все что надо.

Сетевой функционал есть, да и всякий другой тоже https://developer.gnome.org/gio/stable/

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

Владимир

Не отговариваю вас от разработки, но не переоценивайте ее сверх меры.
Скорее всего она займет некоторую нишу /трудно сказать/.
Многих интересуют rapid технологии.

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

Вам нужно было взять за основу не C, а JavaScript.
Нынешний мир «высоких технологий» устроен так:
нужно что-то разработать и лет пять доказывать, что это - супер современно.

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

Зачем JavaScript то, есть уже emscripten, да и внутри node.js не питон какой нибудь, а тот же самый С.

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

Владимир

Иронизировал же ведь.

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

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

Дальше мы на практике, а не в рекламе, докажем всем что наша система объективно эффективнее.

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

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

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

Как бы ты ее реализовал?

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

struct{

int selector_of_type;

void * data_of_selected_type;

} //забыл ; - не скомпилируется. ненавижу писать в тексте:)

metaprog ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)