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

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

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

Но есть и исключение. Из существующих систем нет ничего проще в отладке, чем LabVIEW. Там можно ставить пробы и точки остановки (breakpoint) прямо на проводках между блоками.

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

https://ru.wikipedia.org/wiki/Спор_Таненбаума_—_Торвальдса

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

Ты меня о чем спрашиваешь? Я видел код генеренный рапсодией, и непосредственно имел дело с кодом генеренным tau sdl. Это был Си. Писал энвайронмерт для этого дела на мк, и на самом граф.движке удалось потыкать мышкой.

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

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

metaprog ()

Я уже рисую простенькие блок-схемы. Добился того, что функции, типы, структуры, юнионы

на таком уровне - блоксхемы бесполезны (аргументы функций, statement вызова функции, выражения). Это уровень кода, даже в тулзах, приведенных мной выше. Погляди всё же на SDL (https://en.wikipedia.org/wiki/Specification_and_Description_Language ) - там граф. блоки на вполне адекватных уровнях абстракции.

Но это всеравно овно. Но для просвещения полезно, имхо.

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

И не надо. Не пиши. Ни на жабе, ни на плюсах, ни на Си. И в мире не появится ничего ужасного, типа аналогов LabVIEW.

Серьёзно, это настолько отвратительно, что даже не хочется как-то аргументировать и указывать недостатки. Если тот же LabVIEW ещё худо-бедно применим для создания схем обработки сигналов измерительных приборов и прочей высокоуровневой работе с железом, что от программирования довольно далеко, то концепция твоего поделия изначально ориентирована на то, что никому в здравом уме не нужно. И уж конечно, удобным визуальное программирования можно назвать с очень большой натяжкой. Очень. ОЧЕНЬ большой. Примерно как удаление гланд через задний проход.

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

// Да, я имел дело с LabVIEW и плевался от него целый семестр

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

я для чего про энвайронмерт написал? Да, позволяет. Но сила не в этом, а в SDL

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

Мы как раз занимаемся визуальными средствами составления диаграмм. Мышкой. В браузере.

Мне-то, тоже проще это текстом на специальном языке (не XML!) описать, но речь не о моих личных предпочтениях, а о том какие технологии в мире востребованны.

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

Владимир

Лет пять назад реализовал следующее.
Имеет MSDN и имеются include.
Утилита парсила текст HTML, находила в include объявления функций, ...

Результатом работы был набор *.h и *.cpp, код которых являлся wrappers к API Microsoft /+ набор xml файлов/.

class Caret

// --------------------------------------------------------
// --- Creates a new shape for the system caret and assigns ownership of the caret to the specified window. The caret shape can be a line, a block, or a bitmap.
//     
 BOOL WINAPI  CCaret::CreateCaret(
 _In_      HWND    hWnd,
 _In_opt_  HBITMAP hBitmap,
 _In_      int     nWidth,
 _In_      int     nHeight
) {
/*
Parameters

hWnd [in]                Type: HWND                                                                                                                           
                         A handle to the window that owns the caret.                                                                                          

hBitmap [in, optional]   Type: HBITMAP                                                                                                                        
                         A handle to the bitmap that defines the caret shape. If this parameter is NULL, the caret is solid. If this parameter is (HBITMAP)   
                         1, the caret is gray. If this parameter is a bitmap handle, the caret is the specified bitmap. The bitmap handle must have been      
                         created by the CreateBitmap, CreateDIBitmap, or LoadBitmap function.                                                                 
                         If hBitmap is a bitmap handle, CreateCaret ignores the nWidth and nHeight parameters; the bitmap defines its own width and height.   

nWidth [in]              Type: int                                                                                                                            
                         The width of the caret, in logical units. If this parameter is zero, the width is set to the system-defined window border width.     
                         If hBitmap is a bitmap handle, CreateCaret ignores this parameter.                                                                   

nHeight [in]             Type: int                                                                                                                            
                         The height of the caret, in logical units. If this parameter is zero, the height is set to the system-defined window border          
                         height. If hBitmap is a bitmap handle, CreateCaret ignores this parameter.                                                           


Return value

Type: BOOL

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.


Remarks

The nWidth and nHeight parameters specify the caret's width and height, in logical units; the exact width and height, in pixels,
depend on the window's mapping mode.


*/

 BOOL  bVp1 = TRUE;

 ErrorClear                                                // Clear error datas

BOOL  bRet = ::CreateCaret(
  hWnd,
  hBitmap,
  nWidth,
  nHeight
 );

// --- 
//
 if ( bRet == FALSE ) {

  ErrorDataCode( TRUE, FALSE )                             // Проверка на наличие ошибки

 }

 return  bRet;                                             // 

}                                                          //  BOOL WINAPI  CCaret::CreateCaret(

[/cut]

Кстати утилита нашла ряд ошибок в текстах, содержащем API функций

Шутка
На вашем месте сгенерировал бы код всех блок схем.

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

Средства контроля многопоточности можно обеспечить специальными блоками.

А на чем программируешь-то?

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

У автора си головного мозга. Он не понимает, что визуальное программирование - это не функции мышкой вызывать. До процессов бизнеса еще как до луны.

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

Средства контроля многопоточности можно обеспечить специальными блоками

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


А на чем программируешь-то?

Прошивки микроконтроллеров и всякий мелкий софт — на Си, остальное — на плюсах. Это имеет какое-либо значение?

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

Описание процессов бизнеса (и не только) — задача важная и нужная, её часто не хватает в том или ином аспекте. Программирование мышкой же…

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

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

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

Пожалуйста. Самое простое - 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);

}

Пример посложнее: запись и в 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));

}

Заметьте несколько моментов:

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

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

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

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

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

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

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

Сделаю, как раз разбираюсь с функциями стека TCP и циклами.

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

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

Линус может сколько угодно крыть плюсы матом: „есть два типа языков: первые все ругают, а вторыми никто не пользуется“. К тому же, раздутие кода — не такая большая проблема, он всё равно оптимизируется при компиляции. Зато шаблоны проектирования, приводящие к раздутости (к слову, многие из них можно реализовать и на Си, просто это редко делают), делают проект более структурированным, что есть хорошо.

Всему своя ниша и свои задачи

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

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

Не более чем системы для прототипирования под джаваскрипт и хаскелл. О системах прототипирования замечание уже было.

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

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

Есть по крайней мере два способа справиться с проблемой масштабирования:

1. Поддиаграммы (то же, что функции в текстовых языках).

2. Зум колесиком мыши «от земли до космоса» как в стратегических играх.

И то, и то будет вополщено.

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

Уже есть первые примеры с массивами (первое сообщение обновлено), сортировка будет чуть позже, когда налажу циклы. Хотя в stdlib уже есть функция qsort, сделаю, как пример.

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

char metaprog_array_pointer_10156130170823954432[] = {72,101,108,108,111,32,87,111,114,108,100};

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

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

А зачем вам плюсы, есть есть Си?

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

quantum-troll ★★★★★ ()

Metaprog

Казалось бы, при чём тут метапрограммирование?

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

Владимир

Неплохо!
Но вы еще даже к лесу не подошли ...

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

Они же приводят к раздутию кода,

К раздутию кода приводит тупость кодера. У нормального программиста С++ влазит даже в AtTiny13, не говоря уже про STM32xxx

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

Ага, значит это не визуальный Си. Это какой-то новый язык, гораздо более ограниченный чем Си. Ок.

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

Желания благородные конечно, но у тебя, автор, пока ещё каша в голове. Ты всерьёз размышлял как именно ты достигнешь таких фич?

Ну перетащишь весь код в базу данных и будешь редактировать код через заковыристый UI вместо текста, дальше что? Как именно ты будешь создавать возможность совместной работы?

vladimir-vg ★★ ()

Мне кажется делать графический С это бессмысленно, лучше построить на чем то максимально высокоуровневом, что бы можно было сравнивать 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 ()
Ответ на: комментарий от anonymous

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

vladimir_vist ()
Ответ на: комментарий от 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 ()
Ответ на: комментарий от andalevor

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

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

Думаю обязательно нужно сделать набор only с клавиатуры, что бы быстро составлять эти схемы, и вимщики не жаловались.

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

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

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

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

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

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

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

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

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

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

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

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

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

Владимир

Согласен!
C/C++ использую только для разработки API.
К примеру для парсинга MSDN /о чем говорил ранее/ реализовал с
использованием JavaScript и PHP /«И хрустит и очень вкусно»/

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

Сишный код скармливется компилятору gcc, а сишный код генерируется автоматически. С программистом взаимодействует только графическая диаграмма.

Строка не нуль-терминированная, так как длина строки-массива известна, а функция fwrite, в отличие от printf, требует длину массива, а не «0» на конце. Там, где «0» на конце нужен, он стоит, даже в этих примерах есть.

Еще раз о причинах писать именно цифрами:

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

metaprog ()

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

Дракон? Нет, не слышали.

По состоянию на 2019 год оно опенсорсно и кроссплатформеннно.

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

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

Для обработки сигналов всякой.

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