编译器设计-RunTime运行时环境

Compiler Design - Run-Time Environment

作为源代码的程序仅仅是文本(代码、语句等)的集合,要使其活动,它需要在目标计算机上执行操作。程序需要内存资源来执行指令。程序包含程序名、标识符等,运行时需要与实际内存位置进行映射。

所谓运行时,我们指的是正在执行的程序。运行时环境是目标机器的一种状态,它可以包括软件库、环境变量等,为系统中运行的进程提供服务。

运行时支持系统是一个包,主要由可执行程序本身生成,有助于进程与运行时环境之间的进程通信。它在执行程序时负责内存分配和取消分配。

激活树Activation Trees

程序是一系列指令组合成若干过程的序列。过程中的指令是按顺序执行的。过程有一个开始和结束分隔符,其中的所有内容都称为过程的主体。过程标识符及其内部的有限指令序列构成了过程的主体。

过程的执行称为其激活。激活记录包含调用过程所需的所有必要信息。激活记录可以包含以下单元(取决于使用的源语言)。

每当执行一个过程时,它的激活记录都存储在堆栈上,也称为控制堆栈。当一个过程调用另一个过程时,调用方的执行将被挂起,直到被调用的过程完成执行为止。此时,被调用过程的激活记录存储在堆栈上。

我们假设程序控制按顺序执行,当一个过程被调用时,它的控制权被转移到被调用的过程。当被调用的过程被执行时,它将控件返回给调用方。这种类型的控制流使以树(称为激活树)的形式表示一系列激活变得更容易。

为了理解这个概念,我们以一段代码为例:

. . .

printf(“Enter Your Name: “);

scanf(“%s”, username);

show_data(username);

printf(“Press any key to continue…”);

. . .

int show_data(char *user)

{

printf(“Your name is %s”, username);

return 0;

}

. . .

下面是给定代码的激活树。

现在我们知道过程是以深度优先的方式执行的,因此堆栈分配是过程激活的最佳存储形式。

存储分配Storage Allocation

运行时环境管理以下实体的运行时内存需求:

代码:它被称为程序的文本部分,在运行时不会更改。它的内存需求在编译时是已知的。

过程:它们的文本部分是静态的,但它们是以随机的方式调用的。这就是为什么堆栈存储用于管理过程调用和激活。

变量:变量只有在运行时才知道,除非它们是全局变量或常量。堆内存分配方案用于管理运行时变量的内存分配和取消分配。

静态分配Static Allocation

在这种分配方案中,编译数据被绑定到内存中的一个固定位置,并且在程序执行时不会改变。由于预先知道内存需求和存储位置,因此不需要内存分配和取消分配的运行时支持包。

堆栈分配Stack Allocation

过程调用及其激活通过堆栈内存分配进行管理。它适用于后进先出(LIFO)方法,这种分配策略对于递归过程调用非常有用。

Heap Allocation

仅在运行时才分配和取消分配过程本地的变量。堆分配用于动态地将内存分配给变量,并在不再需要变量时将其收回。

除了静态分配的内存区域外,堆栈和堆内存都可以动态和意外地增长和收缩。因此,不能在系统中为它们提供固定数量的内存。

如上图所示,代码的文本部分被分配了固定数量的内存。堆栈和堆内存被安排在分配给程序的总内存的最末端。两个人都在互相残杀和成长。

参数传递Parameter Passing

过程之间的通信媒介称为参数传递。调用过程中的变量值通过某种机制传递给被调用过程。在继续之前,先复习一些与程序中的值有关的基本术语。

右值

表达式的值称为其r值。如果包含在单个变量中的值出现在赋值运算符的右侧,则该值也将变为r值。r值总是可以分配给其他变量。

l值

存储表达式的内存(地址)的位置称为该表达式的l值。它总是出现在赋值运算符的左侧。

For example:

day = 1;
week = day * 7;
month = 1;
year = month * 12;

从这个例子中,我们了解到常数值(如1、7、12)和变量(如日、周、月和年)都有r值。只有变量才有l值,因为它们也表示分配给它们的内存位置。

For example:

7 = x + y;

是一个l值错误,因为常量7不代表任何内存位置。

形式参数Formal Parameters

接受调用方过程传递的信息的变量称为形式参数。这些变量在被调用函数的定义中声明。

实际参数Actual Parameters

将其值或地址传递给被调用过程的变量称为实际参数。这些变量在函数调用中指定为参数。

Example:

fun_one()
{
   int actual_parameter = 10;
   call fun_two(int actual_parameter);
}
   fun_two(int formal_parameter)
{
   print formal_parameter;
}

形式参数保存实际参数的信息,这取决于所使用的参数传递技术。它可以是一个值或地址。

传递值Pass by Value

在传递值机制中,调用过程传递实际参数的r值,编译器将其放入被调用过程的激活记录中。然后,形式参数保存调用过程传递的值。如果形式参数所保留的值发生了更改,则不会对实际参数产生影响。

通过引用传递Pass by Reference

在按引用传递机制中,实际参数的l值被复制到被调用过程的激活记录中。这样,被调用的过程现在拥有实际参数的地址(内存位置),而形式参数引用相同的内存位置。因此,如果更改了形式参数所指向的值,则应该看到对实际参数的影响,因为它们也应该指向相同的值。

按副本传递还原Pass by Copy-restore

此参数传递机制的工作原理与“按引用传递”类似,只是在调用过程结束时对实际参数进行更改。在函数调用时,实际参数的值被复制到被调用过程的激活记录中。如果操作了形式参数,则对实际参数没有实时影响(因为传递了l值),但是当调用过程结束时,形式参数的l值将复制到实际参数的l值。

例子:

Example:

int y; 
calling_procedure() 
{
   y = 10;     
   copy_restore(y); //l-value of y is passed
   printf y; //prints 99 
}
copy_restore(int x) 
{     
   x = 99; // y still has value 10 (unaffected)
   y = 0; // y is now 0 
}

此函数结束时,形式参数x的l值复制到实际参数y,即使在过程结束前改变了y值,x的l值也复制到y的l值,使其行为类似于通过引用调用。

按名称传递Pass by Name

像Algol这样的语言提供了一种新的参数传递机制,其工作原理类似于C语言中的预处理器。在按名称传递机制中,被调用的过程的名称将被其实际主体替换。Pass by name以文本方式将过程调用中的参数表达式替换为过程主体中的相应参数,以便它现在可以处理实际参数,这与Pass by reference非常类似。

编译器设计-RunTime运行时环境的更多相关文章

  1. 运行时环境(The Runtime Environment)

    App Engine应用响应网络请求.当一个客户端(典型的是用户的Web浏览器)使用HTTP请求(比如获取在URL上的网页)连接上应用的时候,网络请求就开始了.当App Engine接收到请求时,它会 ...

  2. java 运行时环境和编译器环境

    必须要保证运行环境高于编译环境 1.编译器的环境设置 单击项目右键-> Properties -> Java Compiler -> 5或6 如果编译器的环境高于运行时环境会报错. ...

  3. java 常用类库:操作系统System类,运行时环境Runtime

    System类: System 类代表Java程序的运行平台,程序不能创建System类的对象, System类提供了一些类变量和类方法,允许直接通过 System 类来调用这些类变量和类方法. Sy ...

  4. iOS开发——高级特性&Runtime运行时特性详解

    Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...

  5. Runtime运行时的那点事儿

    注:本文是对 Colin Wheeler 的 Understanding the Objective-C Runtime 的翻译. 初学 Objective-C(以下简称ObjC) 的人很容易忽略一个 ...

  6. Java运行时环境---内存划分

    背景:听说Java运行时环境的内存划分是挺进BAT的必经之路. 内存划分: Java程序内存的划分是交由JVM执行的,而不像C语言那样需要程序员自己买单(C语言需要程序员为每一个new操作去配对del ...

  7. ios - runtime运行时应用---交换方法

    runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundColor的方法换成了自定义的pb_setBackgroundColor 首先创建UIV ...

  8. runtime 运行时机制 完全解读

    runtime 运行时机制 完全解读   目录[-] import import 我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! ...

  9. Apache Flink 分布式运行时环境

    Tasks and Operator Chains(任务及操作链) 在分布式环境下,Flink将操作的子任务链在一起组成一个任务,每一个任务在一个线程中执行.将操作链在一起是一个不错的优化:它减少了线 ...

随机推荐

  1. (转)Amazon Aurora MySQL 数据库配置最佳实践

    转自:https://zhuanlan.zhihu.com/p/165047153 Amazon Aurora MySQL 数据库配置最佳实践 AWS云计算 ​ 已认证的官方帐号 1 人赞同了该文章 ...

  2. hdu1978 简单记忆化搜索

    题意: How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  3. hdu1671 字典树记录前缀出现次数

    题意:       给你一堆电话号,问你这些电话号后面有没有相互冲突的,冲突的条件是当前这个电话号是另一个电话号的前缀,比如有 123456789 123,那么这两个电话号就冲突了,直接输出NO. 思 ...

  4. POJ1904 强联通(最大匹配可能性)

    题意:       有n个王子,n个公主,然后给你每个王子喜欢的公主,最后问你在不影响最大匹配的前提下,每个王子可以匹配那些公主. 思路:       是hdu4685的减弱版,之前研究过hdu468 ...

  5. Win64 驱动内核编程-1.环境搭建

    驱动开发环境及其双机调试环境搭建 开发环境搭建 使用工具:vs2015,Windows 10 SDK_10.0.14393,WDK10.0.14393.0 (1)安装VS2015  随便一个版本吧,我 ...

  6. Word 通过添加Package 实现word藏毒

    这个思路要结合近期在一些安全网站上公布的姿势来实现,先科普几个地方. (1)通过cmd本身就可以直接下载: Bitsadmin /transfer AA /download /priority nor ...

  7. XCTF-wtf.sh-150

    wtf.sh-150 题目描述 没有描述 解题过程 打开之后是个论坛,有注册和登录功能点 抓包发现,登陆成功后会设置cookie <script>document.cookie = 'US ...

  8. Web中的相对路径和绝对路径

    前台路径:浏览器端发起的资源请求路径 后台路径:服务器端发起的资源请求路径

  9. jpa查找数据库最新一条消息

    主要字段说明: pid:指导记录主键 user_pid:用户主键 competition_project_pid:用户作品 Mysql表 Repository /** * 指导记录 * @date 2 ...

  10. 初步了解web

    ------------------------1.Web应用程序的main方法在哪里------------------------Tomcat:从启动到运行首先,我们是通过执行 Tomcat 的s ...