• 2022-11-06 edit:现在部分想法发生了改变,编程语言还是有不同的,学了新语言没学到新思想相当于只是学了一门方言

TL;DR:
又到了开学季,又是一群懵懂的新生进入大学的日子。。。
这次不是来抨击大学,而是想讨论一个初学者最常提的问题,我应该学什么编程语言?
我的回答是:如果是科班学习,建议学 C++ (其实相对于 C++, 其实更推荐 C,但 C++ 有考试 so)。对于非科班,如果是想写程序自动化一些事情,解决一些问题,或者 Just for fun 的话,建议学 Python
第一门编程语言的学习算是一个比较特殊的阶段(那个时候学习者对整个大厦有什么都没有概念,更多地是在“学会编程”,而不是学会语言,学会用编程解决问题,同时积累语言特性和使用知识)
对于科班来说,接触 C 这种非常底层的语言,变量的类型,IO,数组,指针 都是非常有必要的,对于非科班的,解决问题的人来说,Python 对很多底层的抽象和众多的第三方库则是我所推荐的。


TLDR 完了,是时候进入正题了,编程语言应该是 CS 学习中最不重要的一环,它只是一种对系统底层的抽象,包裹(描述应该不对),一种达成目的的工具。回溯系统的设计,回到了 Von Neumann architecture - Wikipedia ,这属于是一种 「路径依赖」 Path dependence - Wikipedia

所有编程语言其实都是差不多的,变量类型,函数,循环,数据结构,IO。这些都是一定会有的,基础中的基础,因为这些都是系统设计之初就定好的,CPU,寄存器,Program Counter,内存(ram),储存(storege)。

在此之上,就是从这基础中派生出的,方便编程人员的一些 (poor word choice here),比如说 递归,类型推导,generic,static,OOP,lambda function,GC,error handling…还有很多,接触的语言不多也不深,见笑了。

或者抛开这些 来说,我们所做的一切,不都只是在调用硬件,帮助我们做事而已吗:)

但这并不是说学语言不重要,恰恰相反,没有语言经验的积累,不会有这些抽象的总结,也不能只学语言,还有 CompilerDesign PatternOS, Algorithm and Data Structure 在等着呢。

例子

Lua is descended from Sol, a language designed for petroleum engineers with no formal training in computer programming. People not trained in computing think it is damned weird to start counting at zero. By adopting 1-based array and string indexing, the Lua designers avoided confounding the expectations of their first clients and sponsors.

除此之外,我还有个 first class language 的概念,类似于 johnbanq 说的

各个领域一般都对具体的编程语言有所偏好。一门编程语言之所以能够流行,一个很重要的因素就是它在某个领域取得了重要甚至主导的地位,或者是某个重要平台的钦点语言。我们搞嵌入式和底层系统会用 C/C++/Rust,写云原生基础设施会用 golang,写 Web 后端服务会用 Java,Web 前端会用 Javascript,搞机器学习与人工智能会用 Python

有一些语言,是为某些事情设计的,优化也是向这方面优化的,比如,vimscript 就是 Vim 的 first class language,用 lua 来操作,当然可以,但是实际上,只是在调用 Neovim 的 API 而已,使得配置十分冗长。又或者 Javascript 对于浏览器,不用 JavaScript 操作 DOM,或许可以,但绝对不如它方便。

语言与工具常变,模式与解法长青,问题永恒

—— johnbanq


说来惭愧,贴了那么多 Wikipedia 的链接,没一个看完过,惭愧啊惭愧。