October 26th, 2007

nyaload

(no subject)



Что хорошего в С++ - это то, что можно быть близким к С настолько, насколько этого хочется, и можно быть довольно далеко от С ровно настолько, насколько хочется.

"Мы используем Си с классами!"
"У нас запрещёна перегрузка операторов (упс, ну кроме математической библиотеки (и operator[] в нашем массиве))!"
"Шаблоны? Фуууууу! (ну кроме пожалуй fixed_capacity_vector и прочих контейнеров)".
"угх, пожалуй operator new таки удобней malloc. Но в остальном у нас С".
"Да, всё таки for (int i = 0; ...) удобней, чем отдельное обявление int i в С89".
"эмм... против более безопасной линковки символов в С++ ничего не имею"
"уф, всё таки std::sort обгоняет qsort..."


Искренне и честно "да, для меня С лучше С++", без обмана самого себя, может заявить очень мало людей.


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

Почему же When C++ is an option, C is probably a better option. - непонятно. Учитывая, что особо лучшей альтернативы для движка игры кроме "языков близких к ассемблеру" нет (много арифметики с указателями, GC даже не мешает, а просто тупо не нужен).
C++ - был специально спроектирован, что бы быстрее и веселее писать такие вот системные вещи. Почему же его и не взять. Сложно иметь дело с исключениями (неудачник нарвётся на terminate!) и шаблонами (неудачник не сможет слинковать или даже прочитать сообщение об ошибке! А ещё неудачник не дождётся конца компиляции) (пример фич за которые С++ часто ругают)? Ну так это можно обозвать той же полезной сложностью, за которую хвалит С Линус - "дураки не пройдут". А про более безопасную линкову - вы возможно про неё даже не знаете. Или не замечаете, потому что привыкли. За эту фичу С++ обругать сложно.
Другое дело когда пытаются "бустифицировать" под другие задачи, вот тогда действительно получается не всегда удачный инструмент, ибо использовали general purpose язык, а не для язык под задачу.


Вообще http://yosefk.com/c++fqa - довольно интересный ресурс, где можно увидеть большей частью объективную критику от человека, который С++ знает хорошо. И читать весело :)
There are two problems with placing template definitions in header files which may bother you: you get to recompile them each time the file is included, and you disclose your source code to the user.
Let's concentrate on the first problem. The second is minor anyway because source code of templates isn't necessarily easier to understand than disassembled object code.


If STL wanted to be consistent, it would also define volatile_iterator and const_volatile_iterator



Уф. Это был просто дамп мыслей, может быть противоречивых. А не попытка сказать что yosefk прав или не прав. Нет, всё-таки я не согласен. Практически в каждом пункте его претензий к любой фиче С++ опускается что та или иная гнусность - это практически всегда плата за тот или иной профит в другой области. Для примера, первый пункт из "defective" - "перекомпияция при измении private секции". С первого взгляда кажется, "почему бы не издать закон, что не надо перекомпилировать". Извиняюсь, но если мы хотим инлайнить обращения в генерируемом коде к этим переменным - то нам придётся мириться с перекомпиляцией (если не хотим инлайна - то на выбор: используй Pimpl. Или возьми не С++). Читал ли yosefk Design & Evolution?
Каждая фича С++ - это длительная борьба многих людей комитета с ожесточённым отстаиваем права на существование этой фичи.

Скорее, хотел обидеться на тех, кто считают С++ однозначно хуже языка X (вместо X подставляйте Assembler/C/Ocaml/D с одной стороны, Java/C#/D/Python с другой, и Haskell/Ocaml с третьей), и считают что он не может быть наиболее подходящим инструментом, какую задачу не возьми.
Вот он говорит про Java. А на чем бы побыстрей сляпать новую JVM, большую и сложную, с JIT компиляцией, имеющей доступ ко всем сервисам OS, если такая понадобится? Кстате, очевидно, что делать это на одном единственном языке нерационально. Оптимизатор писать на чем-то вроде С** страшно.

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