编译型的计算机语言处理系统可以生成,自编译语言

自编译语言的功能及其编译程序是可以像滚雪球一样,一级一级她扩充。它可以对编译程序作修改并且描述其他语言的编译程序。它的编译程序在一台机器上建立以后,就有可能产生其他计算机上的各种语言的编译程序,从而缩短了编译程序的研制过程。它对于促进计算机的推广应用,其作用是显著的。[1]

中文名

自编译语言

外文名

self-compiling language

定    义

编译程序可直接用这种语言写作    用

促进计算机的推广应用

系    统

计算机

应用学科

计算机原理

自编译语言概述

编辑

语音

在早期,人们是使用机器语言或汇编语言并用手工方式来编写编译程序的。采用这两种语言来编写编译程序的主要缺点是生产效率低,从编写到调试出一个中等复杂的程序语言(如ALGOL、FORTRAN)的编译程序,一般需要几个到十几个人年,并且编写出来的程序不便于阅读、修改和移植。用汇编语言手工编写编译程序的主要优点是:能够根据具体机器做针对性较强的处理,可以发挥具体计算机的系统功能;可以满足各种具体要求;编程可精雕细刻,所生成的程序效率高。但是随着计算机技术的发展,软件的生产率、可靠性、可移植性及可维护性等已成为当前软件生产和发展的主要矛盾,因此,越来越多的人使用高级语言来构造编译程序。这样做除了可以节省大量的程序设计时间外(实践表明,与手编程序相比,一般可节省四分之三的时间),而且所构造出来的程序易于阅读和修改,还可以用自展方式(自编译方式)来生成编译程序和进行编译程序的移植。所有这些都在一定程度上满足了软件工程化方面的要求。所以,已发展了多种适用于进行系统程序设计的高级语言,其中较著名的有Pascal、MODULA一2、C、Ada、C++和Java语言等。

用高级语言来书写编译程序是建立在高级语言的自编译性的基础之上的。

高级语言的自编译性是指,如果一个高级语言能用来书写它自己的编译程序,则该语言称为自编译语言。上述语言都是自编译语言。一般说来,自编译语言不但可以用来书写其自身的编译程序,而且也能用来书写其他语言的编译程序。所以,如果某台计算机上已配备有某种自编译语言(具备该语言的编译系统),就可以利用这种语言为本台机器配置其他高级语言(用该语言编写并生成其他高级语言的编译系统)。[2]

自编译语言自展

编辑

语音

设有自编译语言L,可以通过自展的方法为机器A生成该语言的编译程序L.Ao。首先,将语言L划分为核心部分和扩充部分,其核心部分为L1,其扩充部分分别为L2、L3、…、Ln,即

L=L1+L2+L3+…+Ln

先用A机的机器语言或汇编语言编写核心语言L1的编译程序L1.Ao,然后用语言L1编写语言(L1+L2)的编译程序(L1+L2).L1。由于(L1+L2)语言仅是在核心语言L1的基础上稍加扩充,所以,其编译程序一般能够用核心语言编写出来。利用语言的自编译性,语言(L1+L2)的编译程序(L1+L2).L1经L1.Ao编译以后,则可生成(L1+L2).Ao。然后用语言(L1+L2)编写语言(L1+L2+L3)的编译程序(L1+L2+L3).(L1+L2),该编译程序经(L1+L2).Ao编译以后,生成语言(L1+L2+L3)的编译程序(L1+L2+L3).Ao,……,如此重复下去,其过程就像滚雪球一样直到生成整个语言L的编译程序L.Ao为止。

由于开始通过低级语言建立的编译程序可做得比较小而简单,因而可以在较少的人力和时间的情况下建立起来,以后都是用高级语言本身来编写较大语言的编译程序。由于有用高级语言进行程序设计的优点,所以这样做的结果是比用低级语言直接一次生成一个完整的编译程序要快,而且在程序的可靠性方面也更能得到保证。[2]

d70766acf56b8bc31cb1b35bc75bc075.png

自编译语言移植

编辑

语音

有的编译程序可以通过移植得到。所谓移植就是将某台机器(称宿主机)上现成的软件移植到另一台机器(称目标机)上。

如果使用高级语言来编写编译程序,并且这个语言具有自编译功能,则移植将是比较方便的。

例如,设宿主机A上具有高级语言L(该语言具有自编译功能)所写的L语言的编译程序L.L,以及用该机的机器语言表示的L语言的编译程序L.Ao,则就有可能将宿主机A上的语言L的编译程序移植到目标机B上。

任何一个编译程序从逻辑上都可分成两部分:一部分所做的工作与具体机器无关,用F.L表示(称为编译程序的前端);另一部分(主要是生成目标代码部分,即编译程序的后端)则是与具体机器有关的,对A机用A.L表示。即有:

L.L=F.L+A.L

将宿主机A上的语言L的编译程序移植到目标机B上的做法是:首先用L语言把A.L改写为B.L,使之产生目标机B上的目标代码,这样可得到用A机L语言所写的可生成B机的目标代码的语言L的编译程序I.L(即交叉编译程序),

I.L=F.L+B.L

I.L在A机上经过L.Ao编译得到一个I.Ao,它是能在宿主机A上运行的L的编译程序,但是其代码生成部分是生成目标机B上的目标代码。因此,再把I.L由I.Ao进行一次编译,就得到可在目标机B上运行的生成目标机目标代码的语言L的编译程序L.Bo。[2]

01ad736f72f09b54d53fb6bb5366e9c7.png

自编译语言自动生成

编辑

语音

编译程序是一个相当复杂的系统软件,一般有数万条指令,为了缩短研制时间,保证代码编制的正确性,人们希望尽可能地把工作交给计算机去完成,从而提出了“编译自动化”的课题。由于高级语言具有自编译性,即可以用这个语言来编写自己的编译程序,同时一个具有自编译性的高级语言也可用于编写其他高级语言的编译程序。这样使得人们可以通过使用高级语言实现编译程序各遍的算法的方法,来解决“编译自动化”的问题。这种方法有利于减少错误并加快研发的速度。

在编译程序自动化进程中,开发较早且应用广泛的是词法分析程序生成器和语法分析程序生成器。

LEX是一个有代表性的词法分析程序生成器。它输入的是正规表达式,输出的是词法分析程序(也称为扫描器)。LEX的基本思想是由正规表达式构造有穷自动机。

YACC(Yet Another Compiler Compiler)一种基于LALR(1)文法的语法分析程序生成器。它接受LALR(1)文法,生成一个相应的LALR(1)分析表以及一个LALR(1)分析器,而且,YACC生成的语法分析器可以和扫描器连接。

LEX和YACC是关于编译程序前端的生成器,而关于编译程序后端(目标代码生成、目的代码优化)的生成器仍不多见。

理想化的编译程序生成器以源语言的规格说明、语义描述和目标机的规格说明作为输入,而输出的则是编译程序。但编译程序生成器还仅仅只是某部分编译程序的生成器,如词法分析程序生成器、语法分析程序生成器或代码生成程序生成器。

b745d88cff1e922fbb786ae00b4e36c0.png

参考资料

1.

《电子工业技术词典》编辑委员会,电子工业技术词典 电子计算机,国防工业出版社,1976年01月第1版,第79页

2.

张莉,杨海燕,史晓华,金茂忠,高仲仪编著,编译原理及编译程序构造,清华大学出版社,2011.06,297-298

3.

何炎祥,伍春香,王汉飞编著,编译原理,机械工业出版社,2010.04,第10页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值