学哪一个计算机语言好?个人经验分享篇

兄贵
楼主 (文学峸)

我几次分享学习计算机语言的经验,都会受到挤兑,比如:

纠结电脑语言,都是马工的命。州大LS的CS混混就好了 语言是载体,思想才是精华  学一门语言就够了 掌握汇编语言和任何其他一门语言就够了 所有语言最后都形成机器语言,所以一样快 等等

其实我都已经分别回答过了这些迷思,不过觉得意犹未尽,所以再唠叨几句,供刚刚有小孩想学计算机的参考.

1)作为计算机专业,是不是就学一门语言就够了?

我的答案是否定的。如果找一个编程的工作,也许一门语言就够了。我九十年代进入一家银行,里面大多数都是没上过大学的程序员,只会Cobol,照样在银行工作了2、30年没问题。

但是一个年轻人主修计算机,显然是不够的。好比说,你一辈子只吃饭,也饿不死,但天底下这么多好吃的东西,为什么不去吃吃呢?再说,天底下那么多帅哥美女,如果你只交往过一个,你有可能成为情场高手吗?

不同的语言有不同的优势,不同的功能,新的语言不断的在创造出来,起码有了几千门计算机语言了。年轻人,你不希望自己被禁锢在一个语言里吧

80年代初,我在理论物理所跟郝柏林学计算机,他同时教我们C和LISP,还有用于数学推导的 Reduce语言。他说他是中国第一个懂C和Lisp的人,而且也是中国第一个懂Fortran的人,1972年经周总理批准,理论物理所进口了中国第一台小型机,他成了中国第一个在小型机上用FORTRAN编程的人,70年代他在中国推广了FORTRAN,80年代他在中国推广C,我们算是中国第一批学C的人,当时我已经有了在alpha小型机上编程Fortran的经验,我写Fortran的时候,程序是写在纸上,然后把程序给机房的小姐姐工作人员,由她打孔,然后再由机器读打孔卡片如下:


FORTRAN编程给我的感觉就是计算机编个程,太难了,经常要看小姐姐的脸色,她如果发脾气,不给你打孔,你的code就只是纸上谈兵。

而郝柏林给我们使用的Reduce语言,居然可以人机交互,给他一个多项式a^2-b^2要求因式分解,它能马上输出(a+b)(a-b). 给它一个5次方程,它马上给你给解了。太神奇了。

40年前就知道,作为年轻人,只学一门语言不行啊。想想看,一辈子只吃一道菜,睡一个人,可行吗?

2)是不是所有语言都一样?

如果所有语言都一样,为什么这么多的天才们还在创造新的语言呢?早期不同语言可以通过 link 把目标文件连起来,现在语言大部分都是产生Virtual Machine上的assembly. 所以不同语言运行的速度,安全性等等都是完全千差万别的。

3)汇编语言要不要学?

几乎没有汇编语言的工作,即使操作系统,从windows到linux, 97%以上都是用C来写的。所以学汇编语言肯定不能帮你找到工作,但是如果你想成为比其他编程员更厉害的人,你就得精通汇编语言。汇编语言也有高级汇编语言,和低级(或者说基础)汇编语言。现代语言(除了C/C++)基本上不容许Goto语句,而低级汇编语言只有Goto,没有子程序,没有for loop,没有 if else,所以要理解高级语言是如何通过低级语言来实现的。

绝大多数程序员,都会碰到一些bug后,束手无策。为什么?因为不了解底层语言,如果你懂了底层汇编语言,你就能帮他解决问题。另外,很多Code,都有安全漏洞、安全隐患,如果深入到汇编语言,你就比较容易的发现这些安全漏洞和安全隐患。

当年高校的汇编语言是非常重视的,从单板机的汇编语言,到Motorola 68000 汇编语言,到 RISC-V ASM, 到当年被瞧不起的x86, 到逐渐重视的 x64, 以前汇编语言是重中之重的必修课,现在好像很多计算机专业也就草草的浏览一下皮毛。

4)到底应该学哪些语言呢?

Java曾经如日中天,2004年之前,Java势不可挡,不仅横扫各种语言,甚至横扫所有操作系统。连微软都在搞Visual J++,而且从 VJ++1.0,直接跳到 VJ++6.0 不然就跟不上趟了。2003年圣诞节前的微软年会上,J++组粉墨登场,兴致勃勃的展示微软的JVM,完胜Sun Microsystems的JVM,计算机世界将真正进入 write once, run anywhere. 什么计算机语言,什么操作系统,都不重要了。Java将一统江湖,一统天下。 报告人没有等待到同事们的掌声,相反的是比尔盖茨上了讲台,问道:是谁给你发的工资?是Java吗?不是!而是 Windows!是Microsoft Office! 盖茨宣布,解散J++团队,下岗一半,分流一半,成立C#,搞 .NET,微软的口号是:write whatever you want, run Windows

今天的Java,已经行将就木,被批的无一是处。遥想1995年,Java因为推出Hotjava web browser 而一举大红大紫。Hotjava 是第一个动态浏览器,为了推广Java,很多java coding大赛,我当年也参加了,没得到千元大奖,但得到了厚厚Java书。Netscape受到严重威胁,不得不屈尊和Java达成协约,共同开发新的JavaScript作为浏览器客户端,再由Java,PHP,C#包装成OO给程序员用。时至今日,Java,PHP,越来越衰,C#转入游戏业,而JavaScript成了Full stack的不二选择。

所以现在学Java,不是与时俱进的选择,但无奈AP考试只考它,所以还是得学。

如果想参加USACO等等竞赛,C++是不二选择,不仅速度快,而且有强大的算法库 STL

数据的处理,你可以不必用SQL写,你可以用C,C++甚至任何一个语言写,通过产生的bytecode injection 到数据库产生 stored procedures 或者 user functions,但是这需要更高的权限,也需要一样对于数据库的理解,为什么不把SQL也学了呢。 而且SQL是NoSQL的基础,不需要Join而已,有了SQL,对写 key-value, Graph database 等等的 query,也是基本基础。

再者是functional programming language. 虽然业界用到的纯fp不多,但functional programming是完全不同的理念,图灵的state machine的理念是万物皆数,万物皆state。state可以是数,是table(SQL),是矩阵(量子力学),是各种数、array等等的组合(Object Oriented Languages), 而图灵的博士导师Alonzo Church 却认为 计算皆函数,计算机应该是 stateless machine,即没有State。只有你給它一个自变量,它给你一个返回函数值,计算机本身是干净的,没有痕迹的。很明显,functional programming有很多好处, 因为没有state, 所以没有 side effects, 不容许mutation,可以同时运行进行并行计算,debug非常简单,而且几乎没有什么隐藏的bug。

所以和汇编语言一样,学习functional programming,不是为了找相关的工作,而是写出更好的code。现在Java, Python, C#, C++,,,,等等都支持functional programming

同理,学习C语言,其目的之一是使你成为一名更好的程序员,即使不用C。所以也是值得学的,因为它帮助你理解计算机是如何运作的。

总结一下,学习计算机语言,要带着热情去学,带着探险的激情去学,而不是带着畏惧的心情去学。多多益善的学。学习各种语言的特点,特别是要注意学习各种不同类型的语言。比如在学 distributed system时,是否用Go语言去做作业,学操作系统的时候,用 Rust语言去练习,学游戏编程的时候,用一下C#,图像处理时用用Julia。。。。不仅Open your eyes开了眼界, 而且了解到很多你以为不能做,或者很难做的事情,其实其他语言易如反掌。

最后一点,尽量避免dying language, 比如 PHP,VB,LISP,甚至 Java

a
avw
讲这个,大号蚂蚁就不行了。
败了又败
如果大蚂蚁是老毛,兄贵就是林彪。分工不同而已。
青裁
美国CS本科生大部分都是用CPP的,大部分人很轻松自学JAVA,Python….语言确实不是个问题,至于汇编语言啥的,看自己的方

楼主80年代的经验很古董了

败了又败
据我所知,很多公司都在用Java. 一个公司要换编程语言很难。
大地长空
一个王明一个李德。看似满嘴理论,实则教条主义。
田园景色1230
哈哈,文章开头第一段最欢乐
兄贵
Go, Rust, Julia 都是潮流新语言
a
avw
我只知道,一个语言越差,对使用者的要求越高
青裁
这是我背后的省略号代表的…

但目前这些都没革命性的东西,局部改善而已、不足一提

总要注册
说Java说正在死亡的语言, 好像早了一点。 看看各个IT行业的招人广告,

Java是许多公司系统的后台使用的语言。

兄贵
共产党打赢是苏联大炮,武器决定论。老毛一无是处,林彪 狐假苏威
s
skyport
俺面试候选人,第一句话就是,你随便选语言,我也不纠结语法错误,嘿嘿
兄贵
有道理,所以老牌 JavaScript 越来越吃香了
a
avw
一听就是老手
兄贵
谁不重要,武器才重要,工欲善其事,必先利其器。好的语言才是利器
D
DukeAB
赞,80年代就在中科院物理所写code了,
兄贵
要看你做什么

HRT 的 OA,只接受 C++和Python,其他语言根本不看。

如果写网页,必须Javascript

如果做游戏,必须 C++或者 C#

。。。。。。

当然,如果你的工作只是很普通的general purpose, 比如算法,那么什么语言,甚至语法也不重要。

米汤
好像前面讨论过,应该是江青武则天?
兄贵
COBOL招工一时吃紧,因为没有人学了,而很多银行还在用
成功的兔
赞能写会算……正吭哧吭哧写conference abstract的仰望大牛 :)
r
raymn
兄贵讲古有一套,但对语言的认识有限.给年轻人提个醒,莫被误导 :-).
a
avw
这就对了。脱离了环境,单讲语言,没有意义。
a
avw
这里根本没有年轻人
总要注册
Java跟COBOL不一样。 COBOL主要用于financial。 而 JAVA是真正的通用语言。 实际上它和C#

是目前各家公司IT系统的主要后台语言。 也是C++以后的“最新”通用语言。

a
avw
物理所为啥要写code?
r
raymn
看对谁而言.兄贵alpha上算FORTRAN题时,我在PDP-11上写Prolog解释器
t
tibuko
javascript开发跟java是没关系的,也促成了java的毁灭
总要注册
Java是在C++基础上发展起来的语言。 一方面强推C++, 另一方面强砭Java是过时语言。

很不公平。

a
avw
每个人都有历史局限性,我是当故事听的
t
tibuko
成功的语言一般宗教色彩淡点
总要注册
Javascript 导致Java 毁灭? 这是哪儿的理论?请举出有几家公司是用

Javascript写后台的?

t
tibuko
当年OO过度吹捧,现在FP又搞得像是神一样,都是FAD
t
tibuko
导致毁灭也许夸张了,但javascript导致java作为VM通用一统天下的理想毁灭是不错的
小糊涂仙2000
一个公司换语言不容易,一个码工换个语言可太容易了。

我写过汇编,java,C/C++, python, scala。现在我娃学编程,我就让他学C/C++和python

兄贵
我很快用上VAX,比PDP好多了。VMS相当高级了
r
raymn
网上讨论程序语言的,基本不懂程序语言设计原理和语言特点的来龙去脉.不信问他java/python FP的区别
1
12度圆缺
ji语言是末稍,学啥没啥关系

几点感想啊,我认为

1. Java 在微软的消失是因为输了官司,只好另起炉灶,C#实际上和Java很类似。

2. javascript和Java在技术上没啥关系,也就是用Java的公告效应。

3.用C/C++写的stored procedure不能代替SQL,做数据处理是不行的,C/C++的SP是为了有效利用OS API, 而不是取代SQL

4. 同意要学汇编,但汇编有子程序啊,你当年用的汇编难道是DJS130吗  (just kidding)?

5, LISP用的不多,特别讨厌辣莫多的()

6. 个人认为functional programming language就是一个噱头没啥用。根本上你用有限自动机来执行,能没有state?你要用到register 和memory吧?

我认为大学学好汇编,C,一门OO就可以了,至于FP,了解一下概念即可

兄贵
两者语言之间没什么关系,但诞生有关系的。Javascript是Netscape宣称的用Script实现Hotjava功能
兄贵
因为Java失去了C++很多优点。Java曾经名字是C++++。这导致微软用了C#。但C++寿命比Java和C#都会长
q
qqdragon
太赞了,请问x++是不是c++的cloud version ?
兄贵
不是物理所。是理论物理所。完全不同的单位
r
raymn
确切地说,FP是消除scope之间的state dependency.好处还是很多的

> 根本上你用有限自动机来执行,能没有state

兄贵
郝柏林说,写了一大堆书的谭浩强也是他早期的学生,没学明白就写了一大堆教科书
两女宝妈
强赞:)
1
12度圆缺
同意
兄贵
是这样。连NW不是也成了宗教了吗
宝马奔驰
先点赞,再点评

文章写得好。太过专业,点评谈不上,只能说说按世俗角度的理解:

 

Q1. 是不是学一门语言就够了?

A1. 一辈子只睡一个人,不行。

 

Q2. 是不是所有语言都一样?

A2. 每个人都是千差万别的。

 

Q3. 汇编语言要不要学?

人要学会机器的思考方式。人最好成为机器。

 

Q4. 到底应该学哪些语言呢?

天底下那么多帅哥美女,多多交往才能成为情场高手。但要避免交往那些行将就木之人。

 

总要注册
Java本身是面向OO的语言。 如果用Java写functional programming,

那就是杀鸡用牛刀。

总要注册
Javascript 跟Java 风马牛不相及。 只能怪最初的网景公司起的这个破名字。

javascript一般用于写GUI, mobile APP, frontend。 它跟Java毫无关系。

兄贵
感想后的感想,我觉得最重要的是 C/C++, SQL,Javascript

几点感想啊,我认为

1. Java 在微软的消失是因为输了官司,只好另起炉灶,C#实际上和Java很类似。

==> 微软只是不被容许 extend java。开发J++不受法律限制。转C#的目的是保护windows操作系统。C#总体而言,是类似Java,甚至比Java更好些。而后来发展到 .Net core, 其实就是 extend Java了。不过Sun早死了,JVM也不重要了。

2. javascript和Java在技术上没啥关系,也就是用Java的公告效应。

==> 不清楚你有没有经历过那段历史,javascript是Netscape妥协的结果,发展来在Netscape navigator上面实现 Hotjava 上面的功能的。不觉得是公告效应,而觉得是对Java的臣服,完全不一样的语言,套用Java也是得到 Sun的容许的,而且当时的感觉,应该是Sun要求Netscape使用Javascript这个名字的

3.用C/C++写的stored procedure不能代替SQL,做数据处理是不行的,C/C++的SP是为了有效利用OS API, 而不是取代SQL

==> 当然C/C++,或者C#写的SP和UF,可以用到C/C++,C#的所有资源,和SQL各有对方不能替代的地方。即使都可以做,performance也不一样。比如SET process,SQL就快的多,而loop,SQL非常慢,如果用C来写,就快很多

4. 同意要学汇编,但汇编有子程序啊,你当年用的汇编难道是DJS130吗  (just kidding)?

==> 底层汇编子程序,也是通过 GoTo实现的吧

5, LISP用的不多,特别讨厌辣莫多的()

==> 是的,好在IDE帮你Match

6. 个人认为functional programming language就是一个噱头没啥用。根本上你用有限自动机来执行,能没有state?你要用到register 和memory吧?

==> 当调用结束的时候,都release了,所以没有 side effects

我认为大学学好汇编,C,一门OO就可以了,至于FP,了解一下概念即可

==> 参加编程竞赛,用什么语言呢? 是否 加 C/C++ ? 汇编了解一下也可以了。OO其实没多少真货。我觉得最重要的是 C/C++, SQL,Javascript

R
Red_May
语言不重要,重要的是跟上语言的新features. Java 8 stream 开始用FP。Java 不会死,不是语言多好,是开
R
Red_May
发的轮子多。
兄贵
我感觉,微软的X++是为了一统 OO设计,SQLtable,和XML文件的。微软的东西还有F#,J#可以根据工作需要学
兄贵
FP是Java非常重要的部分,而且是实实在在Java追赶先进的产物。杀鸡牛刀的比喻搞反了
兄贵
精髓总结
兄贵
确实很难预言。作为WrapUp JS的ASP, ASP.Net, PHP, Swing, JavaFX, Perl都不行

确实很难预言。作为WrapUp Javascript的ASP, ASP.Net, PHP, Swing, JavaFX, Perl都不行了。而Javascript越活越好。

兄贵
stateless 是更强的总结
h
hhtt
如果在美国用过打卡和读卡机做程序的,一定是前辈!兄贵,有没有编过Assembly,这在美国七八十年代武器上用的。
兄贵
当年的理论物理所,看不起物理所。(现在不知道了)
t
tibuko
当然是没啥关系,但在web就是干死了java,公司么还是用了java,但这语言确实并不很好
h
hhtt
知道PDP-11/45的人应该有些年纪了,应该是退休人士?
t
tibuko
不是
R
Red_May
我猜测一下,您可能熟悉很多语言,但没做过production level 的应用。
成功鼠
Java 将继续存在。现在是API时代, Java SpringBoot是支持API 构建的框架, 大公司最好的语言.
R
Red_May
+1 就是我上面说的。
兄贵
java和python的FP,都挺令人失望的。都不支持最重要的immutability。P的lambda只支持expre
总要注册
应该问问兄贵玩没有玩过Z80单板机。

兄贵
在中国单板机上编过
b
bayview
+1
兄贵
C#的FP好很多
加州lalin
编程语言是熟练工。只会一种不行,会一种后其他也不难。
s
slow_quick
你们上来就是卡片,我是穿孔纸带(用剪刀胶水 cut and paste),719机

我学的第一个 programming language 是Algo-60。穿孔纸带,检错就靠眼睛看。纠错就是剪刀胶水

719机。每天只有一次机会,compile 成功就打一堆结果,不成功明天再来。许多同学连一次 compile 都没成功。

兄贵
纽约故事
Java 不会是 Dying Language
纽约故事
JavaScript is for Front End and Java is for Back End,

Work together, not compete with each other.

纽约故事
Z80 在90年代还再用
纽约故事
同意,当下的语言组合 Java SpringBoot API + JavaScript (React Framework
总要注册
Angular even better。

j
jonjon
在MacPro上,如果用C哪个IDE比较好?

现在用惯了IntelliJ,觉得写Java 和scala不错,但是它好像不支持C。另外不喜欢Eclipse。

成功鼠
Xcode
兄贵
Java, .Net, PHP都phase out.基于Javascript的Node.js Angular React

Java, .Net, PHP都phase out.基于Javascript的Node.js Angular React 直接连SQL

纽约故事
Depends on the size of the project

React is better for a full stack developer, Angular is more for multiple teams working on a large project, some people only have access to Service, some have the access on database, others are for UI only.

Angular is using TypeScript, another layer out of JavaScript. also have to dealing with slowness and steep learning curve.

Whereas React is on top of Javascript, using it like second nature for long-time developer

 

兄贵
能取代Javascript也许是WebAssembly
兄贵
现在几乎都是 VSCode. 需要安装。Xcode是苹果自带的
兄贵
非JS的都会被JS framework取代,而JS可能被WebAssembly取代。JAVA dying
纽约故事
Just repeat myself again, JS is for FrontEnd, whereas Java

is for Back End, any OO programmer knows it is far away from dying, it is a benchmark

j
jonjon
谢两位。我过几天去看一下
成功鼠
Nodejs弱点像single-threading, 怎能与Java相提并论?
成功鼠
没有一种语言比Java更适合 Enterprise-grade应用, 更能处理concurrency, multithr

multithreading, security...

泥川
大厂用:Google C++,Java,python; Facebook:Java, C++, JavaScript,

Microsoft: c++, C#
Amazon: Java, C++, Python, and Perl