为啥下推自动机可以用来编译或解释图灵完备的语言呢

因为编译出来的程序是由图灵完全的计算机执行的,编译器不是程序的执行者,parser 更不是程序的执行者。其实正是下推自动机太强了所以容易混淆。我们现在考虑一个更简单的“编译器”。这个“编译器”的输入是汇编代码,输出也是汇编代码,它所做的全部工作就是把这段程序读进来,什么都不做,然后输出。这个“编译器”叫 cat。Pong~我们惊讶地发现,这个“cat 编译器”输出的程序是图灵完全的。题主想明白问题出在哪了吗?
■网友
Atitit 下推自动机﹙PDA﹚说明书
【为啥下推自动机可以用来编译或解释图灵完备的语言呢】 目录
1. 概念组成与原理成分 1
2. 性状 1
3. 适用场景 主治 适应症 1
3.1. 所有场景()。 1
3.2. 语法解析 构建ast 2
3.3. 监视器模式 2
4. Bp 最佳实践 用法 2
5. 缺点 不良反应 2
5.1. 比起fsm强大了很多 2
5.2. 依然有写功能可能不好实现 2
6. 禁忌 不适应场合 2
7. 注意事项 2
8. 相互作用与其他类库模式 3
8.1. 类似的有fsm turing机 3
9. 过量与滥用后果 3
10. 原理 3
11. 理解曲线动力学 3
11.1. 学习曲线,鉴于fsm状态机和,turing机之间 3
12. 储藏 3
13. 包装与api接口 3
14. 执行标准 3
15. 生产组织与个人 attilax 3
16. Ref 3
1. 概念组成与原理成分下推自动机可以形象的理解为,把有限状态自动机扩展使之可以存取一个栈。每一个下推自动机都接受一个形式语言。下推自动机存在确定与非确定两种形式,两者并不等价。﹙对有限状态自动机两者是等价的﹚被非确定下推自动机接受的语言是上下文无关语言。
2. 性状3. ref=""\u0026gt;适用场景 主治 适应症3.1. 所有场景()。更复杂场景使用turing机
3.2. 语法解析 构建ast3.3. 监视器模式4. Bp 最佳实践 用法5、处理事件输入,实现状态跳转逻辑。 双case
这里有两种写法,一种是在状态中判断事件:一种是事件中判断状态:
本人观点:一般业务场景来说,状态的数量是确定的切数目较少,不同状态下需要处理的事件也不一样。而触发的事件数量则比较多,采用上面第二种方式在事件中判断状态也有利于把里面一层的switch/case剥离出来当成单独的函数,做一些代码模块结构的优化,故推荐使用第二种方式,事件中判断状态。
5. href=""\u0026gt;缺点 不良反应5.1. 比起fsm强大了很多5.2. 依然有写功能可能不好实现6. href=""\u0026gt;禁忌 不适应场合7. 注意事项这里需要注意的两个问题:
1、避免把某个“程序动作”当作是一种“状态”来处理。那么如何区分“动作”和“状态”?“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
2、状态划分时漏掉一些状态,导致跳转逻辑不完整。
所以维护上述一张状态表就非常必要,而且有意义了。从表中可以直观看出那些状态直接存在跳转路径,那些状态直接不存在。如果不存在,就把对应的单元格置灰。 每次写代码之前先把表格填写好,并且对置灰的部分重点review,看看是否有“漏态”,然后才是写代码。QA拿到这张表格之后,写测试用例也是手到擒来。
8. 相互作用与其他类库模式8.1. 类似的有fsm turing机9. 过量与滥用后果10. 原理11. 理解曲线动力学 11.1. 学习曲线,鉴于fsm状态机和,turing机之间下推自动机比有限状态自动机复杂:除了有限状态组成部分外,还包括一个长度不受限制的栈;下推自动机的状态迁移不但要参考有限状态部分,也要参照栈当前的状态;状态迁移不但包括有限状态的变迁,还包括一个栈的出栈或入栈过程。
12. 储藏 13. 包装与api接口14. 执行标准15. 生产组织与个人 attilax16. RefJ


推荐阅读