it-swarm.cn

我不认识C。为什么我应该学习它?

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

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

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

我不同意。我认为:

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

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

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

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

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

58
Stephen

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

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

(我补充说,了解C还可以使您了解使用高级语言要做的工作少得多。并且希望对使用该高级语言工作的cost有所赞赏。)

113
Frank Shearar

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

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

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

您是否决定学习C(或C++或Assembly)取决于您想成为哪种类型的程序员。如果您只想开发出色的Web应用程序或商务应用程序,那很好-无需真正学习C。但是,如果您真的想Excel做事-如果您想真正地工作, cool推动了最先进的项目,那么您真正需要作为程序员认真对待自己才能理解计算机的工作方式。由于C本质上是OS语言,也是支持其他一切功能的语言(从Linux内核到大多数Java VM,再到Python =和Ruby解释器,SQL数据库,Web服务器,以及几乎每个设备驱动程序),对语言的深入了解有很长的路要走。

更不用说了解C(或C++)为为影响数百万(或数亿)人的大型开源项目做出贡献提供了巨大的机会。想要改进Python)解释器,还是Chromium Web浏览器?),那么,您需要了解C的第一个和C++的后者。

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

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

72
Charles Salvia

一条实用的经验法则是,您需要至少了解通常使用的抽象层次以下的抽象层次。请考虑您的PHP或JavaScript解释器实际上可以用C或C++实现。最终,您将遇到解释器中的错误,甚至遇到C运行时错误。如果您不了解C,则只能将错误报告发送给维护者,希望他们可以重现它并关心它,然后轻打一下拇指。如果您知道C,就可以准确地告诉他们问题出在哪里以及问题出在哪里。

这也意味着,如果您使用C/C++工作,则至少应该能够在平台上阅读Assembly。

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

12
Charles E. Grant

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

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

7
dsimcha

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

对于实际开发,使用其他语言are-C#和Java一样是一种流行的语言,而PHP和Python内部项目,在您为该漏洞跟踪系统选择一个开源PHP项目,例如,您的错误跟踪系统)的情况下,请至少具有该领域基本知识的人员在总是有用的。规范似乎仍然来自25年前编写的标准模板。

7
JohnL

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

我是一名教授,经过反复试验,我发现引导学生通过复杂的编程概念要容易得多,前提是他们从基本的角度理解计算机在做什么。不是全部细节,而是基本原理,例如内存是什么,指令是什么,等等。我对C的满意之处在于它离机器很近。

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

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

6
Mike Dunlavey

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

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

6
Jason Baker

我想这是进步。

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

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

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

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

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

4
John Bode

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

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

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

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

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

2
wirrbel

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

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

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

出汗硬的东西。

2
naftalimich

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

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

2
uɐɪ

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

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

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

2
dave

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

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

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

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

1
Mert Akcakaya

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

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

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

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

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

1
Bill Michell

C具有许多优点:

  1. C是一种低级语言。您可以使用c来开发内核和驱动程序。
  2. C是最快的语言。许多强大的软件都由c开发。例如:memcached,redis,nginx,Apache,mysql等。
  3. C是一种跨平台语言。 c开发的程序可以在每个平台上运行。其他跨平台语言无法做到这一点。 Java,python,php等无法在iOS平台上运行。
  4. C++不能在许多嵌入式系统上运行。
1
Edward Shen