Обсуждение:Pure C
Материал из Lurkmore
[править] Статья хороша
Но все же добавьте информацию, где же и чем С лучше С++ недавних быдлопыхпыхкодер-кун, сейчас - сиплюсплюс-кун
Статья в ужасном состоянии. Аффтарские грамматика, пунктуация и способ изложения мыслей будят во мне угнетателя. Нет пути. --Arkanoid man 14:26, 18 декабря 2008 (MSK) ты хуй
А мне статья понравилась. Пунктуацию чуток подправить, но написано остроумно. Зачот чуть более чем полностью.
IRL, статья пидирастически хуёва, десу! -- Ононимус 16:48, 19 декабря 2008 (MSK)
Статья полное говно. Си - язык, на котором написаны ядра всех UNIX-подобных систем (в том числе linux, он самый). И блядь никакие свистопердящие C++ в код ядра не пускаются. Существуют проекты создания ОС в промежуточной среде, типа ява-машины и сраного .NET, но пока чего-то нихуя у них не вышло. Так, что если бы автор сего опуса писал нормальные системные, нужные проги, а не быдлопорграммульки на бейсике для офиса, то он бы знал, почему Си лучше С++, и уж тем более всяких Ява/С#. Если от программы требуется надежность и безотказность (например, если эта программа отвечает за ПРО, или за систему жизнеобеспечения, или блядь хотя бы за серверный процесс, который управляет всеми этими полезными феньками типа SQL), а не кавайные гуйки, то выигрывает Си. Да, и еще, хотя Си не единственный язык компиляторов, но все-таки в этой области он также рулит (компиляторы интерпретаторы, идиот, PHP, Perl, Java написаны на Си). И последнее, когда требуется высокопроизводительный код, то даже если прога написана на Perl (mod_Perl, например) после компиляции код транслируется все-таки в Си-код. Всегда ваш программист-многостаночник (Pascal, Delphi, С, С++, С#, Java, Perl и даже PHP, VB). Прошу школоту пройти на хуй.
>Автор - школьник еще тот. Пхп и перл - интерпретируемые языки, а не компилируемые.
[править] Статья безграмотна
- «вменяемый exceptioning» был в 80-е в MIT, автору предлагается курить известную статью под названием «worse is better», в которой объясняется, почему технологии MIT не попали в мейнстрим.
- в C++ exceptioning не является вменяемым, по той причине, что исключения в C++ не возобновляются, и по ряду других причин.
- Да ладно-ка «не возобновляются». Оператор throw без аргумента does the thing MrBlack 14:11, 19 декабря 2008 (MSK)
- Это не то. Он прокидывает исключение дальше, а «возобновить» — значит продолжить выполнение с любого места в раскрученном стеке вызовов. Первая ссылка в гугле по запросу «lisp exceptions». Хотя pure C тут уже ни при чём.
- BSOD тут вообще ни при чём.
- на C можно писать вполне ОО-программы, автору предлагается курить исходники ядра Линуха и GTK.
- Ну, если использование неких соглашений вместо ОО-синтаксиса можно назвать ООП, то и на асме это вполне можно делать MrBlack 14:11, 19 декабря 2008 (MSK)
- О том и речь, что можно делать, но не очень удобно. И на C++ ОО-программы писать неудобно тоже.
- Всё зависит от кривизны рук и места их произрастания. А то, что на C++ (который, да, совместим с С, но тем не менее вполне себе ОО-язык) неудобно писать ОО программы — сильно сказано.
- ну, если использование неких соглашений в синтаксе вы считаете ООП... алсо, вот пример из windows-мира - цикл из 8 статей об использовании COM на чистом C: http://www.codeproject.com/KB/COM/com_in_c1.aspx
- О том и речь, что можно делать, но не очень удобно. И на C++ ОО-программы писать неудобно тоже.
--Arkanoid man 14:26, 18 декабря 2008 (MSK)автор курит исходники ядра и многие другие и без сопливых
- на что как бы намекает автор, говоря о типах файлов в /usr/bin и /usr/sbin ?
- код на С защищён по полной, кроме ручного управления памятью (и соответственно её утечкой и др. негативными проявлениями, о которых, кстати, нет ни слова).
- полное не понимание, что такое скрипты и зачем они нужны. (Ядро на Perl! ОЯЕБУ!)
- Не рассказано, что C++ не смог заменить С потому что его не способен до конца понять даже сам аффтар (было такая фраза, я гарантирую это). Да и эта ваша ОО нужна только в 3 типах задач (один из которых GUI). Поэтому в Юниксах С и живее всех живых.
- Objective-C — это предок, а не потомок С++.
- Вообще не потомок и не предок. Он появился раньше, да, но Страуструп не с ObjC разрабатывал плюсы. И да, под айфоне можно писать софт ТОЛЬКО на нем, даже жаба в пролете. Однако, можно линковать сишные библиотеки.
Любопытно, кроме C++ у Си есть ещё один обратно-совместимый родственник |
Нихуя С++ не обратно совместим. Попробуй скомпилить сишную прогу где переменная называется new с помощью С++ компилятора.
- С нихуя не быстрее того же Fortran’а (и любого компилируемого языка). Ну, может на сферическиий 1%. Просто он как связующий слой — самый тонкий.
- Фортрана и асма то да. А вот приплючнутого и тем более явы и уж совсем тем более python'a, если автор не тупой криворукий школьник — как то и сравнивать глупо.
- Не освящена ситуация с более чем 9000 вариантам того же «чистого» С.
- Примеры употребления указателей — неуместны и не по делу. Таким образом их их употребляют только быдлокодеры, кем, похоже, и является автор статьи.
- На языке C пишут множество драйверов, утилит, демонов и библиотек. Огромное количество разработок происходит внутри компаний и закрыто от посторонних глаз. Занимаются этим далеко не только бородатые олдфаги, а люди самых разных возрастов.
Запилите статью и не позорьтесь!
[править] Какое mime? Какое ООП?
В статье спутано все. Алсо, расовый ОП (не быдляческий ОО, а именно О) — это смоллток и детки. А то, что наизобретал Страус и всякие коммитеты — плюсы, жабка и прочий сишарп — уже ООП, которое убило все идеи ОП и выебало труп в жопу.
--Arkanoid man 14:26, 18 декабря 2008 (MSK) Про то и речь, читай сноску в разделе ООП данной статьи. Хочешь рассказать так, чтобы было понятно что сигнальная модель рулит - велкам.
Алсо, причем тут mime к файлам в /usr/bin?
--Arkanoid man 14:26, 18 декабря 2008 (MSK) при том, что благодаря быдлоскриптам там теперь не только бинарники но и скрипты. Тысячи их!
Алсо
$ file /usr/bin/* | grep -i i386 | wc -l 648 $ file /usr/bin/* | grep -i script | wc -l 292 $ uname -a Darwin localhost 9.5.0 Darwin Kernel Version 9.5.0: [snip!]
Да, фагготерия!
Блять, трое уже сказали, что заголовки скриптов - это не MIME. clash-bang на сленге, но никак не mime.
Про ОП: забавно, но педивикия щитаит так: w:ОП ))
Алсо Ето ваше ебучее ООП в хуй не упиралось для реального времени и ембеддед аппликацион, ибо ни одна песда на свете не скажет точно, какие танцы с бубнами устроит компилятор при вызове всяких конструкторов, а уж какими кирпичами ети ебаные конструкторы насрут в стек (ни разу не резиновый, алсо).
[править] аффтар выдумал все сам?
Откуда он это взял? Си++ в середине 80-ых уже имел и компилятор, и драфт стандарта. ОП появился после 1981 года? Да не гони, Simula67, как это ни странно, появилась в 67-ом году. Про «выстрелить в ногу» — ты опредились, ты про Си рассказываешь, или про Си++ ? В Си достаточно указателя, void-функций там нет. В Си++ тоже хватает указателя, try-catch конструкции есть. А зачем надо «по смещению наложить структуру, пройтись по её полям» — вообще загадка.
>>Поэтому ядра и драйвера в их пространстве пишутся только на Си, и ни одного на Perl’е.
Драйвера вобще надо на PHP писать, у него тоже компилятор есть.
Статью писал нуб (пруфлинк?). Ограничиваюсь выставлением плашек, дабы не ввязаться в войну правок (уже идёт) (надо удалить примерно две трети текста). Потрудитесь изучить материал, и написать нормальную статью.
[править] удалил ересь про /usr/sbin
Автору: /usr/sbin -- это не "исполняемые скриптовые файлы", а (как сообщает нам педивикия [[1]]) дополнительные системные программы, такие как демоны различных сетевых сервисов. Скриптовых файлов там чуть более, чем половина, но отнюдь не все.
[править] С
Это нормальная статья. "С" создавался как замена ассемблеру именно для системного программирования. Спорить тут о том, что с ним пыталась сделать Microsoft, или кто-то другой, не надо - C++ и его разные названия пусть будут в отдельной статье. "С" сейчас - это язык для ВСЕХ встраиваемых компьютеров и микроконтроллеров. Если вы знаете об ARM или Atmel, вы знаете, что для них фирмы-разработчики выпускают компилятор для "С", чтобы "бородачи" не ебались со специфичным ассемблером. Суть "pure C" - именно кросплатформенное программирование, причём кросс - это не только Windows и *nix.
- Внезапно двачую. Няшную сишку нужно перенести в категорию "ассемблеры", каковым она и является.
- А ещё под Atmel есть среды под Basic и Pascal.
- Годов так 80сятых.
- А ещё под Atmel есть среды под Basic и Pascal.
[править] Быдло детектед
Кто тут пиздит на рекурсию и указатели на ф-ции? Это же наше все и ф-ции высшего порядка соответственно. Читай SICP до просветления, быдлокодер!
Из-за таких идиотов лисперов считают неалекватами. Если бы ты сам прочитал сикп внимательно, то знал бы что хвостовая рекурсия лиспа это итеративный процесс. Итеративный же процесс в си быстрее и менее прожорливей хвостовой рекурсии лиспа, читается( как и программируется) примерно также как и в лиспе(а для 99% программистов лучше). Рекурсивных процессов же следует избегать как в си, так и в лиспе. Есть конечно задачи которые решаются только рекурсией, но на практике в 90% случаев они выходят за область использования си. Первая глава сикпа, если мне не изменяет память.
[править] прошу запилить ссылку на сайт эзотерических исходников
[править] Быдло детектед-2
Для поиска memory leaks всю дорогу была куча инструментов. Тот же Ice или потом Purify. А местные быдлокодеры пишут чтой-то про статический анализ кода.
А где сравнение с великолепным D? Что за быдлячество!
[править] C... такой С
Предлагаю добавить следующий код.
#include <iostream>
using namespace std;
int main()
{
int* g= new int[4];
g[0] = 1;
g[1] = 2;
g[2] = 3;
g[3] = 4;
g[--g[0]] = --g[g[0]++];
for(int i=0;i<4;i++)
{
cout<<g[i]<<endl;
}
return 0;
}
"Код который ничего не решает".
- Разве это не неопределенное поведение?
- В новых версиях gcc решает. К тому же, эту херню и человек-то с трудом осиливает с первого взгляда. И эта... тут код на Плюсах.
Дофига плюсовых возможностей в коде просто усраться дофига
[править] Ошибка в примечаниях
Уберите стыд из примечаний: "Острова" связанных объектов не вызывают утечек памяти в жаве уже очень давно (если и вызывали, в чем я сомневаюсь). Объекты собираются если на них нет ссылок из стека работающих потоков.
- Проблема "островов" в Жабе была. А в примечании говорится не столько о дефектах твоей ненаглядной Жабы, сколько о дефективности некоторых погромистов, которые создают значительные по объёму сложносвязанные структуры и тягают их за собой во всё время исполнения программы, в виде элементов какого-нибудь списка, например, но никак их уже не используют.
[править] Как же, блять, на нём пишут?
А очень просто. Хороший, годный bullet-proof код на Си в большой компании состоит из assert’ов чуть менее, чем на треть (на некоторых участках и вовсе наполовину). Проверяется вообще всё, что можно проверить. Аргументы на вход функций, результаты всех«» вызовов (и своих, и особенно тщательно и густо — внешних), каждый пук на каждой итерации хитрожопых алгоритмов. Память выделяется только самописными функциями-аллокаторами, а выделенным участкам с помощью макроса присваиваются метки вида «файл, номер строки» (чтобы ловить, откуда именно утекло), и параллельно куда-нибудь наружу неким thread-safe образом пишутся логи хода выполнения программы. Код выходит адски-тормозным (примерно как эти ваши C#/Java), и невъебенно-раздутым, но зато подавляющее большинство багов ловится легко, безболезненно и совсем недалеко от места их возникновения. Никакой порчи памяти, никаких утечек. В чём профит от адски-тормозного кода?
- После долгого и вдумчивого тестирования (и руками, и unit-test’ами) собирается release-билд, в котором все ассерты и логи отключены.
- Внезапно начинает работать inline всяких функций вида «5 ассертов и один вызов», эффективно убивая весь лишний abstraction penalty (ассертов-то больше нет).
- Выверты с выделением памяти прекращаются, никаких лишних меток и прочего клаттера.
- На выходе получается ультра-супер-быстрый и тщательно отлаженный бинарник.
- ???????
- PROFIT
Кто-то скажет, что это пиздец. Но если стоит цель писать по-настоящему надёжный код, в любом другом языке придётся заниматься приблизительно тем же самым. Ассертить, ассертить и ещё раз ассертить. Каждый аргумент, каждый вызов. И волшебство «Моя любимая ява/C# в 5 раз более лаконична, чем ваш чистый C» рассеивается вмиг. Ну да, Си остаётся толще. Процентов на 5. При 10-20-кратном выигрыше в рантайме, если грамотно использовать SSE и помнить по кэш-миссы.
Реквестирую запил раздела в статью.
- Ты ещё забыл про такую ненавистную индусам, быдлокодерам и школоте вещь, как графы состояний. Тупо на бумажке. Грубые, прикидочные исчирканные матом блок-схемы алгоритмов и структуры данных, которые позволяют ничего не проебать. Код, написанный на Цэ с предварительным составлением плана в голове (если она есть) обладает совершенно труднопостижимой надёжностью. У меня по служебной лавочке есть софтина из сорока взаимосвязанных плагинов, гоняющая жёсткий матан, которая ни разу не падала. То есть ВООБЩЕ ни разу. И когда я пишу сорок первый — в половине случаев после набора текста он собирается и работает, как надо, а во второй половине — сначала нужно найти и прибить мелкую опечатку. Я уже охамел до того, что при любой ошибке ищу её сразу в смежном ПО (ИЧСХ там и нахожу) — привык, что у меня в моём коде ошибок просто НЕТ. Да, и графический интерфейс там стоит по эффектности пары демосцен — и тоже весь через указатели за два вечера написан. Если ты умеешь пользоваться бумагой и карандашом, весь так называемый "прогресс" в области языков и сред разработки за последние 20 лет тебе не нужен.
- Родной, вы видимо просто не писали относительно сложных приложений на С в группе (вариант - модификация уже написанных приложений). Никакие «графы состояний на бумажке» от неявных ошибок (ваших и чужих) вас не охранят. И время на отладку тратить придётся. И охаянный вами «прогресс языков за последние двадцать лет» покажется очень даже полезным.
- Дражайший, верно подмечено, про неявные ошибки. Только вод беда - Си язык простой, неявную ошибку в нем допустить усраться надо (если опыт программирования есть и понимание как это работает), а вот в приплюснутом ошибку допустить проще простого - поди догадайся + у этой переменной thread-safe || fail, так чисто для справки. Чем сложней язык тем больше вероятность допустить "неявную ошибку". Спорить будем?
- Родной, вы видимо просто не писали относительно сложных приложений на С в группе (вариант - модификация уже написанных приложений). Никакие «графы состояний на бумажке» от неявных ошибок (ваших и чужих) вас не охранят. И время на отладку тратить придётся. И охаянный вами «прогресс языков за последние двадцать лет» покажется очень даже полезным.
[править] Снимите млять редирект с шарпа
Быдлокодерам: Шарп не Ъ.--83.149.3.14 00:23, 10 ноября 2010 (MSK)
[править] могло бы исключить появление BSOD
Кое-кто ехидно предполагает, что наличие хоть какого-нибудь вменяемого exceptioning’а в Си могло бы исключить появление BSOD в 90-х.
ЩИТО? Это бред, его нужно убрать. Сипыпышная фишка (лулз, конечно) с «exceptioning’ом» void foo(int *p, int c) {
try { *p=c; } catch (...) { printf("Щито?\n"); }
}
не прокатывает в ядрах операционок. Ибо в ядре:
а) ядро распоряжается ресурсами. Хочет, запишет по адресу 0x80050000; перехочет- не запишет. Кто сказал, что это будет ошибка? Это может будет логическая ошибка, так как записывать в тот адрес ничего не нужно. Но никто, даже процессор не может определить является ли это ошибкой, или нет. Другое дело прога. Она не имеет права записывать куда хочет, а если попробует, то ось не позволит. А самой оси кто может запрещать?
б) код с try и catch раскручивается в ряд ассемблерных инструкций, которые пишут в разные области памяти (зависит от оси). При исключении ось сама передаёт управление из try в catch. В ядре очевидно это сделать некому.
в) Даже если попытаться придумать обработку исключений, то придётся учить матан. В ядре исключения управляются обработчиками исключений. Допустим, в ядре код что-то поделил на ноль. После такой инструкции проц генерирует исключение, ищет сопоставляет через таблицу векторов прерываний типу ошибке обработчик и передаёт управление ему. Чтобы как то «симулировать» придётся заставить компилятор при обработке блоков try catch записывать в таблицу векторов обработчик. А это гемморно, так как машинно-зависимо. Ассемблер, короче.
Так что не надо быдлокодить и писать такую ересь. —83.149.3.5 21:02, 17 ноября 2010 (MSK)
Надо же. Такая толстота, а работает.
вы ребята, не компелировали ни строчки рабочего кода в ring0, я гарантирую это. а хотите вступить? а что у вас есть?
быдлокодеры такие быдлокодеры. выучили заумные слова вроде GC и exception, и думают, что теперь могут писать Объектно-Ориентированное Ядро. интересно, а видел ли хоть один из них, на каком языке пишется обвязка к ихним супер-пупер-языкам? та самая, которая стек откручивает?
Для полный дебилов, которые вообще не в курсе, что такое BSOD и как срабатывают исключения (ага эти самые try), поясняю: 1. Кто драйверы не писал, заткнитесь: __try __except __finally - в ядре есть (ага, поверх чистого си) 2. В ваш except на великом и могучем языке программирования С++/Java/C#/Python/PHP/ещё-какая-ересь половина исключений отдаеться системой (опачки!) что как бы намекает, что выдаються вашиму сепер-объектному коду они из си на котором они отлавливаюсть 3. Полная херная вообще - BSOD выдаеться когда нет возможности правильно обработать возникшее исключение (!! их же тут нету, по мнению некоторых школьников) и система мечтает хоть на жеском диске что то вам на память оставить. А не форматнуть и его за компанию.
[править] Пополните
Добавьте еще, что СИ - рабство в Древнем Китае. Немного википедности тут не помешает http://ru.wikipedia.org/wiki/Си_(Рабство) Тем более, язык неплохо ассоциируется с анальным рабством, что доставляет.
[править] Идея для эпиграфа
«Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво». Керниган
[править] Название
« |
Еще одну интерпретацию названия C++ можно найти в приложении к Оруэллу | » |
— "Исторические замечания" в книжке Страуструпа |
Читавшие Оруэла поймут
[править] О быдлокодерах
Быдлокодеры на Си таки пишут, не надо. Грызут кактус но пишут. Правда большинство быдлокодеров уже давно свалило на C# но это не заслуга Си (как и не заслуга Си более ранний исход быдлокодеров на кресты). Быдлокодеры вообще на любом языке писать способны, даже на Perl, не говоря уже о таком простеньком но рутинном языке как Си. Рутина быдлокодерам кстати нравится, см. китайское наследование методом copy&paste
[править] Запилите если охота
[URL=http://fastpic.ru/view/31/2011/1025/3b69de5be54b1017c5997af81947fd65.png.html][IMG]http://i31.fastpic.ru/thumb/2011/1025/65/3b69de5be54b1017c5997af81947fd65.jpeg[/IMG][/URL]
[править] Блджат RMS основал GNU в 83-ем году
Относительно УГ после 81-го года. Копипаста с педивикии w:Linux:
GNU
Проект GNU был начат в 1983 году Ричардом Столлманом с целью создания «целостной Unix-совместимой программной системы», полностью состоящей из свободного программного обеспечения. Работа началась в 1984. Позднее, в 1985, Столлман основал Free Software Foundation, а в 1989 году составил GNU General Public License (GNU GPL). В начале 1990-х многие из программ, необходимых в операционной системе (такие, как библиотеки, компиляторы, текстовые редакторы, командная оболочка UNIX, и оконная система), были завершены, в то время как разработка низкоуровневых элементов, таких как драйверы, демоны и ядра была приостановлена и они оставались незавершёнными. Линус Торвальдс сказал, что если бы ядро GNU было доступно в то время (1991), он бы не решился написать своё собственное.
[править] Ебаный стыд, "двойной указатель на функцию"
int (**f)(char *с) — двойной указатель на функцию, принимающую строку и возвращающую целое число
читается как:
указатель на указатель на функцию, алсо используется для массивов функторов w:Функтор_(программирование), например в этих ваших COM объектах, нечто подобное под названием vtbl (виртуальная таблица функций)
[править] Технические решения, совершенно несопровождаемые в дальнейшем...
ЛПП, взять хотя бы этот же апач и кучу другого опенсурса, чуть более чем полностью написанного на С. А матан с указателями на функции запросто дефайнится, для уменьшения баттхерта быдлокодеров и улучшения читаемости кода вообще.
Алсо, тема с макроопределениями не раскрыта, а она собственно зачастую и является очень сильным колдунством, чуть менее чем всех программ выше студенческого курса, и иногда вызывающим лютый баттхерт даже у видавших виды гиков.