Как стать автором
Обновить

Комментарии 64

И для кого же эта статья на Хабре?

Сначала, не понял для кого Ваш коммент.
Сейчас тоже не понимаю.

А так в конце статьи
Уткнулся в пределы быстродействия используемого им языка программирования, например, Python.
и пр.

Думаю, ниже увидим.

Походу, для любителей холивара.
Уткнулся в пределы быстродействия используемого им языка программирования, например, Python.
и пр.

Golang? Rust? Даже на Java высокоэффективный код пишут…

Перешел на Rust и C вспоминаю как страшный сон :D
Можно по разному относиться к C, но различные API еще долго будут писаться именно на нем. Так что хотя бы базовое знание C будет не лишним, даже если именно на нем ничего не писать.

Системные API — может быть!
Но вот «обычные» веб-API — нет, для них есть более подходящие языки!!!

Но Rust ведь тоже «не очень» для «обычных» веб-API. Естественно, я имел ввиду не веб — статья то про C.
Но Rust ведь тоже «не очень» для «обычных» веб-API

нет, есть же actix… Градация какая (от более к менее):


  1. python/golang
  2. java
  3. rust
  4. все остальное
Я, например, веб-интерфейсы к серверному софту на C++ пишу. Правда, при этом прекрасно осознаю, что это явно не мейнстрим.
Приходит время перебираться на текстовый браузер.
Перейти из C во что угодно можно плюс-минус за день. А вот перейти из условного «PHP» в C за день не получится.
Можно, конечно, «плюс-минус за день» перейти с C на C++, но при этом Вы все равно будете писать на С используя лишь компилятор плюсов. А вот научиться думать на другом языке займет намного больше времени.
о что угодно можно плюс-минус за день

удачи перейти в джаву коммерческую со спрингом (гы-гы-гы) или в какое-нибудь функциональное программирование (хаскель?)

Прошу прощения, но без уточнения предметной области, Ваше заявление звучит как «купил экскаватор, вспоминаю лопату, как страшный сон».
>Стоит, конечно, признать, что зарплаты на начальном этапе программистам на С предлагают на порядок меньше, чем на Python или Java.
Я сильно сомневаюсь, что среди программистов вообще бывают зарплаты, реально отличающиеся на порядок.

Может двоичной порядок?

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

50000 рублей и 500000 рублей — вполне реально, десятичный порядок

Это уж совсем крайние случаи, надо сказать. В моей окрестности нет зарплат 500, и 50 нет тоже. У нас более реалистичный диапазон — от 80 (а реально видимо больше) до скажем 350.

Ну или точнее так — если это про один город, то между C и питон программистом такой разницы не будет никогда. Она будет между совсем ничего не умеющим джуном/стажером, и специалистом достаточно редкого высокого уровня (скорее всего — с задачами руководства командой). Языком это не объясняется ну никак.

Да пёс его знает, что имели в виду в статье ) если то, что разрабам на Си (начинающим) платят на порядок меньше, чем начинающим pythonшокам, то соглашусь с Вами, что разница вряд ли столь огромна. А если сравнивать профессионального программиста и новичка, то причём тут python/Java? :)
Я скорее к тому, что натянуть этот тезис автора на глобус, наверное, возможно при определенных условиях )

Ну или точнее так — если это про один город, то между C и питон программистом такой разницы не будет никогда.
На самом деле, легко может быть разница на двоичный порядок, типа 80 и 160. Если сишники в регионе требуются преимущественно с прицелом на железо на древние заводы и разные там НПО/НПП/НИИ, где 80 тыщ — предельная зарплата за полную ставку даже для матерого «ведущего инженера» с завидным опытом (а «инженеров» и «программистов» руководство не различает принципиально), а на Python'е местные галеры пишут какой-нибудь ERP или е-коммерс с кучей клиентов и 160 там вполне нормальная синьорская зарплата.

Ну 99000 и 101000))

Посмотрел программу курса, посмотрел на книгу Кернигана-Ричи. От книги, кмк, толку как раз, сколько надо, а вот курсы си, если не ведут к ковырянию ядра линукса, как-то не очень применительны. Да, МК, и вот это все, но это у К-Р есть.
НЛО прилетело и опубликовало эту надпись здесь
Не буду писать про 1992-й год, когда в ходу ничего особо и не было, кроме асма и паскаля.
Низкоуровневое программирование.
Микроконтроллеры — да.
Можно писать так, что понимаешь, как это транслируется без лишних затрат.
Плюсы были излишними.

Насколько это востребованно сейчас — невостребованно.
Только с очень редкими вакансиями, которых почти нет.
Можно выделить 4 основных повода освоить C:


  • Для написания программ с бескомпромиссным быстродействием.

Но ведь C не даёт бескопромиссного быстродействия.


  • Для низкоуровневого программирования различных устройств, например, Arduino, мощности которых не хватает ни на какие другие языки.

Вот прям совсем ни на какие? Даже на C++?

Совсем заклевали чистый C!!!

Попробую в обратку сыграть:

Язык C нужен! сейчас! практически безальтернативно (или, э-э-э, ассемблер?):
— для программ, где нет (или с ней проблемы) динамической памяти. Т.е. память есть, страниц/виртуализации/арены/кучи — нет;
— где нет операционки. Да, можно натянуть плюсы, однако всё это грустно…
— для написания драйверов. Да, до сих пор! Читал про заходы C++, читал про «оригиналов», пишущих драйвера на C#, но…
— в банковском секторе (естественно, в узкой сфере);
— в авиационном ПО.
Два последних пункта связаны с возможностью автоматизированной проверки/верификации кода на правильность/отсутствие/недопущение и т.д.

Вот с верификацией, да еще автоматизированной, как раз все плохо. Да, драйвера, ОС, конечно пишут. Просто таких людей мало.
Так я же не утверждал, что с верификацией всё хорошо :).
Это у них что-то типа требования: прохождение определённых тестов по коду. При этом используется урезанный C, запрещён ряд функций, и для компиляции используется «сертифицированный» компилятор.
>Так я же не утверждал, что с верификацией всё хорошо :).
ну мне видимо так показалось. Я исходил из того, что если верификация нужна, то используют чуть более другие языки. Пытаются, во всяком случае.

Это какая-то бумажная сертификация, а не формальная верификация.

Мне С дал базовые знания. Я считаю что с этого языка надо учить программировать.
Не понимаю, что так все Си критиковать стали? Ладно — статью за ее 100% рекламный характер и некую небрежность, про те же порядки. Как наСИльник с более чем 20 летним стажем в сфере встраиваемых систем, с полной уверенностью скажу, что язык будет еще долго актуален. Незаменимый инструмент в своей области. Ни один другой язык, кроме ASM и C++, не позволит так близко и гибко «подобраться» к железу. Да те же WEB сервисы в «мелких» IoT устройствах, кроме как на Си(++) не пишут. Компактность исполняемого кода, скорость выполнения. Ни один язык и близко не стоит. Кроме того, Си — это не столько про язык, сколько про архитектуру вычислительных систем. К сожалению, все чаще появляются люди, крутые специалисты в ЯП высокого уровня, но абсолютно не понимающие элементарных принципов работы вычислительной системы. Нет, я не призываю всех переходить на Си. Выкопать котлован детской лопаткой можно, но лучше использовать экскаватор. А вот создать песчаную скульптуру экскаватором — практически нереально. Ни лопатка ни экскаватор в этом не виноваты. Священные войны, что лучше, Си или Питон — это либо троллинг, либо полнейшая некомпетентность спорунов.

Забавно, но с языком "C" меня связывает только Arduino, на котором используется упрощёная версия C++

С чего Вы взяли, что это «упрощенная версия»? Вроде бы используется вполне «взрослый» компилятор g++.
Он самый и используется. Скорее, дело в препроцессоре Wiring, который, почему то называют языком программирования. habr.com/ru/post/55254
Как по мне, то из С и С++ выбор однозначно в сторону С++. И не ради «предельной близости к машине», а ради пользовательского интерфейса.

Об этом говорят мало, либо предлагаются различные монстры, хоть и опенсорсные, типа MFC, Qt, wxWidgets, Win32++ и т.п. Но для целей создания легкого, простого и легковесного GUI там речь особо не идет. Win32++ конечно самый простой из них, но не слишком привлекателен, поскольку использует парадигму MFC, а к ней уже успели вызвать оскомину.

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

А вся это «скорость» и «близость к железу» это ни о чем. Простой, легкий и удобный интерфейс плюс такая же работа с данными, вот практически все, что нужно обычному пользователю. А монстромания, типа 1С8х, это на любителя, тем кому «нужно все еще вчера».
НЛО прилетело и опубликовало эту надпись здесь
А кто вам сказал, что с С++ я «мучаюсь»? Наоборот, получаю удовольствие! Особенно от WTL. Интерфейс пользователя там простой, понятный, легкий и открытый. И в принципе, есть все, что нужно. А если чего нет, то можно сделать. Что мне еще надо? А C#-ом, WinForms'ами и WPF'ом пусть занимаются другие, те, кто получает удовольствие от них.

Меня, кстати, всегда удивляло, почему одни люди пытаются отговорить других заниматься тем, что им интересно и предлагают взамен свое? Я «свой» C++ / WTL может быть, слегка, рекламирую, но не навязываю.

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

Тем более, что основного кода WTL, 10-й версии, – всего ничего, менее 1,5 мегабайт, в исходниках (не считая ATL и исходных кодов поддержки Windows). Пары лет на освоение хватит за глаза, при достаточном желании.
НЛО прилетело и опубликовало эту надпись здесь
Ну, это уже не технический спор, а скорее мировоззренческий. А люди не склоны менять свои жизненные установки. Хотя, не смотря на это, легко соблазняются, если им не давать жестких указаний или советов, а просто показать, что есть что-то у кого-то. Если понравится, то начнут пользоваться, а нет, то просто пропустят мимо глаз и пойдут дальше. А доказывать, что свое болото круче соседнего, думаю, глупо. Сколько мы видели в Интернете «религиозных войн» и что толку, каждый остался при своем мнении, хорошо еще, если обошлось без «жертв».

Однако «логика обстоятельств» сильнее «логики намерений», как говорил товарищ Сталин. Поэтому, пусть она и говорит нам, кто больше прав, а кто меньше.

Я, например, предвзято относился к Питону, пока не приспичило делать очередную обработку строковых данных. Раньше я для подобного использовал Visual FoxPro и С++. Получалось неплохо, но на Питоне это как бы и проще, гораздо, и красивее.

Кстати, на Питоне можно делать и оконный интерфейс. По сравнению с AIR / Flex как-то даже «кучерявее» выходит (тем более что «Адоба» прекратила недавно поддержку Flash и Flex). Но все равно, WTL он не заменит, хотя может помочь в чем-то, если горит.

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

Текущий проект у меня связан с обучением французского языка с нуля, с помощью двуязычных субтитров накладываемых на оригинальное обучающее видео и использование моего метода «запоминания руками» ( scholium.webservis.ru ). Сами видео делаются с повторами фрагментов и паузами между ними. Примеры можно глянуть на my.mail.ru/mail/emmerald/video/_myvideo/4.html (формат 1х1, т.е. к каждому фрагменту добавляется одна пауза) и my.mail.ru/mail/emmerald/video/_myvideo/5.html (формат 3х3, по три одинаковых фрагмента с тремя паузами). Другой ролик (без пауз) можно посмотреть в my.mail.ru/mail/emmerald/video/_myvideo/3.html.

Данные для видео и пересборка самих (оригинальных) роликов делаются с помощью Питона (позже напишу статью здесь об этом). А желание обновить мою древнюю программу «Сколиум», под это дело, наткнулись на козни «Адобы». В декабре прошлого года я вспомнил как и перекомпилировал свой код на AS3 / Flex / AIR, а в январе этого года промежуточные swf-файлы создаваться напрочь отказываются, мол, Ява что-то чудит, без баяна (не помогает даже независимый Apache Flex).

Поэтому решил вместо древних инструментов задействовать WTL для написания той же программы. Пока все складывается удачно. Вот только некоторые шероховатости возникли с воспроизведением звуковых интервалов на С++.

Сама эта тема для меня не новая. Я уже делал проект на WTL с внедрением в него опенсорсного видеопроигрывателя FFPlay. Получилось здорово. Там и видео воспроизводилось, и аудио и даже картинки можно было смотреть. Сам проект был заточен на распознавание (с целью перевода и замены) встроенных субтитров как у роликов «Easy French» на Ютубе либо французского TV 7jours. Продвинулся там нормально, пока не столкнулся с хорошими внешними субтитрами, с которыми работать легче, чем с жестко «впаянными» в видео. Решил, что логичней довести их, до ума, сначала.

В текущем же проекте для поддержки звука использую SDL, который применяется и для видеопроигрывателя FFPlay. Все работает прекрасно, но с точным воспроизведением звукового интервала пока трудности. Как я смотрю, все лепят, что-то свое. В AIR / Flex звук поддерживался на автопилоте, а точность была до одного звукового сэмпла. В SDL готовых функций для этого почти нет, чем точнее, тем больше возни.

Далее WTL я собираюсь использовать для создания своего аналога программы 1С77, но 64-битной и заточенной на SQLite и MMF. Основная проблема – нужно создать общий, универсальный контрол, для списков, диалоговых и печатных форм. В Инете много подобного опенсорса, но подходящего для меня нет. Даже в Qt, не говоря уже про wxWidgets и прочее.

Как-то так. А каковы ваши технические интересы, раз уже речь пошла про них?
Я вообще задаюсь вопросом таким вот — Си самый эффективный язык для именно программирования. И я не говорю про производительность там или его близость к железу (че за бред вообще). Вам нужно ООП? Так пожалуйста пишите ООП на голом Си (или ваш JVM написан на чем то другом ?). В Си говорят нет таких понятий как полиморфизм и всей той новомодной лабуды? А как вы думаете откуда это пришло, правильно в Си был и есть полиморфизм наследование и вся прочая хрень которую вы так любите (Сука лямбды нету, тут реально обидно). Так вот к чему я это все, Си просто язык и дает вам свободу делать что в голову вам пришло. В отличии от ваших модных языков которые подают вам паттерн который по их мнению лучший и потом спорят о его величии и количестве сектантов.

Заметка для слоупоков полиформизмв си:
(foo*) bar


Заметка для слоупока: наследование
struct foo{
    bar __base__;
}


Заметка ну совсем для долеких 3:
 (bar *) foo //теперь мы обращяемся к базе класса 


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

Я люблю параметрический полиморфизм, где он в С?


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

Хочу свободу выражать ограничения на то, что могут или не могут делать мои функции. С этого не даёт.

Ну реализуй дженерики что тебе мешает?

Хочу свободу выражать ограничения на то, что могут или не могут делать мои функции

ты тут вообще о чем говоришь?
Ну реализуй дженерики что тебе мешает?

Как? Ну, кроме написания на C своего языка (что дело очень неприятное, это проще и удобнее делать на других языках).


ты тут вообще о чем говоришь?

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

чет ты загнул конечно, посмотреть на тип функции (на тип функции карл) и понять что функция не пишет в файл. Может ты имел тип который функция вернет но причем тут писать в файл. Тут уже пахнет каким то вуду а не программированием.

Допустим вот сигнатура функции (может ты это имел под типом)
void Get();

иди определи что она пишет и куда и не говори мне что тут Си виноват

Ну так про то и речь: в C это сделать невозможно (иначе я бы не приводил этот пример), и тут виноват именно C и его слабая система типов.


В некоторых других языках я могу написать get : Int или, что то же самое, get : () -> Int, и я буду знать, что эта функция никуда не лезет (и, как следствие, понятно, что она всегда возвращает одно и же число).


Могу написать get : IO Int, и тогда будет понятно, что эта функция может делать вообще всё что угодно. Могу написать get : MonadReader SomeType m => m Int, и тогда буду знать, что эта функция, возможно, обращается к некоторому окружению с типом SomeType (а, может, и не обращается).

int Get() не утраивает? че за бред с get: IO int  ? как сигнатура функции может отвечать за ее процесс? Слабая система типов? как типы или сигнатура функции отвечает за ее исполнение? Какая слабая система типов?
int Get() не утраивает?

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


как типы или сигнатура функции отвечает за ее исполнение?

Вам вкратце или развёрнуто?


Если вкратце, то ограничивая то, что функция может или не может делать. Собственно, зачаточные элементы таких ограничений есть и в С: если вы пишете int Get(double), то char* вы туда передать не сможете, а функция точно не будет вычислять strlen от своего аргумента. И ко второму аргументу функция не обратится, потому что у неё его нет.


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


Если развёрнуто, то это вопрос на полгода-год чтения книг вроде types and programming languages или, например, более практической type-driven development with idris.

боже что за ахинею ты несешь.
Вот я возьму и вызову strlen на аргумент инт. И где тут ограничения?

И ко второму аргументу функция не обратится, потому что у неё его нет.

ну тут вообще просто огонь. В Си все функции пытаются делать что ты с несуществующими аргументами.
Вот я возьму и вызову strlen на аргумент инт. И где тут ограничения?

так в этом смысл — ограничения должны быть, чтобы можно было писать математически верный и верифицируемый код. А использовать Си как "мощный" ассемблер… можно, но это слишком низкоуровнево )

Вот я возьму и вызову strlen на аргумент инт. И где тут ограничения?

Они в C, увы, лишь warning, но тем не менее:


% cat shit.c               
#include <string.h>

int main()
{
        int a = 0;
        return strlen(a);
}
% clang shit.c -o /dev/null
shit.c:6:16: warning: incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' [-Wint-conversion]
        return strlen(a);
                      ^
/usr/include/string.h:391:35: note: passing argument to parameter '__s' here
extern size_t strlen (const char *__s)
                                  ^
1 warning generated.

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

Например?

А по поводу писать свой язык ради дженериков. Еле палы вы молодые такие ленивые и совсем думать не хотите.

Если тебе надо мета программирование то задайся вопросом как компилятор решает эту проблему. Если ты хочешь дженерик контейнеры посмотри как glib это организовал. Штука просто отличная и использовать раз в 100500 удобней не говоря уже про понятность кода.

Так что именно из этого тебе надобно? Все есть. все удобно и эффективно в отличии от массива библиотек вроде бустов и всякой дребедени.

Вопрос остаётся только в скорости разработке на Си. Да это дольше если ты нубас и не вникаешь в суть дела. Да это тяжелее если ты не вникал в саму суть проблемы. Но если ты подкован в теме то реализация функционала на Си очень проста и прямолинейна без лишних абстракций ради абстракций. В этом случае разработка течет очень быстро и без проблем.

Когда у людей проблемы с Си: когда новые программисты привыкли что есть куча библиотек с готовыми решениями и простыми интерфейсами. Но нам не платят за готовые решения. Да есть джава и си шарпы, да они удобны для написания бизнес логики но это маркетинг. Все тоже самое можно сделать на Си ну или на С++ без каких либо проблем (хотя с++ высший уровень мазохизма конечно)
Если тебе надо мета программирование то задайся вопросом как компилятор решает эту проблему.

Я знаю, как компилятор решает эту проблему (хоть компилятор плюсов, хоть хаскеля), и писал свои тайпчекеры, поддерживающие параметрический полиморфизм.


Если ты хочешь дженерик контейнеры посмотри как glib это организовал. Штука просто отличная и использовать раз в 100500 удобней не говоря уже про понятность кода.

Это где через void* всё? Спасибо, не надо.


  1. Нулевая поддерживаемость — компилятор не ловит ошибки (ведь у него же нет информации о типах).
  2. Нулевая оптимизируемость — компилятору очень тяжело видеть за всеми этими указателями, и инлайнить код он не может.

Так что именно из этого тебе надобно?

О, да чего только не надо. Сортировки с типом чуть умнее, чем qsort. Списки-массивы те же. Ассоциативные контейнеры. Парсеры на комбинаторах.


Можете привести пример парсера на комбинаторах на C? Не кодогенеренный lex/yacc/etc, а вот ну хотя бы как boost.spirit, я уж не говорю о вещах типа megaparsec/trifecta/etc?


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

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

Сортировки с типом чуть умнее, чем qsort. Списки-массивы те же. Ассоциативные контейнеры. Парсеры на комбинаторах.


так это не к языку предъява а к тебе как программисту.

Нулевая поддерживаемость — компилятор не ловит ошибки (ведь у него же нет информации о типах).


а ты там зачем нужен?

Можете привести пример парсера на комбинаторах на C? Не кодогенеренный lex/yacc/etc, а вот ну хотя бы как boost.spirit, я уж не говорю о вещах типа megaparsec/trifecta/etc?


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

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


а ты там зачем нужен?

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


А то, знаете, так можно дойти и до того, что С не нужен, можно же писать на асме. А что больше времени и усилий на это нужно, и больше простор для ошибки — ну так «а ты там зачем нужен?»


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

«Могу описать» ≠ «хочу описать» или, тем более, «считаю нужным описывать».


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

я еще раз спрашиваю причем тут язык? что за деградация пошла. Почему язык должен проверять твои ошибки или законность твоих требований? Язык тебе дан для описания процесса а не для его проверки. Есть специальные инструменты для проверок всего что тебе надо. Язык не описывает стандарты алгоритмов. Язык программирования описывает действия а не диктует их.

Это как сказать хочу что бы в Си было встроено подключению к базе данных.

Поэтому Си останется языком программировании а не средой разработки как все ваши новомодные «Языки». Нужен парсер ищи на гите. Нужен драйвер для БД, Ищи на гите. а еще лучше сделай сам. тыж программист.
Язык тебе дан для описания процесса а не для его проверки.

Так вот и ключевое расхождение: я считаю, что язык дан и для описания процесса, и для проверки корректности этого описания.


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

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


Поэтому Си останется языком программировании а не средой разработки как все ваши новомодные «Языки». Нужен парсер ищи на гите. Нужен драйвер для БД, Ищи на гите. а еще лучше сделай сам. тыж программист.

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


Вот у меня здесь описан в этак сотню строк парсер, позволяющий парсить такие или такие выражения. Как аналогичное сделать на C?

Нулевая поддерживаемость — компилятор не ловит ошибки (ведь у него же нет информации о типах).

а ты там зачем нужен?

А что это ты не на асме пишешь? Компилятор C за тебя переменные по регистрам пихает.

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

Речь про const и pure функции? Они есть в gcc и Clang. Там, вообще, огромное количество атрибутов есть. Сейчас большинство нового C кода всё равно пишется на подмножестве расширений GCC и Clang.
Речь про const и pure функции? Они есть в gcc и Clang.

Это релевантно, но этого недостаточно, так как получается либо всё, либо ничего: либо любое IO для обычных функций, либо всякое отсутствие эффектов для [[pure]]-функций.


Сейчас большинство нового C кода всё равно пишется на подмножестве расширений GCC и Clang.

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

MTX-Legion


Сука лямбды нету, тут реально обидно

лямбд нет, но есть указатели на функции — бери и вызывай )
Либо что-то через структуры и макросы можно изобразить...

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