区分编译性语言和解释性(直译)语言
了解栈的数据结构,以及压栈出栈了解
回顾之前iOS内存分区
了解程序方法执行的压栈操作
熟悉方法的执行在栈上,由CPU控制执行。之前只记得iOS方法的查找和异常抛出,也要了解方法的压栈执行,进一步熟悉栈的数据结构
编译和直译
编译:将源码全部转换为可执行的二进制代码,然后执行。
或者可以说将一段程序直接翻译成机器码(对于C/C++这种跨平台的语言)或者
中间码(Java这种跨平台语言,需要虚拟机将中间码映射为机器码),需要编译器。
直译:只有运行,没有编译过程,将一段程序解释成有逻辑操作符.
由解释器按程序的逻辑顺序调用操作符,需要解释器。
区别:一般编译程序产生目标代码的执行速度比直译的执行速度快,因为省去了逻辑顺序。
通俗来讲,编译执行就像点菜吃饭,上桌直接吃,解释执行像吃火锅,边煮边吃。
编译性语言:C/C++、OC、Swift、Java
解释性语言:JavaScript、python
一些语言特色:Java的动态绑定机制、oc的runtime、swift增加@objc赋予动态性
栈的结构:
仅在表尾端进行插入和删除的线性表
,表尾端为栈顶,表头为栈底,不含元素为空栈。
先进后出,就像手枪弹夹的子弹进出。记得数据结构中,栈的操作是移动栈顶指针top+1、后存入元素,栈base指针是不动的。
了解这些 一定区分关键词:
表尾,栈顶,top指针 都在一端操作删除和删除
栈底,base
记忆方法,弹夹子弹,矿泉水装的球,表尾端操作的栈顶有top指针。
再强调一下, 表尾端是栈顶
方法压栈
JVM方法执行
本质,在栈空间开辟独立空间讲解:
Java栈也称作虚拟机栈(Java Vitual Machine Stack),
也就是我们常常所说的栈,跟C语言的数据段中的栈类似。
事实上,Java栈是Java方法执行的内存模型。为什么这么说呢?下面就来解释一下其中的原因。
Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,
在栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、
指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用、
方法返回地址(Return Address)和一些额外的附加信息。
当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。
当方法执行完毕之后,便会将栈帧出栈。
因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。
以此类推:iOS方法执行(isa查找方法不做讲解)
我们的程序由一个一个方法组成,CPU负责调度这些方法,当我们程序执行到某方法时,需要在栈上开辟空间,此时栈的尾指针向栈底移动。方法执行完毕,需要释放这些空间,此时将栈的尾指针移项栈顶,完成栈的分配。
iOS内存分区中栈的分区是高地址向地址扩容,生长方向向下,压栈的数据流程(栈指针指向栈空间的最高处,压栈的数据向低地址生长,栈的指针向下移动,出栈时,栈指针向高地址移动)
回头来看,方法执行的栈的top指针移动,很多教程说栈尾指针移动,确切的说是栈尾的top指针向下移动。但是栈的结构中存在top和base指针。脑海中想到了一个倒立的矿泉水瓶子,表尾top指针在下面,移动和删除数据 申请释放内存空间
网友评论