Многие учебные заведения преподающие компьютерные науки шарахаются от C++ как от чумы, полагая что этот язык а) чрезвычайно сложен для студентов и б) является нагромождением нелепостей, котрые скопились за долгую историю языка и которые могут непоправимо травмировать нежные детские души. В итоге в лучшем случае преподавание ведётся на живых языках таких как C и Java, а в худшем - на мертворождённых мутантах, плодах академического исступления, навроде Scheme или SmallTalk.
На рубеже 19-20 вв. зачастую студентов всё ещё учили латыни. Не для того, чтобы на ней разговаривать или писать работы - латынь уже тогда была мёртвым языком - а целиком лишь для гимнастики ума. По мнению преподователей овладевание латинской грамматикой упорядочивало мышление, учило стройно излагать мысли на письме и в устной речи. В отличие от латыни, C++ это живой постоянно развивающийся язык, по сей день один из наиболее популярных инструментов в инженерном мире.
Изучение C++ вместо Pascal или Java на инженерных факультетах полезно вот почему:
- На C++ можно изучать процедурное программирование точно так же как и на C или Pascal. В отличие от мёртвого Pascal, язык C++ до сих пор один из наиболее популярных; в отличие от C более строгая проверка типов в C++ приучает с младых ногтей избегать небрежности, которая так характерна для C.
- На C++ можно изучать объектно-ориентированное программирование, включая такие уровни абстракции как templates. За историю использования языка собран колоссальный опыт как ОО приёмов, так и применения templates. К примеру, аналоги templates появились в Java сравнительно недавно. Во многих других языках они до сих пор отсутствуют.
- На C++ можно изучать низкоуровневое программирование, т.к. благодаря одному из основных принципов языка - you don't pay for what you don't use - C++ всегда оставался близок к железу на котором он бежит, ничуть не уступая в этом C.
- На C++ можно и нужно изучать основные концепции исполнения программы такие как адресация памяти и операции с ней посредством пойнтеров, memory barriers и спекулятивное исполнение, стэк и механика вызова функции, передача по ссылке или по значению и многое другое. Студенты выросшиие на Java и Python имеют очень отдалённое представление об этих материях, что непосредственно сказывается на качестве их инженерных решений.
- На C++ можно и нужно изучать разработку софта как инженерную дисциплину. Те несуразности в C++ которые могут показаться на первый взгляд, при более пристальном изучении окажутся единственно верными решениями перед лицом неудобной, неукладывающейся в строгие академические рамки реальности в которой должен жить инженер. Каждое такое решение является продуктом мучительного поиска сильнейших людей в индустрии. Для абсолютно любого аспекта C++ можно найти разумное объяснение его существования. Оно будет задокументированно в качестве предложения в стандарт и одобренно большинством голосов комитета WG21 в ISO.
Изучение истории C++, предложений по изменению языка уже само по себе является интереснейшим курсом молодого бойца для будущего инженера. Подобные решения ему придётся принимать на протяжении всей карьеры и на своей собственной шкуре испытать неразрешимые противоречия между техническими требованиями и имеющимися возможностями.
Those who don't understand C++ are doomed to reinvent it, poorly.
no subject
Date: 2008-11-29 05:33 am (UTC)Да нет, конечно же. Именно что разговаривать и писать работы.
no subject
Date: 2008-11-29 05:45 am (UTC)Экий набор несуразностей
Date: 2008-12-20 04:56 pm (UTC)Си++ создан одним человеком. Другие специалисты подключились потом, но влияние Страуструпа осталось. Опять же, помним: верблюд – лошадь, созданная комитетом. Ещё важнее то, что у многих проблем "растут ноги" из решений, принятых тогда, когда Си++ был ещё академическим проектом. Например, объединение в рамках одной концепции понятий "класса", "структуры" и "объединений" никакого практического смысла не несёт.
Изучение Си++ в вузе – плохая идея (речь не идёт о спецкурсах и т.д.). Язык слишком сложен, чтобы его было быстро освоить и пользоваться им уже как инструментом. А также слишком обманчив: многие считают, что знают Си++, а назвать, какие методы автоматически генерируются компилятором, не могут и уж тем более не знают, что из этого следует. Отмечу, что не о троечниках речь.
Я не знаю, что Вы имеете в виду под низкоуровневым программированием, но изучать вопросы программирования, связанные с хардвером, на Си++ не следует. Обобщённо говоря, из-за того, что программист на Си++ не контролирует то, что выдаст компилятор.
C++ is the most poorly invented language, to reinvent it more poorly is not easy.
Re: Экий набор несуразностей
Date: 2008-12-21 07:42 pm (UTC)С++ никогда не был академическим проектом, а наоборот был задуман Страуструпом как альтернатива существовавшим на тот момент академическим языкам. Именно поэтому Страуструп решил расширять С - повсеместно используемую рабочую лошадку, а не чисто академический язык. Именно поэтому Страуструп с самых первых дней C with Classes плотно работал с Ричи, Керниганом и другими над своим расширением.
Студентам необязательно изучать С++ во всех тонкостях с самых первых дней. Именно богатсво средств, доступных в языке позволяет изучать разные концепции не меняя инструментария, не отвлекая на переучивание ради новых языков.
Низкоуровневость проявляется в С++ благодаря тому что конструкции языка непосредственно мапируются на машинные средства: поинтеры указывают на память, для хранения переменных используются регистры, стэк поддерживается непосредственно CPU и т.д..
Re: Экий набор несуразностей
Date: 2008-12-22 01:47 pm (UTC)Мне про это ничего неизвестно. Зато я помню, сколь минимальной была первая версия языка и предложения о расширениях – например, множественное наследование или темплейты – представляли доклады, автором которых был Страуструп. Даже, как помнится, без соавторов.
Известно, что Си++ вытекает из диссертации Страуструпа. Откуда следует практическая направленность Си++, не ясно. Не обосновано. Тогда как попытки
скрестить ужа с ежомюнионы со структурами, введение множественного наследования, ссылок, объектная модель – всё типичные академические игры. Промышленные (в широком смысле) системы программирования делаются не так: в них приоритеты повышенная надёжность и полезность конструкции. Уместный пример здесь скорее Ява.Ну и на даты можно посмотреть. Начало работы над проектом – 1979 г.; первый "компилятор" Cfront (поделие, переводившее Си++ программы в Си) – первый коммерческий компилятор (так и не смог дознаться, что за) – 1985 г., первая книга Страуструпа – 1986 г. ARM – 1990 г. Язык сложился, его уже не исправить. В том же году – образование рабочей группы по стандарту Си++ и в 1998 г. стандарт опубликован. Видим, что стандарт следовал за распространением языка, а не наоборот. (Впрочем, это нормально.) Да, кстати, Вы этот стандарт (а тем паче более поздний) читали?
О каких либо сколько-нибудь крупных проектах для раннего Си++ ничего не известно. Сравните с Си. И первый компилятор только через шесть лет после создания языка (если не считать Cfront, который и не компилятор вовсе.
Студентам необязательно изучать С++ во всех тонкостях с самых первых дней.
Вкратце. Тезис "то, что Вы не знаете, Вам не повредит" ложен, особенно в случае с Си++. Желание использовать динамические структуры данных с классами влечёт необходимость разбираться в функциях, генеримых компилятором. Использование полиморфизма методов с различными сигнатурами требует знания сложных (весьма!) правил выбора нужного метода. Хуже всего, что при беглом взгляде всё кажется простым: остаётся либо запрещать использовать какие-то конструкции (что непедагогично и не особо действует на студентов), либо объяснять, что и как. А объяснять придётся, подробно останавливаясь на тонкостях языка и последствиях тех или иных решений (что в случае Си++ сильно не одно и тоже. Вообще-то это правильный подход, но если тема курса – структуры данных, то нужно не это.
К тому же экономить часы на том, чтобы изучать поменьше языков программирования – глупо. Новый простой язык вроде Си, Паскаля или даже хотя бы Явы – это пара занятий в начале курса (если речь не идёт о первокурсниках). В результате несколько языков дают в сумме сложность меньшую, чем один Си++.
Низкоуровневость проявляется в С++
Можно признать, что наличие указателя есть признак низкоуровневости. Всё остальное – это Ваше знание о том, как это обычно (кстати, не всегда) реализуется. Ни регистры, ни стек сиплюсам не нужны. И Си++ в этом ничем не выделяется на фоне Си/Паскаля/Модулы.
Re: Экий набор несуразностей
Date: 2009-01-07 12:52 am (UTC)I spent several months programming in Java. Contrary to its authors prediction, it did not grow on me. I did not find any new insights - for the first time in my life programming in a new language did not bring me new insights. It keeps all the stuff that I never use in C++ - inheritance, virtuals - OO gook - and removes the stuff that I find useful. ... it might be a profitable thing ... but it has no intellectual value whatsoever. Look at their implementation of hash tables. Look at the sorting routines that come with their "cool" sorting applet. Try to use AWT. The best way to judge a language is to look at the code written by its proponents. "Radix enim omnium malorum est cupiditas" - and Java is clearly an example of a money oriented programming (MOP). As the chief proponent of Java at SGI told me: "Alex, you have to go where the money is." But I do not particularly want to go where the money is - it usually does not smell nice there.
The signature of max is: max: T x T -> T It is not expressible in Java
These are my litmus tests: if a language allows me to implement max and swap and linear search generically - then it has some potential.
Это цитаты Александра Степанова.