如何高效的学习编程语言
王垠大神发过一个博文如何掌握所有的程序语言。他其中的一个重要论断就是:重视语言特性,而不是语言。
还有大神进一步拆解编程语言的共性来告诉应该如何学习。
具体应该如何学习呢
高屋建瓴的一句“编程语言都是相通的”,和“万物皆对象”一样,“一切皆文件“等都属于非常正确,很有启发,但是没有球用的见解。我们需要把具体的共性揪出来,来统一学习共性,区别个性就能够将整个学习串联起来。下图就是一个拆解的知识网络:
语言特性
语言特性是学习一门语言时最先见到和学习的内容。他进一步被分解为语法和语义:
- 语法: 编程语言中描述语义的写法
- 语义: 编程语言要描述的东西本身
例如“我爱北京天安门”,根据语法就是主谓宾结构,语义就是我爱北京天安门。
编程语言究其核心可以理解为语言特性的集合。特定场景下特定的语言特性就非常好用(例如迭代器之于 IO 流)。但是并不是无节制的往语言里添加语言特性就是好的,这可以看一些 C++ 的发展就是这么搞得导致可读性越来越差以及越来越难用。
当然大多数语言特性也是通用的,很多时候学通了一门编程语言其他编程语言基本上也不在话下:
- 算法表达与抽象
- 数据表达与抽象
- 变量、常量
- 控制流
- 函数
- 类型系统
- 错误处理
- 模块化
- 元编程
- 资源管理(主要是内存管理)
- 面向对象
- 函数式
- 范型编程
当然还有一些语法糖性质的次要特性:
- 正则表达式
- 多行字符串等
这里面要特别区分一些非语言特性,例如 printf 这样的。不要深扣 %d %2f 这样的区别。他们不是关键
有两本书将整个编程语言进行了抽象,《代码之髓:编程语言核心概念》和《计算机程序的构造和解释》
框架和类库
要做东西,只了解语言特性是不够的。即使一个 hello world 也是需要知道 print console.log 这样的函数的。还有就是解决日常问题也需要一些必不可少的容器(数据结构)、压缩、编码等。这些在现代编程语言中都会以框架和库的形式提供。
目前主流的编程语言都会提供一套标准库,他们提供了一些非常底层的功能,这些通常都是共性的:
- IO
- 字符串(编码、解码以及处理)
- 路径
- 通信(Socket http)
- 日期时间
- 正则表达式
- 数字
- 密码学
- 集合(容器)
- 并发编程支持
- 异步编程支持
- 函数式编程支持
- FFI
- 单元测试框架
还有一些特定领域的库:
- 命令行
- GUI
- WEB 前端
- WEB 后端
- 游戏开发
- 机器学习
- 嵌入式
- 爬虫等
工具
也就是编写每种语言配套的一系列工具,他们有些是通用的有些是特有的:
- 编辑器(通用)
- 格式化工具
- 静态检查(Lint)
- 包管理工具
- 构建工具
- CI/CD 支持
- debugger
- profiler
语言编译与运行时
如果想要深入理解甚至精通一门编程语言,就必须了解自己的代码是怎么运行的。整个进程的运行时行为大致时什么样子的。
语言社区
所谓的语言社区就是我们学习该语言的通道,它通常包括:
- 官网
- 标准化流程和文档
- 技术会议
- 博文
- 线上论坛等等
通过语言社区我们能够知道该语言的过去以及未来的趋势。根据历史脉络能够理解语言设计者的意图以及各种语言特性主要是解决了那些痛点。