为什么大一是以 C 语言入门,而不是 Python?
头条问答-为什么大一是以 C 语言入门,而不是 Python?
(译注:圣经记载:在远古的时候,人类都使用一种语言,全世界的人决定一起造一座通天的塔,就是巴别塔,后来被上帝知道了,上帝就让人们使用不同的语言,这个塔就没能造起来。 巴别塔不建自毁,与其说上帝的分化将人类的语言复杂化,不如说是人类自身心灵和谐不再的分崩离析。之所以后来有了翻译,不仅是为了加强人类之间的交流,更寄达了一种愿望,希望能以此消除人际的隔阂,获求来自心灵的和谐及慰藉。真正的译者,把握血脉,抚平创痕,通传天籁,开启心门。)
这是我写的旋风式的编程语言简介—我本来为亚马逊开发者杂志本月的期刊写的,但是发现我写的东西没法…见人。
首先,我偶尔一不小心口出脏话,或者对上帝不恭的话,所以对很官方很正式的亚马逊上发表是不合适的; 所以我就把它塞到我的博客里了,我的博客反正没人看的。除了你以外。是的,只有你会看,你好啊。
其次,这是一项进行中的工程,现在只是东打一耙西搞一下,还没有精加工过的。又一个把它写到博客里的很大的理由。不需要很好,或很完整。就是我今天想说的一些话。请随便!
我的旋风式简介会讲C,C++,Lisp,Java,Perl,(我们在亚马逊用到的所有语言),Ruby (我就是喜欢),和Python,把Python加进来是因为—好吧,你看了就知道了,现在我可不说。
你必须懂C。为哈? 因为出于所有现实的理由,这个世界上你过去,现在,将来会用到的每一台计算机都是一台冯·诺曼机器,而C是一种轻量级的,很有表达力的语法,能很好的展现冯·诺曼机器的能力。
冯·诺曼架构就是你每天都用的计算机的架构的标准:一个CPU,内存,硬盘,一条总线。多核计算机并没有带来本质上的变化。冯·诺曼机是一个很方便,很便宜,上世纪五十年代的实现图灵机的技术,图灵机是执行计算的最知名的抽象模型。
世上还有其他的计算的机器。比如,Lisp机器,是上世纪50年代对Lisp计算模型的实现。Lisp模型是基于lambda代数的一种计算语言表示法,后者是与图灵机同构的一种模型。不像图灵机,lambda代数能被人类读和写。但是这二者是同等能力的。它们同样精确的表示了计算机能干什么。
Lisp机现在不是很流行了,除了在跳蚤市场里。从谁更受欢迎来说,冯·诺曼机器赢了。还有一些其他的计算机,比如神经网络计算机,译者也不知道怎么翻的计算机(cellular automata),但是这些都不够大众化,至少现在是这样的。
所以你必须知道C。
还有一个你必须知道C的原因是,Unix是用C写的。巧的是,Windows也是。基本上所有的其他操作系统都是用C写的。因为这些操作系统都是冯·诺曼机的操作系统,你还能用别的吗? 任何跟C很不一样的东西都会跟硬件的实际能力相差太远而导致无法满足性能上的需要,至少对一个操作系统来说是这样—至少在上个世纪是这样,碰巧这些系统都是上个世纪的。
你还应该知道Lisp。你不必用它来干实际工作,虽然它在很多GNU的软件里都会很用得着。尤其是,你应该学会Scheme,Lisp的一种小巧化的,纯洁的方言。GNU的版本叫Guile。
他们在麻省理工和加州伯克利教新学生一到两个学期的Scheme,这些学生都对他们为哈要学这么奇怪的语言抓破脑袋。实话实说,作为第一门学习的语言,这是一个很烂的选择,第二门也是很烂。你应该学会它,最终,但不是作为第一门或第二门语言。
这是很难的哦。这是很大的一步。学会怎么用Lisp写出像C语言的程序是不够的,那没有意义。C和Lisp一个就像红外线,一个就像紫外线,它们分布在光谱的最两端。它俩一个牛逼的地方刚好是另一个傻逼了的地方。
如果说,C是最靠近计算机是如何工作的语言模型,Lisp就是最能反映计算(注意,这里没有了“机”字,计算机和计算是很不同的!译者注)是如何工作的模型。你不需要懂很多Lisp,真的。紧咬Scheme就哦了,因为它是最简单最干净的。其他的Lisp已经发展成了很大,很复杂(很好很强大? 译者:-)的编程环境,就像C++和Java,要有很多库啊,工具啊等等之类。那些,你不需要知道。但是你应该能用Scheme写程序。如果你能够做出The Little Schemer和The Seasoned Schemer这两本书里的所有习题,你懂得就够多了,我认为。
但是对于你天天要做的编程工作,你应该基于以下条款选择你的语言:库,文档,工具支持,操作系统集成,资源,和一堆其他的东西。这些条款跟计算机如何工作关系很小,但是跟人类如何工作关系甚大。
人们还在用很直白的C语言写东西。很多东西。你应该懂C!
C++是地球上最蠢的语言,即使是从蠢这个字的真正意义上出发。C++很无厘头。它不知道自己是什么东西。它没有内视(面向对象里的一个概念,译者注)。C也没有,但是C不是“面向对象”的,而面向对象很大程度上是关于要让你的程序知道它自己。对象就像演员。所以面向对象语言应该有运行时的自省机制,知道自己是个什么类的对象。C++不是这样的,真的,你不会那样用它。
关于C:写一个C的编译器是那么的简单,以至于你可以用C写一个关于C的工具,用起来就像是有内省机制。而C++呢,基本上是不可解析的,所以如果你想写一个很牛逼的工具用来—比如,告诉你你的虚函数的原型,或者帮你重构你的代码,你将不得不依赖别人的工具集,因为你自己在除非脑子进屎的情况下是根本不会去写一个C++的解析器的。而市面上所有的C++的解析器都很傻逼。
C++很蠢,你不能用蠢语言创造一个好系统。语言决定世界,蠢语言决定蠢世界。
所有的计算都基于抽象。你用低级的东西创造出高级的东西。但是你不能用分子创造出一个城市。尝试使用太低级别的抽象只会给你带来麻烦。
我们就惹上麻烦了 (是指亚马逊的员工,还是所有C++的程序员? 我也不知道,译者注)。
理智的情况下,你用C写的最大的东东就是一个操作系统。而操作系统其实不是很大的,真的。它们看起来很大,但那是因为它们有很多应用软件,操作系统本身的内核是蛮小的。
你用C++能写的最大的东东是…也是操作系统。好吧,或许稍微再大点儿。让我们说,再大三倍吧。或者10倍吧。但是操作系统内核最多也就,那啥,一百万行代码? 所以我说你能用C++写的最大的系统大概也就是一千万行代码吧,再大的话就开始不行了,这玩意儿你没法控制了,就像恐怖片里的…
我说的一千万行是指如果你那时候还能让你的系统编译通过的话。
我们(在亚马逊,译者注)有五千万行C++代码。不,现在还要更多了。我已经不知道有多少行了。上个圣诞节是五千万行,那是九个月前,而它以每季度八百万行的规模增长。增长率本身也增长,妈呀。
我们想这个系统里干点啥好像要一万年。一个亚马逊工程师有一次这样描述我们的代码库:“一座很大的屎山,你见过的最大的山,每次你想修正一个bug,你的工作就是爬到屎山的正中心去。”
伙计们,那哥们可是在四年前说的这话。他现在已经到更环保绿色的牧场上去了。真是太可惜了,他可是个实实在在的高手啊。
这都是C++的错。别跟我争论。就是的。我们用的是世上最蠢的语言。这简直有点老板级的蠢,你说呢? (译者注,meta在计算机术语里通常表示更高一个层次,比如,meta-language,比普通的language高一个层次,意思是关于语言的语言。哲学里应该会经常用到这个词。我不懂哲学,但是我觉得老板们总是比我们高一级,所以meta-dump我就翻译成老板级的蠢喽。
:-)说了以上这些难听的话,话得说回来了。用C++写出漂亮的代码显然是可以的,我的意思是说,这样的代码应该大部分还是C,偶尔很有品味的,很有节制的用一点C++。但是这种代码几乎从来不会被写出来。C++是个很好玩的游乐场,而如果你把它玩儿得门儿清的话你会觉得自己特牛,所以你总是被诱惑把你知道的所有的东西都用上。但是那是很难做好的,因为从一开始这个语言就太狗屎了,最终,你会弄得一塌糊涂,即使你很能干。
我知道,我说的都是异端邪说,该被钉到十字架上的。随便吧。我在大学里的时候老喜欢C++了,因为我那时候就只知道这一门语言。当我听到我的语言教授,Craig Chambers,绝对的厌憎C++,我想:“为啥呢? 我觉得它挺好的啊”。而当我听到STL(标准模板库)的发明者被采访时说他恨OOP(面向对象编程)时,我更是认为他肯定是磕药了。怎么会有人恨OOP呢,而这个人竟然还是STL的发明者?
亲不敬,熟生厌(语出圣经,译者注)。说的是在大多数情况下,跟一件事物熟悉了之后你就失去对它的膜拜尊敬了; 在计算机语言里情况不是这样的。光对一门语言熟悉不会导致你看轻这门语言。你必须成为另一门更优秀的语言的专家(才能让你明白原来那门语言有多么多的问题)。
所以如果你不喜欢我针对C++大放厥词,请你去学另一门语言并成为一个专家(我推荐Lisp),只有那时你才有足够的武器与我争论。然而,那时你将不会跟我争了。你上了我的当了。你也会跟我一样变得不喜欢C++了,你或许会觉得我这个人很恶心,把你骗得不喜欢自己曾经的最爱了。所以或许你应该把我说的一切都忘了。C++挺好的其实,真的。它就是很棒棒(译者注,作者在这里用了ducky,这是一个女性喜欢用的夸某物好的词,近来也为玻璃们喜爱)。忘了我说的话。C++不错的。
你的问题暂时回答到这,总而言之,学好C语言准没错,如果更多问题,可以关注微信公众号ickeybbs,咨询我!