架构 — 编程语言

  1. 过程式就是按一条条命令的方式执行,而 机器语言 本身就是由一条条指令构成的,也是 过程式
  2. 过程式是 最为常见 的,每个编程语言都有过程式的影子,代表为Fortran、C/C++、JavaScript、Go
  3. 过程式编程中 最核心 的两个概念: 结构体 (自定义类型)和 过程 (函数)
    • 通过 结构体 对数据进行 组合 ,可以构建出 任意复杂的自定义数据结构
    • 通过 过程 可以抽象出 任意复杂的自定义指令 ,复用之前的成果,简化意图的表达

函数式

  1. 函数式本质上是 对过程式编程的一种约束 ,最核心的主张是 变量不可变函数尽可能没有副作用
    • 对于通用语言而言,所有函数都没有副作用是不可能的,例如内部有IO行为的函数就有副作用
  2. 既然变量不可变,函数没有副作用,那么出错的机会就会减少,代码质量也就变高,代表为Haskell、Erlang
  3. 大部分语言都比较 难以彻底实施 函数式的编程思想,但在思想上会有所借鉴
  4. 函数式编程相对小众,写代码质量高,但 学习门槛高

面向对象

  1. 面向对象是在过程式的基础上,引入了 对象 )和 对象方法类成员函数
  2. 面向对象主张尽可能把方法(过程) 归纳到合适的对象 )上,不主张全局函数(过程),代表为Java、C#、C++、Go
  3. 面向对象的核心思想是引入 契约 ,基于 对象 的概念对代码的使用界面进行抽象和封装,主要优点如下
    • 清晰的使用界面 :某种类型的对象有哪些方法一目了然,不像过程式编程,数据结构和过程的关系非常松散
    • 信息封装 :面向对象不主张绕过对象的使用接口侵入到对象的内部实现细节
  4. 面向对象还有一个至关重要的概念是 接口 ,通过接口可以 优雅 地实现 多态 ,多态的概念如下
    • 对象和对象方法是 强关联 的,可以引入接口来 抽象不同对象的行为
    • 这样不同对象就可以用 相同的代码 来实现类似的复杂行为
  5. 多数面向对象语言还会引入 继承 的概念,虽然继承带来了编码上的便捷性,但也带来了不必要的负担
    • 何时使用 组合 ?何时使用 继承 ?Go给出了最完美的答案: 放弃继承,全面强化组合
    • 继承属于 过度设计 ,会产生复杂的对象继承树

面向连接

  1. 不同的编程范式 并不互斥 ,某些编程语言会有 明确的编程范式主张 ,如Java是纯正的面向对象语言,反对全局过程
  2. 某些编程语言主张自己是 多范式 的,典型代表是C++,但C++太复杂,以至于让人 误以为 多范式会大大增加了语言的复杂度
  3. Go是多范式更好的例子,Go本身并没有声称自己是多范式的,但实际上 Go保留了每种编程范式的精华部分
    • Go没有声称自己是多范式的,而是认为自己是一门 面向连接 的语言
  4. 面向连接即 朴素的组合思想 ,研究连接就是研究人和人的组合,代码和代码的组合
  5. 面向对象创造性地把 契约 的重要性提到了非常重要的高度,但 并不是只有对象需要契约 语言设计的方方面面都需要契约
    • 代码规范约束了人的行为,是人与人的连接契约
    • 消息传递约束了进程(这里的进程是抽象的,Go中叫goroutine)的行为,是进程与进程的连接契约
      • 消息传递是 多核背景 下流行起来的编程思想
      • 核心主张:尽可能用 消息传递来取代共享内存 ,从而尽可能 避免显式地锁 ,降低编程负担
      • Go不只是提供 语言内建 的消息传递机制,同时它的消息传递是 类型安全 的,大大较低犯错机会

工程化能力

  1. 包(package):代码的发布单元
  2. 版本(version):包的依赖管理
  3. 文档生成(doc)
  4. 单元测试(test)

执行器行为

  1. 编译的目标文件是可执行程序,代表为Fortran、C/C++、Go
  2. 生成跨平台的虚拟机字节码,有独立的执行器(虚拟机)执行字节码,代表为Java、Erlang
  3. 直接解释执行,代表为JavaScript
    • 纯解释执行的语言已经不多了,大多数语言也只是看起来直接执行
    • 内部还是会基于字节码的虚拟机,目的是为了提高性能

语言对架构的影响

  1. 淡紫色是 硬件层次的依赖 ,是程序工作的 物理基础 ,浅绿色是 软件层次的依赖 ,是程序工作的 生态环境
  2. 桔色是 库或源代码层次的依赖 ,是 程序本身的组成部分 ,细分为两部分:业务无关的框架和基础库,业务架构
  3. 业务架构与语言无关 ,但语言的选择对业务架构的决策会有深远的影响,主要体现在两方面: 开发效率维护成本

转载请注明出处:http://zhongmingmao.me/2019/04/26/architecture-programming-language/

访问原文「架构 — 编程语言」获取最佳阅读体验并参与讨论