Чому сі - добре, а сі

Мова програмування Сі створювався з конкретною метою: це мова для написання портіруемость програм, при цьому максимально ефективний в плані швидкодії, який можна порівняти з асемблером (який на всіх апаратних платформах різний). Зручність програмування в Сі - це річ третьорядна, він дійсно не дуже зручний. Виконуються тільки ті дії, які програміст прописав явно - саме тому рядки і масиви реалізовані так дубово і непоказний.

Якщо поставити перед собою таке завдання і писати відповідно до стандарту ANSI C, то на Сі можна написати портіруемость програму або бібліотеку функцій. Цю програму можливо відкомпілювати практично на будь-якому типі процесора - компілятор Сі є скрізь. І вона буде працювати. Прикладів незліченну кількість (zlib, libpng і так далі).

Отже, Сі - це мова низкоуровневого програмування, призначений для створення портіруемость програм і бібліотек функцій. Його створення було справжньою революцією, тому що він дозволив відв'язати програми від конкретної процесорної архітектури, практично нічого не втративши в продуктивності і швидкодії, в порівнянні з асемблером.

Цю нішу він зайняв назавжди і пребуде в ній назавжди. Немає сенсу придумувати щось ще.

Спочатку творці мови Сі і системи Unix припускали, що виникнуть інші мови, більш зручні для програмістів (кожна мова зі своєю спеціалізацією). Для кожного такого мови, на Сі буде написаний транслятор (НЕ компілятор), який транслює исходник з цієї мови знову ж на Сі, а не в виконуваний код. І вже цей проміжний Сі-текст транслюється Сі-компілятором в бінарний виконуваний файл. Такою була початкова філософія системи Unix: всі програми портіруемость і всі мови надбудовуються над базовою мовою Сі.

Улучшайзеров Бйорн Страуструп і його Сі ++

І ось, користуючись тим, що мова Сі багато хто знає, хтось Бйорн Страуструп вирішив його "проапгрейдить": він приліпив додаткові фічі (здебільшого абсолютно ідіотські - начебто перевантаження стандартних операторів) і додав "об'єктно-орієнтованість". Ну, що стосується "об'єктно-орієнтованості" - це окрема розмова, а в цілому отримали наступне: в мову введено неявні приховані механізми, які не працюють однаково на різних платформах, портіруемость програми писати неможливо, і в той же час мова незручний для високорівневого програмування , як і Сі. Компілятори Сі ++ набагато складніше, ніж компілятор Сі, і є не скрізь. В основному Сі ++ використовують, тому що під нього написані бібліотеки класів (як правило прив'язані до певної платформі і операційній системі).

Проте, Сі ++ використовують і пишуть на ньому програми. Ну просто людина до всього звикає.

Дінрус - це російська версія мови програмування D. На даний момент мова знаходиться в розробці - ведеться розробка основної рантаймной бібліотеки Dinrus.Base.dll
Описувати переваги Ді перед Сі ++ не буду - вони дуже високі.
Що стосується Дінрус, то я особисто займаюся його розробкою і хотів би знайти кваліфікованих помічників.
Сі входить сюди ж, як складова частина.
Ось ряд сішних функцій в Дінрус:

цілий видали (in ткст фімя);
alias видали remove;

цілий перейменують (in ткст з, in ткст в);
alias перейменують rename;

хук времфл ();
alias времфл tmpfile;

ткст час (ткст s);
alias час tmpnam;

цілий закройфл (хук потік);
alias закройфл fclose;

цілий слейфл (хук потік);
alias слейфл fflush;

хук откройфл (in ткст фімя, in ткст режим);
alias откройфл fopen;

хук переоткройфл (in ткст фімя, in ткст режим, хук потік);
alias переоткройфл freopen;

проц устбуф (хук потік, ткст буф);
alias устбуф setbuf;

цілий уствбуф (хук потік, ткст буф, цілий режим, т_мера розмір);
alias уствбуф setvbuf;

цілий вфвиводф (хук потік, in ткст формат, спіс_ва арг);
alias вфвиводф vfprintf;

цілий вфсканф (хук потік, in ткст формат, спіс_ва арг);
alias вфсканф vfscanf;

цілий всвиводф (ткст s, in ткст формат, спіс_ва арг);
alias всвиводф vsprintf;

цілий вссканф (in ткст s, in ткст формат, спіс_ва арг);
alias вссканф vsscanf;

цілий ввиводф (in ткст формат, спіс_ва арг);
alias ввиводф vprinf;

цілий всканф (in ткст формат, спіс_ва арг);
alias всканф vscanf;

цілий берісфл (хук потік);
alias берісфл fgetc;

цілий вставьсфл (цілий c, хук потік);
alias вставьсфл fputc;

ткст дайтфл (ткст s, цілий n, хук потік);
alias дайтфл fgets;

цілий вставьтфл (in ткст s, хук потік);
alias вставьтфл fputs;

ткст дайте (ткст s);
alias дайте gets;

цілий вставте (in ткст s);
alias вставте puts;

цілий отдайс (цілий c, хук потік);
alias отдайс ungetc;

т_мера Новомосковскйфл (ук указат, т_мера розмір, т_мера nmemb, хук потік);
alias Новомосковскйфл fread;

т_мера пішіфл (in ук указат, т_мера розмір, т_мера nmemb, хук потік);
alias пішіфл fwrite;

цілий дайпозфл (хук потік, цілий * поз);
alias дайпозфл fgetpos;

цілий устпозфл (хук потік, in цілий * поз);
alias устпозфл fsetpos;

>> максимально ефективний в плані швидкодії

Швидкодія визначається реалізацією компілятора / оптимізатора і стандартних бібліотек. Сам по собі мова не може бути гальмівним або швидким.


>> Якщо поставити перед собою таке завдання і писати відповідно до стандарту ANSI C, то на Сі можна написати портіруемость програму або бібліотеку функцій.

Аргумент відстійний. Стандарт ANSI C занадто малий і навіть мережевий введення / виведення в себе не включає. Про яку портіруемость мова? Для утиліт рівня grep / echo / cat? Тому що ніяке графічне додаток на ANSI C написати не вийде. Кросплатформеність в бібліотеках типу qt / gtk досягається за рахунок подачі різного коду різних архітектур. Немає причин, по яким те ж саме можна зробити і в C ++.

zlib і libpng погані приклади, оскільки це допоміжні бібліотеки, яким від системи потрібно хіба що виділення пам'яті або файловий ввід / вивід - це повинно бути в будь-стандартної бібліотеці будь-якої мови програмування. Решта в них складають найчистіші алгоритми.


>> Компілятори Сі ++ набагато складніше, ніж компілятор Сі, і є не скрізь.

Компіляторів купа, і під різний. Той же GCC може бути легко портований на потрібну архітектуру. Пояснюю принцип його роботи - код на C ++ спочатку транслюється в асемблер цільової архітектури, після чого до нього "пришивається" OS-залежний код (типу ініціалізації при старті і т.д.), після чого все це лінкуются в потрібний виконуваний формат, разом з Портировать стандартними бібліотеками.


>> В основному Сі ++ використовують, тому що під нього написані бібліотеки класів (як правило прив'язані до певної платформі і операційній системі).

Раптово, для використання C ++ бібліотек зовсім не обов'язково писати на C ++. Достатньо написати заглушку класів в процедури на C. Зачатки ООП є в бібліотеці Glib (не плутати з Glibc), яку використовують і в проектах на C.

Давно не Новомосковскл такої нісенітниці. На сьогоднішній день C ++ є найкращим мовою програмування, на мій погляд. І C природно теж. як його складова частина. Єдине-ця мова вимагає професіоналізму, його переваги проявляються при рівні підготовки розробника набагато вище середнього.

Репост багаторічного товстого наброса давно протухлого холівара на рівні восьмого класу. Свіжіше нету?

марення сивої кобили