我不认识C。为什么我应该学习它?[关闭]


58

我的第一种编程语言是PHP(gasp)。之后,我开始使用JavaScript。我最近在C#中完成工作。

我从来没有看过像C这样的中低级语言。

大型编程社区的普遍共识是:“坦率地说,没有学习C之类的程序员,就无法处理诸如指针,数据类型,通过引用传递值等编程概念。”

我不同意。我认为:

  1. 由于高级语言易于访问,因此更多的“非程序员”陷入困境
  2. 为了真正用高级语言完成所有工作,需要理解大多数“学习低级优先”的拥护者都宣扬的相同概念。

有些人需要了解C。这些人的工作要求他们编写低至中级代码。我确定C很棒,而且我确定有一些懂C的坏程序员。

为什么会有偏见?作为一个优秀,诚实,饥饿的程序员,如果我不得不学习C(出于某些不可预见的原因),我将学习C。考虑到那里的多种语言,好的程序员是否应该专注于学习什么能促进我们的发展?我们不应该学习我们感兴趣的东西吗?我们不应该利用有限的时间前进吗?为什么有些程序员不同意这一点?

我相信在工作上追求卓越是优秀程序员和劣质程序员之间的基本确定性特征。

在现实世界中,有没有人举例说明过用高级语言(例如Java,Pascal,PHP或JavaScript)编写的东西如何真正受益于C的先验知识?实例将是最大的赞赏。


@斯蒂芬哦,对不起...我误会了。(但您确实知道为什么需要学习c / c ++吗?)
ApprenticeHacker

1
@burningprodigy是的,在需要执行C / C ++或最有意义的事情的情况下,我当然会学习C。用高级语言进行开发。这是荒谬的。
斯蒂芬,

@burningprodigy让我们继续聊天中的讨论
斯蒂芬

您能给我们一些“无法处理诸如指针...之类的编程概念”的上下文(URL)吗?
2013年

如果我希望可以学习一种语言,那就是Common Lisp,而不是C。作为主要的C#开发人员,我可以肯定自己会从中受益更多。我们已经在C#中有了指针。通常,我宁愿学习更多解决问题的方法,也不愿尝试以更困难的方式实施相同的解决方案。(仅作说明,我半谎言。我已经做了一些C语言,我知道它有其优点。只想赞扬一种比C语言早十年的强大而富有表现力的语言。)
Magus

Answers:


113

了解C的优点是您对计算机的工作原理非常了解。不只是编程模型如何工作,而且存储器的布局方式等等。

C以下的唯一级别是特定CPU所说的汇编。

(我补充说,了解C还可以使您了解使用高级语言要做的工作少得多。并且希望可以理解使用该高级语言进行工作所涉及的成本。)


12
弗兰克:你打在了头上。了解计算机的工作原理,内存管理和分配以及您可以进一步欣赏高级语言的想法是学习C的原因。我很幸运,我们必须学习C才能实现类项目,例如在UDP上实现基本的TCP层。 。
克里斯,

12
我对此表示同意,尽管:C仅使您更靠近草根几步,而不是一直到地面。好的,有一种叫做内存布局的东西。但这在物理上是什么意思?如果您不了解电子产品,您是否了解计算机的工作原理?量子力学?等等。我不确定世界上是否只有一个人能够深入理解整个食物链,从高级语言到C,再到量子力学。
乔纳斯·普拉卡

14
我的问题是,您如何从了解计算机内部的工作原理中受益?你得到什么?欣赏您现在拥有的知识并不是学习像C这样的低级语言的充分理由。这就像说我应该学习Fortran来欣赏我现在拥有的知识
TheLQ 2010年

18
@TheLQ我无语。了解计算机内部的工作原理如何从中受益?您对自己正在做的事情,正在得到的事情有了更清晰的了解。而是:您首先要了解它实际上对机器所做的事情。
Frank Shearar 2010年

15
我将其标记为正确,因为它似乎是最受欢迎的答案。就是说,我不太在乎“计算机的工作原理”,因为它实际上并不能帮助我开发应用程序的下一个炫酷功能。这就像开车:我非常擅长,但可以忽略中断液压的工作原理。当我踩刹车时,它就停止了。另外,我敢肯定,如果我必须先骑一辆马车五年,我会更喜欢开车。并不意味着我没有能力假设汽车比越野车有更好的表现。
斯蒂芬,2010年

72

我认为这里没有任何答案确实是OP所需要的,因此,我将发表自己的看法。

你看,我是一个毫无歉意的C势利小人。我的态度是,如果你不知道C,则在一定程度上,你并不真的知道自己在做什么,作为一个程序员。因此,我认为我是您在这里所说的“有偏见”的人。

但是,在实践中,无论您是否真的知道作为程序员的工作,并不一定会阻止您使用高级工具开发出真正出色,有用的软件。我的意思是,Stack Overflow的创建者Jeff Atwood甚至都不知道C,但是我要说Stack Overflow是一个非常不错的Web应用程序。

是否决定学习C(或C ++或汇编程序)取决于您要成为哪种类型的程序员。如果您只想开发很酷的Web应用程序或业务应用程序,那很好-并不需要真正学习C。但是,如果您想真正擅长于自己的工作-如果您想从事一些很酷的项目,这些项目可以推动应用程序的发展。艺术,那么您真正需要作为程序员认真对待自己,以真正了解计算机的工作原理。由于C本质上是OS语言,也是支持其他所有语言的语言(从Linux内核到大多数Java VM,再到Python和Ruby解释器,SQL数据库,Web服务器以及几乎所有设备驱动程序) ,对语言的亲密理解会走很长一段路。

更不用说了解C(或C ++)为为影响数百万人的大型开源项目做出贡献提供了巨大的机会。是否想改进Python解释器或Chromium Web浏览器?好吧,您需要先了解C,然后再了解C ++。

这就是为什么将C与死自然语言(如拉丁语)或过时的技术(如马和马车)进行比较是完全错误的。我们21世纪软件基础结构的很大一部分都由C代码提供支持,这就是为什么C至今仍然像今天一样重要的原因。

因此,您是否应该学习C确实取决于您在程序员职业生涯中想要的东西。


5
你听起来不那么势利。好吧,也许一点。:)
Stephen

7
极好的答案。我在没有学习C和C ++的情况下成功编程了十年,并且可能在没有学习过它的情况下走了整个职业生涯。但是自从去年学习它以来,我已经写了更好的软件,不仅使用C ++,而且还使用其他语言。
John M Gant


3
为什么将C与拉丁文进行比较会“完全错误”?我认为这是一个很好的类比。拉丁语无处不在。58%的英语词汇受拉丁语影响(直接或通过其他浪漫语言)。拉丁语也是掌握我们文化的关键。法律,民主,宗教,基础设施,城市规划以及其他一系列领域都可以追溯到罗马帝国。您可以选择忽略C的方式与忽略拉丁语的方式相同,但是您永远无法避免使用它们。“拉丁语和希腊语不是死语。它们不再是凡人。” (麦凯尔(JW McKail))
AndersSjöqvist2014年

2
@AndersSjöqvist,这是错误的,因为即使它已经对现代语言的发展产生了深远的影响,也没有人会说拉丁语。而C则正在积极使用和使用无处不在 -在几乎所有的操作系统,虚拟机,数据库或解释。拉丁语更像是…… Simula-一种死语,对生活语言产生了深远影响,但在学术界之外并未使用。
Charles Salvia

12

一条实用的经验法则是,您需要至少比通常使用的语言理解至少一个抽象级别。请考虑您的PHP或JavaScript解释器实际上可以用C或C ++实现。最终,您将遇到解释器中的错误,甚至是C运行时错误。如果您不了解C,您将仅限于向维护人员发送错误报告,希望他们可以重现它并关心它,然后再动一下手指。如果您了解C,则可以准确地告诉他们问题出在哪里以及问题出在哪里。

这也意味着,如果您使用C / C ++工作,则至少应该能够读取平台上的程序集。

至于在需要时学习C:我的观察是,大多数程序员可以按需学习Perl / Python / Javascript,但是汇编器/ C / Lisp似乎需要更多时间,因此值得在需要之前至少学习一些基础知识出现。


9
好的,我可以忍受“ C / C ++”(该死的语言律师)。而且“ Perl / Python / Javascript”是完全合理的。但是为了上帝的爱,为什么要使用“汇编程序/ C / Lisp”?就像说“苹果/橙色/巴拉克·奥巴马”。这三种语言彼此无关。
杰森·贝克

@Jason,我建议的唯一共同点是,大多数人发现三语种的语言更难于即时掌握,因此OP值得花些时间与他们在一起之前立即使用它们是值得的。指针算术和函数式编程没有太多共同之处,只是人们似乎不得不在更有意义的时间里凝视它们。
查尔斯E.格兰特

我完全同意。相反,要达到更高的抽象水平,至少可以进行一些编程的“办公室IT人员/ gal”通常比不能进行编程的人更好。
Emmet

7

我不认为,你需要学习C 第一,但我相信你应该学C 最后。所有抽象都是泄漏的,对C的理解使您更容易理解使用一些高级抽象时真正发生的事情。也就是说,出于同样的原因,我还认为所有认真的程序员最终都应该学会至少阅读汇编程序。

学习这些低层次的概念可以提供令人惊讶的推理高级事物的能力。例如,在C ++和D中,虚拟函数的默认参数由对象的静态(编译时)类型而不是动态(运行时)类型确定。除非您了解vtables和调用约定的工作原理以及以相反的方式实现虚拟功能的原因,否则这毫无意义。


2
也许学习阅读汇编语言。问题是我使用了多达10个不同的处理器系列,并且了解所有非常不同的变体都是造成混乱和混乱的秘诀。尝试将AMD SHARC与Atmel AVR32和TI MSP430进行比较。
uɐɪ

@Ian:对。理想情况下,您应该学习最常开发的任何拱门的汇编语言。对于大多数人来说,我猜这将是x86或ARM。
dsimcha

3
“所有认真的程序员最终都应该学会至少阅读汇编程序。”像这样的评论使我开始着手这个问题。先生,我认为您只是有偏见。虽然,我喜欢您所说的泄漏抽象。那讲得通。另一方面,这些东西并没有在我的竞技场上带来很多“现实世界”的改变。我仍在使用高级抽象,无论是否泄漏。
斯蒂芬

1
@Stephen,您应该尝试编写一些汇编语言.8位CPU并不难,并且尝试在6502(例如C64)和Z80(例如CP / M商用计算机)中实现相同的小功能实际上是非常有教育意义的由于一些非常基本的设计差异(索引页与寄存器)而产生的经验。

尽管有明显的错误All abstractions are leaky陈述,但+1 。
托马斯·爱丁

7

偏见是现状之一。在过去(1980年代或更早的年代),C / C ++几乎是性能应用程序的要求。情况已经改变,但是高级开发人员通常来自那些古老的背景,并在这种情况下查看事物。

在实际开发中,使用了其他语言-C#和Java都是流行的语言,而PHP和Python在内部项目中很流行,在您选择开放语言的情况下,至少有人拥有该领域的基础知识总是很有用的。假设您的错误跟踪系统的源PHP项目。但是,工作规范似乎仍然来自25年前编写的标准模板。


6
“工作规范似乎仍然来自25年前编写的标准模板。” 你再正确不过了。
斯蒂芬

恭喜,约翰!
Mark C 2010年

6

我非常讨厌发布强制性的Joel博客,我在这里同意他的观点。C是编程的通用语言。我无法想到任何无法以某种方式与之交互的高级语言。因此,对于系统编程类型的东西,C仍然是流行的选择。没有C,您根本无法与某些OS级别的东西交互。

除此之外,当您的高级语言不够快时,您打算怎么做?当您使用高级,动态类型的语言(例如Ruby,Python或PHP)时,知道如何编写C尤为重要。但是,即使Java和C#程序员也需要不时使用C语言。


大声笑。Joels在链接的专栏中提出了建议:“最好不要理会我在这里所说的话,而应该构建某种在线软件,让其他学生找人约会。”
斯蒂芬·2010年

3
@斯蒂芬:如果你想让人们真正注意到你,那就让他们下岗或领薪水。
Fred Nurk,2011年

@弗雷德很好的建议,哈哈。
斯蒂芬,

6

太棒了!(正如他们所说的那样:这是私人斗争,还是任何人都可以参加?)

我是一名教授,经过反复试验,我发现如果引导学生从基本的层面上了解计算机的工作原理,就可以更轻松地引导他们学习复杂的编程概念。不是全部细节,而是基本原理,例如内存是什么,指令是什么,等等。我对C的满意之处在于它离机器很近。

这并不是说其他​​老师来过同一个地方。他们从高级语言(BASIC :-)开始,然后从那里开始,没有明显的不良影响。

所以底线,斯蒂芬,你可能是对的。我不这么认为,但以前我做错了。


4

我想这是进步。

二十年前,传统的观念是,您必须学习汇编程序才能了解从诸如C之类的高级语言中学到的东西(这就是为什么我不得不在大学期间使用VAX Macro上汇编程序课;猜想这有多有用原来是要毕业的)。

有一种迷信,因为C有点难于学习,而且它几乎提供任何抽象(指针和字节流就差不多了),学习它会以某种方式使您成为更好的程序员,或者使您对硬件如何工作有更深入的了解水平。

这不一定是真的。标准C与其他任何3GL(Pascal,Fortran等)相比,都离您更近。某些C 实现可能会提供钩子,这些钩子使您可以更深入地访问某些区域,但是通常,裸露的指针与您所获得的接近,而根本没有关闭。例如,您不能直接访问寄存器或状态字。

最后,所有这些都归结为操作码和寻址模式,因此,如果您真的对底层的工作方式感兴趣,最好使用C来学习汇编器。

就其本身而言,学习C不会(有必要)使您成为更好的程序员。但是,它肯定会让您对实际的字符串类型和标准化的容器库有所了解。


我猜“欣赏”是表达它的一种方式。在我的高中编程课程中,主要只是“我需要使用此功能。如何将LOLOMGCHAR *转换为WTFBBQCHAR *”的问题。
Katana314 2013年

我认为C很容易学习。至少对我来说是读克尼根和里奇的话。
罗伯特·布里斯托

2

语言是一种工具。如果您只需要编写网页之类的东西,那么我相信您可以不必学习C就可以脱身,就像只制作塑料模型套件一样,您只需要一把锋利的刀和胶,通常不需要扳手。

我为内存资源有限的嵌入式系统编写代码(最近我做的最大的工作是16 KB,那是巨大的)。在这个市场上,C或汇编器是唯一的选择,而任何蓬松的高级语言都无法使用。


1
太好了,但是并非所有人都这样做。这似乎暗示着,那些为嵌入式系统编写程序的人只是在玩游戏,而没有进行认真的开发-至少,将您的模型比喻为嵌入式系统的意义所在。这显然不是这样的,它是可以编写大规模生产应用中无需接触C.
JohnL

当然,无需接近C语言就可以编写大规模生产应用程序。在使用C语言之前,我已经写了10年的代码。我使用PL / M,Pascal,ADA和汇编器。这些对于学习机器的基础机制很容易和C一样好,并且对于产生无错误的代码通常更好。
uɐɪ

很好-尽管您的上述回答并没有给我留下您以为那样的印象,所以我的答复是……
JohnL 2010年

您是否有针对嵌入式用途的Java引擎方面的经验?

2

以我的经验,一段时间以来,C / C ++是一个很好的缓冲区,它将优秀的程序员与VB6编码人员分开。在做了5年的C / C ++工作之后,我找到了在VB6中工作的机会。我对编码器的质量(或缺乏编码器)感到惊讶。他们对语言的内在,设计或性能没有兴趣。不幸的是,当公司迁移到.Net时,C / C ++编码器和.Net编码器使用的是相同的工具。VB编码器甚至比VB.Net编码器更差。当所有开发都转移到ASP.NET时,情况变得更糟。突然,任何可以拖放控件的人都是程序员。

但是,在就业市场上,很难区分硬核编码员(例如C / C ++)和游客。

因此,在简历上使用C或C ++可能会帮助您与即兴演奏家区分开。


2

挑衅性地问:您是否在要求您确认不必学习C?如果您学习 C(不一定是C ++),则将全面了解计算机的执行模型。特别是关于内存和分配。这对于使用高级语言进行编程的人也很重要。

对于PHP程序员而言,在给定机器上执行代码的方式不太透明。对于PHP程序员而言,这无关紧要,因为网络传输是应用程序的瓶颈,等等。

普通的PHP / Python / C#在语言和CPU之间有很多抽象层。这些层太厚了,以致您无法浏览它们。当您学习C时,您与CPU和操作系统之间就只有一块薄纸。那并没有使编程变得容易(甚至可能不会更好)。但是您实际上可以了解CPU的工作方式。一旦知道了“中级” C,您就可以真正开始将该知识向上链接到更高级别的语言。这是您将获得的直接好处。

在我看来,程序员应该总是花一些时间来学习不同的编程概念。一定要看看C,而且还要看看更高级的编程语言,例如Clojure,Haskell,Prolog。

您不必一定要精通这些,它们只会教给您一个教训,即编程语言的“级别”不是二进制的,而是有很多级别。从上到下了解它们(汇编程序)。它将使您成为一个更好的程序员。


2

您需要了解足够的C语言才能阅读用C语言编写的代码,因为大量用该语言编写的非常重要的代码。这就是您将无法通过全面阅读该主题的完整手册(我使用Kochan的“ C语言编程”)而不必真正使用该语言编写代码的全部内容。如果您遇到需要广泛使用该语言的情况,那么您将有一个良好的基础。如果这台机器对您而言简直就是黑盒子,那么您可能想学习类似Duntemanns Assembly的书。我还建议使用Petzold的“代码”。

除此之外-C语言的基本读写能力和对底层计算机的基本了解-最好将您的学习时间花在诸如SICP,TCP / IP Illustrated或关于具体数学,算法或数据结构的书籍等真实内容上。真正的东西。

花大量时间在PHP编码中学习C根本不值得机会成本。还有更多有用的东西要学习。C确实只是另一种语言,您只能通过学习和使用才能很好地学习,但是可以在需要时学习。

出汗硬的东西。


1

C是用于编写其他语言的语言。它使您可以根据需要与CPU和其他硬件保持紧密联系。

如果您不了解C,那么您将不知道其他语言如何实现它们的结果。

当然,抽象是一个重要的概念,并不是每个人都需要知道他们选择的框架如何实现其承诺的结果。您无需花费20年的时间编写C程序,也不需要真正地思考使用多重继承时vtable会发生什么情况,从而编写出良好的代码。

现在,您可以在不了解四冲程发动机工作原理的情况下驾驶汽车,或者甚至不必使用换挡杆(手动变速箱)。

但是,如果您了解幕后的情况,您将不时获得非凡的成就,而那些不了解这一点的人将难以复制。


1

C(可能是C ++)是您的游刃有余。运行您的代码的OS可能是用C(和C ++)编码的。因此,用于访问OS服务的本机API将使用C语言。

如果您可以在不了解下面的内容的情况下进行操作,则无需了解C。但是,大多数程序员都需要在生活中的某个时候潜入较低的层次。

它还基于您对开发领域的专业化。例如,编写HTML,Javascript和某些服务器端脚本的Web开发人员可能永远不需要了解C的任何知识,但是分布式系统或游戏开发人员会知道。

花几周的时间学习对您的职业如此重要的东西从来没有什么坏处。


1

C具有许多优点:

  1. C是一种低级语言。您可以使用c来开发内核和驱动程序。
  2. C是最快的语言。许多强大的软件都由c开发。例如:memcached,redis,nginx,apache,mysql等。
  3. C是一种跨平台语言。c开发的程序可以在每个平台上运行。其他跨平台语言无法做到这一点。Java,python,php等无法在iOS平台上运行。
  4. 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.