ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
22 декабря
1040008 Топик полностью
fk0, легенда (25.09.2020 12:58, просмотров: 846) ответил Kabdim на Не могу согласится со всем.
Твоё сообщение не содержит никакой осмысленной аргументации. "Багодром, в современных языках заменено, вскрывающееся зло, выстрелы в ногу, рукожопы..." -- это лишь _твоя_ оценка, субъективная. Теперь по пунктам: 

1) Наличие возможности не означает "багодрома", если ей начинают неправильно пользоваться -- это не проблема языка, а возможности C++ оказываются шире, чем у "современных языков". Более того, понятно, почему так происходит. Современные языки типа C# и ручное управление памятью прячут от программиста. Их задача -- удешевить создание программного продукта. Позволить специалистам невысокой квалификации быстро включаться в работу. Программировать бизнес-приложения, где от языка требуются другие свойства, чем для языка используемого в системном программировании. Я в исходном сообщении указал, где данные возможности могут быть использованы: без шаблонов невозможно метапрограммирование, без которого в свою очередь невозможна реализация многих концепций доступных в современном C++, без ADL нелья отделить функции от объектов с которыми они оперируют, типичный пример -- арифметические бинарные операторы, сложение строк например ("aaa" + string).


2) Все популярные операционки -- это какие? Например BeOS была написана на C++ и имела API на C++. Многие компоненты Windows написаны на C++, в Linux тоже. Веб-браузеры пишутся на C++. Не на C#, и не на Java.


3) Речь не о "возможности интегрируемости с C", а о непосредственной, прямой совместимости, без "маршалинга" аргументов и возвращаемых значений, как в C#. На C++ можно писать библиотеку предоставляющую C-интерфейс, и можно непосредственно, напрямую, использовать C-библиотеки. При этом можно использовать хедер-файлы тоже напрямую, можно предоставлять хедер-файлы совместимые с C и C++ одновременно (через #ifdef __cplusplus). В других языках обычный вызов функции из другого языка превращается в проблему, а передача сколько-нибудь сложносй структуры данных -- в большую проблему, часто вызывающую необходимость копировать эту структуру и хранить в другом представлении. И нужны генераторы интерфейсов наподобии SWIG. Или ручное описание всех вызываемых функций и типов данных.


4) Я в теме выше давал объяснение, почему в C++ появляется возможность генерации высокопроизводительного кода. В основном это заслуга метапрограммирования и статического полиморфизма, благодаря которым компилятор в данном конкретном случае, для данного типа, может выбрать только нужные функции и структуры данных, и в итоге видит цепочку вызовов локальных (статических) функций, сгенерированных для использования именно в данном месте, которые инлайнятся и могут оптимизироваться как единое целое. При этом константы могут быть предрасчитаны в момены компиляции. Практически огромные шаблоны классов могут сжиматься до десятка машинных инструкций в данном конкретном месте. В языке C то же самое сделать можно только теоретически: вручную расписав всё для каждого варианта (вместо того, чтоб это доверить компилятору выполняющую "программу" из шаблонов) -- но это не такой код, с которым можно потом работать, это считай ассемблер получится. Так разумеется не пишут, только может оптимизируют отдельные кусочки. В основном пишутся обобщённые функции, которые оказываются медленными и не эффективными. В других языках (C#-дженерики) только так и возможно. Хотя там компилятор уже в рантайме умеет компилировать разные версии дженериков для именно конкретного типа, сам код на уровне исходного текста уже оказывается обобщённым. Там нет понятия специализации шаблона для какого-то конкретного случая. Опять же можно расписать все варианты вручную, но объём работы отобьёт желание. Ту работу, которую делает компилятор C++ в момент компиляции во многих языках переносят в момент исполнения. Да, можно сделать "то же самое", но это будет не совсем то. Вместо статической диспетчеризации появляются виртуальные функции, за которые переступить оптимизатор не может и оптимизация останавливается, например. Если в языке нет понятия константных выражений (constexpr), то опять же все расчёты переносятся в момент исполнения. Оптимизатор может в каких-то случаях понять, что выражение константа и посчитать в момент компиляции, но сколько-нибудь сложные вычисления так не выполнить.

[ZX]