C мёртв? $#%&!!!

Май 30th, 2007 по SadKo Оставить ответ »

Вот, почитал статью:

http://www.xakep.ru/post/38388/default.asp

Такое ощущение, что автор только всю жизнь и программировал на паскале.
Он пытается сравнить системные языки программирования с чисто прикладными.
Возникновение монструозно сложного языка C++, сочиненного путем тупого добавления к C без исправления его многочисленных дефектов модных конструкций объектно-ориентированного программирования
Ну уж извольте. Если бы не было потребности, то язык не возник бы. Язык не сложный, просто нужно иметь пару извилин и помнить, что можно делать, а что нельзя.
Отсюда понятно, почему серьезные специалисты употребляют такие сильные выражения как «развращение малолетних», «интеллектуальная зараза» и т.п., говоря о языках C/C++.
Нет, не понятно. Это понятно автору статьи, который не в состоянии часок-другой посидеть с языком и разобраться в его тонкостях. Я понимаю «развращение малолетних» как тот факт, что С++ новичкам освоить сложно. Хотя бы потому, что в нём много тонкостей.
Подчеркнем, что BlackBox, хотя и аналогичен виртуальным машинам Java и .NET, но работает с эффективным компилируемым кодом. Благодаря этому программы, написанные на Компонентном Паскале в Блэкбоксе, качественно более эффективны, чем программы на Java и С#.
Бред. Откровенный бред. И меня больше всего добило это:
При создании C была проигнорирована вся накопленная к тому времени мудрость создания высоконадежных языков программирования. В результате на C легко написать совершенно нечитаемые конструкции.
А зачем эти конструкции писать? Чтобы выпендриться перед кем-то? А про искусство оформления кода мы вообще забыли, да? Про то, что надо писать программы понятно, чтобы любой другой человек с минимумом усилий их понимал.

Итог: намешали в кучу Pascal, C, C++, C#, Java, Oberon, Blackbox. При этом не было сказано, для какой конкретной задачи используется тот или иной язык. C++ не подойдёт для написания всяких веб-систем, работающих через браузеры — имхо очень сложно. В то время, как Java или тот же C# не подойдут для написания операционной системы. Из-за их прикладного характера.

Реклама

6 комментариев

  1. ну а что ты хотел, хакер превратился в быдло-журнал

  2. Анонимно:

    [quote]Такое ощущение, что автор только всю жизнь и программировал на паскале.
    Он пытается сравнить системные языки программирования с чисто прикладными[/quote]

    Во-первых, основная масса [b]прикладного[/b] ПО пишется на С++, так что считать его «системным» языком неверно.

    Во-вторых, почему это Паскаль «чисто прикладной» язык? На нём с таким же успехом, как и на Си/С++, можно писать системные вещи. Вот [b]почему[/b] такое встречается нечасто — это уже другой вопрос.

    [quote]Язык не сложный, просто нужно иметь пару извилин и помнить, что можно делать, а что нельзя[/quote]

    В корне неверно. Попробуйте написать компилятор (хотя бы разборщик, без генерации кода) для Объект Паскаля (Дельфи) и для С++, а потом сравните объём и сложность этого самого компилятора. А это, между прочим, вполне объективный показатель сложности синтаксиса компилируемого языка.

    [quote][i]Отсюда понятно, почему серьезные специалисты употребляют такие сильные выражения как «развращение малолетних», «интеллектуальная зараза» и т.п., говоря о языках C/C++.[/i]
    Нет, не понятно. Это понятно автору статьи, который не в состоянии часок-другой посидеть с языком и разобраться в его тонкостях. Я понимаю «развращение малолетних» как тот факт, что С++ новичкам освоить сложно. Хотя бы потому, что в нём много тонкостей[/quote]

    В тонкостях С++ за «часок/другой» не разберёшься, но не в этом дело. Си/С++ поощряют «неряшливое» программирование и дозволяют целый ряд конструкций, чреватых трудноуловимыми ошибками. Самый простой пример — операция присваивания:

    a = b = 1;

    А если имелось в виду

    a = b == 1;

    что тогда? В программе из многих тысяч строк такую ошибку отловить непросто, особенно если в подавляющем большинстве случаев при выполнении этого оператора b равно 1 (потому что a тогда получит корректное значение, а значение b не будет испорчено). В паскалеподобных языках подобная ошибка исключена в принципе, причём сразу по двум причинам: и невозможности свалить на один оператор несколько присваиваний, и из-за наличия специального логического типа, присвоить которому числовое значение невозможно.

    [quote][i]При создании C была проигнорирована вся накопленная к тому времени мудрость создания высоконадежных языков программирования. В результате на C легко написать совершенно нечитаемые конструкции.[/i]
    А зачем эти конструкции писать? Чтобы выпендриться перед кем-то? А про искусство оформления кода мы вообще забыли, да? Про то, что надо писать программы понятно, чтобы любой другой человек с минимумом усилий их понимал[/quote]

    Выше я привёл отнюдь не идиотскую, а вполне простую и читабельную конструкцию на Си, которая, тем не менее, оказывается очень опасной (пропустить случайно один «=» вполне возможно, и не надо ссылаться на то, что «со мной такого никогда не случалось»).

    Хотя насчёт выпендрёжа замечание совершенно верное. Я б мог ещё одно добавить: не следует стараться уложиться в как можно меньшее число строк и/или операторов, поскольку их количество прямо на эффективность кода не влияет.

    [quote]C++ не подойдёт для написания всяких веб-систем, работающих через браузеры — имхо очень сложно. В то время, как Java или тот же C# не подойдут для написания операционной системы. Из-за их прикладного характера[/quote]

    Пишут на С++ всякие веб-системы, пишут. Что на жабе или сишарпе ось не напишешь — тоже не факт, только для этой оси потребуется собственная виртуальная машина для работы, что полный изврат, конечно. Но разговор-то изначально шёл о Си/С++ и Паскале, а не о С++ и Жабе. А сфера возможного использования Паскаля (не «учебной» версии, которую изначально придумал Вирт, а языка, реализуемого Дельфи и FPC), а также паскалеподобных языков (Модула, Оберон, Ада) — та же, что и у Си/С++.

  3. Я не претендую на абсолютную правду, но всё же следует обратиться к тому, что мы имеем.

    А мы имеем то, что большинство веб-приложений пишется на Java/PHP/PERL. На Java написать код, работающий с аппаратурой напрямую, нереально (за исключением инклудинга бинарных библиотек), так как всё красиво оборачивается виртуальной машиной и хавается интерпретатором. Так как это по большей части интерпретируемые языки, то и производительность у них соответственная.

    Паскаль — хороший язык, я против него ничего не имею. Но покажите мне современные приближённые к hardware проекты, которые были бы написаны на паскале. Скорее, их можно пересчитать по пальцам. Основная направленность паскаля на данный момент — это написание приложений. Из всех проектов выжили два крупных — FreePascal и Delphi. И если бы весь функционал Pascal был бы удобен в использовании, то разработчики FreePascal не стали бы воротить в компилятор поддержку шаблонов в стиле C++. А они это сейчас и планируют. Что касается Delphi, то этот проект сейчас проваливается всё глубже и глубже. Я не знаю, о чём думают господа из Borland, но Delphi — не кроссплатформенная среда, и зависит сильно от Microsoft Windows. Были попытки сделать Delphi под Linux, но идея Kylix провалилась с треском. В отличие, например, от того же Lazarus, который сейчас усиленными темпами развивается и уже напоминает что-то вроде Delphi 1.

    Что касается C/C++, то языки тоже хорошие, но у них своя область применения, как раз более склонная к системной. Написав про очень высокую трудоёмкость написания веб-приложений, я имел в виду написание чего-то вроде веб-интерфейсов. Конечно, это можно сделать, но не так, например, как в том же PHP, который очень хорошо заточены под это, или часть функционала PERL.
    Надо сказать, что Страуструп тоже постарался и сделал синтаксис более строгим. Не всё, что написано на Си, будет скомпилировано Си++.
    Кстати, насчёт того же bool — его просто не было в C, отсюда и такой код. Однако, в отличие от Pascal, Си естественен. В нём нет магических функций WriteLn и ReadLn, нет магических переменных PORT и им подобных. Ну а про встроенный тип String и мэджик преобразования его в PChar я вообще молчу.
    Если вам не нравится strcpy и strcat, которые могут привести к переполнению буфера — используйте std::string, но за это поплатитесь потерей производительности.

    Моя задача была — подчеркнуть, что каждый язык выбирается исходя из поставленной задачи и возможных способов её решения. Каждый язык предоставляет свои средства, облегчающие разработку в той или иной области. Это уже решение разработчика, какой брать инструмент. Конечно, можно обжимать RJ-45 отвёрткой. Но это более трудоёмкий процесс, нежели взять обжимные клещи и обжать ими, то есть подобрать свой инструмент. Язык — как инструмент, его тоже нужно выбирать.

  4. Анонимно:

    [i]Так как это по большей части интерпретируемые языки, то и производительность у них соответственная[/i]

    Ну, если строго говорить, нынешняя Жаба — «двойной компилятор», а отнюдь не интерпретатор байт-кода, поэтому производительность вполне приличная (на циклах с большим числом итераций может даже обойти плохо оптимизированную программу на компилирующем языке, сам видел).

    [i]Но покажите мне современные приближённые к hardware проекты, которые были бы написаны на паскале[/i]

    Причина, как мне кажется, в другом, но затрону её в конце своего ответа :)

    [i]И если бы весь функционал Pascal был бы удобен в использовании, то разработчики FreePascal не стали бы воротить в компилятор поддержку шаблонов в стиле C++. А они это сейчас и планируют[/i]

    Лично я не думаю, что это хорошая идея. Скорей, причина добавления шаблонов — попытка сделать во ФриПаскале всё, что есть в С++, невзирая на то, нужно это реально или нет. Меня никогда отсутствие шаблонов не раздражало, хотя, программируя на С++, я их использовал (из STL, свои не клепал за ненадобностью).

    [i]Я не знаю, о чём думают господа из Borland[/i]

    У Борланда бааальшие проблемы в стратегии компании. Короче — кадры решают всё, и прежде всего кадры управленцев, а с этим у них большая задница. Потому они и проиграли мелкомягким на рынке инструментария для Винды, несмотря на то, что под ДОС борландовское ПО било мелкомягкое по всем статьям. Т.е. сам язык Паскаль здесь явно не при чём.

    [i]Что касается C/C++, то языки тоже хорошие, но у них своя область применения, как раз более склонная к системной[/i]

    Чем Си более склонен к системной области? Лично я никаких реальных преимуществ у него как у языка перед Паскалем не вижу (качество трансляторов — это совсем другой вопрос: понятное дело, что Интел С++ получше код генерит, чем Дельфи). В общем, если не сложно, конкретный пример, где Си действительно лучше.

    [i]Надо сказать, что Страуструп тоже постарался и сделал синтаксис более строгим[/i]

    Знаю, но кардинальные ляпы убрать из Си нельзя — получится совсем уж несовместимый язык.

    [i]насчёт того же bool — его просто не было в C, отсюда и такой код[/i]

    В Си++ есть, однако он по-прежнему понимает в качестве логических числовые значения, и поэтому потенциальная возможность ошибок сохраняется. Во всяком случае, у меня на VS подобный код проглатывало без возражений…

    [i]Однако, в отличие от Pascal, Си естественен. В нём нет магических функций WriteLn и ReadLn, нет магических переменных PORT и им подобных. Ну а про встроенный тип String и мэджик преобразования его в PChar я вообще молчу[/i]

    Чем это он естественен? == вместо общепринятого = и != вместо <> ? Или гениальной операцией «?» ? :)

    Упомянутые процедуры — действительно «магические» (тяжкое наследие создания языка для учебных целей), однако не более магические, чем переменное число параметров в любых функциях Си. Что касается переменной Port и типа string, то это вообще-то борландовские добавления к языку, в оригинале их не было. Кстати, а что в них такого извращённо-магического? Вполне нормально работают, удобны в использовании…

  5. Анонимно:

    [i]Если вам не нравится strcpy и strcat, которые могут привести к переполнению буфера — используйте std::string, но за это поплатитесь потерей производительности[/i]

    А как быть со scanf и тому подобными функциями? В библиотеке Си было полно дыр, допускающих переполнение буфера. Потому-то, кстати, вирусы с лёгкостью проникали на Юниксы, но не могли забраться, например, на VAX/VMS или там мэйнфреймы…

    Ну а в Паскале я регулярно использую прямую пересылку участков памяти — есно, при этом думаю, что пересылаю, куда и сколько. Проблема-то не в том, что внутри программы можно указать неверный размер (это прямая ошибка программиста), а что извне, действиями юзверя, можно было переполнить буфер…

    [i]Моя задача была — подчеркнуть, что каждый язык выбирается исходя из поставленной задачи и возможных способов её решения[/i]

    Согласен полностью. Поэтому я и выбираю (когда у меня есть возможность) либо Паскаль, либо ассемблер, либо их смесь :) Хотя, если б пришлось писать для веба, выбрал бы, наверное, ПХП (знаком крайне поверхностно, потому что интернет-технологии меня не увлекают) — писать на Паскале генераторы ХТМЛ-кода — действительно изврат. А вот Си/С++ по доброй воле не выбираю никогда — с моей точки зрения, нет ни одной задачи, где лучше бы не справился Паскаль с ассемблером.

    Кстати, выбирал бы и Аду, будь в моём распоряжении нормальный компилятор с нормальной ИДЕ :)

  6. > Во-первых, основная масса [b]прикладного[/b] ПО пишется на С++,
    Эх, как давно это было :)

Добавить комментарий

Blue Captcha Image
Refresh

*