APP下载

计算机编译原理课程虚拟实验设计与实践

2019-10-08李凤霞陈宇峰计卫星

实验技术与管理 2019年8期
关键词:堆栈数据流内存

余 月,李凤霞,陈宇峰,计卫星

(北京理工大学 计算机学院,北京 100081)

“编译原理”是计算机学科一门重要的专业基础课程,已列入国际ACM教程和IEEE计算机学科的主干教程。编译程序在语言处理、软件工程、软件自动化、逆向软件工程、再造软件工程等诸多领域有着广泛的应用。一般定义编译过程分为词法分析、语法分析、语义分析与中间代码生成、代码优化、目标代码生成等5个阶段[1-4]。

“编译原理”课程面临的主要问题是:(1)编译过程复杂,如果仅凭借书本、教师讲述和简单的PPT演示学习这些知识点,不利于学生理解;(2)一般的编译原理的课程主要集中介绍前端的词法分析和语法分析,对于中端的中间代码生成和后端的优化以及一些高级技术[5],学生学习和理解起来有难度,同时这些内容也缺乏与之完全匹配的实验内容来说明或验证这些概念。

利用虚拟现实技术构建的虚拟实验可以很好地解决编译原理不易学和信息流动不可视的问题,使学生较好地掌握程序编译知识。因此,针对计算机编译过程信息演化过程不可视的特点,设计开发计算机编译课程虚拟实验,把不可视的信息传输过程用虚拟交互和演示验证的实验方法变得可视、可验证,对于人才培养具有十分重要的意义。

1 虚拟实验的建设方案

虚拟实验是指利用虚拟现实技术,在计算机上所生成的三维、可视化的、交互性的、可完全取代甚至超越传统实验的实验[6-9]。在高校的教学实践中,虚拟实验的作用,一是为缺乏实验机会的学生提供实验资源与良好的学习条件,提高他们的学习积极性与主动性;二是直观地展示理论教学的重难点内容,提高教学效果[10-11]。

目前对于虚拟实验的应用有 2个不同的建设方案:一是开发具有远程访问的物理(实际)实验室,另一个是开发一个完全基于软件的虚拟实验室。

创建远程访问物理实验室比较复杂,所需的硬件和软件成本以及设备维护的总体费用较高,可扩展性较差,并且不容易支持更复杂的协作学习场景。远程访问的物理实验室适用于解决实践操作问题,可以通过远程访问方式为缺乏实验机会的学生提供虚拟实验资源与良好的学习条件,是一种使处于不同地点的学习者可以同时对一个实验项目进行实验操作的实验环境。

基于软件的虚拟实验室具有节省开支、灵活性好、多路访问、容易更改系统配置和抗损伤性的特点[12-13],既可以适用大规模的在线课程的虚拟实验支持,也可以用于更直观地展示教学内容的重难点问题,用于加强与理论教学的紧密结合。

2 计算机编译原理课程虚拟实验典型案例

根据计算机编译原理[5]课程所包含的内容,编译原理实验内容应该分别针对形式语言与自动机理论基础、前端的词法分析和语法分析、中端的中间代码生成和后端的优化以及一些高级技术。对于前端的词法和语法分析,可以通过设计语言编译器来帮助学生理解,而其余的抽象内容可以通过辅助虚拟实验来解析其中的重难点内容。根据编译原理的课程内容,设计了5个辅助教学的虚拟实验:(1)DFA和NFA工作过程虚拟实验;(2)数据流分析过程虚拟实验; (3)堆栈操作原理虚拟实验;(4)堆式内存的分配与垃圾回收虚拟实验;(5)寄存器图着色分配算法虚拟实验。本文介绍2个典型虚拟实验案例。

2.1 数据流分析过程虚拟实验

数据流分析过程虚拟实验的实验目的是让学生理解计算机编译原理课程中对于给定的函数代码数据流的分析过程,在数据流分析过程中理解和记忆知识点。为了进行代码优化、编译程序,需要收集整个代码中的相关信息和每个基本块的信息分布情况,这些信息就是数据流信息,而这一过程就叫做数据流分析过程。数据流分析是在编译过程中使用的技术,它能从程序中收集语义信息并确定变量的定义和使用。通过数据流分析,可以不通过实际程序运行就能够发现程序运行时相关信息的变化,通过这样的方式让学生理解程序运作[14]。

在介绍数据流分析过程前,首先要进行控制流分析。控制流分析是随程序进行划分构成基本块,再将基本块连接起来构成程序流图。在本实验中,数据流分析采用到达-定值数据流分析。数据流分析的最终结果是要得到整个代码中的相关信息和每个基本块的信息分布情况,所以实验最终要得到一张定值引用信息表。因此,实验框架分为两个场景:一个场景是控制流分析的内容,包括基本块划分、控制流图构造的过程展示,分为代码区、基本块、数据流图、提示板、控制区等5部分,如图1(a)所示。另一个场景是数据流分析,主要包括数据流分析的展示和迭代表格的构造过程,还有用户参与的部分,也分为5个部分,分别是控制区、数据流图、迭代表格、用户交互区和提示部分,如图1(b)所示。

图1 数据流分析过程虚拟实验

2.2 堆栈操作原理虚拟实验

堆(heap)和栈(stack)是两种不同的动态数据区域,“堆”是一种接近链式的结构,“栈”则是一种线性的结构。栈式存储更为快捷方便,但是其自由度较小;而堆式存储则使用方式较为麻烦,既需要程序员自己申请,又需要程序员自己进行释放,但是自由度更高、更具有灵活性。每个栈区都可以使用基地址(frame pointer)和栈顶地址(stack pointer/top pointer)来描述。程序使用栈中的基地址和偏移量(通过栈顶地址来显示)来访问变量。一般情况下,一个C语言程序占用的内存空间包括系统区、栈区、共享内存区、堆区、全局变量区、文字常量区、程序代码区等区域。

堆栈操作原理虚拟实验针对堆栈操作,完整地表达了内存结构,能够让学生直观地感受和认识到编译过程中内存的变化。虚拟实验的设计包括操作界面设计和人机交互设计,而人机交互设计主要体现在操作界面中。在操作界面中,用户可以通过鼠标键盘等的输入控制实验的进行,通过实验对堆栈操作原理有着更深层次的理解。

操作界面由3个界面组成,包括主实验界面、编译程序运行时内存分配图展示界面和 func函数运行时堆栈操作在内存中的展示界面(见图2)。

在主实验界面中,主要有原理、操作说明区、代码区、控制区和内存分布区,用户可以通过点击控制区的按钮以控制实验的进行,进行详细的实验操作,原理、操作说明区也将展示详细的原理说明和操作说明。在控制区中设置了“开始”“结束”“返回”和“查看内存分布图”等按钮,可以通过点击“开始”按钮开始演示操作,点击“结束”按钮结束本次操作,点击“查看内存分布图”进入内存分布图界面,如图2(a)所示。

在编译程序运行时内存分配图的展示界面中,包括实验问题描述区、代码展示区、原理说明区和内存分布图展示区,如图2(b)所示。

在 func函数运行时堆栈操作在内存中的展示界面中,主要包括问题描述区、代码区、原理说明区、操作说明区和 func函数运行时栈区扩展图展示区以及控制区,如图2(c)所示。

图2 堆栈操作原理虚拟实验

3 计算机编译原理教学实践过程与评价调查

北京理工大学计算机编译原理虚拟实验课程部署在“虚拟实验工场”平台,如图3所示。“虚拟实验工场”平台支持虚拟现实技术和计算机仿真技术构建的虚拟实验,依托云服务支持在线服务,支持大规模在线课程实验应用,并可与公用的 MOOC平台实现对接[15]。目前主流的人机交互设备包括电脑和手机,所以要求开发的虚拟实验也是既要支持 PC端,又要支持移动端。因此,计算机编译原理课程的虚拟实验都是基于Unity3D技术开发。Unity3D具有跨平台特性,既支持单机版,又支持网页版和移动版。利用Unity3D技术开发的虚拟实验,可以较容易实现在不同用户端下的移植,计算机编译原理课程的虚拟实验均可通过网络实现在线访问。

图3 计算机编译原理虚拟实验课程

在计算机编译原理虚拟实验课程中,尝试使用了数据流分析过程和堆栈操作原理2个虚拟实验,每个实验均需要学生完成实验报告,实验报告中需要记录学生的操作结果、对实验的理解和回答启发式问题,例如:入栈操作和出栈操作分别遵循什么原则,调用函数时的堆栈操作遵循什么原则,当程序员使用堆操作进行内存分配,如果最后忘记释放内存将会引发什么后果。

大部分学生对于计算机编译原理虚拟实验给出正面评价,只有少数人认为虚拟实验太难(见图4)。

图4 学生对计算机编译原理虚拟实验的评价

4 结语

虚拟实验不但是教学手段的创新,还需要在实验内容上进行完善。计算机编译原理课程难且抽象,通过虚拟现实技术将抽象问题形象化,解决了信息流动不可视问题,补充了编译过程实验体系的内容。相比于传统的PPT、动画展示方法,虚拟实验增加了人机交互功能,可以加深学生对重难点知识的学习和理解。目前已经初步完成了部分计算机编译原理实验内容。作为虚拟实验的进一步完善,要将语言编译器+虚拟实验方法结合起来用于计算机编译原理课程教学中,通过代码优化、模型优化、增加人机交互手段(例如使用虚拟现实头盔),增加用户的沉浸感,提高实验教学水平。

猜你喜欢

堆栈数据流内存
基于行为监测的嵌入式操作系统堆栈溢出测试*
汽车维修数据流基础(上)
汽车维修数据流基础(下)
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
基于堆栈自编码降维的武器装备体系效能预测
基于数据流聚类的多目标跟踪算法
内存搭配DDR4、DDR3L还是DDR3?
北医三院 数据流疏通就诊量
一种用于分析MCS-51目标码堆栈深度的方法