百科问答小站 logo
百科问答小站 font logo



只会c语言语法,就能强行做一个编译器出来吗? 第1页

  

user avatar   kelthuzard 网友的相关建议: 
      

这东西。。可难可简单

0. brainfuck

模拟就完事了

1. 词法语法分析完得ast

ast解释,这是玩具语言的选择。

ast生成汇编,然后汇编器产出具体架构的机器代码,这是玩具语言的选择。

2. 分析完得字节码然后套vm执行

语法分析完后也可能有语义检查或者其他啥的,这是c4,red,lua的选择。

2. ast转字节码,或者1直接产出字节码,供以vm模拟字节码行为

这也是解释器,线性分派以及局部性因素可能让它比较快,但是,到这一步大概率你会加上GC,runtime等各种组件,除非你用的宿主语言本身就是GC语言,那么可以省略GC实现,但是runtime等仍然不可少。这是cpython,php,gravity的选择。

3. vm不直接模拟宿主执行字节码,而是在早期将每一条字节码翻译为机器代码,然后vm执行这些机器代码

即jit的过程,是指运行时生成可实现代码的过程,这样比2快。也是个解释的过程。这是luajit,php jit的选择。

4. ast或者字节码转成一种ir,对ir应用些优化,然后lowering,再汇编器出机器代码

可以是ast转成ssa做各种opt pass,然后lowering到平台相关,最后汇编器生成机器代码。这是golang的选择。red也准备这样,但是ir不知道是不是ssa。

100. ast或者字节码转多级别ir,各级别ir都应用优化,然后lowering,最后汇编出机器代码

现代编译器的设计。比如gcc,jvm的c1 c2 ,graal,llvm backend,v8的crankshaft turbofan等,都属于地表最强编译器俱乐部。

还有些不走寻常路以及没提到的以及我不知道流程的,待补充。

不过,结论大致是只学完c语言语法写不出编译器,但是简单的解释器你可以!!




  

相关话题

  埃式筛为什么只要筛到根号n就好了? 
  在C++中,“?:”这个符号叫什么名字? 
  救命!昨天晚上刚刚写了个C语言游戏,结果今天打开中文就显示成乱码了。请问是为什么? 
  如何评价 mimalloc? 
  <<深度探索c++对象模型>>中的虚继承看着蛋疼,感觉这在实际中也没多大用,需要继续深究吗? 
  在有能够转化为C、C++、Java的第四代语言Raptor的情况下,为什么还需要C等程序设计语言? 
  C/C++中的数组为什么必须定义之后在一行内立刻赋值,而不能定义数组之后换一行再赋值? 
  如何评价某985老师所说的「C语言至少学10年才能懂」? 
  如果C语言程序在一台电脑上可以运行,到另外一台就运行出问题是什么原因? 
  进入内核态究竟是什么意思? 

前一个讨论
塔台不发布口令飞机的机头会向上倾斜45°吗?
下一个讨论
丁小平到底是怎样的一个人?





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利