编译原理之美
宫文学
北京物演科技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讲)
结束语 | 用程序语言,推动这个世界的演化
编译原理之美
登录|注册

09 | 面向对象:实现数据和方法的封装

宫文学 2019-09-02
在现代计算机语言中,面向对象是非常重要的特性,似乎常用的语言都支持面向对象特性,比如 Swift、C++、Java……不支持的反倒是异类了。
而它重要的特点就是封装。也就是说,对象可以把数据和对数据的操作封装在一起,构成一个不可分割的整体,尽可能地隐藏内部的细节,只保留一些接口与外部发生联系。 在对象的外部只能通过这些接口与对象进行交互,无需知道对象内部的细节。这样能降低系统的耦合,实现内部机制的隐藏,不用担心对外界的影响。那么它们是怎样实现的呢?
本节课,我将从语义设计和运行时机制的角度剖析面向对象的特性,带你深入理解面向对象的实现机制,让你能在日常编程工作中更好地运用面向对象的特性。比如,在学完这讲之后,你会对对象的作用域和生存期、对象初始化过程等有更清晰的了解。而且你不会因为学习了 Java 或 C++ 的面向对象机制,在学习 JavaScript 和 Ruby 的面向对象机制时觉得别扭,因为它们的本质是一样的。
接下来,我们先简单地聊一下什么是面向对象。

面向对象的语义特征

我的一个朋友,在 10 多年前做过培训师,为了吸引学员的注意力,他在讲“什么是面向对象”时说:“面向对象是世界观,是方法论。”
虽然有点儿语不惊人死不休的意思,但我必须承认,所有的计算机语言都是对世界进行建模的方式,只不过建模的视角不同罢了。面向对象的设计思想,在上世纪 90 年代被推崇,几乎被视为最好的编程模式。实际上,各种不同的编程思想,都会表现为这门语言的语义特征,所以,我就从语义角度,利用类型、作用域、生存期这样的概念带你深入剖析一下面向对象的封装特性,其他特性在后面的课程中再去讨论。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《编译原理之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(6)

  • 逸飞兮
    老师,您好,提个小建议。代码可以按照每节课程建一个文件夹,如果后面课程的代码是基于之前的,可以复制一份到对应的文件夹再修改,这样通过目录可以直接看到整个过程。没有一直跟着老师的课程节奏走,看代码需要翻git记录,有些麻烦。

    作者回复: 多谢建议!
    目前,我尽量保证已经拷贝到文稿里的代码,就不再有变化。
    如果有变化,我就按照你说的版本管理办法,建多个目录!
    我抽时间要把代码库优化一下。整理得更整齐一些。

    2019-09-03
    1
    5
  • mcuking
    这个脚本语言使用 Java 或 C++ 实现的,请问下我想用 javascript 实现一个这样的脚本语言可以吗?

    作者回复: 可以的。当然可以。
    如果你用工具的话,antlr是支持javascript的。
    如果不用工具,手写词法分析器和语法分析器的话,那就更没有问题了。
    我后面可能会抽时间用TypeScript(或其他语言)写一个版本,用于写Visual Studio Code的插件。
    再抽出时间,我其实会拿playscript写playscript的编译器,也就是实现自举:-)

    2019-09-08
    1
    2
  • 沉淀的梦想
    语义分析的时候,有的时候在listener的enter中实现,有的时候在exit中实现,listener的enter和exit方法的具体区别是什么呢?

    作者回复: 计算顺序是语义分析中的一个重要问题。
    如果本计算要依赖下级节点先计算完,那么就要在exit方法中。
    如果如果只依赖自身,那么在哪个方法都可以。比如,判单">"表达式的返回值类型,那肯定是bool,不依赖其他节点。

    2019-09-03
  • 沉淀的梦想
    文中多次提到的“消解”的具体含义是什么呢?

    作者回复: 对应英文Resolve,可能有些资料也翻译做“解决”?
    本质就是建立其正确的引用关系。

    2019-09-03
  • d
    c语言也能写成面向对象风格,只要实现了面向对象的范式,就是面向对象模型编程,不知说的对不对,还请宫老师指正。

    作者回复: 同意你的看法。
    面向对象首先是一种编程思想。哪怕语言层面没有提供直接的支持,也可以按照面向对象编程的思想来做。具体到C语言,它有结构体,有指针,特别是有能够做任何类型转换的void*指针,具有很大的灵活性,所以是能模拟出面向对象的特性的。
    操作系统中的很多东西是用C写的,就有面向对象思想。比如,把很多设备都抽象成文件,按照统一的接口操作。
    当然在语言层面上提供支持,会容易一些。

    2019-09-02
  • 李梁 | 东大
    请问c++ auto变量能进行对象类型推导,这是怎么实现的呢

    作者回复: 你很善于动脑。

    类型推断是第11讲里会讲的内容。
    我这里提前说一下:类型推断就是两个计算过程。一个是S属性(综合属性)计算,从下往上推导,比如:
    auto a = 2;
    你从叶子节点2能推导出这整个语句的类型是int。
    再做I属性(继承属性)计算,就是从上到下的推导。a是这个表达式的叶子节点,a的类型是可以从整个表达式的类型继承下来。

    2019-09-02
收起评论
6
返回
顶部