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)

Мне кажется делать графический С это бессмысленно, лучше построить на чем то максимально высокоуровневом, что бы можно было сравнивать float'ы, оперировать с большими числами, юникодными строками...

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

Владимир

В C имеется возможность работы с памятью и набор управляющих операторов, которые позволяют реализовать любой алгоритм.
В частности можно реализовать и а-ля классы C++, ... /не утверждаю, что нужно, но можно/.
У программистов всегда имеется выбор: - хныкать, что C плохой /с вариациями на тему/; - вести «языковые войны»; - ... и многое в том же духе; - ...

Мой выбор всегда однозначен - нужно проектировать и реализовывать, объекты, архитектуры, ... и все будет Ok!

PS: Windows да Linux реализованы с использованием C.

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

Ну можно сделать удобные функции и объекты для работы со строками и большими числами, но их нужно сделать тогда «стандартными объектами», а если нужна скорость пусть используются обычные char*, int, float. Вот в Си я не могу прочесть строку из ввода и сразу разбить ее корректно на символы, надо подключать библиотеки, и все такое, это путь в никуда, си уже есть.

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

Владимир

Неплохие URL /для начала/.

https://github.com/orangeduck/Cello                        Higher level programming in C http://libcello.org/

http://libcello.org/                                       Cello is a library that brings higher level programming to C.
                                                           By acting as a modern, powerful runtime system Cello makes many things easy that were previously impractical or awkward in C such as:

                                                           Generic Data Structures
                                                           Polymorphic Functions
                                                           Interfaces / Type Classes
                                                           Constructors / Destructors
                                                           Optional Garbage Collection
                                                           Exceptions
                                                           Reflection

                                                           And because Cello works seamlessly alongside standard C you get all the other benefits such as great performance, powerful tooling, and extensive libraries.

https://github.com/orangeduck/Corange                      Pure C Game Engine http://www.youtube.com/watch?v=482GxqTWXtA

https://github.com/orangeduck/mpc                          A Parser Combinator library for C
                                                           https://en.wikipedia.org/wiki/Greenspun%27s_tenth_rule  Greenspun's tenth rule of programming is an aphorism in computer programming and 
                                                                                                                   especially programming language circles that states:

https://github.com/orangeduck/tgc                          A Tiny Garbage Collector for C
                                                           tgc is a conservative, thread local, mark and sweep garbage collector, which supports destructors, and automatically frees memory allocated by tgc_alloc and
                                                           friends after it becomes unreachable.

https://github.com/antirez/sds                             Simple Dynamic Strings library for C
anonymous
()
Ответ на: комментарий от vladimir_vist

что бы можно было сравнивать float

кто запрещяет?

юникодными строками

есть в C99

большими числами

ну вот этого не хватает

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

кто запрещяет?

Реальный мир.

есть в C99

По нормальному это даже в C11 не сделано.

ну вот этого не хватает

Удивлен, думал скажешь про какие нибудь расширения.

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

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

man fgets

CONFORMING TO POSIX.1-2001, POSIX.1-2008, C99.

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

Владимир

Не использовал эти библиотеки ... /хороши они или нет не знаю/.
По крайней мере эти URL демонстрируют малую часть потенциала C.

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

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

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

под «нельзя сравнивать флоаты» ты сетуешь на оператор == для флоатов который работает с какой-то хорошей для всех погрешностью?

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

и в конце он такой: «ну гдэ=то сэм-восэм разница, в 5 знаке опосля запятой»

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

Да там в принципе числа себя плохо ведут, нужно сохранять как то все операции и «начальные числа», и смотреть в какую функцию передается результат, и там уже принимать решение как вычислять все что нужно, используя float, или юзая сверхточный матан.

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

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

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

Ну так и числа криво считают почти все языки, хотя вот Perl6 вроде без ошибок может считать.

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

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

Это ж глифы. Из известных мне языков самое низкоуровневое, что по дефолту работает с ними в строках — swift.

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