📍编程语言
程序员可以看作语义指令(编程语言)和计算机之间的桥梁,类似翻译官的存在。(用户的奇思妙想……)
机器语言
机器语言,顾名思义就是机器能够直接识别的语言,处理速度快,但不直观,对于人类理解不太友好。二进制编码就属于这个范畴。
不同种类的计算机其机器语言是不相容的。
汇编语言
使用字母代替数字,提高了可编写性和可移植性。
中级语言
- C 过程式语言
能够直接操作位、字节、地址(eg.指针);倡导代码和数据分离的结构化编程。
高级语言
进一步提高可移植性,更接近自然语言,需要通过编译器编译为汇编语言,再进一步转为机器语言。
-
C++ 面向对象语言
在C的基础上增加了类、继承、多态、虚函数……
-
Lisp 函数式语言
-
JavaScript 基于原型和头函数的多范式语言
过程式、面向对象、函数式、响应式
📍编程范式
JavaScript是一门融合了多种编程范式的语言。
💬编程范式:范式可以理解为规则,编程范式就是计算机编程所使用的方法,是设计程序结构所采用的设计风格。
程序语言的特性:
- 是否允许副作用
- 操作的执行顺序
- 代码组织
- 状态管理
- 语法和词法(基础)
编程范式可分为:
-
命令式
-
面向过程:将操作按照过程分组
自顶向下、结构化的思想。(JS中的
export模块化体现了其面向过程特性)结构化编程体现在顺序结构、选择结构、循环结构等中。
面向过程存在的问题:
- 数据与算法关联弱(当代码规模变大后,程序会变得难以理解,“大浪淘沙”)
- 不利于修改和扩充
- 不利于代码重用
-
面向对象:根据操作和对应的状态进行分组
面向对象的三大特性:封装(类)、继承、多态、(* 依赖注入)。不同的面向对象语言对这三种特性的实现可能会有区别,但底层逻辑是相同的。
封装就像将数据和算法放在一个黑箱中,只有箱子内部(类成员、类实例)可以访问调用。
继承提高了代码的复用性,能够在不重写父类功能的情况下进行功能扩充。
多态可以简单理解为接口复用,对于同一个接口,不同的对象调用它会产生不同的效果。
依赖注入:可以借助类库实现这一高级特性(eg.Nest.js)
面向对象编程的五大原则:
- 单一职责原则SRP(Single Responsibility Principle):功能单一
- 开放封闭原则OCP(Open-Close Principle):扩展性开放、更改性封闭
- 里氏替换原则LSP(the Liskov Substitution Principle):子类可以替换父类,并可以出现在任何父类出现的地方
- 依赖倒置原则DIP(the Dependency Inversion Principle):上层依赖下层
- 接口分离原则ISP(the Interface Segregation Principle):应该依赖接口而不是具体的实现
面向过程的缺点: 附带着所有隐含环境(可能不是我们需要的),下面这句话很好的说明了。
-
-
声明式
-
函数式 (ramdajs库,辅助函数式编程)
函数是“第一等公民”:函数可以像其他数据类型变量那样使用
纯函数/无副作用:一般将涉及的数据放在函数内部,不影响外部环境,相互之间也互不影响。变量污染?(可缓存、可移植、可测试、可推理、可并行)
高阶函数/闭包:柯里化(用闭包把参数保存起来,当参数的数量足够执行函数了,就开始执行函数。)
function currying(fn, ...args) { if (args.length >= fn.length) { return fn(...args); } else { // 返回一个保存了之前参数的闭包 return (...args2) => currying(fn, ...args, ...args2); } }函数组合:数据从右到左流入,依次调用处理。
Functor:可以当作容器的类型,支持对容器内元素进行操作。
Array.map()、Promise.then()Monad:去除嵌套容器的容器类型,打平操作。
Array.flatMap、Promise.then()Applicative:直接对两个容器直接操作。
-
响应式
异步/离散的函数式编程
- 数据流
- 操作符
- 过滤
- 合并
- 转化
- 高阶
Observable:
- 观察者模式(需要和发布订阅模式做一些区分)
- 迭代器模式
- Promise/EventTarget超集
Monad:去除嵌套的Observable
-
📍构建领域特定语言
💬用于特定领域的语言,如:HTML、SQL
特定领域语言需要使用通用语言来实现。
语言运行:
词法解析(lexer) -> 语法解析器(parser、语法树) -> 遍历分析
└> 解释(interpret)
└> 转换为另一种语言
-
词法解析(lexer)token
- 注释
- 关键字
- 操作符
- 空格
- 字符串
- 变量
-
语法解析器(parser)
- 语法规则:推导式、终结符(构成句子的实际内容)、非终结符(符号和变量的集合)
- LL:从左到右检查,从左到右构建语法树
- LR:从左到右检查,从右到左构建语法树
-
tools
-
visitor
总结
知识点密度很高的一节课,有很多知识点现在还不太理解,日后还需要多花时间深入了解。
当我跃进编程这片海,才发现自己的无知与渺小……