avva: (Default)
[personal profile] avva
Линус в очередной раз сказал, что думает о C++. Вот длинная цитата, но вообще-то стоит все прочитать.
One of the absolute worst features of C++ is how it makes a lot of things so context-dependent - which just means that when you look at the code, a local view simply seldom gives enough context to know what is going on.

That is a huge problem for communication. It immediately makes it much harder to describe things, because you have to give a much bigger context. It's one big reason why I detest things like overloading - not only can you not grep for things, but it makes it much harder to see what a snippet of code really does.[...]

And C is a largely context-free language. When you see a C expression, you know what it does. A function call does one thing, and one thing only - there will not be some subtle issue about "which version" of a function it calls.
А вот что я писал четыре года назад :)
Одна из главных причин, почему C++ плохой язык: для этого надо сначала понять, почему C хороший. В чем состоит то свойство C, из-за которого его называют "портабильным ассемблером"? Дело не в том, что "близко к машине", и всё низкого уровня. Дело в том, что почти всегда в C эффект любой строки кода локален и очевиден. Когда я что-то делаю в C, неважно что, я очень хорошо понимаю, что именно происходит. Если я пишу x=y, я знаю точно, что происходит. Если я пишу f(...), я знаю точно, какая конкретно функция будет вызвана, я могу указать на неё пальцем, и я знаю точно, что произойдёт в момент входа в неё и выхода из неё. Если я выделяю память, я знаю точно, что она не исчезнет, пока я её не освобожу. Итд. итп. [...]

C++ - смесь разных принципов отношения к информации и средствам её прятать или открывать, которые доступны программисту; смесь, кажется, очень плохо продуманная. С одной стороны, полностью сохранён "низкий уровень" C, в том числе отсутствие сборки мусора, т.е. очень важный пример того, что заставляем программиста за всем следить и обо всём помнить. [...] Но, с другой стороны: полностью нарушен (я бы сказал, низвергнут с пьедестала и подвержен особо извращенному поруганию) этот самый принцип локальности поведения системы в ответ на строчку моего кода. Я всего лишь объявил переменную какого-то типа, написав "Typename varname;", но эта строчка может привести к вызову неизвестного мне конструктора, а за ним - кода сколь угодно, вообще говоря, сложности. Я всего лишь применяю известный мне оператор к переменной - а он, оказывает, overloaded у этого класса, и черт знает что на самом деле там произойдет. Я всего лишь вышел из функции, что может быть проще, написал }, а в рантайме на самом деле пошли плясать деструкторы всех автоматических объектов в этой функции. И даже и не буду начинать говорить про copy constructor и прочие подобные прелести.
(это тоже длинная цитата, но не всё - см. по ссылке).

Тогда я хорошо понимал, почему C лучше C++. Прошло четыре года, и теперь я хорошо понимаю, почему C++ лучше, чем C (сомневаюсь, что Линус об этом напишет). При этом я не отказываюсь ни от одного слова, и все еще считаю, что C лучше C++. Никаких дешевых парадоксов, просто два разных смысла слова 'лучше'. Об этом как-нибудь в другой раз.

Date: 2010-06-23 09:07 pm (UTC)
From: [identity profile] dimrub.livejournal.com
Я всего лишь вышел из функции, что может быть проще, написал }, а в рантайме на самом деле пошли плясать деструкторы всех автоматических объектов в этой функции.

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

Date: 2010-06-24 12:16 pm (UTC)
From: [identity profile] mopexod.livejournal.com
А какой красивый паттерн пропал - из всех мест функции вместо return - goto end;

Я просто люблю goto. Хотя и деструкторы на } - тоже люблю.

(no subject)

From: [identity profile] faceted-jacinth.livejournal.com - Date: 2010-06-25 07:31 pm (UTC) - Expand

(no subject)

From: [identity profile] mopexod.livejournal.com - Date: 2010-06-26 09:05 am (UTC) - Expand

Date: 2010-06-23 09:14 pm (UTC)
From: [identity profile] strangeraven.livejournal.com
C++ по сути не просто язык программирования, а среда для создания множества диалектов.
Хороший стиль C++ - это программирование на одном из его осознанно выбранных диалектов.
Ну например, отказаться от исключений, виртуальных функций, т.п., и писать на "C с классами". По сути это портативный ассемблер и есть. Вполне себе диалект.

Если известно, на каком диалекте написана программа, то локальность и простота обеспечивается.

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

Date: 2010-06-23 09:17 pm (UTC)
From: [identity profile] nevsky.livejournal.com
> ...два разных смысла слова 'лучше'. Об этом как-нибудь в другой раз.

Ах, на самом интересном месте!

Date: 2010-06-23 10:16 pm (UTC)

Date: 2010-06-24 03:03 am (UTC)

Date: 2010-06-24 07:02 am (UTC)
From: [identity profile] niobium0.livejournal.com
+1, жду с нетерпением.

Date: 2010-06-23 09:31 pm (UTC)
From: [identity profile] burrru.livejournal.com
Думаю, важно местоимение. Пока это "я" и даже "мы", С и С++ сравнимы и у каждого есть свои преимущества. Но когда появляются "они", С++ выглядит более уместным.

Date: 2010-06-23 10:23 pm (UTC)
From: [identity profile] avva.livejournal.com
Хорошо сказано. А почему - выглядит более уместным?

(no subject)

From: [identity profile] burrru.livejournal.com - Date: 2010-06-24 03:31 pm (UTC) - Expand

(no subject)

From: [identity profile] vasja-iz-aa.livejournal.com - Date: 2010-06-25 07:38 pm (UTC) - Expand

(no subject)

From: [identity profile] meshko.livejournal.com - Date: 2010-06-24 04:28 am (UTC) - Expand

Date: 2010-06-23 10:24 pm (UTC)
From: [identity profile] chaganazana.livejournal.com
>> Никаких дешевых парадоксов, просто два разных смысла слова 'лучше'.

Другими словами, все хорошо в своем месте и в свое время.

Date: 2010-06-23 10:32 pm (UTC)
From: [identity profile] rezkiy.livejournal.com
А вот что писал г-н Торвальдс три года назад:

http://kerneltrap.org/mailarchive/git/2007/9/6/257267

Date: 2010-06-23 10:54 pm (UTC)
From: [identity profile] avva.livejournal.com
Помню, да. Но кстати в этот раз он лучше написал, чем в тот.

(no subject)

From: [identity profile] rezkiy.livejournal.com - Date: 2010-06-24 01:11 am (UTC) - Expand

Date: 2010-06-23 10:34 pm (UTC)
From: [identity profile] xsbos.livejournal.com
Мне кажется, я уже никогда и ничего не смогу написать на Си.
Буду чесаться, пыхтеть и нервно оглядываться по сторонам.
А на плюсах смогу.

Date: 2010-06-23 10:50 pm (UTC)
From: [identity profile] amosk.livejournal.com
Большинство тех кто ненавидит С++ писали на нем максимум мелкие утилиты.
Т.е. здесь срабатывает инстинкт ненависти ко всему чужому и непонятному (шовинизм).

С другой стороны, мне очень комфортно было на чистом С писать модули для Линукса. И я считаю что это правильное решение - использовать С для ядра.
Но именно работа с оборудованием и прочие задачи ОС и есть та граница, внутри которой С имеет преимущества над С++: полный контроль за ходом выполнения программы.
Весь прикладной (в терминах ОС) софт эффективнее писать на С++, а в большинстве случаев - на языках более высокого уровня (Java, Python, C#...)

А вообще я когда периодически переключаюсь с С на С++ и обратно, переключение на С происходит обычно безболезненно, т.к. разница слишком огромна и понятно что ожидать (вернее чего не надо ожидать :)), а вот при переходе с С на С++, вроде бы тот же язык, а не хватает разных мелочей, типа этих:
struct A {int a; int b;};
struct A a = { .b = 111 };
или
a = (struct A){1, 2};
или
int a[10] = { [5] = 1111};

Касательно перегрузки операторов, то эта фича расширяет контекст не более чем это делают таблицы виртуальных функций, которые повсеместно применяются в ядре линукса.
Так что речь Линуса как обычно не блещет объективностью. Ну просто невзлюбил он С++, вот и находит поводы его не использовать.

Date: 2010-06-24 12:10 am (UTC)
From: [identity profile] ol [infoserver.ru] (from livejournal.com)
а вот при переходе с С на С++, вроде бы тот же язык, а не хватает разных мелочей, типа этих:
struct A {int a; int b;};
struct A a = { .b = 111 };
или
a = (struct A){1, 2};
или
int a[10] = { [5] = 1111};

Только все это (за исключением первой строки) — не C, а нестандартное расширение, которое реализовано только в GCC.

(no subject)

From: [identity profile] amosk.livejournal.com - Date: 2010-06-24 12:22 am (UTC) - Expand

(no subject)

From: [identity profile] ro-che.info - Date: 2010-06-24 06:41 am (UTC) - Expand

Date: 2010-06-23 11:01 pm (UTC)
From: [identity profile] yirmy.livejournal.com
Вообще-то на любом языке можно писать хороший добротный код и можно писать ОЧЕНЬ гадкий код (write only software :)) - все зависит от того кто пишет. А из двух языков програмирования всегда лучше тот, на котором ТРУДНЕЕ писать гадкий код. Все остальное попадает в категорию "о вкусах не спорят".

Date: 2010-06-23 11:13 pm (UTC)
From: (Anonymous)
Для кого интересно лучше?

(no subject)

From: [identity profile] yirmy.livejournal.com - Date: 2010-06-23 11:47 pm (UTC) - Expand

(no subject)

From: [identity profile] amosk.livejournal.com - Date: 2010-06-24 12:01 am (UTC) - Expand

(no subject)

From: [identity profile] zigmar.livejournal.com - Date: 2010-06-24 10:17 am (UTC) - Expand

(no subject)

From: [identity profile] yirmy.livejournal.com - Date: 2010-06-24 04:20 pm (UTC) - Expand

(no subject)

From: [identity profile] migmit.vox.com - Date: 2010-06-25 05:02 am (UTC) - Expand

(no subject)

From: [identity profile] zigmar.livejournal.com - Date: 2010-06-25 08:16 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.vox.com - Date: 2010-06-25 08:17 am (UTC) - Expand

Date: 2010-06-23 11:12 pm (UTC)
From: (Anonymous)
И Линус такой медленный и C безнадежно устарел.

Date: 2010-06-24 12:09 am (UTC)
From: [identity profile] cryinstone.livejournal.com
Мой бывший однокурсник, к-рый весьма хороший программист от б-га, в свое время создал монументальный труд по поводу "нехорошести" С++:
http://yosefk.com/c++fqa/ (http://yosefk.com/c++fqa/)
И - по большому счету, с ним трудно поспорить.

Date: 2010-06-24 04:43 am (UTC)
From: [identity profile] lazyreader.livejournal.com
А зачем спорить с юмористическими текстами?

(no subject)

From: [identity profile] cryinstone.livejournal.com - Date: 2010-06-24 05:11 am (UTC) - Expand

Date: 2010-06-24 12:16 am (UTC)
From: [identity profile] msh.livejournal.com
Может он и detest, но ведь Linux kernel просто таки набит разным overloaded methods

Да вот прямо из соседнего окна

if (shost->transportt->user_scan)
error = shost->transportt->user_scan(shost, channel, id, lun)

эффект конкретно этой строчки - совершенно неочевиден, например, возвращаемое значение в разных имплементациях - разное.

Date: 2010-06-24 02:45 am (UTC)
From: [identity profile] meshko.livejournal.com
Точно!
Вообще репутация Линусовских рантов для меня навсегда подмочена его выступлением про дебаггеры.

Кстати читал недавно Google C++ Style Guide, подумалось, что на таком Си++ я, пожалуй, мог бы писать.

(no subject)

From: [identity profile] lazyreader.livejournal.com - Date: 2010-06-24 04:43 am (UTC) - Expand

(no subject)

From: [identity profile] dimrub.livejournal.com - Date: 2010-06-24 06:08 am (UTC) - Expand

Или вот такое:

From: [identity profile] pargentum.livejournal.com - Date: 2010-06-24 01:32 pm (UTC) - Expand

Date: 2010-06-24 03:30 am (UTC)
From: [identity profile] itman.livejournal.com
And C is a largely context-free language. When you see a C expression, you know what it does.

Ага, три раза. Особенно макросы какие-нибудь завернутые. И так все понятно, что хоть плачь. Или некоторые конструкции, которые на плюсах очень компактные - на Си - страницы кода получаются. Опять-таки, практически полная невозможность автоматизации работы с памятью. Какой замечательный язык, право! Зато есть возможность греппать malloc и free!
PS: Единственное серьезное преимущество Си - простота и портабельность.

Date: 2010-06-24 04:48 am (UTC)
From: [identity profile] lazyreader.livejournal.com
+всё.

Достаточно почитать код, например, какого-нибудь ffmpeg. Не поможет никакой grep и никакой ctags; там всё сплошь - косвенные вызовы через таблицы указателей на функции, да ещё и не всегда первого уровня. Да и выше по треду приведён пример ещё лучше - ядро линукса.

В общем, любой более-менее развитой проект на C однажды обязательно начинает использовать виртуальные функции ручного изготовления, а также обязательно заводит внутри себя две-три разновидности veryspecial_my_smart_malloc.

Хотя overloading, действительно, причиняет некоторые неудобства.

(no subject)

From: [identity profile] itman.livejournal.com - Date: 2010-06-24 04:50 am (UTC) - Expand

(no subject)

From: [identity profile] phoonzang.livejournal.com - Date: 2010-06-24 07:49 am (UTC) - Expand

(no subject)

From: [identity profile] lazyreader.livejournal.com - Date: 2010-06-24 08:46 am (UTC) - Expand

(no subject)

From: [identity profile] itman.livejournal.com - Date: 2010-06-24 01:54 pm (UTC) - Expand

Date: 2010-06-24 05:43 am (UTC)
From: [identity profile] 575757.livejournal.com
об этом была интересная дискуссия на HN пару недель назад http://news.ycombinator.com/item?id=1421398

Date: 2010-06-24 12:42 pm (UTC)
From: [identity profile] pupunussi.livejournal.com
Я не представляю себе свою жизнь без полиморфизма. Привык, наверное. :)

Date: 2010-06-24 06:36 pm (UTC)
From: [identity profile] gdy.livejournal.com
When you see a C expression, you know what it does. A function call does one thing, and one thing only - there will not be some subtle issue about "which version" of a function it calls.

Ха-ха :-)
В сишных исходниках одного очень серьёзного CAD'a в одном из модулей, по крайней мере, у функций отсутствовали прототипы, а для некоторых функций было несколько реализаций с разными сигнатурами.

Date: 2010-06-24 11:24 pm (UTC)
From: [identity profile] offthebeat333.livejournal.com
ясно..

А что Вы думаете о Delphi?? :)

Ответ

Date: 2010-06-27 09:23 am (UTC)
From: (Anonymous)
Хорошая статья, не зря прочитал:)

Date: 2010-06-30 10:31 pm (UTC)
From: [identity profile] thornik.livejournal.com
Си лучше С++ (или наоборот), как грабли лучше лопаты при укладке асфальта. Они ОБА настолько устарели, что могут служить наказанием нерадивым шарповодам и жабофилам. :)

C++

Date: 2010-07-20 04:42 am (UTC)
From: [identity profile] tr1gger.livejournal.com
C++ -- это переходный язык от С к Java, имхо.

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 28th, 2025 10:16 pm
Powered by Dreamwidth Studios