C

Feb. 10th, 2004 06:28 pm
avva: (Default)
[personal profile] avva
Why C Is Not My Favourite Programming Language — статья в Kuro5hin с длинной дискуссией в комментариях.

Статья довольно глупая, откровенная провокация на флейм. Тем не менее, в ней есть немало любопытных trivia, а в дискуссии встречаются, в стоге бреда, несколько интересных иголок.

Я не знал, кстати, что "you musn't cast the return value of malloc()". Это, конечно, тоже неправда, но проверка показала, что, действительно, завсегдатаи comp.lang.c советуют этого не делать. Вот здесь, например, подробно объясняется, почему: потому-что, во-первых, при правильном использовании malloc() это совершенно ничего не даёт (возвращаемый malloc() результат типа void* и так будет правильно приведён к нужному типу), а во-вторых, в случае, если вы забыли включить stdlib.h, то компилятор будет считать malloc() функцией, возвращающей int, но из-за эксплицитного приведения не выдаст ошибки и (на некоторых архитектурах) сгенерирует неправильный код.

Вряд ли я, впрочем, последую этому совету: привык приводить результат malloc(), а проверка того, что не забыл #include <stdlib.h>, у меня и так намертво в голове зашита.


Что же касается переносимости (так Лингво предлагает переводить portability) кода на C, то как раз позавчера произошло порадовавшее меня событие: Брэд взял написанный мной сервер memcached, и попробовал скомпилировать и запустить его на 64-битной машине (до сих пор никто этого не пробовал, включая меня). Заработало без всяких проблем с первого раза. Если учесть, что memcached только и делает, что очень интенсивно работает с памятью и сложными структурами кэширования информации, очень неплохой результат, по-моему.

Date: 2004-02-10 09:07 am (UTC)
From: [identity profile] alickop.livejournal.com
Что же касается переносимости...
Боюсь, что Ваш пример не показателен. Грамотно написанный код переносим в любом языке. Другое дело, что не все языки этому способствуют.

Date: 2004-02-10 09:11 am (UTC)
From: [identity profile] avva.livejournal.com
Я не спорю, что не показателен. Наверное, мне просто похвастаться
захотелось ;-)

Date: 2004-02-10 09:29 am (UTC)
From: [identity profile] dyak.livejournal.com
Для меня совет про malloc() звучал примерно как "а теперь представьте, что вы проводите операцию на мозге совковой лопатой..." И не потому что кто–то может забыть этот #include, а потому что кто–то что–то компилирует с такими опциями.

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

Date: 2004-02-10 09:30 am (UTC)
From: [identity profile] iratus.livejournal.com
Статья - тролл чистой воды. но и в С конечно немало проблем. Но С ИМХО это просто лакмусовая бумажка определяющая способности разработчика. Например, тот кто полагается исключительно на garbage collector никогда не сможет писать правильный и эффективный код. И вообще все эти помощники программиста превращают даже Хелло ворлд в bloatware. Но конечно чтобы программировать на С нужна хорошая дисциплина.

что касается его недостатков, то это то что С библиотека стандартизирует лишь очень старые и морально устаревшие функции. поэтому для любого мало-мальски серьезного проекта приходится писать/реюзать свои собственные функции. Кстати одна из самых больших недостатков маллока ( для меня) это то что маллок() возвращает память non-aligned. Это приводит к достаточно серьезным проблемам

Re:

Date: 2004-02-10 09:53 am (UTC)
From: [identity profile] trurle.livejournal.com
Ето как это - non aligned? Должен возвращать с таким выравниванием что бы можно было сделать casting к любому типу.

Re:

Date: 2004-02-10 10:31 am (UTC)
From: [identity profile] iratus.livejournal.com
ээээ вы видимо плохо представляете о чем идет речь. вместо маллока должна быть функция posix_memalign() из POSIX 1003.1d с дефолтным значением выравнивания на 128 для 32-битных машин... - 4 слова. многие серьезные оптимизации работы с памятью на низком уровне требуют подобного выравнивания особенно если вы используете MMX/SIMD инструкции на интеле х86. я не раз сталкивался с тем что многие функции отказываются работать если вы передаете в него не выровненный пойнтер

Re:

Date: 2004-02-10 10:44 am (UTC)
From: [identity profile] meshko.livejournal.com
По-моему работа с MMX, Altivec и пр. в любом случае связана с таким количеством приседаний, прыжков и ужимок, что выравнивание как-то бледнеет на их фоне.

Date: 2004-02-10 11:02 am (UTC)
From: [identity profile] muchandr.livejournal.com
Согласен. C хреновато векторизируется. Даже Фортран векторизируется лучше, но вообще для векторов нужен иной парадигм. Нечто data-directed, скорее всего.

А проблема с aligment решается или простеньким wrapper макро для malloc, или использованием другого аллокатора. Это же не часть языка, а просто библиотечная функция.

Вообще alignment - уродливый performance hack и никакой специальной поддержки в general purpose programming language ИМХО не заслуживает.

Re:

Date: 2004-02-10 10:09 pm (UTC)
From: [identity profile] muchacho.livejournal.com
Подумаешь, функции. На техасских DSP (по крайней мере серии C6x) битовые операции работают корректно только с выровненными словами, точнее, С-компилятор генерирует такой код.

Date: 2004-02-10 10:53 am (UTC)
From: [identity profile] muchandr.livejournal.com
K5 стремительно попсеет и становиться копией /. Похоже, любимый язык этого чела Ява, да еще не по тем причинам, по каким это может быть еще допустимо :)

C делает как раз то, зачем его придумали, а именно нечто довольно low-level, но относительно портативное.

Лично мне кажется, самая большая проблема для портативности в C - неспецифицированная длина типов. Поэтому не мешает пользоваться библиотечными типами аля int16. Вот с поинтерами беда. В low-level языке нужен механизм точной декларации адресных типов. Тогда и кастать к ним можно было бы без зазрения совести, да и код бы получился компактнее на машинах, поддерживающих несколько режимов адресации.

Еще бесит макро синтакс для function pointers.

Подавляющее большинство проблем с buffer overflow можно избежать, если не пользоваться sscanf и типами unsigned :) Еще есть профайлеры/аллокаторы которые ловят доступы в неаллокированную память и есть StackGuard. Путаницу с между = и == легко избежать в случае констант, если приучиться всегда использовать константы как lval (типа 5 == x)

Остальные наезды просто не по существу. Проблемы, которые в общем-то все признают как таковые, даже и не упомянаются. (например слегка сломанная прецидентность операторов и путаница с return values аггрегатных типов (array/struct))

Date: 2004-02-11 01:02 am (UTC)
From: [identity profile] alexott.livejournal.com
а вот это вы видели?

http://www.cs.berkeley.edu/~fateman/papers/software.pdf

Date: 2004-02-11 01:05 am (UTC)
From: [identity profile] avva.livejournal.com
Ага, видел. Это выше качеством, конечно.

Re:

Date: 2004-02-11 01:07 am (UTC)
From: [identity profile] alexott.livejournal.com
да, конечно, не сравнить с указанной вами статьей.
На С надо писать осторожно, мы пишем на С только расширения, а сам софт на Scheme

my 2c

Date: 2004-02-12 05:24 pm (UTC)
From: [identity profile] yanis.livejournal.com
C and moderate C++ are the only languages to be used in high-performance large scale systems. All this crap about portability and "inconvenience" usually comes from people who mean robust GUI development (for which no compiled language makes sense at all), junior programmers indoctrinated in the ways of "Object-Oriented Approach" and poor professionals (a.k.a fucking shitheads).

Recently I saw a huge proprietary "component library" produced by a C++ celebrity ... Implementation of double-linked list is 1,500 lines long and an overhead per stored element is about 40 bytes. Oh yes, and of course it's a full template (every algorithm is T-parametrized).

Peaceful discussions with people, who say that C is bad because of its memory allocation or its tolerance of undeclared functions, will require someone like St.Francis of Assisi, because it's not unlike preaching to animals.

Re: my 2c

Date: 2004-02-15 07:01 am (UTC)
From: (Anonymous)
>Recently I saw a huge proprietary "component library" produced by a C++ celebrity
А кем, если не секрет? Александреску?

Re: my 2c

Date: 2004-02-15 03:20 pm (UTC)
From: [identity profile] yanis.livejournal.com
нет не Александреску, но я не хочу называть человека по этическим соображениям.

Date: 2006-11-08 09:13 am (UTC)
From: [identity profile] bolk.livejournal.com
[livejournal.com profile] avva, простите, если не по адресу, по какому алгоритму memcache освобождает память, когда её нехватает? я где-то видел очень любопытный пост на эту тему, сейчас понадобился, никак не могу найти.

Date: 2006-11-08 12:51 pm (UTC)
From: [identity profile] avva.livejournal.com
Есть набор классов по величине памяти - например, в самом простом и дефолтном варианте, есть класс размером в 128 байт, потом 256 байт, потом 512, 1k, 2k итд. до 1Mb. Если какая-то запись (ключ+значение+ дополнительные заголовки) занимает, скажем, 1.5k, под нее отводится кусок из класса в 2k, т.е. кусок размером в 2k, и она в него пишется.
У каждого класса отдельно есть своя LRU queue всех записей в этом классе - каждый раз, когда кто-то просит прочесть какую-то запись, она перемещается в начало списка своего класса. Таким образом, в конце списка находятся те записи, которых давно никто не просил - их куски освобождаются, когда нужно место для новой записи в этом классе, и нельзя больше согласно конфигурации попросить памяти у системы.

Date: 2006-11-08 01:17 pm (UTC)
From: [identity profile] bolk.livejournal.com
О! Спасибо большое!

January 2026

S M T W T F S
    1 2 3
4 5 6 7 8 910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 10th, 2026 07:54 pm
Powered by Dreamwidth Studios