LINUX.ORG.RU

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

 , , ,


10

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



Последнее исправление: CYB3R (всего исправлений: 9)

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

Это вынужденная временная мера, так как визуальных сред программирования с открытым кодом нет в природе (если не считать детских). Конечной целью является полная замена LabVIEW опенсорсным аналогом, опирающимся на Си.

Вы б убили Линуса за то, что он начинал делать линукс из-под миникса?

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

Он детский. А я хочу оперировать функциями стандартной библиотеки Си, системными вызовами, сишными библиотеками, и делать это мышкой в графике, а не клавиатурой в тексте, как 40 лет назад.

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

Графическое программирование намного проще и понятнее.

Блок-схемами? Только процедурное программирование.

Как графически изображается что-то вроде (JavaScript)

get('story.json').then(JSON.parse).then(function(response) {
  console.log("Вот наш JSON!", response);
});
?

monk ★★★★★
()

Графическое программирование намного проще и понятнее

Вызывающе неверная информация. Хотя надо признать периодически вылезают дилетанты, пытающиеся что-то такое делать. Хоть тот же ДРАКОН.

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

Если под словом «графическое» не понимать именно блок-схемы, то местами действительно проще и понятнее.

Например, рисование форм проще и понятнее делать графически рисуя формы, а не описывая их текстом. Конечный автомат проще описать диаграммой состояний, а таблицу решений таблицей.

monk ★★★★★
()

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

Ахаха. Надо тебе посмотреть какой нить большой проект на FBD/SFC или упасибоже LD, чтобы больше не болтать ерундой.

anonymous
()

Посмотрите...

Такой пакет как dia и дополнительно dia2code. В dia Вы рисуете диаграмму, dia2code перегоняет нарисованную диаграмму в код. С, С++ и ещё куча языков поддерживаются.

Moisha_Liberman ★★
()

Графическое программирование намного проще и понятнее.

Я бы так не сказал.

rumgot ★★★★★
()

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

Weres ★★★
()

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

XMs ★★★★★
()
Ответ на: комментарий от deep-purple

Видел.

Поэтому я и просто упомянул, но не сказал что сам этим постоянно пользуюсь. Так, от случая к случаю. ТС же интересуется что ещё кроме LabVIEW есть, что посмотреть.

Хотя, если честно, то я не особо уверен что тема взлетит.

Moisha_Liberman ★★
()
Последнее исправление: Moisha_Liberman (всего исправлений: 1)

Для нетекстового программирования лучше бы поддержать какой-нибудь язык из МЭКовских, например, FBD

Alden ★★★★
()
Последнее исправление: Alden (всего исправлений: 1)

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

Только вот Миниксом кто-то серьёзно пользовался.

Bfgeshka ★★★★★
()

На чем можно программировать графически, а не в тексте?

Таких систем не одна и не две - тысячи их, этот список далеко не полный.

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

На вот парочку оперсорсных - noflo, viskell. Вообще говоря, их намного больше, просто первое, что пришло на ум.

Трудно поверить, но это единственная полностью графическая среда программирования серьезного уровня в 2019 году

Трудно поверить, но такие системы существовали ещё 50 лет назад.

Графическое программирование намного проще и понятнее.

Есть мнение, что очень быстро можнно столкнуться с ограничениями.

Я уже рисую простенькие блок-схемы

Нарисуй простенькую реализацию простенького алгоритма быстрой сортировки:

void quicksort(int *A, int len) {
  if (len < 2) return;
 
  int pivot = A[len / 2];
 
  int i, j;
  for (i = 0, j = len - 1; ; i++, j--) {
    while (A[i] < pivot) i++;
    while (A[j] > pivot) j--;
 
    if (i >= j) break;
 
    int temp = A[i];
    A[i]     = A[j];
    A[j]     = temp;
  }
 
  quicksort(A, i);
  quicksort(A + i, len - i);
}


Интересно, насколько картинка будет понятнее текста.

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

Хотя надо признать периодически вылезают дилетанты, пытающиеся что-то такое делать. Хоть тот же ДРАКОН.

В случае ДРАКОНа (и система ГРАФИТ-ФЛОКС) вылезли не совсем уж дилетанты.

Zubok ★★★★★
()

Опять двадцать пять.

Miguel ★★★★★
()

Прими таблетки уже.

anonymous
()

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

dave ★★★★★
()

Простота программирования и эффективность, не меньшая, чем у Си, убьет C++, Python, Java, Javascript и прочую ерунду с раздутыми и полными багов абстракциями

Межпланетный шахматный конгресс.avi

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

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

Видимо...

Имелся в виду smalltalk browser...

Но как это не взлетело тогда, так не думаю что взлетит и сейчас.

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

Ну почему?

Если заказчик требует отчёт, то для визуализации алгоритма а общем и целом, оно вполне-вполне.

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

Ну Simulink-то да.

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

Moisha_Liberman ★★
()

Устарело

Будущее за нейросетями и видеороликами. А также за виртуальной реальностью.

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

Здраствуйте. Я, Кирилл. Хотел бы чтобы вы сделали игру, 3Д-экшон суть такова… Пользователь может играть лесными эльфами, охраной дворца и злодеем. И если пользователь играет эльфами то эльфы в лесу, домики деревяные набигают солдаты дворца и злодеи. Можно грабить корованы…

И никак иначе.

EXL ★★★★★
()

Больше инвалидных кресел, хороших и удобных!

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

сравнивать программы из сотни строк с программами из десятков тысяч…

tz4678 ★★
()

После чего перенести сам Metaprog на Си

Визуальный Си в моём понимании это такая среда где все самые безумные трюки с памятью и указателями можно будет показать в понятной визуальной форме.

Как ты визуально покажешь, например такой код? http://www.catb.org/jargon/html/D/Duffs-device.html


   register n = (count + 7) / 8;      /* count > 0 assumed */

   switch (count % 8)
   {
   case 0:        do {  *to = *from++;
   case 7:              *to = *from++;
   case 6:              *to = *from++;
   case 5:              *to = *from++;
   case 4:              *to = *from++;
   case 3:              *to = *from++;
   case 2:              *to = *from++;
   case 1:              *to = *from++;
                      } while (--n > 0);
   }

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

vladimir-vg ★★
()
Последнее исправление: vladimir-vg (всего исправлений: 1)

Ты упрлс?! Я даже UML предпочитаю в PlantUML делать, а не мышкой.

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

Если не нужно это выполнять где-то, то в человеческом мире оно должно начинаться с async и идти дальше синхронно.

Shadow ★★★★★
()

Графическое программирование намного проще и понятнее.

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

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

smalltalk текстовый, мимо кассы. Еще и дебильные объектные модели.

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

оно должно начинаться с async и идти дальше синхронно

А как будет рисоваться async?

И даже если ограничиться синхронными вычислениями. Как нарисуете

pad :: Int -> String
pad x = replicate x ' '

oneRow :: Char -> (Int, Int) -> String
oneRow c (0, y) = pad y ++ [c] ++ pad y
oneRow c (x, y) = pad y ++ [c] ++ pad x ++ [c] ++ pad y

diamond :: Char -> Maybe [String]
diamond = Just . (\x -> x ++ tail (reverse x)) . mkTop . subtract 64 . ord
  where rows x = zip (0 : take (x-1) [1, 3..]) [x-1, x-2..0]
        mkTop  = zipWith oneRow abc . rows
        abc    = map chr [65..90]

?

monk ★★★★★
()
Ответ на: комментарий от vladimir-vg

В LabVIEW, например, есть case-структуры, или структуры выбора. https://i.postimg.cc/3rcCmDGS/image.png

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

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

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

Это как раз картинкой проще чем текстом: https://cdncontribute.geeksforgeeks.org/wp-content/uploads/duff-device.png

А вот когда простенькое

while (*d++ = *s++);

превращается в простыню из квадратиков, то читабельности это не прибавляет.

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

В LabVIEW, например, есть case-структуры, или структуры выбора.

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

Если уж тащишь в визуальный интерфейс, значит предоставь такие способы увидеть что-то, что нереально сделать через текстовый интерфейс.

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

Через текст реально сделать такую сложную вещь, как ядро Linux. Но это нереально сложно. В первую очередь - не столько новые возможности, сколько упрощение пользования низкоуровневым Си. Упрощения до уровня возможности отказаться от идиотской ерунды типа объектных моделей.

А также куча других возможностей. Например, автоматическая параллелизация потоков исполнения. Или одновременное коллективное программирование одной блок-схемы через интернет, процесс будет похож на онлайн игру.

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