LINUX.ORG.RU

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

 , , ,


7

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

Это в glib реализовано или этот велосипед изобрести нужно самому?

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

Си тоже текстовый, но там мощная система типов

Хорошая шутка

~~@~~

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

Владимир

Безусловно ваш проект очень интересен.
Рациональное зерно в нем имеется /без иронии/.
Но нужно больше «проникнуться».

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

Владимир

Многие вместо int selector_of_type; используют «магическое слово».
У Microsoft иногда первое поле содержит длину структуры /тем самым они двух зайцев сразу ловят/.
Погуглите по вопросам создания динамических структур, типов данных, ...

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

Я вот думаю кроме целочисленных типов сделать возможным выбор по булевому и по значению строк. В Лабвью именно так работают case-структуры.

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

Владимир

Вы вольны сделать хоть двести типов данных если в них имеется потребность.

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

Владимир

Все это «детские шалости».
Имеется такое понятие метадата база.
Скорее всего вам пока в этот лес лучше не входить.

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

Скорее всего ограничусь GDK (чтобы не париться с «application» и прочими ООП-подобными концептами в GTK, сложно и ненужно).

Для дальнейшего прогресса нужно:

1. Открыть окно

2. В него вставить «доску» для рисования

3. В этой «доске» нарисовать прямоугольник с текстом, графический «хеллоуворлд»

Накидайте простых примеров, ускорьте прогресс.

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

Нужен полный пример с самого начала. Чтоб все в одном int main(){...}

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

После опыта с текстовым программированием я влюбился в Лабвью с первого взгляда.

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

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

Как я уже сказал — дерзай, мне интересно, что у тебя получится. Но читая твои разбросанные по теме высказывания «это учить не хочу, это читать не хочу, это очень сложно», я пока сомневаюсь в конечном результате.

С третьей стороны — вот, нашлись люди, слепили из веб-технологий Электрон. Те, кто знает нативные языки, плюются. Те, кто не знает — кушают и нахваливают, и им хрен что возразишь. Копроэкономика на стороне вторых.

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

Посмотри Gtk3 Tutorial, первый пример. Ну и скомбинируй это с DrawingArea. Вот Perl пример от меня.

use v5.22.2;
use Gtk3 -init;

my $window = Gtk3::Window->new('toplevel');
$window->signal_connect(destroy => sub {
	Gtk3::main_quit
});

my $draw_area = Gtk3::DrawingArea->new(); 
$draw_area->set_size_request(640, 480);
$draw_area->signal_connect(draw => sub {
	my ($widget, $cairo, $pointer) = @_;
	
	$cairo->set_source_rgb(0, 1, 0);
	$cairo->rectangle(20, 20, 200, 200);
	$cairo->fill();
	
	$cairo->set_source_rgb(0, 0, 1);
	$cairo->rectangle(150, 150, 200, 200);
	$cairo->fill();
	
	$cairo->set_source_rgb(0, 0, 0);
	$cairo->select_font_face(
		"DejaVu Sans", 
		"normal",
		"bold"
	);
	$cairo->set_font_size(20);
	$cairo->move_to(300, 30);
	$cairo->show_text("Hello World!");
	$cairo->fill();
});

$window->add($draw_area);
$window->show_all;
Gtk3::main;

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

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

Все так, в чем суть то?)

С третьей стороны — вот, нашлись люди, слепили из веб-технологий Электрон. Те, кто знает нативные языки, плюются. Те, кто не знает — кушают и нахваливают, и им хрен что возразишь. Копроэкономика на стороне вторых.

Ну так из похожего есть только QML, да и то он не дотягивает до уровня браузера. По моему electron прекрасный инструмент!

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

Прикол еще в том, что пока что я осилил компиляцию только с gtk2. gtk3 нет и не знаю где брать. Это сильно делает погоду?

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

Какой дистрибутив? Все браузеры собираются с Gtk3.

pkg-config --libs gtk+-3.0

Это сильно делает погоду?

Да, намного лучше юзать Gtk3.

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

Грубо говоря, снять проститутку намного проще, чем найти хорошую девушку

Хорошую девушку, которая помогла бы мне ускорить работу над Метапрогом. Ладно, шучу:)

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

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

С третьей стороны — вот, нашлись люди, слепили из веб-технологий Электрон. Те, кто знает нативные языки, плюются. Те, кто не знает — кушают и нахваливают, и им хрен что возразишь. Копроэкономика на стороне вторых.

Я ж Метапрог делаю из чистейшего Си, даже от плюсов плююсь, а от веба тем более:)

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

Package gtk+-3.0 was not found in the pkg-config search path. Perhaps you should add the directory containing `gtk+-3.0.pc' to the PKG_CONFIG_PATH environment variable No package 'gtk+-3.0' found

дебиан бустер

metaprog ()
Ответ на: комментарий от metaprog
apt install libgtk-3-dev

Делал? Если делал и все равно не хочет работать, попробуй

pkg-config --libs gtk-3.0
VarfolomeyKote4ka ()
Ответ на: комментарий от metaprog

Владимир

Извиняюсь, что встряю в ваш диалог с VarfolomeyKote4ka.
Встречал не пяти разработок /с исходниками/, касающихся рисования блок-схем.
Может быть полезно посмотреть их?

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

Gtk4 будет практически таким же как и Gtk3, так что «переходить» (и переписывать что то) на него не надо будет. Да он еще и не вышел, нет, не надо, можно пока юзать Gtk3.

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

Хорошую девушку, которая помогла бы мне ускорить работу над Метапрогом. Ладно, шучу:)

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

во дебилы, не осилили даже сделать Лабвью «на самом себе»

Может, таки не «не осилили», а на то были объективные причины?

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

pkg-config --libs gtk+-3.0

-lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0

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

Либо так:

gcc -c ./test.c -o ./test.o $(pkg-config --cflags gtk+-3.0)
gcc test.o $(pkg-config --libs gtk+-3.0)
Либо вот так:
gcc ./test.c -o ./test $(pkg-config --cflags --libs gtk+-3.0)

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

Переделаю для большей наглядности:

1)

gcc -c ./test.c -o ./test.o $(pkg-config --cflags gtk+-3.0)
gcc test.o -o test.elf $(pkg-config --libs gtk+-3.0)
./test.elf

2)

gcc ./test.c -o ./test.elf $(pkg-config --cflags --libs gtk+-3.0)
./test.elf

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

Нет. Именно не осилили. Не хотели. Вот gcc написан на Си и на все 100% компилирует сам себя. Лабвью так не делает потому что задумывалось всего-лишь для обработки сигналов, данных итп. Хотя несмотря на это вышла годная система, которая еще чуть-чуть - и была бы полноценным униерсальным IDE. Если б не копирасты, которые всю идею похерили в пух и прах.

metaprog ()
Ответ на: комментарий от VarfolomeyKote4ka
gcc ./test.c -o ./test $(pkg-config --cflags --libs gtk+-3.0)
In file included from ./test.c:7:
/usr/include/gtk-2.0/gtk/gtk.h:38:10: fatal error: gtk/gtkaction.h: Немає такого файла або каталогу
 #include <gtk/gtkaction.h>
          ^~~~~~~~~~~~~~~~~
compilation terminated.
metaprog ()
Ответ на: комментарий от VarfolomeyKote4ka

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

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

Устарело, удалено. Можешь что бы легче было, собрать формочки с помощью Glade.

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

Подключилось все же? Ну GtkAction будет удален в Gtk4, не советую его использовать.

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

Не-не, я его не использовал. Я пока вообще ничего гткшного не использую. Просто забыл заменить #include <gtk-2.0/gtk/gtk.h> на 3.0

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

Так делать неправильно, нужно

#include <gtk/gtk.h>
У тебя же для этого специально pkg-config --cflags есть.

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

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

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

А то! Что бы писать что то серьезное™ нужно еще системы сборки знать, а их много, и нужно их как то комбинировать, вот тут то и можно почувствовать себя профессионалом, а после того как разберешься, через месяц, или два, можно и к коду переходить!

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

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

Это да, но типа надо знать ждать ли от тебя ответа и все такое. Вообще интересно как работает опенсорс, я в это сейчас только въезжаю.

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

Ну в лабвью я сразу перешел к коду без лирических отступлений на системы сборки, конвенции по написанию кода, книги/курсы о паттернах ООП и нужду быть писателем уровня Достоевского:)

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

Гтк теперь 3, все компилится без багов. Теперь переходим к самому коду.

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

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

Теперь эта строка понятна. А вот по ссылке, насколько я понимаю

g_signal_connect (app, «activate», G_CALLBACK (activate), NULL);

параметр «activate» - это указатель на функцию?

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