vitus_wagner (
vitus_wagner) wrote2012-10-18 08:43 am
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Entry tags:
Плюсы C++
Тут сегодня в debian-russian кто-то высказался, что де у C++ есть плюсы и минусы. Минусов больше.
Не могу не согласиться. Я знаю целых два плюса C++. Оба - в названии.
Не могу не согласиться. Я знаю целых два плюса C++. Оба - в названии.
no subject
2. Паттерн RAII. Очень удобно, например, чтобы не забывать освобождать локи (если код сильно ветвистый, ошибки с локами очень частые). Существеный процент багов в астериске как раз решают легко этим паттерном.
3. Более жесткая типизация. Конечно, до haskell'а какого-нибудь как до луны пешком, но все же.
4. Перегрузка функций. То, для чего в C чаще всего используют макросы. Например реализация банальных min/max.
В общем если использовать C++ не как считается "правильно", а как 'C с плюсами" то получается очень даже неплохой язык, по сравнению с C.
Но после знакомства с функциональными языками программирования становится совсем печально -- ни один из известных мне не годится как средство для системного программирования, а от C, C++, а тем более Java тошнит.
no subject
2. Lexical scoping вещь, конечно, неплохая. Но этого где только нет.
3. Более жесткая, чем где? И вообще в большинстве случаев типизация ПЕРЕМЕННЫХ в отличие от типизации ЗНАЧЕНИЙ - это зло.
4. Перегрузка функций, а особенно операторов, сделана ровно потому что Страуструп без подобных костылей Obfuscated C context выиграть немог. Понадеялся, что хотя бы Obfuscated C++ выиграет. Ну, блин, использовать оператор логичесокго сдвига в качестве оператора вывода. Если уж хочешь разрешить создавать свой синтаксис, нужно делать это по-человечески, разрешив создавать новые управляющие структуры (как можно в Tcl) и определять свои инфиксные операторы, задавая им относительный приоритет.
Использовать C++ как C с плюсами крайне неудобно из-за толстого рантайма и name mangling. Потому что ниша C - это дописывание маленьких кусочков недостающей функциональности в скриптовые языки, где требуется либо низкоуровневый доступ к оборудованию, либо оптимизация на уровне тактов CPU. С++ в этой нише однозначно хуже.
no subject
А это что, кстати, означает? Я это видел уже где-то, но в чём смысл не понял.
Если надо сделать перемемую не переменной - есть const, тоже кстати неплохая штука, хотя оно как раз есть в C.
no subject
no subject
no subject
Угу. Функция ждет, что в параметре строка, а ей прилетает словарь, например.
no subject
no subject
... Identical to supernatural ...
no subject
no subject
Еще сей
длинный и чешуйчатыйязык одноэлементные кортежи без спросу разворачивает при передаче их как параметра, если после элемента запятую не влепить.no subject
no subject
no subject
По поводу структур данных я имел в виду такие структуры как списки, деревья, и т.д.
2. К счастью да. Правда вот даже в Java их -- нет. И вообще в языках со сборкой мусора с этим бывают проблемы. В perl AFAIR хотя бы сборщик мусора инкрементальный, поэтому в нем такая радость работает.
3. Более жесткая чем в C, разумеется.
4. Про ублюдочность iostream можно даже и не говорить :) А перегрузка функций таки нужна. Красивый способ обойтись без нее в обычном виде, оставив все плюшки я вижу разве что в haskell.
5. Если не использовать iostream и прочую чисто C++ мерзость, можно обойтись без его жуткого рантайма. Но когда мы говорим о сравнении со скриптовыми языками, то тут уже слова про рантайм, мне кажется, не к месту -- у перла он все равно больше.
$ ls -l /usr/lib64/libperl-5.16.so
-rw-r--r-- 1 root root 1615416 Sep 26 04:39 /usr/lib64/libperl-5.16.so
У C еще есть важная ниша -- библиотеки. Т.е. код, который может использоваться из разных приложений на разных языках программирования. Код на Perl использовать из какого-нибудь Haskell будет проблематично.
И вот по-настоящему хорошего языка для их написания сейчас нет. C++ просто меньшее из зол.
no subject
Увы, в этом плане C++ практически не лучше perl. Из-за name mangling и рантайма использовать код на С++, например из Tcl получается заметно сложнее, чем код на С.
А также см python-tkinter. Код на Tcl из кода на Python вполне используется.
no subject
но -- да, это требует доп усилий.
no subject
Такой код вообще писать нынче не на чем удобно. C++ по совокупности характеристик лучше, хотя все равно получается трудночитаемый говнокод, из-за необходимости заниматься закатом солнца вручную (особенно там где реализуются парсеры для протоколов).
no subject
no subject
Но вот nginx уже так переписать не получится.
В решениях для сотовых таки стоимость железа меньше стоимости работы программистов, и надежность критична (а у Erlang для этого есть весьма приятственный инструментарий). Поэтому оптимайзить, тем более переписывая на C, не просто не выгодно -- а опасно для бизнеса.
no subject
Стоимость железа меньше стоимости софта сейчас практически везде. Ну кроме, может быть, крайне тиражируемых десктопных пакетов. И то, судя по тому, какие деньги заламывет за лицензии на них Microsoft, и там стоимость разработки MS Office сравнима с совокупной стоимостью того железа, на котором его гоняют.
А Erlang это пример крайне удачного для своей области разделения обязанностей между низкоуровневым, написанным на C рантаймом и высокоуровнвым скриптовым языком.
На мой взгляд, правильно выбранная пара из скриптового языка и С-рантайма побъет один универсальный среднеуровневый язык, будь то C++, D или Java в любой области. В достаточно сложном проекте, правда, может понадобится более одного высокоуровневого языка.
no subject
2. Если в апач не встраивать языки программирования то он не нужен, ибо есть nginx, который легче и шустрее. Или какой-нибудь lighttpd, если нужен cgi а не fastcgi.
3. Себестоимость массового софта существенно меньше себестоимости железа. Оптимизировать какой-нибудь апач есть смысл, например.
4. Про Erlang согласен полностью.
5. Про использование пары C + скриптовый язык также согласен.
C++, как я уже сказал, пригоден как замена C во многих случаях. Именно благодаря тому, что на C++ можно писать столь же низкоуровневые вещи как и на C. А вот высокоуровневые нельзя ни на одном из них. И тот же Perl использовать целесообразнее во многих случаях, в которых сейчас используют C/C++.
P.S. Собственно о чем мы спорим? Мы по всем позициям согласны, кроме одной -- я считаю, что "C++ можно, и часто даже нужно использовать вместо C в качестве 'C с плюсами', если не использовать большую часть его дебильных псевдофич"
no subject
1. Я считаю что апач имеет смысл в ситуации статика+cgi. И что cgi гораздо правильнее, чем fastcgi. В смысле, если нагрузка на динамическую часть сайта такова, что cgi не справляются, то либо неправильно распределен контент между статикой и динамикой (90% современных CMS), либо проект настолько велик, что все равно нужен кластер. А CGI сильно проще чем fastcgi, поскольку короткоживущие процессы вообще проще программировать и они прощают больше ошибок.
2… Я считаю, что число ситуаций, когда C уже не тянет, и хочется чего-то более выскоуровневого, а прикручивание полноценного второго языка ещё не оправдано - пренебрежимо мало. И вообще начинать разработку любого проекта надо с какого-нибудь высокоуровневого языка, и только потом, когда приспичит, падать на C. Желательно не во всем проекте, а в возможно меньших критических частях.
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
По CGI vs FastCGI
1. Противопоставление CGI и FastCGI не совсем корректно, ибо это совершенно разные протоколы для разных целей:
- cgi предназначен для запуска отдельных скриптов
- fastcgi это протокол взаимодействия http-сервера с application server'ом (который, в свою очередь, например запускает скрипты)
2. Самое частое применение fastcgi сейчас -- для замены mod_php. В этом случае php5-fpm играет роль application server'а, который запускает много разных PHP скриптов.
3. Применение такого application server'а оправдано при использовании PHP (да, я в курсе, что использование PHP само по себе обычно неоправдано), так как он в состоянии кэшировать, например, результат парсинга скрипта (у которого может быть стотыщ include).
4. Подход, когда приложение запускающее какой-либо код, и приложение контактирующее со внешним миром соединены друг с другом исключительно через tcp или unix sockets я считаю более правильным, нежели комбайны.
По поводу C/C++:
Полностью согласен, за исключением одного -- даже когда C еще тянет, использование некоторых возможностей C++ может быть оправдано. В первую очередь, как я уже говорил, ради RAII и более удобных способов создания специфических структур хранения данных в памяти.
(no subject)
(no subject)
(no subject)
(no subject)
no subject
#OUT + "x = " + x + "\n";
Казалось бы, сложение здесь ещё менее логично, но дело-то не в логике, а во внешнем виде. Так, стоп, торможу! Это даже лучше, чем я думал! Конкатенация строк ассоциативна, поэтому нет разницы между "сконкатенировать и один раз вывести" и "вывести несколько раз". Данная запись эту эквивалентность отражает, логика на месте (в отличие от сдвига влево). Жаль, язык умер, красивый был. :-(
... Каждая концепция порождает свою фигню ...
no subject
А в перле импликация, использующаяся в качестве запятой и двоеточия одновременно, не режет глаз?