Поможет ли вам глубокое знание C ++ в изучении других языков быстрее / проще? [закрыто]


9

Есть ли вероятность того, что кто-то, кто выучил все ключевые аспекты C ++ и хорошо знает основы языка, выучит другие языки (такие как Python, Perl, Java) быстрее и проще?


9
Я бы сказал, что C ++ достаточно отличается от большинства других языков, чтобы сделать его более запутанным, чтобы выбрать что-то еще (если это единственный язык, который вы знаете). Многие языки используют синтаксис C ++, но немногие развивались в одном и том же направлении. В C ++ есть много исторических ошибок, специфичных только для C ++. Лучший выбор для быстрого освоения новых языков - просто сосредоточиться на изучении разных языков из разных парадигм. Чем больше парадигм вы узнаете, тем быстрее вы сможете выбрать другие вещи из этих парадигм.
KChaloux

3
Я не думаю, что знание C ++ дает вам преимущество в изучении других языков в целом. Это действительно зависит от того, какие другие языки вы собираетесь изучать. Мой профессор языков программирования говорил, что мы должны сосредоточиться на понимании общих понятий: это определенно сделает изучение отдельных языков намного легче.
Джорджио

9
Углубленное изучение одного языка - это хорошее начало для изучения программирования в целом, за исключением того, что вы можете перепутать языковые знания с общими знаниями. Современный C ++ - отличный язык, но как только вы перейдете на промежуточный уровень, вы получите огромную прибыль от знакомства с другими перспективами - возможно, взгляните на OCaml и Ruby, даже если вы никогда не будете использовать их всерьез. Как только вы станете постоянным программистом и сможете различать языковые и общие знания, освоение новых языков становится довольно простым делом, хотя мастерство всегда требует времени.
Амон

1
По сравнению с чем? Хорошо изучать другой язык, хорошо знать C ++, но не глубоко, совсем ничего не зная?
Теластин

2
Да, но и наоборот. Знание Ocaml или Scheme облегчает понимание многих новых функций C ++ 11
Василий Старынкевич,

Ответы:


12

В общих условиях

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

В конкретных условиях

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

Личное мнение

Я лично изучил Java сначала почти за 3 года до изучения C ++, и я должен сказать, что сожалею об этом (uni course ...). Это сделало изучение C ++ (я все еще учусь - далеко не «глубоким» знанием: D) не таким простым, как мне бы того хотелось. Если бы я сделал это наоборот, я бы сказал, что мне было бы намного легче. Особенно, когда вы знаете, ПОЧЕМУ что-то делается определенным образом, а не просто будьте уверены в автоматическом волшебстве языка. Если мне позволят высказать мнение, я бы предложил: C (для основных и универсальных парадигм программирования) -> C ++ (для базового понимания ООП наряду с управлением памятью) -> Затем вы можете перейти на любой «настоящий» язык ООП с хорошая основа, или вы можете продолжить с более сложными темами в C ++, все в зависимости от того, что вы


3
Я рад, что в моем университете мы начали с паскаля. Затем мы перешли на C (для части управления памятью и битовыми операциями) и, наконец, перешли на java для oop (хотя это, конечно, мог быть любой другой oo-язык). Честно говоря, меня очень беспокоит, сколько университетов начинаются с Java. Вы неизбежно выучите Java (и, что более важно, ООП) неправильно, поскольку настоящий ООП слишком сложен для начинающих, которые все еще борются с разницей между ORиAND
Lovis

2
@Doval: Сборка мусора дает вам иллюзию того, что вам не нужно беспокоиться об управлении памятью. Просто посмотрите, как часто программы с управляемым кодом получают утечки памяти, потому что некоторые ссылки оставались действительными в неожиданном месте (коллекции являются постоянным нарушителем), чтобы увидеть, насколько это иллюзорно на самом деле.
Мейсон Уилер

1
@Doval: Неправильный размер, место, выравнивание: как можно выполнить любую из этих вещей на объектно-ориентированном языке, когда компилятору известен правильный размер, а распределитель обрабатывает размещение и выравнивание? Освобождение на ранней стадии: это именно то, что GC должен предотвращать, поэтому говорить, что это не имеет отношения к этой дискуссии, просто не соответствует действительности. Но это происходит за счет превращения каждого выделения в утечку памяти. А не топать данные других объектов - это проблема проверки границ , а не проблема сбора мусора.
Мейсон Уилер

2
C ++ требует такого большого изучения, что это специфично для реализации C ++, но никогда не будет использоваться вне C ++ из-за его бесконечных причуда, его библиотек и различных систем. По моему опыту, все, кто пишет C ++, в основном соглашаются, что весь C ++ написан плохо и полон причуд и странностей, которые в основном специфичны для C ++. Изучение вашего минного поля не принесет ничего полезного в других языках, когда большинство языков испытывают недостаток в большинстве проблем C ++.
Джимми Хоффа

2
@Doval: Да, в этом весь мой смысл: эти вещи алгоритмически неразрешимы в общем случае , поэтому они должны обрабатываться умным человеком, а не алгоритмом, чтобы быть обработанными правильно. И сказать «это не утечка, это неэффективная программа» - это просто семантическое разделение волос; для стороннего наблюдателя поведение программы такое же, как и у программы с утечкой памяти, особенно в контексте многозадачных систем, где сжатие памяти под нагрузкой может вызвать серьезные проблемы.
Мейсон Уилер

9

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

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

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


4
Существуют причины, по которым Java и C # имеют более слабую систему шаблонов, но это потому, что им нужны полные метаданные обо всем. И мне было бы интересно объяснить, как объекты как ценности разрушают вещи. Особенно учитывая, что есть ссылки ...
Дедупликатор

3
@Deduplicator: Java и C # имеют совершенно разную систему генериков , поскольку опыт показывает, что шаблоны вызывают всевозможные серьезные проблемы, многие из которых возникают из-за того, что система шаблонов была плохо спланирована. ( Случайно завершено по Тьюрингу , чтобы привести один очевидный пример!) И объекты как значения нарушают подстановку Лискова, потому что если у вас есть класс Derived, родительским объектом которого является Base, и он переопределяет виртуальный метод в Base, и вы передаете его по умолчанию, передавая в функция, которая берет Base и вызывает виртуальный метод, она не будет вызывать производную версию.
Мейсон Уилер

2
@MasonWheeler: Ах, вы имеете в виду нарезку .
Фред Ларсон

2
@FredLarson: я должен был догадаться, что такая распространенная, пагубная проблема будет иметь конкретное название для нее. (И это C ++, глупое имя в этом. Когда программист вне мира C ++ слышит «нарезку», он, вероятно, подумает о нарезке массива !: P
Мейсон Уилер

4
Хотя я согласен на многие вещи, которые вы написали, я думаю, что у вас очень предвзятая точка зрения ;-) ИМХО изучение C ++ не делает людей тупее.
Док Браун

8

Нет. Хорошее знание C ++ облегчит изучение других языков, подобных C ++. Но это было бы скучно. Почему вы хотите знать два одинаковых языка? Это ничего не купит. (Обратите внимание, что это не относится к C ++. Это применимо к любому языку. Сравните с естественными языками: изучение итальянского языка не облегчит изучение других языков. Это облегчит изучение испанского, французского или португальского языка и изучение трех языков. из них будет легче выучить четвертый, но даже изучение всех романских языков не поможет вам в изучении финского, китайского, хинди, иврита, арабского, пушту, греческого и т. д.)

Языки программирования реализуют парадигмы. Питер ван Рой собрал плакат 34 основных парадигм программирования .

Парадигмы, в свою очередь, состоят из понятий. На этом плакате перечислено около 18 концепций.

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

Конечно, есть еще много специфических особенностей языка (среди них синтаксис). Кроме того, этот плакат полностью игнорирует типизацию, и, конечно, существует существенная разница между системой типов System F <: ω- стиля, системой типов в стиле Scala или динамической системой типов с утиным типом, не говоря уже о системе зависимых типов. à la Idris, Agda, Coq, Guru или ATS.


Хинди , а не индуист . Ничто не поможет вам в «изучении индуизма», не говоря уже о итальянском или C ++ ;-) +1.
PKG

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

Я должен был бы не согласиться с сравнением с естественными языками, поскольку C ++ является мультипарадигмальным языком в отличие от естественных языков. Кроме того, детально изучая функцию языка, вы узнаете, какие решения для этой функции нужны, и, скорее всего, поймете плюсы и минусы других реализаций. Например, попробуйте изучить шаблоны c ++ без углубления в свои преимущества и недостатки по сравнению с динамическими обобщениями. Даже если вы не наткнетесь на какие-либо упоминания о C # (сейчас это сложно), вы все равно будете знать, что такое динамические дженерики, и сразу узнаете об ограничениях C # дженериков, узнав о них позже
Rado

5

Я бы сказал, что глубокое знание любого языка программирования поможет в изучении других, по крайней мере, других языков в той же семье. Например, знание C ++ не сильно поможет с LISP или Haskell, но для объектно-ориентированных процедурных языков это поможет. Мой подход состоял в том, чтобы попытаться выучить язык из каждого из различных семейств (процедурный, функциональный, объектно-ориентированный и т. Д.) Языков, тогда эти знания могут быть перенесены на другие языки в этой семье. С другой стороны, глубокое знание APL не поможет ни с чем другим ...


3
Я видел, как выглядит код Self, Smalltalk или Ruby, написанный кем-то, кто изучил C ++ как первый язык. Я бы сказал, что знание C ++ довольно вредно для изучения ОО. Я думаю, что Self или Newspeak были бы гораздо более подходящими для этого. Кстати, глубокое знание APL, по крайней мере, поможет с такими языками, как J и K. Это также поможет в размышлениях о абстракциях и liftig коллекций более высокого уровня, что, вероятно, поможет при программировании в стиле MapReduce или Hadoop, а также в мышлении о Functors. , Аппликативы, Монады и Категории.
Йорг Миттаг

1
@ JörgWMittag: Хорошо известно, что можно писать на языке COBOL на любом языке ... какой смысл?
Дедупликатор

@Deduplicator Если ваш первый язык - COBOL, у вас гораздо больше шансов написать COBOL на других языках.
Довал

На самом деле, я должен согласиться с вещью COBOL. У меня был парень, работавший на меня много лет назад, который писал на языке Паскаль "Кобол" ...
Джим Натт

5

Я собираюсь взять другую интерпретацию здесь.

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

Но вы должны изучать структуры данных. Если вы просто «выучите C ++», вы не очень сильно выиграете, и это может замедлить процесс изучения других языков в краткосрочной перспективе.

Когда я учился в колледже, Data Structures был обязательным курсом на уровне новичка, принятым после CS1 (который по крайней мере половина класса выбрала). Это было сложно. Формат курса был в основном «Вот структура данных, которую вы никогда не видели раньше [например, левая куча ]. Реализуйте ее в C ++ за неделю и сделайте так, чтобы ваш вывод точно соответствовал нашему ожидаемому выводу, побайтно, поэтому мы может оценить это автоматически. " Затем на следующей неделе вы получите новую структуру данных и новое назначение. Я, вероятно, узнал больше на этом одном курсе, чем на всех других моих курсах вместе взятых.

Это тот тип обучения, который вам нужно сделать, чтобы C ++ был ценным.


2

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

Я не думаю, что C ++ лучше или хуже любого другого языка в этом отношении. Это один из наиболее многословных языков, которые я знаю, и он усложняет некоторые вещи, которые просты в большинстве других языков, но это не обязательно приводит к облегчению изучения следующего языка . Это обычно делает следующий язык чувствовать себя легче использования , хотя. Есть разница


0

Нет. Глубокое знание C или подмножества C ++, которое «в основном C», поможет при изучении других языков, по крайней мере, при представлении того, что должны делать их реализации. Глубокое знание C ++, , с другой стороны, в основном будет информацией, которая вводит в заблуждение или не имеет значения при изучении других языков; если вы изучите объектную ориентацию в C ++ более чем на поверхностном уровне, например, когда вы перейдете к Perl / Python / Ruby, вы потратите больше времени на изучение того, что вы знаете, чем на его использование, поскольку объекты на этих языках реализованы в совершенно другой способчем в C ++. То же самое верно в большей или меньшей степени для большинства других языков и для других языковых функций (например, шаблоны C ++ и полиморфизм Haskell - это в основном одна и та же функция, опять же, с совершенно разными реализациями). Поэтому глубокое знание C ++ в основном будет специфичным для C ++.


этот пост довольно трудно читать (стена текста). Не могли бы вы изменить его в лучшую форму?
комнат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.