相信每一个盘算机科班身世的同学或许都有这样的履历:在大三的某一天,仿佛打通了全身筋脉一样平常把三年的所学:“数电里的与非门——盘算机体系结构——汇编语言——语言——Java语言”。全部知识全部串联了起来。全部这些语言的出现都仿佛都有了一定性和追根溯源的汗青感。
**阅读指引**
读懂此文,必要以下基础:
1. 至少写过50000行的代码;
2. 汇编基础(静态数据段,代码段,堆栈段)。
有以下大概类似知识就更好了:
1. 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是过程式,Haskell是函数式,JAVA是面向对象,Python是简单的大杂烩,shell是调用命令的,lua是调用c程序的,PHP是写页面的,ProLog是线性逻辑推理的。
再比方,UML是描述规格specification的,XML是存储数据的。
再再比方,CSS是描述网页表现的,HTML是描述网页内容的。
javascript比力神奇,不敢说。)
**JAVA语言**
(推荐《当地Java代码的静态编译和动态编译题目》)
JAVA语言比C++语言多了什么?
1. 虚拟机
a) 跨平台
b) 动态编译
c) 动态特性
2. 没有指针
3. 没有类的多继续,有接口的多继续。
4. 统一的库
从编译来说,JAVA比C++迈出了一大步。
它的跨平台特性和运行时的灵活性,为JAVA自己以及未来语言都提供了很多可能性。
虚拟机的好处有什么?
1. 跨平台:在OS与字节码间隔了一层。实现了程序员无负担的跨平台。
2. 动态编译:许多信息不必在编译后确定,为动态特性提供可能,稍后详细说。
3. 运行时维护着类型信息,乃至可以加载新的类型。(CORBRA依赖这个实现)
JAVA编译执行的过程是怎样的?
1. 编译后产生一个基于堆栈的字节码。
2. JRE在不同的OS上提供支持。
3. 起初的JRE是解释执行的,服从低下。
a) 获取待执行的下一个字节码。
b) 解码。
c) 从操作数堆栈获取所需的操作数。
d) 按照 JVM 规范执行操作。
e) 将结果写回堆栈。
JAVA是如何解决执行服从低下的题目呢?
使用JIT(Just-in-time)编译器进办法态编译。
JIT(Just-in-time)是怎样运行的呢?如何解决了服从的题目?
如上图:
1. 每次按照一个function来编译。转成中心表现,并优化其服从,再天生可执行码。
2. 编译器的编译线程和执行线程是分开的,应用程序不会等待编译的执行。
3. 分析框架Profiler会观察程序行为,对频仍执行的function进一步优化。(比方function内部对象维持一个池不必每次天生。)
动态编译的优点有什么?
可以根据程序的行为,优化其代码
1. 比方频仍执行的function——热方法
2. 比方arrayCopy方法,假如每次都拷贝大段内存,在指令集中有特别指令可以加速。
3. 比方类条理结构,多态的优化。(大多数虚调用都有其固定的一个目标,JIT因此天生的直接调用代码比虚表调用代码的服从会更高。)
动态编译的缺点有什么?
1. 大量的初始编译会影响程序启动时间。
2. 运行时间的编译,行为分析都必要耗费时间。
3. 运行服从达到稳固必要时间。
4. 实时GUI型的程序不能忍受“动态编译”和“GC”带来的耽误。
JAVA如何解决实时的需求?
使用AOT(Ahead-of-time)编译器:预先编译成为可执行码。
AOT(Ahead-of-time)的缺点:
对于一些动态特性的支持服从低下
1. 反射机制
2. 运行时类加载
JIT与AOT的对比
总体来说,JAVA适合怎样的应用呢?
JAVA比力时间必要长期运行的应用,比方Web服务器,Daemon服务。
**函数式语言**
函数式语言通常有哪些呢?
1. 函数式语言
a) Lisp
b) Scheme
c) Haskell(纯函数式)
d) F#?
2. 包含了函数式特性的语言
a) Python
b) Javascript
c) JAVA
d) C?
函数式语言有哪些特性?
1. 函数无副作用,只对输入输出有作用
2. 高阶函数,lamda演算。(这个像C函数指针,但是它是高阶的,即返回值可能也是函数)
3. 没有过程,类似规格说明的语法,更轻易理解,自解释。
4. 基于list的编程,函数更通用。
5. 惰性盘算(这个很像“树形DP”)
6. 有对应的数学形式化表达,有可能证实其正确性。(最终目标可能是保证程序没有bug。)
7. 其模型适合多核大概分布式的盘算。
a) 不变性(immutable)
b) 惰性盘算/按需盘算(lazy evaluation)
c) **最紧张的是,由于函数式语言不可在同一数据上做修改,每一次运用一个函数都会在新的位置产生新的数据,这与过程式语言在同一位置对数据做多次操作不同:函数式语言的函数依赖于前一次函数产生的结果数据,过程式语言依赖于数据的位置。这里函数式语言就暗含了盘算的依赖顺序,假如没有前后顺序关系,就可以并发。而过程式语言没有指定这个顺序,就必要通过加锁、Actor、Channel等模式来指定这个顺序**
总的来说,函数式语言,向着更抽象迈了一大步,更像是数学上的表达,几乎与冯诺伊曼体系断绝了关系。
函数式语言的劣势?
1. 服从不高(因为其抽象,远离了冯诺伊曼体系)
2. 平台以及开发情况都比力简单。
3. 缺少推广,应用不广泛
**逻辑程序设计**
ProLog语言,线性逻辑。人工智能语言。没有接触过。
**总结**
动态性有哪些呢?
1. 多态性:运行时根据详细对象来访问属于它的方法。(而不理会指针的类型。)
2. 反射:运行时维系着类型结构的Meta-Data。
3. 运行时类加载:运行后再次加载新的数据类型和指令流。
4. 动态链接:OS根据按需链接库文件。
编译语言 和 解释语言 的分界在哪里?
语言本身并没有编译类型大概解释类型。(比方:JAVA也可以静态编译后成可执行码。)只有少数运行时特性是依赖于解释型的。(可能必要运行情况的支持。)
为什么解释语言都必要虚拟机大概运行情况支持?
动态编译,运行时Meta-Data的保存,这些功能对于每个程序都是一致的。
所以把它们分脱离来,不必每个程序植入这些代码
非脚本语言 和 脚本语言
脚本语言,我理解是负责调理其他代码的语言。
比方shell脚本(调用命令),lua(调用C)。
跨平台分为哪些条理?
1. 源码跨平台(C,C++,但是因为系统调用接口不同,程序员负担太大,但是汇编却不是。)
2. 执行码跨平台(JAVA,有些语言直接从源码解释执行,比方Javascript,PHP)
发展汗青(推荐《近看图灵碗 (一. 从苏黎世到巴黎)》)
学术上有哪些实行性语言?
1. Fortran
2. ALGOL58
3. ALGOL60
4. Lisp
5. smalltalk
常用语言
过程式:C,ALGOL,Pascal,
面向对象式:C++,smalltalk,JAVA,Delphi
函数式:Lisp,Scheme,Haskell,
逻辑式:Prolog
脚本?PHP,Python,Ruby
存储描述信息:XML,CSS,HTML
**回复题目**
程序设计语言的目的是什么?
1. 控制数据
2. 控制指令流
为什么大多数语言有控制流?逐行执行+跳转。这与我们的需求差很远(比方一个教务管理系统。)
逐行执行,很大程度是起源于冯诺依曼体系结构。
为什么类型申明在C语言中要与控制流隔脱离来?
因为在编译时,详细的类型信息,要转化成地址偏移,然后更换控制流中的类型变量。
如今主流语言最基本的元素是?
控制流 与 类型系统。
有没有语言它的类型结构,在运行时也可以改变?
Javascript只有对象没有类,使用prototype的方式继续,运行时给某个对象添加新的数据成员。没有类型体系。
许多厥后的语言在运行时都保存着类型信息的,比方Python,JAVA。
**综上所述**
控制流——指令流
类型系统——为了盘算出变量地址信息
区分运行时的Meta-Data与编译时的Meta-Data
想清楚自己想要什么,才能有的放矢,否则浪费的还是自己的时间。
假如必要一些Python和Java的一些核心知识点
私信发送“1”,即可获取
私信方法:点我主页头像旁边的私信按钮,回复“1”即可
也盼望我的一些资料和资源可以为你能有所帮助! |