前言

最近一两个月一直在准备秋招的事情,太忙了,学习进度给暂停了下来,然后秋招也快到了尾声,这里抓紧时间把自己想要学的东西学完,这里要做的是研究的斯坦福的cs143,整个的资源可以在edx上搜索到,大致将编译器的结构过一遍,然后手撕一个简单的编译器(暂时不涉及到优化的方面,这是在升级版的教程里面),然后因为网上的笔记和资料不多这里决定不仅仅记录写编译器的部分,还把自己的整理也记录下来,作为总结,今天的这篇简单聊聊编译器的架构和设计理念吧。

正文

程序执行的分类

首先对于不同语言如何被计算机理解并执行,常见的分类有通过编译器(类似C++,Go,将源代码编译成可执行文件后再结合数据进行运行得到结果),通过解释器(类似Python,直接将代码和数据作为输入经过解释器的处理得到输出),有时候又可能是类似两者的结合,例如Java就是先将源代码进行编译为.class字节码,然后再交由JVM做对应机器指令翻译,同时又可能配合这JIT即时编译来做优化等等。

所以说现代化的程序运行都是很复杂的,但是对于本次学习,我们暂时只涉及到编译器的部分,理解编译器是如何工作,它的架构是什么etc。

语言多样性的原因

一个很有意思的问题,在正式开始编译器的旅程前我们先驻足思考下,为什么会有这么多种语言在编程的世界,我们能否将不同语言的性进行统一,做到大一统呢?我们又该如何评判一个语言的好坏或者说广泛适用性呢?

第一个问题,我认为语言的多样性是基于场景的多样性,不同应用场景对语言的特性要求也不同,例如在科学计算领域需要对浮点数有着良好的计算支持,需要对并发计算有着一定的要求;在即时通信商用软件的领域,时间性要求即高;对大量数据的处理存储时,数据的持久化,数据分析有着一定的要求例如sql。

第二个问题,语言特性是否能融合统一呢?我认为在某些情况下只能做到一定程度的改善,但是在大多数场景下还是需要有取舍,不同特性可能存在的矛盾冲突会导致统一的不可能性,例如在Java,C++中常见的重载特性,在Go中却没有得到支持,也是一直被社区呼吁,但是因为考虑到重载对于编译时间,运行时间之间的相互矛盾,Go在这一块也是一直保持者谨慎的态度,等等众多的例子说明了统一的困难。并且想要一个实现重大新特性相较于在原有流传广泛的老语言而言,实现一门没有包袱的新语言来说无疑是更简单的,也因此每隔几年就会冒出新的宠儿。

最后一个问题,怎么取判断语言的好坏呢?个人看来还是需要根据应用场景来做具体分析比较靠谱,再厉害的语言也无法覆盖到方方面面,比较程序员最喜欢讨论谁是世界第一语言2333。

常见编译器的架构

在这里我们主要将编译器分成五个部分词法分析

语法分析

语义分析

优化

代码生成

其实在我之前的博客中已经大致说了各个部分做什么,这里再简单重新提一下

词法分析:例如对单词进行切分,对于程序进行切分token,eg: int x = 1;将会被切分为int,x,=,1,;

语法分析:将这些token转为为结构体语法树,例如ast语法树

语义分析:类似人类理解句子的含义,但是编译器肯定做不到这么多复杂的东西,最多做一些类似代码错误检测,例如类型错误,作用域等

优化:进行一些性能优化,例如更快,使用更少的内存,这里我们的编译器没有涉及到优化这一块

代码生成:编译器最终生成汇编代码,或者其他的中间代码,甚至其他语言的代码,类似人类的翻译。

总结

今天先写到这里,之后会继续写这次将涉及到的cool语言特性以及编译的相关知识。

手撕python_手撕编译器(一)——编译原理简介相关推荐

  1. PL/0语言编译器扩展 编译原理课程实践(1)

    转眼大学生活就要结束,编译原理课程学的东西很多都忘记了.当时我们编译原理课程实践是PL/0语言编译器扩展,在原有PL/0语言文法进行扩展.我写这次博文一是为了回忆以前学的知识,加深记忆:二是和大家分享 ...

  2. 简介DOTNET 编译原理 简介DOTNET 编译原理 简介DOTNET 编译原理

    简介DOTNET 编译原理 相信大家都使用过 Dotnet ,可能还有不少高手.不过我还要讲讲Dotnet的基础知识,Dotnet的编译原理. Dotnet是一种建立在虚拟机上执行的语言,它直接生成 ...

  3. javac编译原理简介

    文章目录 1:javac的七个阶段 1.1 第一阶段:parse 1.2 第二阶段:enter 1.3 第三阶段:process 1.4 第四阶段:attr 1.4 第五阶段:flow 1.5 第六阶 ...

  4. 手撕python_手撕LeetCode #1171——Python

    1171. 从链表中删去总和值为零的连续结点 给你一个链表的头结点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续结点组成的序列,直到不存在这样的序列为止. 删除完毕后,请你返回最终 ...

  5. java编译器 Javac 编译原理

    目录 词法分析器 语法分析器 语义分析器 代码生成器 java源代码(符合语言规范)-->javac-->.class(二进制文件)-->jvm-->机器语言(不同平台不同种类 ...

  6. 编译原理练手之撸个Json Parser

    https://github.com/lucyTheSlayer/FFJson 手撸个python目标还是太遥远,先从简单的json解析器开始.捣鼓了半天,似乎是ok了,现总结一下. 1.Lexer ...

  7. 腾讯手游助手与 C/C++语言编译器发生的冲突

    自己编译的exe可执行文件都弹出:"此应用无法在你的电脑上运行,若要找到适用于你的电脑的版本,请咨询软件发布者" 问题描述 原因分析 解决方案 结论:卸载腾讯手游助手 问题描述 用 ...

  8. 编译原理 - 1 手撸状态机词法分析器

    感谢vczh轮子叔的坑了的教程,我的编译原理第一次入了个门,词法分析写完了,今后可以看看书继续往下学了. http://www.cppblog.com/vczh/archive/2014/03/02/ ...

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

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

最新文章

  1. linux虚拟机安装oracle全过程(一)
  2. PMBOK(第六版) PMP笔记——《十一》第十一章(项目风险管理)
  3. 264 参考帧 list0 list1
  4. CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模
  5. 现代软件工程第六章作业
  6. 有了WCF,Socket是否已人老珠黄?
  7. 双系统装完只能u盘启动_U盘启动盘如何安装Win7+Win8双系统史上最详细教程
  8. Mysql的一揽子方案用法
  9. Teemo Attacking
  10. 什么是云桌面?企业为什么要关心云桌面?
  11. MMORPG网络游戏开发之用户管理
  12. vue 嵌套表格组件_vue+element-ui实现嵌套表格导出
  13. 新版SpringCloudGateway网关 切面修改方法入参
  14. 【华为机试真题Python】工厂流水线调度
  15. oracle11g rac转换单机,oracle11g rac RMAN备份恢复至单机
  16. OpenGL API - 笔记汇总
  17. Learning to Rank系列之Pointwise方法
  18. 用Python读红楼梦之——一、词云绘制
  19. JAVA使用JDBC批量插入SQL
  20. 数据链路层的有那三个基本问题?为什么都必须加以解决?

热门文章

  1. 莫比乌斯反演公式推导
  2. Java基础编程\第四-六章(面向对象编程)
  3. <<人性的弱点>>读后感
  4. 有效提高执行力,你需要这几个技巧
  5. java web树形图查询_Javaweb生成族谱树形图
  6. 一文详解什么是RNN(循环神经网络)
  7. 贴几张Google Earth的图
  8. 3.7 pipeline syntax 7
  9. igxe取东西显示服务器繁忙,igxe服务器繁忙
  10. python之xlrd