范式编程 | 青训营笔记
一、编程语言
- 机器语言:计算机执行的二进制命令,都是0和1表示的
- 汇编语言:用助记符代替机器指令的操作码(如:ADD表示加法)
- 高级语言:更简单,符合人们的习惯,也更容易理解和修改。高级语言经过编译器编译之后可以得到目标程序。(如:C++、JAVA)
二、编程范式
什么是编程范式
范式编程是一种重用性高、解决方案标准化的软件设计方法。它依靠定义通用模式和对应模板来解决重复出现的问题,简化设计过程和实现代码。掌握范式编程理念和各种典型模式,可以帮助程序员产生更高层次的思维模式,设计出更高质量的软件。
命令式编程:
- 命令式编程强调描述解决问题的具体步骤和过程。程序员需要精确地定义应该执行什么操作,以及应该如何执行这些操作。
- 代表语言有C、Java、C++等,解决问题时通常需要编写一条条的执行语句来表示具体的运算和赋值过程。
示例代码:
java
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i; // sum = sum + i
}
声明式编程:
- 声明式编程更关注问题的最终结果,而不是具体的运算过程。程序员只需要声明想要得到的结果,系统会自动找到计算这个结果的过程
- 代表语言有SQL、正则表达式、HTML等,解决问题时更关注结果而非过程,通过声明的方式获得结果。
示例代码:
sql
SELECT sum(age) AS total_age
FROM users;
两种编程范式各有优缺点:命令式编程更精确和灵活,适合解决复杂问题。但代码量通常较大,可读性和重用性较低。声明式编程代码更简洁和高层次,适合表达简单问题和业务逻辑。但对复杂问题的表达能力较弱,过程不够透明。
过程式编程
- 自顶向下
- 结构化编程
顺序、选择、循环代替goto
- 算法+数据结构=程序
js中的面向过程
面向对象编程
- 封装
- 继承
- 多态
- 依赖注入
五大原则
- 单一职责原则
- 开放封闭原则(拓展性开放、更改性封闭)
- 里式替换原则(子类可以替换父类,并可以出现在父类可以出现的任何位置)
- 依赖倒置原则(具体依赖抽象,上层依赖下层)
- 接口分离原则
函数式编程
响应式编程
三、领域特定语言
特定领域语言(Domain-Specific Language,DSL)是一种专门针对某一特定问题领域设计的计算机语言。它提供了一种专门的语言,用于在某个特定领域内描述问题和解决方案。
相比通用编程语言(如Java、C++等),特定领域语言有以下优点:
- 专注性:DSL专门针对一个领域设计,可以更好地描述该领域的概念和语义,表达力更强。
- 可读性:DSL使用领域专业术语,更符合人类的思维方式,代码更加简洁和可读。
- 安全性:DSL限定了语言的用途,减少了误用的可能性,更加安全可靠。
- 生产力:在特定领域内,DSL可以大幅提高开发效率和生产力。
但是,DSL也有一定缺陷:
- 狭隘性:DSL专注于一个领域,不具有通用编程语言的广泛适用性,无法解决更广范围的问题。
- 实现难度:开发一门DSL需要深入理解问题领域并设计 grammar,这是一个比较困难的工作。
- 学习成本:每一门DSL都是一套全新的语言体系,需要专门学习,使用成本较高。
常见的DSL有:
- 数据库查询语言SQL
- 正则表达式
- 数学表达式语言MathML
- 图形化建模语言UML
- 网页布局语言CSS
总之,特定领域语言通过针对某一特定问题领域设计语言,可以帮助用户以最自然和高效的方式解决该领域的问题。它消除了通用语言的冗余和不必要的复杂性,提供了一种专业且优化的工具来提高生产力。但是它也付出了一定的限制性和实现难度作为代价。
DSL和通用语言并不互斥,而是可以相互补充。我们可以根据需要,选择使用DSL或通用语言来解决不同的问题。理解各种DSL和它们的设计思想,也有助于我们在设计软件时采取"语言导向"的思维模式,开发出更高质量的产品。 (已编辑)
语言运行
- lexer(词法解释器)
- Parser(语法分析)
四、资料
函数式编程
Introduction - mostly-adequate-guide (gitbook.io)
Ramda Documentation (ramdajs.com)
创建DSL parser工具
PEG.js – Parser Generator for JavaScript (pegjs.org)
yiminghe/kison: A LALR(1)/LL(1)/LL(K) parser generator for javascript/typescript (github.com)