编译技术发展综述

2024-04-15

编译技术发展综述(精选6篇)

篇1:编译技术发展综述

编译技术发展综述

计算机科学与软件学院

计算机1302 蔡元昊 1311611517

引言:编译程序构造的原理和技术一直属于最近公布的核心知识领域,已成为计算机科学必备的专业基础知识。而且编译程序的构造是计算机科学中一个非常成功的分支,也是最早获得成功的分支之一,他所建立的理论和技术方法值得人们深入研究和学习。

摘要:编译程序是计算机的核心系统之一,是掌握计算机理论和软件技术的关键知识,编译原理合计数为人们理解计算机语言。创造优秀的软件奠定了理论基础。扩展了视野,开辟了捷径。编译原理和技术可以应用在其他诸如软件建模语言、硬件描述语言。脚本语言等的翻译方面:在集成化软件开发环境以及软件安全一直有着广泛的应用。而且,编译原理的研究有力的推动了计算机科学、计算机工程、软件开发以及人机工程的研究和发展。编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。

一、早期编译技术的发展

编译器是将一种语言翻译为另一种语言的计算机程序。编译器将源程序(source language)编写的程序作为输入,而产生用目标语言(target language)编写的等价程序。通常地,源程序为高级语言(high-level language),如C或C + +,而目标语言则是目标机器的目标代码(object code,有时也称作机器代码(machine code)),也就是写在计算机机器指令中的用于运行的代码。这一过程可以表示为: 源程序→编译器 →目标程序

在20世纪40年代,由于冯·诺伊曼在存储-程序计算机方面的先锋作用,编写一串代码或程序已成必要,这样计算机就可以执行所需的计算。开始时,这些程序都是用机器语言(machine language)编写的。机器语言就是表示机器实际操作的数字代码,例如: C7 06 0000 0002 表示在IBM PC 上使用的Intel 8x86处理器将数字2移至地址0 0 0 0(16进制)的指令。

但编写这样的代码是十分费时和乏味的,这种代码形式很快就被汇编语言(assembly language)代替了。在汇编语言中,都是以符号形式给出指令和存储地址的。例如,汇编语言指令 MOV X,2 就与前面的机器指令等价(假设符号存储地址X是0 0 0 0)。汇编程序(assembler)将汇编语言的符号代码和存储地址翻译成与机器语言相对应的数字代码。

汇编语言大大提高了编程的速度和准确度,人们至今仍在使用着它,在编码需要极快的速度和极高的简洁程度时尤为如此。但是,汇编语言也有许多缺点:编写起来也不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。发展编程技术的下一个重要步骤就是以一个更类似于数学定义或自然语言的简洁形式来编写程序的操作,它应与任何机器都无关,而且也可由一个程序翻译为可执行的代码。例如,前面的汇编语言代码可以写成一个简洁的与机器无关的形式 x = 2

第一个编译程序的出现是在20世纪50年代早期,多数早期的编译工作是将算术公式翻译成机器代码。用现在的标准来衡量,当时的编译程序能完成的工作十分初步,如只允许简单的单目运算,数据元素的命名方式有很多限制。然而它们奠定了对高级语言编译系统的研究和开发的基础。20世纪50年代中期出现了FORTRAN等一批高级语言,相应的一批编译系统开发成功。随着编译技术的发展和社会对编译程序需求的不断增长,20世纪50年代末有人开始研究编译程序的自动生成工具,提出并研制编译程序的编译程序。它的功能是以任一语言的词法规则、语法规则和语义解释出发,自动产生该语言的编译程序。目前很多自动生成工具已广泛使用,如词法分析程序的生成系统LEX,语法分析程序的生成系统YACC等。20世纪60年代起,不断有人使用自展技术来构造编译程序。自展的主要特征是用被编译的语言来书写该语言自身的编译程序。1971年,PASCAL的编译程序用自展技术生成后,其影响就越来越大。随着并行技术和并行语言的发展,处理并行语言的并行编译技术,将串行程序转换成并行程序的自动并行编译技术也正在深入研究之中。另外嵌入式应用迅速增长的需求,推动了交叉编译技术的发展.还有系统芯片设计方法和关键EDA技术的研究,也带动了专用语言VHDL等及其编译技术的不断深化。在70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。

在九十年代,作为GNU项目或其它开放源代码项目标一部分,许多免费编译器和编译器开发工具被开发出来。随着芯片研制,国内还有若干单位也在开展基于GCC生成面向特定芯片的编译器工作。编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管近年来在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变。

大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。3.编译器的种类

编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。二.编译工具

1.C语言对应的编译器——VS2008 C语言对应的编译器可以用VS2003、VS2005、VS2008、TC等,以最新版本的Visual Studio 2008为例

Microsoft® Visual Studio® 2008 使开发人员能够快速创建高质量、用户体验丰富而又紧密联系的应用程序,充分展示了 Microsoft 开发智能客户端应用程序的构想。借助 Visual Studio 2008,采集和分析信息将变得更为简单便捷,业务决策也会因此变得更为有效。任何规模的组织都可以使用 Visual Studio 2008 快速创建能够利用 Windows Vista™ 和 2007 Office system 的更安全、更易于管理并且更可靠的应用程序。

Visual Studio 2008 在三个方面为开发人员提供了关键改进: 1.快速的应用程序开发 2.高效的团队协作 3.突破性的用户体验

Visual Studio 2008 提供了高级开发工具、调试功能、数据库功能和创新功能,帮助在各种平台上快速创建当前最先进的应用程序。2005 年,微软发布了 Visual Studio 2005。.NET 字眼从各种语言的名字中被抹去,但是这个版本的 Visual Studio 仍然还是面向.NET 框架的(版本2.0)。它同时也能开发跨平台的应用程序,如开发使用微软操作系统的手机的程序等。总体来说是一个非常庞大的软件,甚至包含代码测试功能。

Visual Studio 9 目前可以确定的是支持建立于 DHTML 基础上的 AJax 技术,这种微软在

Visual InterDev 时代提出的基于异步的客户端动态网页技术在当年并没有像微软预期中的那么流行起来,反而随着 GMail 等应用而东山再起,渐渐成为主流网络应用之一。同时 Visual Studio 9 会强化对于数据库的支持以及微软新的基于工作流(Workflow)的编程模型。预计为了保持与 Office 系列的统一,Visual Studio 9 的名称为 Visual Studio 2008。

2.C++语言对应的编译器——Microsoft Visual C++ 6.0 Visual C++是一个集成环境的C++编译器,功能很多。还有 Borland C++ Buider C++编译器,比较小巧实用。C++ Buider 也是C++编译器,是另一个公司的产品。

Microsoft Visual C++ 6.0功能特点:

几乎所有世界级的软件,从业界领先的Web浏览器到面向任务的企业应用,都是使用Microsoft Visual C++开发系统来开发的。要用C++来开发Windows和Web上的高性能应用程序,Visual C++是效率最高的首选工具。Visual C++ 6.0在不牺牲灵活性、性能和控制力度的同时,给C++带来更高水平的生产效率。除了IntelliSense Technology(智能感应技术)和Edit and Continue(即编即调)等显著缩短开发时间的新特性外,Visual C++ 6.0还为Web开发和企业开发提供更良好的支持。Microsoft Visual C++ 6.0专业版的健壮的构件开发、强大的数据库工具和完备的Internet支持将使您从中受益,创建出策略性的商务解决方案来。

有了这些显著缩短开发时间的新特性,您可以享受到一种全新水平的工作效率。编码所费的时间减少了,编译所费的时间减少了,调试所费的时间也减少了,一句话,创建应用程序所费的时间减少了,同时还可以享受到更多的构件重用。获得令人目眩的速度。本已是速度的标准的Visual C++如今更上一层楼,Visual C++ 6.0在多处进行了最优的调整,这样的结果是:开发者可以创建出可能范围内的最小最快的构件和应用。3.JAVA语言对应的编译器——eclipse JCreater、JBuilder、eclipse、myeclipse、netbean这几个是主流,eclipse和myeclipse(eclipse的扩展功能更多)是主流中的主流。

JBudler Eclipse 属于IDE,是集成开发环境(IDE)!IDE是集成了编译,检错,自动查找错误,深度反检查功能的辅助开发工具。就是说,只要属于java的IDE,都会把sun的编译器集成到它里面来。而JBudler与Eclipse 等这些开发工具更多的是体现在对不同层面java开发提供了不同的强大功能。比如:MyEclipse强势在web开发的便捷。JBudler对GUI更强大。eclipse是一个非常著名的集成开发工具,其自身功能强大而易用。更为重要的是,软件本

身是一个开放源代码的项目,由一个国际组织进行管理,很多大公司都是这个组织的成员,包括IBM和Borland等著名的软件开发商,事实上,eclipse本来是IBM开发的工具,是由IBM将其贡献给开放源代码社区的。正因为如此,任何人都可以免费获得eclipse开发环境,而不需要支付任何费用。

eclipse的另一个非常重要的特点是其提供了非常灵活的扩展能力,事实上,eclipse可以被称作一个开发平台,它提供了丰富的接口可以扩展其本身。eclipse本身是使用Java开发的,开发人员可以简单的按照其规范开发eclipse的插件,就可以在eclipse平台上增加更多的功能。大量的开发人员基于eclipse开发了插件,比如C++开发、UML设计、J2EE开发等都有相应的插件。事实上,包括IBM在内,很多大的软件公司基于eclipse开发了其自己的软件产品,这无疑得益于eclipse良好的结构。

三、编译原理的近期发展 随着大规模集成电路、网络通讯和其它数字信息技术的迅速发展,目前嵌入式系统己经广泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术等各方面,在人们日常生活中的方方面面到处是嵌入式系统设备的身影,如手机、PDA、智能家电以及汽车电子等。随着国内外各种嵌入式产品的进一步开发和推广,嵌入式技术和人们的生活结合越来越紧密,人们日常的工作、学习和生活方式终将不可避免地逐步改变,嵌入式产品正在逐步形成时尚,在当今的信息社会中扮演越来越重要的角色。

嵌入式系统一般指的是非PC系统,它包括完全植入嵌入式硬件内部的为特定应用设计的专用计算机系统,以及相应的硬件。嵌入式系统以应用为中心的,它的软硬件可以根据需求进行裁减,以此来适应目标系统对外形尺寸、功能、可靠性、成本、功耗、外部接口等方面的严格要求。简单地说,嵌入式系统集操作系统、应用软件与硬件于一体,具有软件代码小、高度自动化、响应速度快等特点,因此特别适合要求实时和多任务的应用。

由于嵌入式系统资源有限,一般无法提供编译、汇编、链接等工具,同时也很难提供高级调试功能,因此嵌入式系统的应用软件一般不能直接在嵌入式系统平台上进行开发,而需要在交叉编译环境中开发。也就是说通常是在另外的开发平台上开发的,一般这种开发平台由通用的计算机系统和专用的嵌入式系统软件开发工具组成。

编译实现方式的发展主要分一下五类:手工、机器语言、汇编、系统程序设计语言、自动构造工具lex yacc gcc。推动编译技术发展的因素主要包括:语言范型(计算模式)、计算机体系结构语言范型主要包括:命令式(imperative language)、应用式(applicative)、基于规则的(rule-based)、面向对象的(object-oriented)、并行计算(parallel computing)。体系结构主要包括:万诺曼机体系结构、并行体系结构、嵌入系统。编译程序执行环境主要包括:批处理、交互环境、嵌入系统环境、并行编译技术、交叉编译。编译程序在一个机器(宿主机)上运行,产生另一个机器(目标机)的汇编语言。嵌入式系统中的应用程序正是借助这样的编译程序生成。目标处理器MIPSX是MIPS系列芯片的种,属于RISC体系结构,来源于斯坦福大学的MIPS计划。由于该系列CPU不是采用加州大学伯克利分校的RISC窗口技术而是采用消除流水线各级互锁的微处理器MIPS(MicroprocessorWithout Interlocking Pipeline Stage)技术,因此而得名。MIPS是将IBM公司对优化编译程序的研究和加州大学伯克利分校的大规模集成电路的思想结合起来的产品。

由于RISC指令集的简单和整齐,为了达到更好地利用计算机的性能,MIPS系列芯片中很好地应用了流水线策略。流水线是现代各类微处理器都采用的指令执行技巧,即将若干条指令的取指、译码和执行过程部分重叠在流水线中同时执行。以前在CISC计算机中,由于指令多而复杂,处理每条指令的所需时间不固定,当后面指令需要前条指令的结果时,往往造成指令互锁,因此无法实现流水 线。而斯坦福大学的MIPS计划就是在编译的过程中,利用编译程序优化处理器的流水线以求提高处理器流水线的效率。由于采用了硬件连线控制来执行数目不多的简单指令,而且还能重组软件流水线,这样就减少了硬件复杂性。“编译原理”课程分析编译原理课程一般利用常用软件如C,Pascal等来构建编译的各部分程序,编译原理的构成包括词法分析,语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。编译原理课程的学习可以对程序设计语言的设计和实现有深刻的理解,还可以有助于快速理解定位和解决在程序编译、测试与运行中出现的问题。编译程序规模大。由于编译原理是一个极其复杂的系统,程序规模大,将它肢解开来一部分一部分地研究。理论知识抽象。要完整地构造一个编译系统并不是一件容易的事情,它不仅需要具有较完备的软件知识,并需要掌握现有的软件工具的使用,而且更重要的是要有丰富的实践经验,了解硬件系统结构和操作系统的功能。算法的理解和实现。编译原理这门课包含许多理论知识和算法,这些理论的学习和理解都存在着一定的难度。其中理论知识包括:词法分析器的构造,语法中各种分析器(LR,LL,SLR,LALR等)实现与完成。

在编译原理的不断发展和完善过程中,一本本课程教材接踵而至,其中不乏非常优秀的“名书”。编译领域里程碑式的经典著作——龙书,20年后终于出新版!这是一个延绵30年的故事,这是一部关于龙书的传奇!最新版本,增添三章节内容,使龙书地位更权威!1977年,Alfred V.Aho 和Jeffrey D.Ullman 出版《Principles of Compiler Design 》,封面是一名骑士和一只恐龙,因此第一次被人称为龙书,但因为那条龙是绿色的,所以称为绿龙书。过了9年,1986年,原来的两位作者加上Ravi Sethi, 升级了前一本书,书名改为《Compilers: Principles, Techniques and Tools》,封面依然沿用骑士和恐龙,那头龙是红色的,因此被叫做龙书二或者是红龙书。又过了一个9年,又一个9年,编译领域的巨无霸--龙书始终都没有升级。终于在2006年年底,龙书升级了。作者又增加了Monica S.Lam,名字沿用《Compilers: Principles, Techniques and Tools》,封面依然保持恐龙和武士的设计,但这次的龙是紫色,因此叫做紫龙书。

本书全面、深入地探讨了编译器设计方面的重要主题,包括词法分析、语法分析、语法制导定义和语法制导翻译、运行时刻环境、目标代码生成、代码优化技术、并行性检测以及过程间分析技术,并在相关章节中给出大量的实例。与上一版相比,本书进行了全面的修订,涵盖了编译器开发方面的最新进展。每章中都提供了大量的系统及参考文献。本书是编译原理课程方面的经典教材,内容丰富,适合作为高等院校计算机及相关专业本科生及研究生的编译原理课程的教材,也是广大技术人员的极佳参考读物。Alfred V.Aho是哥伦比亚大学的Lawrence Gussman计算机科学教授。Aho教授多次获奖,其中包括哥伦比亚校友会颁发的2003Great Teacher奖和电子与电器工程师协会的Jonh von Neumann奖章。他是美国国家工程院院士,以及ACM和IEEE的会员。Monica S.Lam是斯坦福大学的计算机科学教授。她曾经是Tensilica 的首席科学家,并且是moka5的创建者和首席执行官。她领导了 SUIF项目。该项目开发了最流行的研究性编译器之一,并首创了很多在工业界得到应用的编译技术。Jeffery D.Ullman是Gradiance公司的首席执行官和Standford大学的StanfordcW.Ascherman计算机科学(名誉退休)教授他的研究兴趣包括数据库理论、数据库集成、数据挖掘和利用信息基础软件的教育技术.他是美国国家工程院的院士,ACM的会员,并且是 Karlstrom奖和Knuth奖的获得者。

我对编译技术发展的总结:

编译原理是门实用的科学性的学科,当今世界发展离不开编译的进步,正是考虑到其重要性,中国乃至世界都应该注重这方面人才的培养,发展并不是一帆风顺,尤其是中国的核心技术缺乏,创新能力不足,不像美国,日本,甚至印度都很注重知识产权的重要性,都很注重自主创新的重要性,所以今后作为一个中国人,作为一个开发者应该把国家的利益放在第一位,把自主创新放在第一位,希望中国编译技术的发展越来越好!

篇2:编译技术发展综述

据说第一个编译程序的出现是在20世纪50年代早期,很难讲出确切的时间,因为当初大量的实验和实现工作是由不同的小组独立完成的,多数早期的编译工作是将算术公式翻译成机器代码。用现在的标准来衡量,当时的编译程序能完成的工作十分初步,如只允许简单的单目运算,数据元素的命名方式有很多限制。然而它们奠定了对高级语言编译系统的研究和开发的基础。20世纪50年代中期出现了FORTRAN等一批高级语言,相应的一批编译系统开发成功。随着编译技术的发展和社会对编译程序需求的不断增长,20世纪50年代末有人开始研究编译程序的自动生成工具,提出并研制编译程序的编译程序。它的功能是以任一语言的词法规则、语法规则和语义解释出发,自动产生该语言的编译程序。目前很多自动生成工具已广泛使用,如词法分析程序的生成系统LEX,语法分析程序的生成系统YACC等。20世纪60年代起,不断有人使用自展技术来构造编译程序。自展的主要特征是用被编译的语言来书写该语言自身的编译程序。1971年,PASCAL的编译程序用自展技术生成后,其影响就越来越大。

随着并行技术和并行语言的发展,处理并行语言的并行编译技术,将串行程序转换成并行程序的自动并行编译技术也正在深入研究之中。另外嵌入式应用迅速增长的需求,推动了交叉编译技术的发展.还有系统芯片设计方法和关键EDA技术的研究,也带动了专用语言VHDL等及其编译技术的不断深化。

编译实现方式的发展

-手工

机器语言

汇编

系统程序设计语言

-自动构造工具lex yacc gcc

推动编译技术发展的因素

语言范型(计算模式)

计算机体系结构

语言范型

-命令式(imperative language)

-应用式(applicative)

-基于规则的(rule-based)

-面向对象的(object-oriented)

-并行计算(parallel computing)

体系结构

-万诺曼机体系结构

-并行体系结构

-嵌入系统

编译程序执行环境

-批处理

-交互环境

-嵌入系统环境

为了提高软件开发的效率和保证质量,人们除了要在软件工程中对软件开发过程所要遵循的规范化或标准化外,还尽量使用先进的软件开发技术和相应的软件工具,而大部分软件工具的开发,常常要用到编译技术和方法。实际上编译程序本身也是一种软件开发工具。为了提高编程效率,缩短调试时间,软件工作人员研制了不少对源程序处理的工具。这些工具的开发不同程度地用到编译技术和方法。下面仅是一些

例子。

1、语言的结构化编辑器 结构化编辑器是引导用户在语言的语法制导下编制程序,能自动地提供关键字和与其匹配的关键字,如if后必须有then,begin和end的配对,左右括号的配对等,这样可以减少语法上的错误,可加快对源程序的调试,提高效率和质量。

2、语言程序的调试工具 调试是软件开发过程中一个重要环节,结构化编辑器只能解决语法错误的问题,而对一个已通过编译的程序来说,需进一步了解的是程序执行的结果与编程人员的意图是否一致,程序的执行是否实现预计的算法和功能。这种对算法的错误或程序没能反应算法的功能等错误就需用调试器来协助解决。调试器的功能愈强,实现愈复杂,但它必须与语法分析、语义处理有紧密联系。

3、语言程序测试工具 语言程序的测试工具有两种:静态分析器和动态测试器

静态分析器是对源程序进行静态地分析。它对源程序进行语法分析并制定相应表格,检查变量定值与引用的关系。如某变量未被赋值就被引用,或定值后未被引用,或多余的源代码等一些编译程序的语法分析发现不了的错误。动态测试工具是在源程序的适当位置插入某些信息,并用测试用例记录(显示语句或函数)程序运行时的实际路径。将运行结果与期望的结果进行比较分析,帮助编程人员查找问题。这种测试工具在国内已有开发,如FORTRAN语言和C语言的测试工具。

4、高级语言之间的转换工具 由于计算机硬件的不断更新换代,更新更好的程序设计语言的推出为提高计算机的使用效率提供了良好条件,然而一些已有的非常成熟的软件如何在新机器新语言情况下使用呢?为了减少重新编制程序所耗费的人力和时间,就要解决如何把一种高级语言转换成另一种高级语言,乃至汇编语言转换成高级语言的问题。这种转换工作要对被转换的语言进行词法和语法分析,只不过生成的目标语言是另一种高级语言而已。这与实现一个完整的编译程序相比工作量要少些。在国内已研制出C,PASCAL,FORTRAN到Ada的翻译器和IBM 4700汇编到C的转换器,其效果很好。近年来,由于JAVA语言的发展,国内外也已研制出不少其他语言到JAVA的转换系统,如c到JAVA的转换系统,cobol到JAVA的转换系统等等。

编译实现方式的发展主要分一下五类:手工、机器语言、汇编、系统程序设计语言、自动构造工具lex yacc gcc。推动编译技术发展的因素主要包括:语言范型(计算模式)、计算机体系结构语言范型主要包括:命令式(imperative language)、应用式(applicative)、基于规则的(rule-based)、面向对象的(object-oriented)、并行计算(parallel computing)。

体系结构主要包括:万诺曼机体系结构、并行体系结构、嵌入系统。编译程序执行环境主要包括:批处理、交互环境、嵌入系统环境、并行编译技术、交叉编译。

编译程序在一个机器(宿主机)上运行,产生另一个机器(目标机)的汇编语言。嵌入式系统中的应用程序正是借助这样的编译程序生成。

目标处理器MIPSX是MIPS系列芯片的种,属于RISC体系结构,来源于斯坦福大学的MIPS计划。由于该系列CPU不是采用加州大学伯克利分校的RISC窗口技术而是采用消除流水线各级互锁的微处理器MIPS(MicroprocessorWithout Interlocking Pipeline Stage)技术,因此而得名。MIPS是将IBM公司对优化编译程序的研究和加州大学伯克利分校的大规模集成电路的思想结合起来的产品。

由于RISC指令集的简单和整齐,为了达到更好地利用计算机的性能,MIPS系列芯片中很好地应用了流水线策略。流水线是现代各类微处理器都采用的指令执 行技巧,即将若干条指令的取指、译码和执行过程部分重叠在流水线中同时执行。以前在CISC计算机中,由于指令多而复杂,处理每条指令的所需时间不固定,当后面指令需要前条指令的结果时,往往造成指令互锁,因此无法实现流水线。而斯坦福大学的MIPS计划就是在编译的过程中,利用编译程序优化处理器的流水 线以求提高处理器流水线的效率。由于采用了硬件连线控制来执行数目不多的简单指令,而且还能重组软件流水线,这样就减少了硬件复杂性。但是由于存在数据和指令转移的相关性,这会引起流水线的停顿,降低流水线整体的执行速率。为了调整这些相关性,又开发出了代码重组技术,其中一种是延迟转移(delayed branch),另一种叫延迟装入,提升了性能。

MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品被很多计算机公司采用生产各种工作站和计算机系统。R系 列遵循按比例提高性能设计技术,按不同工艺技术实现基本相同的体系结构,其适用范围从低端的嵌入式控制器、个人计算机到高端的超级小型机、服务器甚至大型 机和巨型机,而且系统软件和应用程序都是兼容的。MIPS公司在1986年推出82000处理器,1988年推出83000处理器,1991年推出第一款 64位商用微处理器84000。之后,又陆续推出88000(于1994年)、810000(于1996年)和812000(于1997年)等型号。1999年,MIPS公司发布MIPS 32和MIPS 64架构标准。2000年,MIPS公司发布了针对MIPS 32 4Kc的新版本以及未来64位MIPS 64 20Kc处理器内核。

在整个R系列中82000/82010是最基础的原型;83000/83010是82000/82010的增强型产品;由于84000采用高 精度的CMOS工艺,因此其性能很高,用途很广;而86000/86010是ECL电路化的高速品种,但是由于86000/86010的功耗大,成本高,所以其应用受到很大限制。但是MIPSX并不属于以上提到的CPU中的任何一种,它是由20世纪80年代后期由美国国防部高级研究项目署(DARPA)资 助的一个项目的成果。因此,基于MIPSX的交叉编译工具链研究虽然现有的GNU交叉编译工具链对MIPS公司R系列芯片的支持很好,但还是缺乏对 MIPSX的有效支持,所以还是需要进行移植。进行移植工作前,必须首先了解MIPSX的体系结构。经过实验室前几届师兄的分析,我们得知MIPSX的体 系结构与MIPS公司R系列芯片中的82000最为接近,当然它们在很多地方还是存在着差别,比如具体指令集的不同,比如MIPSX没有浮点操 作;MIPSX指令的基本操作码只占5位;MIPSX在跳转指令中的延时槽有两条等。

简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 目标代码(object code)→ 链接器(Linker)→ 可执行程序(executables)高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言(High-level language),如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。

对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。

在20世纪40年代,由于冯·诺伊曼在存储-程序

编译原理实验程序

计算机方面的先锋作用,编写一串代码或程序已成必要,这样计算机就可以执行所需的计算。开始时,这些程序都是用机器语言(machine language)编写的。机器语言就是表示机器实际操作的数字代码,例如:

C7 06 0000 0002 表示在IBM PC 上使用的Intel 8x86处理器将数字2移至地址0 0 0 0(16进制)的指令。

但编写这样的代码是十分费时和乏味的,这种代码形式很快就被汇编语言(assembly language)代替了。在汇编语言中,都是以符号形式给出指令和存储地址的。例如,汇编语言指令 MOV X,2 就与前面的机器指令等价(假设符号存储地址X是0 0 0 0)。汇编程序(assembler)将汇编语言的符号代码和存储地址翻译成与机器语言相对应的数字代码。

汇编语言大大提高了编程的速度和准确度,人们至今仍在使用着它,在编码需要极快的速度和极高的简洁程度时尤为如此。但是,汇编语言也有许多缺点:编写起来也不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。

发展编程技术的下一个重要步骤就是以一个更类似于数学定义或自然语言的简洁形式来编写程序的操作,它应与任何机器都无关,而且也可由一个程序翻译为可执行的代码。例如,前面的汇编语言代码可以写成一个简洁的与机器无关的形式 x = 2。

在1954年至1957年期间,IBM的John Backus带领的一个研究小组对FORTRAN语言及其编译器的开发,使得上面的担忧不必要了。但是,由于当时处理中所涉及到的大多数程序设计语言的翻译并不为人所掌握,所以这个项目的成功也伴随着巨大的辛劳。几乎与此同时,人们也在开发着第一个编译器,Noam Chomsky开始了他的自然语言结构的研究。他的发现最终使得编译器结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法(grammar,指定其结构的规则)的难易程度以及识别它们所需的算法来为语言分类。正如现在所称的-与乔姆斯基分类结构(Chomsky hierarchy)一样-包括了文法的4个层次:0型、1型、2型和3型文法,且其中的每一个都是其前者的专门化。2型(或上下文无关文法(context-free grammar))被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。

分析问题(parsing problem,用于限定上下文无关语言的识别的有效算法)的研究是在20世纪60年代和70年代,它相当完善地解决了这一问题,现在它已是编译理论的一个标准部分。它们与乔姆斯基的3型文法相对应。对它们的研究与乔姆斯基的研究几乎同时开始,并且引出了表示程序设计语言的单词(或称为记号)的符号方式。人们接着又深化了生成有效的目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其误称为优化技术(optimization technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(code improvement technique)。

这些程序最初被称为编译程序-编译器,但更确切地应称为分析程序生成器(parser generator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是 Yacc(yet another compiler-compiler),它是由Steve Johnson在1975年为Unix系统编写的。

类似地,有穷自动机的研究也发展了另一种称为扫描程序生成器(scanner generator)的工具,Lex(与Yacc同时,由Mike Lesk为Unix系统开发的)是这其中的佼佼者。在20世纪70年代后期和80年代早期,大量的项目都关注于编译器其他部分的生成自动化,这其中就包括代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。

编译器设计最近的发展包括:首先,编译器包括了更为复杂的算法的应用程序,它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言(可允许此类分析)的发展结合在一起。其中典型的有用于函数语言编译的Hindle y-Milner类型检查的统一算法。

其次,编译器已越来越成为基于窗口的交互开发环境(interactive development environment,IDE)的一部 分,它包括了编辑器、链接程序、调试程序以及项目管理程序。这样的IDE的标准并没有多少,但是已沿着这一方向对标准的窗口环境进行开发了。

编辑器(editor):编译器通常接受由任何生成标准文件(例如ASCII文件)的编辑器编写的源程序。现在,编译器已与另一个编辑器和其他程序捆绑进一个交互的开发环境-IDE中。此时,尽管编辑器仍然生成标准文件,但会转向正被讨论的程序设计语言的格式或结构。这样的编辑器称为基于结构的(structure based),且它早已包括了编译器的某些操作;因此,程序员就会在程序的编写时而不是在编译时就得知错误了。从编辑器中也可调用编译器以及与它共用的程序,这样程序员无需离开编辑器就可执行程序。

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。目前各个大学使用的教材机械工业出版社、国防工业出版社出版的《编译原理》。

大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决著名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名著的相关数论。

推荐参考书

虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生来说,要自己写出一个像TurbocC,Java那样的编译器来说还是太难了。不仅写编译器困难,学习编译原理这门课程也比较困难。

第一本书的原名叫《CompilersPrinciples,Techniques,andTools》,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙,也因为獗臼樵诒嘁朐?砘?嘴域确实?忻?所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版,名字就叫《编译原理》。该书出的比较早,大概是在85或86年编写完成的,作者之一还是著名的贝尔实验室的科学家。里面讲解的核心编译原理至今都没有变过,所以一直到今天,它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论,怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西,所以国内的教材都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。

第二本书的原名叫《ModernCompilerDesign》,中文名字叫做《现代编译程序设计》。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践,书中给出了不少的实际程序代码,还有很多实际的编译技术问题等等。此书另外一个特点就是其现代而字。在传统的编译原理教材中,你是不可能看到如同Java中的垃圾回收等算法的。因为Java这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识,那么你肯定得看前面那本龙书,如果你想自己动手做一个先进的编译器,那么你得看这本《现代编译程序设计》。

第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》。或许是这本书引入国内比较早吧,我记得我是在高中就买了这本书,不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是点到为止,作为大学本科教学已经是十分深入了。该书的特点就是注重实践,不过感觉还不如前面那本《现代编译程序设计》的实践味道更重。此书的重点还是在原理上的实践,而非前面那本那样的技术实践。《编译原理及实践》在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器TinyC.等你把整本书看完,差不多自己也可以写一个TinyC了。作者还对Lex和Yacc这两个常用的编译相关的工具进行了很详细的说明,这一点也是很难在国内的教材中看到的。

推荐了这三本教材,都有英文版和中文版的。很多英文好的同学只喜欢看原版的书,不我的感觉是这三本书的翻译都很不错,没有必要特别去买英文版的。理解理论的实质比理解表面的文字更为重要。

编译原理的实质

几乎每本编译原理的教材都是分成词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化这些部分。其实现在很多编译原理的教材都是按照85,86出版的那本龙书来安排教学内容的,所以那本龙书的内容格式几乎成了现在编译原理教材的定式,包括国内的教材也是如此。一般来说,大学里面的本科教学是不可能把上面的所有部分都认真讲完的,而是比较偏重于前面几个部分。像代码优化那部分东西,就像个无底洞一样,如果要认真讲,就是单独开一个学期的课也不可能讲得清楚。所以,一般对于本科生,对词法分析和语法分析掌握要求就相对要高一点了。

词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。

语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,LL自顶向下算法和LR自底向上算法。LL算法还好说,到了LR算法的时候,困难就来了。很多自学编译原理的都是遇到LR算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了,又不是像词法分析那样非得自己写出来才算真正的会。像LR算法的语法分析器,一般都是用工具Yacc来生成,实践中完全没有比较自己来实现。对于LL算法中特殊的递归下降算法,因为其实践十分简单,那么就应该要求每个学生都能自己写。当然,现在也有不少好的LL算法的语法分析器,不过要是换在非C平台,比如Java,Delphi,你不能运用YACC工具了,那么你就只有自己来写语法分析器。

等学到词法分析和语法分析时候,你可能会出现这样的疑问:词法分析和语法分析到底有什么?就从编译器的角度来讲,编译器需要把程序员写的源程序转换成一种方便处理的数据结构(抽象语法树或语法树),那么这个转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分,只是我们为了简化语法分析的过程,就把词法分析这种繁琐的工作单独提取出来,就成了现在的词法分析部分。除了编译器部分,在其它地方,词法分析和语法分析也是有用的。比如我们在DOS,Unix,Linux下输入命令的时候,程序如何分析你输入的命令形式,这也是简单的应用。总之,这两部分的工作就是把不规则的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源分析转换成树这种数据结构呢?数据结构中有Stack,Line,List这么多数据结构,各自都有各自的特点。但是Tree这种结构有很强的递归性,也就是说我们可以把Tree的任何结点Node提取出来后,它依旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言,比如我们在函数里面使用函树,循环中使用循环,条件中使用条件等等,那么就可以很直观地表示在Tree这种数据结构上。同样,我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分,就会介绍一种堆栈式的中间代码,我们可以根据分析出来的抽象语法树,很容易,很机械地运用递归遍历抽象语法树就可以生成这种指令代码。而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的Java,.NET,其底层的字节码bytecode,可以说就是这中基于堆栈的指令代码的。

关于语义分析,语法制导翻译,类型检查等等部分,其实都是一种完善前面得到的抽象语法树的过程。比如说,我们写C语言程序的时候,都知道,如果把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么C语言的编译器是怎么知道的呢?就是通过这一步的类型检查。像C++语言这中支持多态函数的语言,这部分要处理的问题就更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生,旧的办法不见得足够解决。

本来说,作为一个编译器,起作用的部分就是用户输入的源程序到最终的代码生成。但是在讲解最终代码生成的时候,又不得不讲解机器运行环境等内容。因为如果你不知道机器是怎么执行最终代码的,那么你当然无法知道如何生成合适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的程序的运行过程都通通排在你面前,你将来可能不会从事编译器的开发工作,但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储,怎么装载,怎么执行的。关于部分的内容,我强烈建议大家看看龙书上的讲解,作者从最基本的存储组织,存储分配策略,非局部名字的访问,参数传递,符号表到动态存储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。

关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《AdvanceCompilerDesginandImplement》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《AdvanceCompilerDesginandImplement》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢?

编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课

第一个编译程序的出现是在20世纪50年代早期,很难讲出确切的时间,因为当初大量的实验和实现工作是由不同的小组独立完成的,多数早期的编译工作是将算 术公式翻译成机器代码。用现在的标准来衡量,当时的编译程序能完成的工作十分初步,如只允许简单的单目运算,数据元素的命名方式有很多限制。然而它们奠定 了对高级语言编译系统的研究和开发的基础。20世纪50年代中期出现了FORTRAN等一批高级语言,相应的一批编译系统开发成功。随着编译技术的发展和 社会对编译程序需求的不断增长,20世纪50年代末有人开始研究编译程序的自动生成工具,提出并研制编译程序的编译程序。它的功能是以任一语言的词法规 则、语法规则和语义解释出发,自动产生该语言的编译程序。目前很多自动生成工具已广泛使用,如词法分析程序的生成系统LEX,语法分析程序的生成系统 YACC等。20世纪60年代起,不断有人使用自展技术来构造编译程序。自展的主要特征是用被编译的语言来书写该语言自身的编译程序。1971 年,PASCAL的编译程序用自展技术生成后,其影响就越来越大。

随着并行技术和并行语言的发展,处理并行语言的并行编译技术,将串行程序转换成并行程序的自动并行编译技术也正在深入研究之中。另外嵌入式应用迅速增 长的需求,推动了交叉编译技术的发展.还有系统芯片设计方法和关键EDA技术的研究,也带动了专用语言VHDL等及其编译技术的不断深化。我国编译器研发工作起步并不算晚,早在60年代初期,董韫美院士和杨芙清院士就分别在中科院和北大领导研究组开发编译器,那时面向的高级语言是ALGOL和FORTRAN,目标机是国产机。

在改革开放前,由于国家需要,中科院、国防科大、江南计算所、北大等单位一直在研制国产计算机,包括大型机和高性能计算机(如向量机、并行机),相应的也在研制高级语言编译器。中科院计算所以董韫美院士领导的研究组先后开发了119机、109机的类 ALGOL语言编译器BCY。国防科大开发了向量编译器和向量识别器。

70年代中科院计算所张兆庆教授研究组(以后称ACTGroup)开始在国产机上研制FORTRAN语言编译器,先后参与了众多的院级和国家级科研攻关项目,主持开发了013,757,KJ8920等国产大型机系统中的FORTRAN语言编译器,所研制的编译器支持了数百万行应用软件的运行。

篇3:航天器控制语言编译技术研究综述

目前,航天地面控制系统以上传预先编写控制指令序列的方式对航天器和星上载荷进行控制。指令虽然具有一定的规范约束,但由于是面向系统的底层语言,类似于计算机汇编语言,其可读性较差,开发速度低。对于在轨维修、辅助对接等空间精细操控任务,整个任务必须进行实时控制,但一个动作通常需要几十上百条指令序列才能完成,无法在短时间内开发,制约了空间操控任务的发展。

航天器控制领域的发展方向是空间系统与地面系统构成天地协同控制系统,因此迫切需要一种支持航天器实时精细操控的航天器控制语言。一种新的计算机语言的实现需要编译技术作为支撑,而航天器控制语言与一般的高级语言有所区别,其编译方法也有所不同。

为此,本文以编译技术研究为主线,对编译技术、航天器控制语言做详细阐述,进一步归纳航天器控制语言的编译特点,以此为基础,针对未来天地协同任务中的航天器实时精细控制等应用需求,提出满足该要求的实时控制语言及其需要解决的主要研究问题。

1 编译技术

1.1 编译的概念

一个编译器就是一个程序,它可以阅读以某一种语言(源语言)编写的程序,并把该程序翻译成为一个等价的、用另一种语言(目标语言)编写的程序。这个转换翻译的过程就是所谓的编译[1]。通常,编译器最主要的作用就是将用源语言编写的程序翻译成一种可以被机器执行的形式。在这个过程中编译器也会报告源程序的错误和警告,程序员可以根据这些信息来改正或优化程序。

1.2 编译技术的发展

编译技术是随着程序设计语言的发展而发展的。Grace Hopper在1951年开发出了一个称作是A-0系统的编译器,这是人们第一次在编译器上的尝试。1957年,John Backus领导的小组历时18年为FORTRAN语言开发出一个编译器。这是第一个真正意义上的编译器,是编译史上的里程碑。几乎同一时间,Noam Chomsky在自然语言结构上的研究成果促使了编译理论的重大进展。根据语言文法的难易程度以及识别它们所需的算法将语言分为:0型、1型、2型和3型文法。2型(上下文无关文法)被证明是程序设计语言中最有用的,如今它已代表着程序设计语言结构的标准方式。上下文无关文法、有穷自动机理论及正则表达式理论构成了编译技术的基础[2]。

编译技术发展至今天,已经形成了一个比较稳固的技术体系,如图1所示。一般可分为词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等几个前后衔接的环节。这些环节又可以分为两个部分:分析部分和综合部分,也即前端和后端。分析部分包括了词法分析、语法分析、语义分析、中间代码生成。主要是将源程序分解为多个组成要素,并在这些要素上加上语法结构,根据这个结构来创建一个该源程序的中间表示。同时分析部分还会收集有关信息,并将信息存在符号表中,符号表将和中间表示一起传递给综合部分。综合部分根据分析部分提供的信息来构造目标程序。有时还会在分析与综合部分之间进行一个与机器无关的优化步骤,这个优化是对中间表示进行转换,以便后端能够生成更好的目标程序。

影响编译技术的发展因素是多方面的。最基本直接的因素就是程序设计语言的发展。从最初的汇编语言开始,到现在广泛使用的C++、C#、JAVA等语言,不断有新的语言特征加入,编译器必须要有相应的算法和表示方法来支持新的语言特征。另一方面,计算机体系结构的发展也对编译技术产生了很大的影响。

1.3 编译技术的应用现状

编译技术应用领域比较广泛,其中比较有创新性和代表性的应用是反病毒方面[3]、促进可信赖计算方法[4]和基于编译技术的协议解析方法[5]。并行编译技术[6,7]、交叉编译技术和动态编译技术[8]都是编译技术研究和发展的重要方向,目前对动态编译的研究主要集中在运行时特定化、Just-in-time编译和动态的二进制代码转换和优化三个方面。

2 航天器控制语言

2.1 航天器控制语言的概念

一种语言被人们叫做控制语言,因为其编程执行后有明显的控制过程、作用对象或控制结果,航天器控制语言就是指面向航天器,与任务无关,直接操作航天器及其星上系统或有效载荷的编程语言。

航天器控制语言显式或隐式的支持航天器控制命令,尤其是指令与数据的注入等操作,与传统的编程语言相比具有明显的领域性。同时航天器控制语言对可靠性要求较高,随着航天器控制领域的发展,天地协同的精细操作越来越受到重视,航天器控制语言对实时性的要求也越来越高。高可靠性以及高实时性是很多传统编程语言所不具备的。

2.2 航天器控制语言研究现状

目前比较有代表性的航天器控制语言有HAL/S、Timeliner和SCL。

HAL/S是美国航宇局根据在阿波罗的指挥舱和登月舱中运行计算机实时程序所获得的经验而直接设计的一种适用于航空、航天领域实时高级语言,主要用于开发航天飞机的飞行软件和实时控制。其设计的最重要目的就是要增强编程过程的可靠性[9],这个过程包括协作者之间的交流、编程过程本身以及工作程序的维护等。为了强调可靠性和降低维护费用,HAL/S的设计采用了严格的编译校检,模块化/结构化编程手段,以及全部做了注释的标准可读程序列表。目前,为NASA开发的HAL/S语言及其编译器己进入使用阶段。同时,大量的目标计算机也都有了相应的模块化代码发生器。近来HAL/S正用来为航天飞机机载计算机编制程序,并且被NASA定为一种标准的飞行软件开发语言。

Timeliner是由Charles Stark Draper Laboratory于1982年开发的,一种用来编写基于事件、时间、地面或者人工命令驱动的自动执行脚本的语言,在国际空间站、日本空间站及轨道快车计划中取得了成功的应用。Timeliner可以与联合手动的人工程序结合,或可以通过Timeliner消息功能请求人工实现一个手动程序。Timeliner系统主要包括一个高级脚本语言,一个包含指令和变量的目标系统数据库,一个编译器,一个执行器和监控界面[10]。通过在编译器和执行器中加载目标系统数据库,将程序与目标系统指令和变量分离的方式,简化编写脚本、编译执行的过程,提高运行速度,并且实现Timeliner在不同系统间的通用性。

国内杨永安等提出的航天器控制语言(Spacecraft Control Language,SCL)[11,12]是航天测控网为实现遥控作业操作模式而专门开发的面向航天器遥控操作的高级语言,用于编制遥控作业。SCL依托专用的测控软件,利用与其他测控软件模块的接口及不同型号卫星的配置加载,通过测控设备实现对航天器的直接操作。该语言能够有效地解决航天器上行控制、参数判断和数据同步等航天器测控专用语句的设计难题。

3 典型航天器控制语言编译技术分析

3.1 HAL/S编译器分析

HAL/S的编译器基本上是用高级语言XPL写成的,并由XPL翻译器编写系统设计和实施的。这个编写系统由一组程序构成,并为编写解释器-编译器提供了一个有力的工具。它之所以这么有用,主要是因为它为语法分析提供了统一的模块,并且能自动产生出与语言相关的编译器区段。

HAL/S的编译器要经过四个阶段。

阶段1:输入源程序,分析语法和语义,产生源程序列表和一个具有内部格式的指令文件(HALMAT),同时还产生一批用于以后阶段的表。

阶段1.5:整理阶段1所产生的数据,执行与机器无关的优化处理。

阶段2:输入阶段1产生的HALMAT,输出机器语言的目标模块。输出格式适合连接程序做进一步的处理。

阶段3:产生一个模拟数据文件,它支持运行时诊断程序和HALSTAT程序。

3.2 Timeliner编译器分析

Timeliner的编译过程有别于传统的编译过程,其输入输出均与常见的编译系统不同。其输入不仅仅是源程序的代码,还需要一个储存有目标环境变量和命令的地面数据库(GDB);其输出也不是常见的机器可识别二进制代码,而是一个特殊的具有树形结构的XML(e Xtensible Markup language)文件和一个任务控制操作的列表文件,用于任务执行时的监控显示。基于上述的编译过程,Timeliner系统分为了两个主要部分:编译器和执行器,如图2所示。

Timeliner通过在编译器和执行器中加载目标系统数据库,将程序与目标系统指令和变量分离的方式,简化编写脚本、编译执行的过程,提高运行速度,并且实现Timeliner在不同系统间的通用性。编译器只关心控制指令和变量是否合法并将脚本转换成执行器能读懂的XML格式文件,它并不需要理解控制指令或者变量的意义。执行器根据编译器发送的XML文件创建可执行树并依照调度算法调度树的每个结点执行,同样不考虑控制指令和变量是如何执行的,执行细节交由能识别这些指令和变量的目标系统完成。对于Timeliner语法规范中定义的关键字、语句、运算符、表达式等语法要素,在执行器中有不同的类与它们对应,在创建可执行树时由关键字工厂创建不同的对象,这些对象保证Timeliner脚本的运行,在适当时机向星上系统发送指令、修改变量。

3.3 SCL编译器分析

根据航天测控中心操作系统使用Open VMS以及系统软件采用FORTRAN语言的实际,SCL采取了一种转换的思路来进行程序的编译,即把SCL语言程序等价转换成标准的FORTRAN语言程序,利用VMS系统支持功能强大、可靠性高的FORTRAN编译程序,对转换后的等价FORTRAN语言程序进行编译、联结生成机器可执行的程序。SCL的编译原理如图3所示。

为了定位错误,对SCL程序作语法上的等价转换,对转换前SCL程序中的每条语句与生成语法等价的FORTRAN语句以自然顺序编号,通过查询编号来定位错误语句;由于FORTRAN编译程序产生的目标程序不能实现程序走向的任意控制,因此增加了一个程序走向控制模块,此模块接受控制员的指令操作,然后控制程序走向;编译程序在对源程序进行等价转换的过程中,为所有可能用到的参数做了说明,并作为一个全局段放入到内存中,这样就解决了FORTRAN语言具有隐含说明性的问题;内部变量采取集中管理,同时创建一个对应表和一个读写子程序,调用读写子程序,通过查表来得到变量地址,然后进行操作。

在这三种代表性的航天器控制语言中,HAL/S提供了较强的实时性支持,但是HAL/S需要为每一种目标机开发一个相应的编译器,且由于HAL/S的设计采用了严格的编译校检,编译器的开发复杂,因此HAL/S对通用性的支持不强。Timeliner通过采用编译器+执行器的结构,将执行器嵌入到目标系统中,提供了很好的通用性,也提供了一定的实时机制,但是对星上系统要求较高。至于SCL则通过对遥控指令控制命令的显式支持,解决了遥控作业操作模式的问题。当前航天器控制领域的主要研究内容是天地协同系统,即空间系统与地面系统构成一个统一的天地大回路协同控制系统,形成对空间系统的强实时、智能操控能力,从而实现对空间任务的快速响应和“随机应变”。这就要求航天器控制语言提供强实时性、可控性和智能性,同时还要兼顾对控制目标的通用支持。目前的航天器控制语言仅解决了其中一部分的问题。

4 下一步研究重点

从前面的叙述中可以看出航天器控制语言的编译与一般语言的编译还是有所区别的,尤其是Timeliner的编译过程打破了一般高级语言编译后生成及其可识别二进制代码的习惯,以一种近似解释执行的方式完成Timeliner的编译。

航天器控制语言有两个主要问题需要解决:实时性与通用性。实时性是航天器控制中的需求,通用性是为了支持对多种航天器的控制。下一步的研究重点就是在航天器控制语言的编译过程中怎样确保对实时性和通用性的支持。

篇4:浅论编译的发展与特点

关键词:编译;定义;发展;特点

中图分类号:G629.22文献标识码:A文章编号:1671-864X(2016)08-0284-01

一、引言

编译是翻译的一种形式,即编辑和翻译的结合,是将一种语言文字写作的内容用另一种语言文字忠实而又完整地予以概述。编译的特殊性在于用精当的语言再现原作本质性的内容,略其形态,取其精髓而舍弃其余。[1]与传统的翻译形式相比,编译给予译者更大的自由,更加侧重于译入语语境和语言习惯。随着时代的发展与翻译理论研究的深入,编译已经成为了翻译活动中的重要部分,尤其是在对新闻文体、外宣资料、社科学术论文摘要等体裁的翻译活动中。

二、关于编译

编译最早出现在古罗马时期的科技翻译中,老普林尼的《博物学》有37卷之多,广征博引大量观察结果,这些都是从约2000部前人的作品中搜集来的,作者对资料来源加以鉴别、重组和转述,构成新的作品。在当时的医学领域也是如此。古罗马医学大师塞尔苏斯的重要作品《药物论》,也是由古希腊典籍编译而成。

时至今日,编译的运用更加广泛,概念也更加明晰。《译学词典》中称编译着眼于“译”,在此基础上由译者添加“编”的功夫。[2]翻译目的论者诺德将编译视作工具性翻译,是“目的论”的一种体现。[3]周兆祥按“翻译的自由度”将翻译分为六种类别,其中编译的自由度仅次于改写[4]。

三、编译在我国的发展

国内翻译界对编译的关注与研究,开始于上世纪八十年代。1986 年维颐、嘉祥、同均等在《翻译通讯》上发表《常用译法归类》;邝日强在《上海科技翻译》上发表《我的业余编译活动》,对自己多年积累的科技文体编译实践经验进行总结。[5]这些文章的发表,见证了我国编译研究的开端。自2000年以来,翻译家与学者们对编译的研究趋向具体化,富有针对性,往往通过分析对某一体裁具体文献的编译实践活动,获得实践经验与理论感悟。

在理论研究逐渐成熟化的同时,编译实践活动也更加广泛地运用于各个学科和社会领域。二十世纪初期,许多学者和思想家对一系列马克思主义经典著作进行了编译,无数优秀的外文译作在这一时期大量涌现出来;1949年,中央俄文编译局成立;1953年,中共中央编译局成立。这也标志着编译工作进入了更加专业化系统化的发展方向。

20世纪中后期至今,伴随着经济全球化的推进,信息资源共享达到最大化,人们对新闻的获取需求也大大增加。由于国际和国内新闻报道的受众不同,新闻文稿的写法上也存在区别,必须对原新闻稿件先进行编译,再进行传播,编译也因此成为了新闻传播领域常用的手段。在新闻编译中,译者需要根据潜在读者的信息需求和接受习惯对原文稿内容进行筛选,同时根据译语语篇的要求调整结构并提供必要的解释性背景材料。通过这种方式,使新闻文稿和报道在具有真实性的基础上,更能满足受众期待。

除此之外,社科学术论文摘要往往也不适合全译,一般采取编译策略,其编译活动一般以汉译英为主,这也是由英汉语言的差异决定的。汉语中,语言表达有时过于重复冗长,如果逐字对译,不仅不符合英语的行文特点,也会使意义表达不清晰。除此之外,一些中文论文在学术语言规范方面有所欠缺,摘要的写作并不符合应有的体裁要求,这就需要编译来进行完善,以达到良好的效果。

四、编译的特点

编译通常采取先编后译或边编边译的方法。在翻译之前,需要提前进行一系列加工和预处理[6]。原文在语言表达和逻辑上不符合译入语读者的习惯,就需要提前针对结构,逻辑,语言手法等进行编辑,这是编译活动的第一步。

编译的过程是对来源复杂的信息进行有目的的筛选,需要删减许多不必要的信息,舍弃与主题内容无关的修饰和铺垫。同时,也要把握材料的详略区分,对重要的信息多加笔墨,次要的信息一笔带过,才能简洁凝练,有效地传达信息。

除了内容以外,编译在结构上也具有一定的协调性。在记叙和描写中,可以遵循时间顺序或空间顺序,使行文流畅通顺;在新闻类文稿中,除了注重时效性外,也应在结构上突出重点,由次要到主要,由点及面地传达信息。

在篇幅长短上,编译文稿主要以短篇幅为主。这也是由编译工作的特点决定的。在较短的篇幅中,明确地传达完整的信息,内容充实,条理清晰,使读者易于理解,一目了然,这也正是编译文稿的意义所在。

五、结语

随着时代的发展,传统古板的翻译方法已经体现出一定的局限性,编译也在不断地发展中趋于成熟,其自身拥有的诸多特点可以被利用于不同体裁的应用文体,在翻译和整合的过程中,满足人们获取信息的更大需求。作为联系原文与译文,沟通文本和读者的一种翻译方法和手段,编译的重要性也将在今后的现代生活中得到更加淋漓尽致的体现。

参考文献:

[1]刘树森.编译:外语专业高年级学生应当掌握的一种能力[J].中国翻译,1991(3).

[2]方梦之.译学词典[M].上海:上海外语教育出版社,2005.

[3]Nord,Christiane.Text Analysis in Translation[M].Amsterdam:Rodopi,1991.

[4]周兆祥.翻译初阶[M].香港:香港商务印书馆,1996

[5]贾洪伟.翻译研究综述[J].上海翻译,2011,(1):17

篇5:军用数据总线技术发展综述

1553B以其高可靠性、易维修性、良好的操作方便性等优点成为目前应用最为广泛的数据总线,但随着军用通讯系统的数据传输量的`日益增长,这种数据总线的传输能力已经不能完全满足现代军用系统的需要.扩展数据总线的传输量、提高总线的传输速率将成为今后一段时期军用数据总线开发的主流.介绍、比较和分析了国内外现阶段应用的几种军用数据总线的构架及其优缺点.

作 者:马贵斌 周国奇 田珂 MA Guibin ZHOU Guoqi TIAN Ke 作者单位:马贵斌,MA Guibin(空军驻洛阳地区军代表室,河南,洛阳,471003)

周国奇,田珂,ZHOU Guoqi,TIAN Ke(中航光电科技股份有限公司,河南,洛阳,471003)

篇6:汽车线控转向技术发展综述

汽车线控转向技术发展综述

线控转向(Steer-By-Wire)是汽车转向系统的最新技术,可以提高汽车操纵稳定性、安全性和舒适性,代表着未来的`发展趋势.了解线控转向系统的结构、工作原理以及性能特点并进行相关分析有利于我们掌握线控转向的关键技术.

作 者:刘齐 LIU Qi  作者单位:上海交通大学自动化系,上海,200030 刊 名:芜湖职业技术学院学报 英文刊名:JOURNAL OF WUHU VOCATIONAL INSTITUTE OF TECHOLOGY 年,卷(期):2009 11(2) 分类号:U463.4 关键词:线控转向   线控技术   发展现状   结构   关键技术.  

上一篇:校奖学金的获奖感言下一篇:适合中学生的励志书籍推荐