编译原理之美
宫文学
北京物演科技CEO
立即订阅
8171 人已学习
课程目录
已完结 43 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么你要学习编译原理?
免费
实现一门脚本语言 · 原理篇 (13讲)
01 | 理解代码:编译器的前端技术
02 | 正则文法和有限自动机:纯手工打造词法分析器
03 | 语法分析(一):纯手工打造公式计算器
04 | 语法分析(二):解决二元表达式中的难点
05 | 语法分析(三):实现一门简单的脚本语言
06 | 编译器前端工具(一):用Antlr生成词法、语法分析器
07 | 编译器前端工具(二):用Antlr重构脚本语言
08 | 作用域和生存期:实现块作用域和函数
09 | 面向对象:实现数据和方法的封装
10 | 闭包: 理解了原理,它就不反直觉了
11 | 语义分析(上):如何建立一个完善的类型系统?
12 | 语义分析(下):如何做上下文相关情况的处理?
13 | 继承和多态:面向对象运行期的动态特性
实现一门脚本语言 · 应用篇 (2讲)
14 | 前端技术应用(一):如何透明地支持数据库分库分表?
15 | 前端技术应用(二):如何设计一个报表工具?
实现一门脚本语言 · 算法篇 (3讲)
16 | NFA和DFA:如何自己实现一个正则表达式工具?
17 | First和Follow集合:用LL算法推演一个实例
18 | 移进和规约:用LR算法推演一个实例
实现一门脚本语言 · 热点答疑与用户故事 (2讲)
19 | 案例总结与热点问题答疑:对于左递归的语法,为什么我的推导不是左递归的?
用户故事 | 因为热爱,所以坚持
编译原理 · 期中考试周 (1讲)
期中考试 | 来赴一场100分的约定吧!
免费
实现一门编译型语言 · 原理篇 (12讲)
20 | 高效运行:编译器的后端技术
21 | 运行时机制:突破现象看本质,透过语法看运行时
22 | 生成汇编代码(一):汇编语言其实不难学
加餐 | 汇编代码编程与栈帧管理
23 | 生成汇编代码(二):把脚本编译成可执行文件
24 | 中间代码:兼容不同的语言和硬件
25 | 后端技术的重用:LLVM不仅仅让你高效
26 | 生成IR:实现静态编译的语言
27 | 代码优化:为什么你的代码比他的更高效?
28 | 数据流分析:你写的程序,它更懂
29 | 目标代码的生成和优化(一):如何适应各种硬件架构?
30 | 目标代码的生成和优化(二):如何适应各种硬件架构?
实现一门编译型语言 · 应用篇 (2讲)
31 | 内存计算:对海量数据做计算,到底可以有多快?
32 | 字节码生成:为什么Spring技术很强大?
实现一门编译型语言 · 扩展篇 (3讲)
33 | 垃圾收集:能否不停下整个世界?
34 | 运行时优化:即时编译的原理和作用
35 | 案例总结与热点问题答疑:后端部分真的比前端部分难吗?
面向未来的编程语言 (3讲)
36 | 当前技术的发展趋势以及其对编译技术的影响
37 | 云编程:云计算会如何改变编程模式?
38 | 元编程:一边写程序,一边写语言
结束语 (1讲)
结束语 | 用程序语言,推动这个世界的演化
编译原理之美
登录|注册

21 | 运行时机制:突破现象看本质,透过语法看运行时

宫文学 2019-10-09
编译器的任务,是要生成能够在计算机上运行的代码,但要生成代码,我们必须对程序的运行环境和运行机制有比较透彻的了解。
你要知道,大型的、复杂一点儿的系统,比如像淘宝一样的电商系统、搜索引擎系统等等,都存在一些技术任务,是需要你深入了解底层机制才能解决的。比如淘宝的基础技术团队就曾经贡献过,Java 虚拟机即时编译功能中的一个补丁。
这反映出掌握底层技术能力的重要性,所以,如果你想进阶成为这个层次的工程师,不能只学学上层的语法,而是要把计算机语言从上层的语法到底层的运行机制都了解透彻。
本节课,我会对计算机程序如何运行,做一个解密,话题分成两个部分:
1. 了解程序运行的环境,包括 CPU、内存和操作系统,探知它们跟程序到底有什么关系。
2. 了解程序运行的过程。比如,一个程序是怎么跑起来的,代码是怎样执行和跳转的,又是如何管理内存的。
首先,我们先来了解一下程序运行的环境。

程序运行的环境

程序运行的过程中,主要是跟两个硬件(CPU 和内存)以及一个软件(操作系统)打交道。
本质上,我们的程序只关心 CPU 和内存这两个硬件。你可能说:“不对啊,计算机还有其他硬件,比如显示器和硬盘啊。”但对我们的程序来说,操作这些硬件,也只是执行某些特定的驱动代码,跟执行其他代码并没有什么差异。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《编译原理之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(6)

  • 置顶
    宫老师讲的真好!一直以来,都有一种强烈的信念!要学编译原理,要学这种在日新月异的信息技术领域里“亘古不变”的技术原理,以不变应万变。上半年学习了极客时间出的“深入浅出计算机组成原理”,在这一节正好排上用场,对程序运行时机制有了更深入的理解。

    作者回复: 对的。
    计算机的组成原理、编译器的基本架构等等内容,其实半个世纪也没有太大的变化,是比较稳定的。并且,真正做一些深入的工作的时候,这些知识仍然非常有价值。

    2019-10-25
    3
  • Gopher
    写的真好,一下子就听懂了( ̄∀ ̄)

    内存布局:
    指令数据,分而治之;
    自下而上,由静至动;
    栉比鳞次,序从中来。

    作者回复: 你不光代码写得好,文采也很好。
    新东方的三驾马车之一的王强说到,好的代码就像诗歌一样优美。写完代码要站在远处欣赏一下 :-)

    2019-10-09
    6
  • 曾经瘦过
    使用的java 语言。java是运行在jvm虚拟机里面的,是便以为jvm所需的机器码 基本的过程和这个是差不多的。看了这一篇专栏之后 发现基础知识的用处真的很多,操作系统 组成原理 用处真多。

    作者回复: 对呀。既然学计算机嘛,就搞到根本上去,心里会比较踏实。而且说实话,基础原理并不多,也不易变。反倒上层各种类库、框架,层出不穷,天天更新。这两头哪边学起来更辛苦,真不一定!

    2019-10-09
    2
  • 刘強
    文章里说操作系统还会自动维护栈。
    但我觉得栈的维护是有程序或者编译器来维护的。操作系统只是给程序(进程)分配了栈的起始地址而已,剩下的进栈和出栈操作,都是预先编译好的push和pop指令来完成的。不知理解的对不对。

    作者回复: 栈这个东西,如果深入看一下,其实涉及得还挺多的。

    操作系统的介入,主要原因是内存管理。因为你的程序所使用的内存,并不是物理内存,都是虚拟出来的。在你使用栈的时候,操作系统要帮你把逻辑的内存映射到物理的内存上去。只不过这个过程对程序是透明的。是CPU和操作系统之间协作完成的。

    具体细节是:当你push一个新的变量到栈里的时候,如果超出了当前可用的物理内存,CPU会产生一个page fault(缺页错误),操作系统这个时候介入,调度一页新的物理内存过来。

    你可以查看Intel的手册,看看push指令的说明,里面有介绍。关于page fault,你可以参考https://en.wikipedia.org/wiki/Page_fault

    当然,如果你的程序直接运行在裸机上,没有使用操作系统,那就没有操作系统什么事了。直接在裸机上编程叫做bare metal programming,在有些领域很有用。

    总结起来,栈的管理,与CPU、内存和你的代码都有关。

    2019-11-05
    1
  • 怎么没提push和pop呢

    作者回复: 在22讲,汇编语言的部分就有。

    2019-10-19
  • d
    有些汇编的语法和上面的是反着的,比如 指令:寄存器 ,源操作数/地址

    作者回复: 是的。我们用的都是GNU汇编的语法。第22讲正式讲汇编的时候特别做了说明。看看是不是在21讲提到汇编时也注释一下。

    2019-10-10
收起评论
6
返回
顶部