17

架构 -- 编程语言

 5 years ago
source link: http://zhongmingmao.me/2019/04/26/architecture-programming-language/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
  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
    • 纯解释执行的语言已经不多了,大多数语言也只是看起来直接执行
    • 内部还是会基于字节码的虚拟机,目的是为了提高性能

语言对架构的影响

MRfMRfu.png!web

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK