精通C ++的知识是否可以帮助您更快/更轻松地学习其他语言?[关闭]


9

学习过C ++所有关键方面并且非常了解该语言基础知识的人是否有可能更快,更轻松地学习其他语言(例如Python,Perl,Java)?


9
我认为C ++与大多数其他语言有足够的不同,以至于使C ++ 在选择其他东西时更加混乱(如果这是您所知道的唯一语言)。许多语言都共享C ++的语法,但很少有人朝着完全相同的方向发展。C ++具有许多仅适用于C ++的历史遗留问题。快速选择新语言的最佳选择是专注于从不同范例中学习不同的语言。您熟悉的范式越多,从这些范式中挑选其他事物的速度就会越快。
KChaloux

3
我认为了解C ++不会给您一般学习其他语言带来的好处。这实际上取决于您将要学习什么其他语言。我的编程语言教授曾经说过,我们应该专注于理解一般概念:这肯定会使学习单个语言变得更加容易。
乔治

9
深入学习一种语言是一般学习编程的一个好的开始,除了您可能将特定于语言的知识与常识相混淆。现代C ++是一门很棒的语言,但是一旦您达到中级水平,就会从其他已知角度中受益匪浅–即使您永远不会认真使用OCaml和Ruby,也可以看看它们。一旦您是一名稳定的程序员并且可以区分特定于语言的事物和普通事物,那么掌握新语言就变得相当容易,尽管精通总是会花费时间。
阿蒙2015年

1
比起什么?很好地学习另一种语言,很好地了解C ++,但一点都不了解?
Telastyn

2
是的,但反之亦然。知道Ocaml或Scheme使许多C ++ 11新功能更容易理解
Basile Starynkevitch 2015年

Answers:


12

笼统

对任何编程语言的深刻了解都可以帮助您更快地学习其他语言。这部分是因为编程比学习语法更是一种思考的方式。大多数编程实践都适用于大多数其他编程语言。这就是为什么人们说您总是比第二种语言学习第二种编程语言更快的原因。

具体而言

C ++是一种比其他语言允许更多“控制”的语言。这可能是好事,也可能是坏事。 例如,当您进入森林时,真实的枪比气枪要好(因为您实际上可以用它射击东西),但是这对您和您周围的人也更危险。C ++具有诸如内存管理的概念,在大多数其他语言中,您无需担心。但是,即使使用自动内存管理语言,也要牢牢掌握这些概念并非毫无意义。您还可以执行按位运算,并使用C ++这样的语言深入到“金属”。即便是对这些领域的基本了解也可以以任何语言为您提供很多帮助。

个人想法

在学习C ++之前,我亲自学习Java已有近3年的时间,我应该对此感到后悔(单门课程...)。这使得学习C ++(我仍在学习-远非“深刻的”知识:D)并不像我想要的那么简单。如果我反过来做的话,我会说对我来说要容易得多。尤其是当您知道为什么要以某种特定方式完成某件事时,不仅要保证该语言的自动性。如果允许我提出意见,我建议:C(用于基本和通用编程范例)-> C ++(用于对OOP和内存管理进行基本理解)->然后,您可以使用任何“真正的” OOP语言良好的基础,或者您可以继续学习C ++中更高级的主题,所有这些都取决于您


3
我很高兴我的大学让我们从帕斯卡开始。然后,我们前进到C(用于内存管理和位操作部分),最后前进到Java for oop(尽管这当然可以是其他任何oo语言)。老实说,我发现有很多大学以Java 开头,这很令人不安。你将不可避免地学习Java(更重要的是,OOP)错了,因为真正的OOP过于复杂,对于初学者仍与之间的区别挣扎ORAND
洛维斯

2
@Doval:垃圾回收给您带来不必担心内存管理的错觉。只需看看托管代码程序多久发生一次内存泄漏,这是因为某些引用在意外的地方仍然有效(收藏是多年生的违法者),以了解这确实是多么的虚幻。
梅森惠勒2015年

1
@Doval:错误的大小,位置,对齐方式:当编译器知道正确的大小并且分配器处理放置和对齐方式时,用一种面向对象的语言来做这些事情到底是怎么做的?提早释放:这正是GC应该防止的事情,因此说它与本次讨论不相关只是直截了当的事实。但这是以将每个分配转换为内存泄漏为代价的。 不踩踏其他对象的数据是一个边界检查问题,而不是垃圾回收问题。
梅森·惠勒

2
C ++需要大量的学习知识,这些知识都是C ++实现特定的,但是由于C ++的无数怪癖,它的库和各种系统,因此永远不会在C ++之外使用。以我的经验,每个编写C ++的人基本上都同意所有C ++的编写都不好,并且充满了大多数C ++特有的古怪之处。当大多数语言都缺乏C ++的大多数问题时,在这种雷区中学习将不会对其他语言有用。
Jimmy Hoffa'1

2
@Doval:是的,这就是我的全部要点:在一般情况下这些事情在算法上是无法确定的,这就是为什么必须由聪明的人而不是算法来正确处理它们的原因。说“这不是泄漏,这是效率低下的程序”,只是语义上的分裂。对于外部观察者而言,该程序的行为与正在泄漏内存的程序的行为相同,尤其是在多任务系统的情况下,在这种情况下,内存在负载下的压缩会导致严重的问题。
梅森惠勒

9

抱歉不行。在编程类(尤其是初学者级)中教授C ++时,这实际上是一个大问题:您可以学习编程原理,也可以学习C ++语言,但是C ++语言有很多陷阱和愚蠢的小技巧,无法在两者之间有效地学习两者。一学期课程的范围!

有很多在C ++中尝试过的东西,最终由于纯粹的惯性而成为该语言的惯用语,此后几乎所有其他语言都被研究并拒绝了,因为事实证明这是一个巨大的错误。主要的是C ++的模板和C ++的对象模型(将对象作为值类型从来都不是一件好事,因为它破坏了Liskov替换和OOP本身。)

所以,如果你得到的C很深的造诣++第一,然后你想学习其他编程语言,也将是一大堆的有害和起反作用的CRUD你就必须忘却,以便可以在其他编程语言有效。


4
Java和C#具有严格较弱的模板系统是有原因的,但这是因为它们需要有关所有内容的完整元数据。我会对解释对象如何将价值观破坏事物感兴趣。特别是考虑到有参考文献……
Deduplicator 2015年

3
@Deduplicator:Java和C#具有完全不同的泛型系统,因为经验表明,模板会导致各种严重的问题,其中许多是由于模板系统最初并未精心计划而引起的。(偶然完成,给出一个明显的例子!)和值的对象破坏了Liskov替换,因为如果您有一个派生类,其父类是Base,并且它覆盖了Base上的虚方法,则默认将其传递给一个具有Base并调用虚拟方法的函数,它将不会调用Derived版本。
梅森惠勒

2
@MasonWheeler:啊,您指的是切片
Fred Larson

2
@FredLarson:我应该猜到这样一个普遍存在的,有害的问题应该有一个特定的名称。(而且,这是C ++,这真是个愚蠢的名字。当C ++世界之外的程序员听到“切片”时,他可能会想到数组切片!:P
Mason Wheeler 2015年

4
尽管我同意您所写的许多内容,但我认为您的观点非常有偏差;-)恕我直言,学习C ++不会让人感到愚蠢。
布朗

8

不会。精通C ++将使学习其他类似于C ++的语言变得更加容易。但这将很无聊。您为什么想知道两种相同的语言?那什么都没买。(请注意,这并非特定于C ++。它适用于任何语言。与自然语言相比:学习意大利语不会使学习其他语言变得更加容易。它将使学习西班牙语,法语或葡萄牙语以及学习三种语言变得更加容易。这些语言将使学习第四语言变得更容易,但是即使学习所有浪漫语言也不会帮助您一点点学习芬兰语,中文,印地语,希伯来语,希伯来语,阿拉伯语,普什图语,希腊语等)

编程语言实现范例。彼得·范·罗伊(Peter van Roy)收集了34种主要编程范例的海报

范式又由概念组成。那张海报列出了大约18个概念。

所有范式(或至少海报中的范式)均由这些概念组成。所有语言都实现由这些概念组成的一种或多种范例。因此,如果您学习这些概念,则(在某种意义上)您将一次学习每种编程语言。

当然,仍然存在许多特定于语言的怪癖(其中包括语法)。而且,该张贴者完全忽略了键入,并且System F <:ω样式类型系统,Scala样式类型系统或动态Duck类型类型系统之间当然存在显着差异,更不用说从属类型系统了。 Idris,Agda,Coq,Guru或ATS。


印地语,不是印度教没什么可以帮助您“学习印度语”,更不用说意大利语或C ++了;-) +1。
PKG

实际上,学习不同的语言虽然确实很相似,但是仍然可以拓宽您的思维范围,因此可以帮助您稍微偏远的语言。
–dyesdyes

我不得不不同意与自然语言的比较,因为C ++是一种不同于自然语言的多范式语言。另外,通过详细学习语言功能,您将知道该功能的设计决策,并且很有可能了解其他实现的利弊。例如,尝试深入学习c ++模板,而不了解它们与动态泛型的优缺点。即使您没有偶然发现C#(时下困难),您仍然会知道动态泛型是什么,并且在以后了解它们时会立即知道C#泛型的限制
Rado 2015年

5

我想说,深入了解任何编程语言都将有助于学习其他语言,至少可以学习同一家族中的其他语言。例如,C ++知识对LISP或Haskell并没有多大帮助,但对于面向对象的过程语言,它将有所帮助。我的方法是尝试从不同的语言家族(过程性,功能性,面向对象等)中学习每种语言,然后将知识传播到该家族的其他语言中。另一方面,对APL的深入了解无济于事。


3
我已经看到了学习C ++作为第一语言的人编写的Self或Smalltalk或Ruby代码的样子。我实际上会说,了解C ++对学习面向对象非常有害。我认为Self或Newspeak更适合于此。顺便说一句,对APL的深入了解至少将有助于J和K之类的语言。它还将有助于思考更高级的集合抽象和liftig,这可能对MapReduce或Hadoop风格的编程有所帮助,并考虑Functors ,应用程式,单声道和类别。
约尔格W¯¯米塔格

1
@JörgWMittag:众所周知,可以用任何语言编写COBOL了。
Deduplicator 2015年

@Deduplicator如果您的第一语言是COBOL,则您更有可能用其他语言编写COBOL。
2015年

实际上,我必须同意COBOL的观点。几年前,我有一个为我工作的人在Pascal上写了COBOL ...
Jim Nutt 2015年

5

我将在这里采用不同的解释。

C ++是一种学习内存和数据结构的好语言,因为它迫使您仔细考虑诸如对象所有权和寿命之类的概念。学习内存和数据结构是任何软件工程课程的重要组成部分之一。

但是您必须学习数据结构。如果您只是“学习C ++”,您将不会真正获得很多收益,并且短期内它可能会减慢学习其他语言的过程。

当我上大学时,数据结构是一门必修的新生课程,是在CS1之后修完的(至少是全班的一半)。那个挺难。该课程的格式基本上是“这是您之前从未见过的数据结构(例如,左派堆)。一周内用C ++实现它,并使您的输出与我们的预期输出完全相同,逐字节,所以我们可以对其自动评分。” 然后,下周您将获得一个新的数据结构和新的分配。我可能在一门课程中学到的知识要比其他所有课程加起来要多。

为了使C ++有价值,您需要进行这种学习。


2

您学习的每种语言都使下一门语言更容易学习,尤其是在同一范例中。它们相互借鉴,一段时间后,您会发现一种新语言看起来只是其他语言的功能集合,但有一些独特的变化。

在这方面,我认为C ++不会比其他任何语言更好或更差。它是我所知道的较为冗长的语言之一,使某些事情很难实现,而这在大多数其他语言中都是容易做到的,但这并不一定意味着使下一门语言更容易学习。但是,它确实确实使下一种语言更易于使用。有区别。


0

不会。对C或“基本为C”的C ++子集的深入了解,将在学习其他语言时,至少在描述其实现必须做什么时,将有所帮助。另一方面,对C ++的深入了解将主要是学习其他语言时令人困惑或不相关的信息。例如,如果您学习C ++的面向对象的知识不仅仅涉及表面层面,那么当您转向Perl / Python / Ruby时,与使用它相比,您将花费更多的时间来学习您所学的知识,因为这些语言中的对象是在一个完全不同的方式比在C ++中。对于大多数其他语言和其他语言功能(无论是C ++模板还是Haskell多态本质上都是相同的功能,但实现方式完全不同),或多或少的情况都是相同的。因此,对C ++的深入了解通常将特定于C ++。


这篇文章很难阅读(文字墙)。您介意将其编辑为更好的形状吗?
蚊蚋
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.