Architecture Decision Record

Active theme: Light

← 决策记录例子

编程语言

目录:

摘要

问题

阿拉需要为阿拉个软件选编程语言。阿拉有两个主要需要:一种适合 Web 应用个前端编程语言,还有一种适合服务器应用个后端编程语言。

决策

前端阿拉选 TypeScript。

后端阿拉选 Rust。

状态

已决定。对出现个新备选方案,阿拉保持开放。

详情

假设

前端应用是典型个:

  • 典型个用户搭交互

  • 典型个浏览器搭系统

  • 典型个开发搭部署

前端应用可能演进得很快:

  • 阿拉想确保快速又容易个开发、部署、迭代等等。

  • 阿拉重视可证明性,比方类型安全,为了做到迭点,阿拉愿意多做一眼工作。

  • 阿拉勿需要兼容遗留系统。

后端应用个要求高于典型:

  • 对质量个目标高于典型,特别是可证明性、可靠性、安全性等等。

  • 对近实时个目标高于典型,也就是阿拉勿想因为虚拟机垃圾回收而出现停顿。

  • 对函数式编程个目标高于典型,特别是并行化、多核处理搭内存安全。

阿拉接受较慢个编译速度,换取编译期安全搭运行时速度。

限制

阿拉对能搭主要云提供商个函数服务(比方 Amazon Lambda)一道用个语言,有很强个限制。

立场

阿拉考虑过迭眼语言:

  • C

  • C++

  • Clojure

  • Elixir

  • Erlang

  • Elm

  • Flow

  • Go

  • Haskell

  • Java

  • JavaScript

  • Kotlin

  • Python

  • Ruby

  • Rust

  • TypeScript

论据

每种语言个小结:

  • C:被否决,因为安全性低;Rust 几乎样样做得更加好。

  • C++:被否决,因为伊一团糟;Rust 几乎样样做得更加好。

  • Clojure:出色个建模;最好个 Lisp 近似;JVM 上有出色个运行时。

  • Elixir:出色个运行时,包括可部署性搭并发;出色个开发者体验;生态相对较小。

  • Erlang:出色个运行时,包括可部署性搭并发;开发者体验有挑战;生态相对较小。

  • Elm:看起来非常有前途;IBM 辣发表重要个案例研究,结果良好;生态较小。

  • Flow:比 JavaScript 有意思个改进;勿过开发者辣离开伊。

  • Go:出色个开发者体验;出色个并发;勿过有一连串做坏个决策,削弱了语言个记录。

  • Haskell:最好个函数式语言;开发者社区较小;还呒没足够多公开发表个生产成功案例。

  • Java:出色个运行时;出色个生态;开发者体验一般。

  • JavaScript:有史以来最流行个语言;最广泛个生态。

  • Kotlin:修复了 Java 个许多问题;有 JetBrains 个出色支持;有从 Java 移植到 Kotlin 个好个公开案例。

  • Python:系统管理最流行个语言;出色个分析工具;好个 Web 框架;勿过被 Google 放弃,改用 Go。

  • Ruby:有史以来最好个开发者体验;最好个 Web 框架;最友善个社区;勿过非常慢;打包有眼难。

  • Rust:最好个新语言;强调零抽象;强调并发;勿过生态相对较小;而且对某眼编译器加速有刻意个限制,比方直接内存访问必须明确标成 unsafe。

  • TypeScript:给 JavaScript 加上类型;出色个转译器;开发者越来越强调从 JavaScript 移植到 TypeScript;有 Microsoft 个有力支持。

阿拉认为,虚拟机有一套阿拉现在勿需要个取舍,比方为提供运行时能力而增加个复杂度。

阿拉相信,阿拉个核心决策由两个横切个顾虑驱动:

  • 要最快个运行速度搭最紧密个系统访问,阿拉会选 JavaScript 搭 C。

  • 要接近最快个运行速度搭接近最紧密个系统访问,阿拉选 TypeScript 搭 Rust。

荣誉提名给虚拟机语言搭 Web 框架,要是阿拉想要虚拟机语言,阿拉会选:

  • Clojure 搭 Luminus

  • Java 搭 Spring

  • Elixir 搭 Phoenix

影响

前端开发者需要学 TypeScript。要是开发者主要经验是用 JavaScript,迭个学习曲线大概率比较容易。

后端开发者需要学 Rust。要是开发者主要经验是用 C/C++,迭个学习曲线大概率适中;要是开发者主要经验是用 Java、Python、Ruby 或者类似个内存托管语言,学习曲线会比较难。

TypeScript 搭 Rust 侪相对比较新。迭意味着许多工具还呒没迭眼语言个文档。比方,devops 流水线需要为迭眼语言配置,到现在为止,阿拉评估个 devops 工具里向,呒没一个有迭眼语言个默认例子。

TypeScript 搭 Rust 个编译辰光相当慢。其中有眼可能是因为语言比较新。阿拉可能想看看哪能缓解编译慢,比方按需编译、编译并发等等。

迭眼语言个 IDE 支持还勿普遍,也还勿是一流。比方,JetBrains 销售 PyCharm IDE,对 Python 有一流个支持,但是勿销售对 Rust 有一流支持个 IDE;JetBrains 可以用 Rust 插件,相对于 Python 语言支持,大概提供 80% 个 Rust 语言支持。

相关

相关决策

阿拉会努力做出搭迭眼语言一致个生态选择。

比方,阿拉想选一个对迭眼语言有好个能力个 IDE。

比方,对阿拉个前端 Web 框架,阿拉更加有可能决定选倾向于 TypeScript 个框架(比方 Vue),而勿是倾向于纯 JavaScript 个框架(比方 React)。

相关需求

阿拉整个工具链必须支持迭眼语言。

相关工件

阿拉预期可能会拿一眼机密导出到环境变量。

相关原则

量两趟,造一趟。阿拉拿一眼安全性放辣一眼速度前头。

运行时比编译辰光更加有价值。阿拉拿客户使用放辣开发者使用前头。

备注

迭里写任何备注。