相信每一个计算机科班出身的同学或许都有这样的经历:在大三的某一天,仿佛打通了全身筋脉一般把三年的所学:“数电里的与非门——计算机体系结构——汇编语言——C语言——C++语言——Java语言”。所有知识全部串联了起来。所有这些语言的出现都仿佛都有了必然性和追根溯源的历史感。
**阅读指引**
读懂此文,需要以下基础:
1. 至少写过50000行的代码;
2. 汇编基础(静态数据段,代码段,堆栈段)。
有以下或者类似知识就更好了:
1. C语言编译,C++对象模型,MFC反射的实现
2. JAVA的解释器运行原理
3. 使用过javascript,Python,PHP:感受过代码和类型系统在运行时的自由程度的不同
4. 计算机组成原理
**序 —— 一些问题**
1. 程序设计语言的目的是什么?
2. 为什么大多数语言有控制流?逐行执行+跳转。这与我们的需求差很远(例如一个教务管理系统、一个自动打车APP)
3. 为什么类型申明在C语言中要与控制流隔离开来?
4. 现在主流语言最基本的元素是?
5. 有没有语言它的类型结构,在运行时也可以改变?
动态性?
什么是动态性?
1. 编译后确定了什么信息,之后不再改变;
2. 运行时可以改变、添加什么;
3. 运行时是否保存着类型信息。
程序中的信息分为几类?
1. 数据信息
a) 编译时Meta-Data元数据(类型框架、空间占用)
b) 运行时Meta-Data元数据(继承体系、用于new或者反射)(特别区别编译与运行的Meta-Data的不同。)
c) 堆栈段中地址偏移(C++的switch case中不能声明变量、共享内存)
d) 静态段中地址
2. 指令信息
a) 代码段(动态性需要操作系统或者虚拟机支持,例如动态链接库,动态类加载,lisp语言自生成代码)
**语言举例**
**汇编语言**
汇编语言没有动态性吗?
没有。首先,寄存器、数据段、堆栈、代码段完全由程序员控制。完完全全是写死了的。然后,根据冯诺伊曼机的规则;取指令,执行,取指令,执行……
既然都有数据段了,还要堆栈段来做什么?这不是多余?
一开始本没有堆栈,直到60年代出现了module模块化,才有了堆栈。汇编中的模块叫子程序,不过仍旧靠程序员全权控制。
堆栈和模块化的优点有?
1. 递归
2. 功能分离到模块,可复用
3. 封装作用域
堆栈和模块化的缺点有?
1. 时间上:保存现场、还原现场的代价(另,高级语言编译“消除尾递归”节约部分成本)
2. 空间上:爆栈的危险
**C语言**
C语言比起汇编多了什么东西?
1. 编译器
2. 表达式(相比汇编,可以处理多个操作数了。)
3. 函数与模块{}(真·模块化,栈操作无需程序员完成)
4. 类型(原子类型、结构类型、数组、指针)
5. 头文件,库
总之,C语言并没有比汇编多了新的特性,它只是把汇编的繁琐操作抽象出来,让编译器完成,减轻程序员负担。
编译器的作用是?
(减少程序员负担)