пятница, 11 июня 2010 г.

[prog.flame] Свежие высказывания Торвальдса о C++ навели на мысли о причинах маргинальности Lisp-а и Haskell-я

Ув.тов.z00n поделился ссылкой на свежую критику языка C++ от Линуса Торвальдса. Вкратце, Торвальдс говорит вот о чем (ниже идет пересказ того, что я понял):

Производительность разработчика определяется не только количеством строк кода. Производительность так же сильно зависит и от коммуникаций между разработчиками. Чем больше нужно общения, тем хуже. Лучше всего, когда коммуникаций нет вообще. Но для этого нужно, чтобы разработчики следовали определенной культуре разработки. В разработке ядра Linux такая культура сформировалась не в последнюю очередь из-за простоты языка C. Код на C легко читать, в нем нет неявных зависимостей от “контекста”. Если человек видит вызов sctp_connect(), он сразу понимает, о чем идет речь. Тогда как обращение к connect() в C++ном коде может означать все, что угодно. Этим-то C++ и плох. Если кто-то находится “в теме”, то в C++ном коде ему будет разобраться несложно. Но вот всем остальным на это потребуется гораздо больше времени и сил для того, чтобы сначала разобраться с контекстом, а затем уже с самим кодом. Плюс к вышеперечисленному разработка ядра – это очень специфическая вещь, для которой C является очень хорошим инструментом. Но это вовсе не значит, что C должен использоваться везде и всюду без разбору.

Во-первых, меня в очередной раз поразило, насколько разумные вещи говорят многие заслуженные программисты (Торвальдс, Страуструп (не смотря на то, что многим стиль его речи не нравится), Кнут, Вирт и др.).

Во-вторых, эти слова, на мой взгляд, очень хорошо описывают не только то, почему C++ слабо представлен в Linux-овом ядре. Но и почему, например, Lisp не завоевал весь мир. Слишком сильная привязка к контексту. Один разработчик напишет себе на Lisp-е собственный DSL, а другому нужно будет сначала разобраться с этим DSL, а уже потом с конкретным кодом.

Этим же, имхо, определяется и успех Java – язык таков, что все пишут однотипный код. Посему чужой код на Java понять проще, чем чужой код на C++.

Этим же, имхо, определяется и то, почему всякие Haskell-и и OCaml-ы пока не захватили весь мир: хардкорные функциональщики не задумываются о читабельности своего кода. Желающие могут, например, посмотреть на реализацию Data.Tree – обилие однобуквенных идентификаторов и операторов непривычного для обычного программиста вида (<$>, <|, |>, :<).

Вот кто захочет придти на проект, который развивался в течении 5-7 лет средней руки программистами, в условиях меняющихся требований, цейтнотов, исправленных на скорую руку просчетов, с кучей workaround-ов для сторонних компонентов, исходник которого будет представлять из себя плохозакомментированную многоэтажную математическую формулу?

8 комментариев:

Анонимный комментирует...

Женя, как ты тогда объяснишь популярность перла с его скобочками, крючочками, долларами? Я это к тому, что написанный код читать достаточно сложно. И чем более опытен программист, тем больший функционал он запихает в меньшее число строк кода. И большей частью такой код будет из закорючек. При этом перл достаточно популярен (хотя сейчас популярность падает).

eao197 комментирует...

Популярность perl-а для меня такая же загадка, как, например, популярность Visual Basic-а, большие программы на TCL/TK и широкое распространенность XML. Т.е. факты есть, объяснения им у меня (пока) нет. :)

Может быть это из-за того, что Perl -- это write-only язык. Программы на нем не читают. Их пишут, потом выбрасывают, потом пишут новые. :)

По поводу связи опыта и объема кода не соглашусь. Тут, наверное, такая тенденция с развитем опыта у программиста: много кода (но сложного) -> мало кода (но сложного) -> нормальное количество простого кода.

1 комментирует...

Как грамотно сказано, без религиозных войн и истерики, чёткое прагматическое обоснование. Класс!

eao197 комментирует...

2Lamer: мне в универе доводилось общаться с несколькими очень классными программистами, которые, к сожалению, с трудом могли донести свои идеи до слушателей. С тех пор у меня сложился стереотип: хороший программист -- плохой рассказчик.

Тем удивительнее читать удивительно точные и логически обоснованные высказывания очень хороших программистов. В данном случае Торвальдса.

Alex комментирует...

Сказано просто замечательно.

В пересказе взят один конкретный пример, который достаточно ярко характеризует проблему. И в Java этот конкретный пример тоже в силе, хотя в C++ достаточно выразительных средств, чтобы перестрялять и повесить всех и вся. (и гораздо больше, чем в Java). И помимо того времени, которое потребуется на понимание чужого кода требуется понимание и опыт использования примененных парадигм. Это так, отступление, вызванное ностальгией по программированию на C++.

Но мне кажется, что за кадром остаётся другая проблема. Можно очень хорошо "испортить" контекст используя pure C. Не помню, где это было, но в принипе никто и ничто не мешает писать ООП на С, и использовать вирт. функции - только без поддержки этих конструкций в языке получится нечто особенное.

И если этот пример притянут за уши, то "плохая" организация доступа к общему участку памяти, или хотя бы организация динамически изменяемого меню через указатели на функции потребуют значительных усилий разработчика-не-автора (да и автора, спустя какое-то время).

Основная мысль была в том, что C++ к обычным проблемам в написании программ добавляет свои, присущие именно C++, так что спорить тут и не с чем.

В популярности Perl (как и C++) играет роль фактор сложности языка и ощущения "могущества" от его использования. ну и Fun. ИМХО, конечно.

Ещё одна ссылка - увидел буквально накануне, хотя вполне возможно, что она уже светилась на РСДН и т.д.
http://www.charlespetzold.com/etc/DoesVisualStudioRotTheMind.html
Последний раздел, "The Pure Pleasures of Pure Coding".

В этом точно что-то есть.

eao197 комментирует...

2Alex:

>Не помню, где это было, но в принипе никто и ничто не мешает писать ООП на С, и использовать вирт. функции - только без поддержки этих конструкций в языке получится нечто особенное.

Видел такое в исходниках OpenSSL. Да, ООП в чистом C возможно, но выглядит страшно. Да и тот же COM из Windows -- его же можно было и на чистом C писать.

За ссылку спасибо. Раньше не встречал, почитаю.

Quaker комментирует...

Популярность perl-а для меня такая же загадка, как, например, популярность Visual Basic-а, большие программы на TCL/TK и широкое распространенность XML.
Перл уже не тот, как в 90-ые. Неизвестно еще, насколько широко будет использоваться 6-ая версия Perl. Что касается Visual Basic-а, посмотрите результаты тестов в журнале "Практика функционального программирования" (конкурсные задания) - там бейсик почти всех порвал, в том числе и функциональщину.

eao197 комментирует...

2Quaker: Visual Basic сейчас тоже совсем не тот, каким он был в 94-96. Тем не менее, корни его популярности именно там. И они мне не понятны.

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