没学过C语言的代价

C语言确实显得有些老旧。最近一版权威性的C语言还是1988年发布的;在接近30年的时间里,这个语言的作者一直都没有对它进行过更新,可见它有多过时了。现在,一说到必须有所了解的编程语言,大家都会想到Rust、Go或是Clojure,却很少有人会想到C语言。

但是我的同事Myles和我都不是追求潮流的人,因此我们坚持让所有学生都熟练掌握C语言。

之所以要求学生学习这门古老的编程语言,我们有下面4个理由:

  1. 在湾区的web和移动初创企业之外的地方,C语言依然是一个被广泛应用的编程语言;
  2. 许多现代编程语言都受到了C语言的影响;
  3. C语言能让你像计算机一样思考;
  4. 在编写软件的时候,你现在所使用的大部分工具,都是使用C(或C++)语言所开发的。

对于第一条理由,如果你就是想在湾区的web或是移动初创企业找一份工作的话,你可以忽略它。但是第二条原因是你无法回避的。而大多数工程师,都应该重视第三条理由,要想做好计算机工作,你就必须要理解计算机的思考方式。对于第四条理由,它也是非常难以忽略的。

掌握C语言,意味着你可以更好的理解你所使用的各种工具。例如,对于web开发者来说,他们必须要透彻的理解浏览器、操作系统以及所使用的各种语言,而这一切都是以C语言为基础的。

我们的大多数学生,在使用直译式语言的时候,都会同时使用那些用C语言所编写的流行的实施工具。我们经常做这样一个联系:让学生们编写一个Python字节码解释器,从而让他们更好的理解堆栈式机器和直译式语言;在进行这个练习的时候,学生需要仔细阅读CPython的部署。另外,ruby的实施参考也是用C语言编写的,还有大部分JavaScript部署,他们是用C++编写的。

在学习hashmaps和动态数组的时候,我们有两种方式:第一,自己进行部署,使用一种能让我们具体对内存布局进行思考的语言;第二,阅读相关优秀的部署实例。学生要想理解Python列表或是ruby数组的工作方式,我们同样有两种方式:第一,让他们从头自己编写一个版本;第二,阅读标准库部署的资源——在没有接触过C语言的情况下,要想彻底理解这些概念,基本上是不可能的事情。

如果不掌握C语言,要想了解操作系统也会变得更加困难。我们现在所使用的大部分操作系统,都是用C语言编写的,C语言的标准库与syscall接口紧密相连,而且大部分与操作系统相关的概念都需要你先熟悉C语言。

在计算机网络方面,虽然对C语言不熟练并不会影响你的日常工作,但是那些要想了解操作系统 TCP/IP 堆栈的从业者,会逐渐意识到C语言的重要性。

最后再来说说数据库,关键值存储,消息队列和其他分布式操作系统技术,要想获得较高的性能,它们都需要你对C语言有所了解。

很多软件工程师可能对C语言并不了解,在某一个狭小领域内的日常工作,或许并不需要你掌握基础知识。但是我们要求学生必须要打好基础,而C语言就是计算机科学工作的先决条件。如果你也有着较高的目标,那么我建议你暂时搁置那些潮流语言,花几个周末的时间去学学看上去有些过时的C语言。

作者:Ozan Onay

来源:51CTO

时间: 2024-10-24 19:38:50

没学过C语言的代价的相关文章

没学过 C 语言的代价

C 语言确实显得有些老旧.最近一版权威性的 C 语言还是 1988年 发布的:在接近 30 年的时间里,这个语言的作者一直都没有对它进行过更新,可见它有多过时了(这里有误.2011 年 12 月 8 日,国际标准化组织(ISO)和国际电工委员会(IEC) 旗下的 C 语言标准委员会(ISO/IEC JTC1/SC22/WG14)正式发布了 C11 标准.C11 标准是 C 语言标准的第三版,前一个标准版本是 C99 标准.)现在,一说到必须有所了解的编程语言,大家都会想到 Rust.Go 或是

从来没学过任何语言 现在想学C#有必要在学下C语言么。

问题描述 一切都是零 解决方案 解决方案二:c#里的许多语法和关键字都和C相似,现在我学了C之后再学C#觉得很轻松解决方案三:它们之间并没有什么必然的联系,可以直接学C#,可能会比较难理解点.解决方案四:如果你有时间的话最好能学下c和数据结构.如果你真的时间比较紧,那不学c和数据结构也可以把c#学好.解决方案五:同意楼上的解决方案六:恩,我就是想问下,直接学C#走的路子近点,还是先学下C语言近点,我不想走弯路了,我这人可笨好心人都来说说自己的看法,谢谢哈解决方案七:我觉得最好还是先大体了解一下C

c语言-C++代码改成C语言代码,没学过C++好多看不懂啊(泪奔······)求大神指点,我用的VC6.0

问题描述 C++代码改成C语言代码,没学过C++好多看不懂啊(泪奔······)求大神指点,我用的VC6.0 代码如下, #include "winsock2.h" #include "Winsnmp.h" #include 这里是string以下都要用 < 和 > 括起来(不知为何不显示=,=) #include vector #include algorithm #include iostream #pragma comment(lib,"

c++-编写一个递归函数,将任意的十进制正整数转换为八进制数(不要用C语言,没学过,用C++)

问题描述 编写一个递归函数,将任意的十进制正整数转换为八进制数(不要用C语言,没学过,用C++) 编写一个递归函数,将任意的十进制正整数转换为八进制数(不要用C语言,没学过,用C++) 解决方案 #include <iostream>using namespace std;void foo(int n int base){ if (n == 0) { cout << endl; return; } foo(n / base base); cout << n % base

学点C语言(39):函数

C语言离不开函数, 使用函数也很方便, 但使用函数是有代价的; 特别是在反复调用时, 函数会因反复地压栈.出栈而浪费一些时间. 下面是测试, 用函数与不用函数的时间分别是: 8秒.4秒! 1. 测试使用函数的代价: #include <stdio.h> #include <time.h> int sum(int x) { return x + x; } int main(void) { int count = 1000000000; int i; int num; time_t s

《21天学通C语言(第7版)》一2.2 程序的组成部分

2.2 程序的组成部分 21天学通C语言(第7版)接下来,将逐行分析上面的程序示例.我们为程序清单中的每一行都添加了行号,以方便读者定位和查找正在分析和讨论的部分. 2.2.1 main()函数 main()函数位于程序清单2.1的第9~23行.在每个可执行的C程序中,main()函数必不可少.在最简单的情况下,main()函数由函数名main.其后的一对圆括号(其中包含void)和一对花括号({})组成.在大多数编译器中,省略圆括号中的void并不影响程序的运行.但是,ANSI标准规定,应该在

大家好,想学.net 以前没学过什么编程软件,问问大家应该先从那里下手好呢?

问题描述 大家好,想学.net以前没学过什么编程软件,问问大家应该先从那里下手好呢?大家好,想学.net以前没学过什么编程软件,问问大家应该先从那里下手好呢? 解决方案 解决方案二:先学语言,再操作编程软件.建议先学C,C++.或者其他你喜欢的语言.然后学习VisualStdio这个软件.

《21天学通C语言(第7版)》一6.3 嵌套循环

6.3 嵌套循环 21天学通C语言(第7版)嵌套循环(nested loop)指的是在一个循环中包含另一个循环.前面绍过一些嵌套语句.只要外层循环中包含完整的内部循环,C语言不允许重叠循环,除此之外对其没有其他限制.因此,下面的写法是不允许的: for ( count = 1; count < 100; count++) { do { /* do...while循环 */ } /* 循环结束 */ }while (x != 0); 如果将do...while循环完整地放入一个for循环中,就没问

学点C语言(38):函数

先复习函数的定义与函数的声明: //这是一个求和函数的定义: int add(int x, int y) { return(x + y); } //可以这样声明: int add(int x, int y); //也可以这样声明: int add(int, int); 定义一个函数指针声明一个函数差不多, 用 (* ) 包括函数即可: //像这样: int (*pfun)(int, int); //或这样: int (*pfun)(int x, int y); //也可以: typedef in