Чи допоможе глибоке знання C ++ вам швидше / простіше вивчити інші мови? [зачинено]


9

Чи існує можливість того, що хтось, хто засвоїв усі ключові аспекти C ++ і дуже добре знає основи мови, швидше та простіше вивчить інші мови (наприклад, Python, Perl, Java)?


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

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

9
Вивчення однієї мови в глибині - це хороший початок до вивчення програмування взагалі, за винятком того, що ви можете плутати специфічні для мови знання з загальними знаннями. Сучасний C ++ - це чудова мова, але як тільки ви перейдете на проміжний рівень, ви отримаєте значну користь від знайомства з іншими перспективами - можливо, погляньте на OCaml та Ruby, навіть якщо ви ніколи не будете користуватися цим серйозно. Коли ви сталий програміст і зможете розмежовувати особливості мови та загальні речі, продуктивність на нових мовах стає досить простою, хоча оволодіння завжди потребує часу.
amon

1
У порівнянні з чим? Вивчити іншу мову добре, добре знати C ++, але не глибоко, взагалі нічого не знаючи?
Теластин

2
Так, але також навпаки. Знання Ocaml або Scheme робить багато нових C ++ 11 нових функцій легшими для розуміння
Базиль Старинкевич

Відповіді:


12

Загальні умови

Поглиблені знання будь-якої мови програмування, ймовірно, допоможуть вам швидше підбирати інші мови. Це частково, тому що програмування - це спосіб мислення більше, ніж засвоєння синтаксису. Більшість практик програмування стосується більшості інших мов програмування. Ось чому люди кажуть, що ви завжди вивчаєте другу мову програмування швидше, ніж першу.

У конкретних умовах

C ++ - це мова, яка дозволяє набагато більше «контролювати», ніж інші мови. Це може бути як добрим, так і поганим. Наприклад, справжній пістолет є кращим, ніж пневматичний пістолет, коли ви їдете в ліс (адже насправді ви можете щось збити з нього), але він також більш небезпечний для вас і для оточуючих. У C ++ є такі поняття, як управління пам'яттю, про яке вам не потрібно хвилюватися у більшості інших мов. Однак чітке розуміння цих понять далеко не безглуздо навіть при роботі з мовами автоматичного управління пам'яттю. Ви також можете виконувати побітові операції та йти набагато нижче до "металу" мовою на зразок C ++. Навіть базове розуміння в цих сферах може вам дуже допомогти як програміст на будь-якій мові.

Особиста думка

Я особисто навчився Java протягом майже 3 років, перш ніж вивчати C ++, і я повинен сказати, що дуже шкодую про це (uni course ...). Це зробило вивчення C ++ (я все ще навчаюся - далеко не «глибокі» знання: D) не настільки просто, як мені б хотілося. Якби я зробив це навпаки, я б сказав, що мені було б набагато легше. Тим більше, коли ти знаєш, ЧОМУ щось робиться певним чином, а не просто бути впевненим у автомагії магії. Якщо мені дозволять дати думку, я б запропонував: C (для базових та універсальних парадигм програмування) -> C ++ (для базового розуміння OOP разом із управлінням пам'яттю) -> Тоді ви можете перейти до будь-якої "справжньої" мови OOP із хороший фундамент, або ви можете продовжити розширеніші теми на C ++, все залежно від того, що ви


3
Я радий, що мій університет почав нас починати з паскалу. Потім ми просунулися до C (для управління пам'яттю та бітових операцій) і, нарешті, перейшли до java for oop (хоча це, звичайно, могло бути будь-якою іншою мовою). Якщо чесно, мені дуже непокоїть, скільки університетів починається з Java. Ви неминуче навчитеся Java (і що ще важливіше, OOP) неправильно, оскільки справжній OOP занадто складний для початківців, які все ще борються з різницею між 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 ++ (об'єкти як типи значень ніколи не є доброю справою, тому що вона порушує заміну Ліскова і сам OOP).

Так що, якщо ви отримаєте глибокі знання C ++, а потім ви хочете дізнатися інші мови програмування, там буде багато шкідливої і контрпродуктивною падла вам доведеться відучитися , щоб бути ефективними на інших мовах програмування.


4
Є причини, що у Java та C # є суворо слабша шаблонна система, але це тому, що їм потрібні повні метадані про все. І мені було б цікаво пояснення, як об’єкти як значення розбивають речі. Особливо враховуючи, що є посилання ...
Дедуплікатор

3
@Deduplicator: Java і C # мають зовсім іншу систему дженерики , оскільки досвід показує, що шаблони викликають всілякі серйозні проблеми, багато з яких виникають через те, що система шаблонів не була добре спланована в першу чергу. (Turing-завершено випадково , щоб навести один очевидний приклад!) І об'єкти як значення порушують підстановку Ліскова, тому що якщо у вас є клас Похідний, батько якого є Base, і він переосмислює віртуальний метод на Base, і ви передаєте його за замовчуванням, переходячи до Функція, яка приймає Base і викликає віртуальний метод, не буде викликати отриману версію.
Мейсон Уілер

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

2
@FredLarson: Я повинен був здогадатися, що така поширена, згубна проблема має для неї конкретну назву. (І це C ++, це дурне ім'я. Коли програміст за межами світу C ++ чує "нарізку", він, швидше за все, подумає про нарізку масиву !: P
Мейсон Уілер

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

8

Ні. Якщо добре знати C ++, це полегшить вивчення інших мов, схожих на C ++. Але це було б нудно. Чому ви хочете знати дві однакові мови? Це нічого не купує. (Зверніть увагу, що це не характерно для C ++. Це стосується будь-якої мови. Порівняйте з природними мовами: вивчення італійської мови не полегшить вивчення інших мов. Це полегшить вивчення іспанської, французької чи португальської мов та вивчення трьох з них буде легше вивчити четвертий, але навіть вивчення всіх романських мов не допоможе вам трохи вивчити фінську, китайську, хінді, іврит, арабську, пушту, грецьку тощо).

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

Парадигми, в свою чергу, складаються з понять. У цьому плакаті перелічено близько 18 концепцій.

Усі парадигми (або принаймні ті, що є на плакаті) складаються з цих концепцій. Усі мови реалізують одну або кілька парадигм, що складаються з цих концепцій. Отже, якщо ви вивчите ці поняття, ви (в деякому сенсі) вивчите кожну мову програмування одночасно.

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


Хінді , а не індуїстський . Ніщо не допоможе тобі в "вивченні індуїзму", не кажучи вже про італійську або C ++ ;-) +1.
ПКГ

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

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

5

Я б сказав, що глибоке знання будь-якої мови програмування допоможе вивчити інших, принаймні інших мов тієї ж сім'ї. Наприклад, знання C ++ не дуже допоможуть з LISP або Haskell, але для об'єктно-орієнтованих процедурних мов це буде. Мій підхід полягав у тому, щоб спробувати вивчити мову з кожної з різних сімей (процедурна, функціональна, об'єктно-орієнтована тощо) мов добре, тоді ці знання можуть переноситися на інші мови в цій сім'ї. З іншого боку, глибоке знання APL не допоможе ні в чому іншому ...


3
Я бачив, як виглядає код Self або Smalltalk або Ruby, написаний особою, яка вивчила C ++ як першу мову. Я б фактично сказав, що знання C ++ є досить шкідливим для вивчення ОО. Я думаю, що «Self» або «Newspeak» набагато краще підходять для цього. До речі, глибоке знання APL, принаймні, допоможе для таких мов, як J та K. Це також допоможе роздумувати над абстракціями колекції вищого рівня та liftig, що, ймовірно, допоможе програмуванню в стилі MapReduce або Hadoop, а також думці про Functors , Додатки, монади та категорії.
Йорг W Міттаг

1
@ JörgWMittag: Загальновідомо, що можна писати COBOL будь-якою мовою ... у чому сенс?
Дедуплікатор

@Deduplicator Якщо вашою першою мовою є COBOL, ви набагато більше шансів написати COBOL іншими мовами.
Довал

Власне, я маю згоду з справою COBOL. У мене був хлопець, який працював для мене років тому, який написав COBOL на Паскалі ...
Джим Натт

5

Я тут прийму іншу інтерпретацію.

C ++ - це гарна мова для вивчення пам’яті та структур даних, оскільки вона змушує вас ретельно продумати такі поняття, як власність та життєдіяльність об’єктів. А вивчення пам'яті та структур даних - одна з найважливіших частин будь-якої навчальної програми з програмного забезпечення.

Але ви повинні дізнатися про структури даних. Якщо ви просто "вивчите C ++", ви дійсно не дуже заробите, і це може сповільнити процес вивчення інших мов у короткому періоді.

Коли я навчався в коледжі, «Структури даних» був необхідним курсом на рівні першокурсника, який пройшов після 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.