教程资源

入门教程在:手把手教你做一个 C 语言编译器


学习过程

19年尝试学了一下,中途看不懂放弃了。20年底从头再看一遍,经过一年的知识积累,在仔细研读之下,终于算是学懂了。此文中记录了我在最初学习时遇到的问题,和最终的解决方法记录下来,希望对读者有所帮助。


虚拟机

虚拟机涉及的知识是比较综合性的,是一个难点。虚拟机的原理是,模拟实现CPU的指令集。CPU的指令功能无非就是操作存储和调用运算资源,我们完全可以自己模拟实现。这样我们就可以不生成直接运行在电脑上的机器码,不用关心exe文件格式,而是实现一个简单的虚拟机来把源码当做脚本来执行。如此,机器码生成的任务可以大大减少,降低入门难度。


BNF

刚开始学的时候遇到的问题是,弄不懂BNF。BNF只有弄懂了,才会自己写,才会用代码实现。个人对BNF的理解见我的另一篇博客:编译原理—理解BNF。


逻辑流程图

在脑海中要有一张如下图的逻辑流程图:

其中,符号表特别重要,源码中的重要信息都是保存在符号表中的。

要特别说一下,比较容易纠结的问题是,为什么按照上面的流程先解析Token,再语法分析,就可以解析代码了?知其然还要知其所以然。我的理解是,编程语言在设计的时候,就考虑到,一要能准确无误的表达出一个操作,没有歧义;二是为了能使编译器更易于实现。编程语言并不是一下子就设计好的,很可能是在设计编译器的过程中不断丰富完善的。举一个例子:为什么标识符不能以数字开头?因为,如果标识符以数字开头,编译过程中就需要更多的判断来分辨到底是一个标识符还是一个数字或者表达式,直接规定不允许以数字开头,保证了不同类型的Token起始符号不同,就可以很容易判断Token的类型了。


动手实践

在原教程的基础上,可以自己尝试实现具有更强功能的C语言脚本,如支持结构体解析,如在解析代码的基础上,实现编辑器上下文提示等等。

同时,在对编译原理上下文无关文法的理解的基础上,学习其他语言,应该更加容易。

同时,可以自己开发一些小工具用来对代码进行自定义处理。


更加深入

后续可以学习已有脚本语言的实现原理,甚至可以尝试自己开发一款脚本语言,学无止境,再接再厉!

【编译原理】入门总结相关推荐

  1. 【编译原理入门】–编译器compiler

    编译原理[入门]–编译器compiler 参考:https://www.youtube.com/watch?v=cxNlb2GTKIc&list=PLTd6ceoshpreZuklA7RBMu ...

  2. 国外精选视频课:编译原理入门1

    编译原理的概述 编译指的是将程序员用某种高级语言的源代码转换成目标代码,即计算机能够人认识的可执行机器代码 编译是由一个叫编译器的程序完成的 因为程序需要被编译运行在特定类型的处理器上,所以,具体如何 ...

  3. 国外精选视频:编译原理入门3

    语法分析 该阶段的目的是为了发现已标记化(已分词)程序中的任何语法错误,语法错误是指那些破坏变成语言规则的内容 分析程序的语法就像检查用英语写的简单句子是否具有语义 这句话是有效的,因为它符合某种规定 ...

  4. 【编译原理】实现一个计算器

    实现一个计算器,包括加减,乘除,括号,错误提示,id等,相当于一个小型的解释器. 其中重要的思想是 把字符转换成token 递归解析 //编译原理实现计算器 #include<bits/stdc ...

  5. 龙书啃不动?老司机带你从零入门编译原理,开发编译器

    计算机只认识二进制的,但是我们平常开发中根本不会使用二进制进行开发,我们使用的都是 Java.C.Python 这类的高级语言.每种语言都会经过一系列的转换才能被计算机识别,那么到底是谁做的这项工作呢 ...

  6. 编译原理实验入门-Cygwin-Flex-Bison-下载安装+基本操作

    编译原理实验入门 一.实验环境配置-Cygwin-Flex-Bison 1.下载Cygwin 2.双击 3.初始安装\更新\删除\安装其他 二.基本操作Cygwin-Flex-Bison (1)Cyg ...

  7. ESP32-C3入门教程 环境篇⑥——ESP-IDF编译原理简述(CMakeLists/CMake)和构建自定义项目

    文章目录 一.前言 二.ESP-IDF编译原理 2.1 基础知识 2.2 软件组件 2.3 构建过程 2.4 最简单的示例项目 三.构建自定义项目 3.1 项目重命名 3.2 main.c重命名 3. ...

  8. micropython编译原理_C语言嵌入式Linux高级编程第9期:CPU和操作系统入门视频课程...

    嵌入式开发是一门交叉学科. 它要求我们的嵌入式工程师,不仅学习C语言.汇编.软件工程等软件层面的知识技能,还要求对CPU内部工作机制.计算机系统架构.操作系统原理.编译器等都有一个全局的认识和把握. ...

  9. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

最新文章

  1. SQLServer服务的运行与登录
  2. Unicode、UTF-8 和 ISO8859-1到底有什么区别(转载)
  3. DDD:架构思想的旧瓶新酒?阿里等大厂却对它趋之若鹜!
  4. php数据库操作命令精华大全
  5. html5 java 图片上传_java实现图片上传至服务器并显示,如何做?希望要具体的代码实现...
  6. linux中特殊字符反引号,linux中的特殊符号$ ‘’ 反引号 反斜杠
  7. Linux命令sort的常用用法
  8. 黑马程序员传智播客 匹配分组学习分组
  9. 占位符是如何防止sql注入的?
  10. 01、CentOS 7 镜像文件各个版本区别及介绍
  11. 串口通信之波特率计算
  12. linux清理缓存和垃圾,CentOS等Linux系统如何清理系统垃圾和日志?
  13. 玩游戏提示计算机内存不足怎么办,打开软件提示内存不足怎么办?电脑提示内存不足解决办法...
  14. android11 rom,第一个Android 11的第三方ROM来了,适用于红米K20 Pro
  15. XPDL与WS-BPEL的比较之五:形势与未来
  16. 翡翠手链更能够突显佩戴者的非凡气质
  17. 实用的19条android平台设计规范
  18. 一些PPT演讲前暖场的音乐
  19. Vultr 修改 Root 账户密码教程
  20. apache poi-检测到Zip Bomb解决方案

热门文章

  1. angularjs中的分页指令
  2. “每日一道面试题”.Net中所有类的基类是以及包含的方法
  3. OpenGL ES 纹理设置
  4. 使用json-lib进行Java和JSON之间的转换
  5. python批量操作Linux服务器脚本,ssh密码登录(执行命令、上传、下载)(一)...
  6. Win8 IIS 安装和部署网站问题
  7. 基于Passthru的NDIS开发的个人理解
  8. 实时修改和读取webconfig
  9. linux分割图片软件,桌面应用|5 种拆分 Linux 终端的方法
  10. rs232串口驱动_RS232与RS485在性能上有啥区别和联系?老电工总结分析,一目了然...