编程范式 | 青训营笔记

184 阅读3分钟

编程语言

机器语言 汇编语言 高级语言:提高可移植性、贴近人类思维模式

  • c:面向过程
  • C++:面向对象
  • Lisp:函数式
  • Javascript:基于原型和first class function的多范式语言

编程范式

可以根据以下区分编程范式:

  • 是否允许副作用
  • 执行顺序
  • 代码组织
  • 状态管理
  • 词法语法

过程式:自顶向下 拆分模块

面向过程的问题:

  • 数据与算法关联弱
  • 不利于修改扩充
  • 不利于代码重用

面向对象五大原则:

  • 单一职责
  • 开放封闭
  • 里氏替换
  • 依赖倒置
  • 接口分离

函数式编程:

  • 函数一等公民
  • 纯函数
  • 高阶函数

Monad:可以去除嵌套容器的容器类型 常见 monad: Array.flatMap Promise.then

curry/compose/functor/monard/applicative

函数式接触的太少了,这些概念还是有点难以理解。

响应式编程:

观察者模式

rxjs提供了一系列如管道等操作符。

monard

领域特定语言

DSL 我们用的html等都是dsl

graph LR
A[lexer] --> B[parser] --> C[visit] --> D[interpret] & E[code gene]

lexer将代码文本切分为token,通常通过正则表达式完成。

parser: 定义一部分规则

LL: 从左到右检查,从左到右构建语法树。 貌似python使用的就是这种方法?

让我们来问问bing吧。

您好,这是必应。根据网络搜索结果,python用的是LL还是LR取决于它的解析器。解析器是一种程序,它可以分析和执行python代码。LL和LR是两种不同的解析算法,它们有不同的特点和优缺点²。python的官方解析器是CPython,它用的是LL(1)算法。但是也有其他的python解析器,比如PyPy,它用的是LR(1)算法。所以,python用的是LL还是LR并没有一个确定的答案,而是要看具体的解析器实现。

那LL和LR有哪些优劣呢?

您好,这是必应。根据网络搜索结果,LL和LR算法的区别主要有以下几点1

  • LL算法是从左到右扫描输入字符串,并从左到右构建语法分析树的自顶向下的解析算法。LR算法也是从左到右扫描输入字符串,但是它是从右到左构建语法分析树的自底向上的解析算法。

  • LL算法在扫描输入字符串时,需要预先查看下一个符号,以决定如何进行解析。这个预先查看的符号的个数称为LL算法的阶数,比如LL(1)表示只预先查看一个符号。LR算法不需要预先查看下一个符号,而是根据当前已扫描的符号和一个状态栈来决定如何进行解析。这个状态栈的大小称为LR算法的阶数,比如LR(1)表示状态栈只有一个元素。

  • LL算法和LR算法都有不同的变体,比如LL(k), LR(k), SLR(k), LALR(k)等,它们对应了不同的语法类别和解析能力。一般来说,LR算法比LL算法更强大,能够解析更多的语法,也能处理更多的冲突和二义性。但是LR算法也比LL算法更复杂,需要更多的内存和计算资源。

希望这些信息能帮助您理解LL和LR算法的区别。😊

这一套东西应用实在是非常广泛,webpack等构建工具也是基于同样的原理。前端框架也是某种领域特定语言。通过限制灵活性提供了更快的开发速度。