|
|
计算机并不能直接地接受和执行用高级语言编写的源程序,源程序在输入计算机时,通过“翻译程序”翻译成机器语言形式的目标程序,计算机才能识别和执行。
|
|
|
这种“翻译”通常有两种方式,即编译方式和解释方式。编译方式是:事先编好一个称为编译程序的机器语言程序,作为系统软件存放在计算机内,当用户由高级语言编写的源程序输入计算机后,编译程序便把源程序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该目标程序,以完成源程序要处理的运算并取得结果。解释方式是:源程序进入计算机时,解释程序边扫描边解释做逐句输入逐句翻译,计算机一句句执行,并不产生目标程序。Pascal、Fortran、Cobol等高级语言执行编译方式;Basic语言则以执行解释方式为主;而Pascal、C语言是能书写编译程序的高级程序设计语言。
|
|
|
|
编译程序的功能是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(* .OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的,例如Visual C++、Visual Foxpro、Delphi等。
|
|
|
编译程序大致分为6个阶段(phase),如下图所示,它们执行不同的逻辑操作。将这些阶段设想为编译器中一个个单独的片断是很有用的,尽管在应用中它们是经常组合在一起的,但它们确实是作为单独的代码操作来编写的。
|
|
|
|
|
|
解释程序的执行方式类似于日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。解释程序基本上执行与编译程序相同的功能,只是方式上不同而已。解释程序按顺序翻译并执行每一条源程序语句。解释程序的优点是当语句出现语法错误时,可以立即引起程序员注意,而程序员在程序开发期间就能进行校正。解释程序的缺点是不能像编译程序那样充分地利用计算机资源。
|
|
|
解释执行的语言因为解释器不需要直接同机器码打交道所以实现起来较为简单、而且便于在不同的平台上面移植,这一点从现在的编程语言解释执行的居多就能看出来,如Visual Basic、Visual Foxpro、Power Builder、Java等。编译执行的语言因为要直接同CPU的指令集打交道,具有很强的指令依赖性和系统依赖性,但编译后的程序执行效率要比解释语言高得多,现在的Visual C/C++、Delphi等都是很好的编译语言。
|
|
|
对于解释语言与编译语言所编制出来的代码在安全性上而言,可以说是各有优缺点。曾经在Windows下跟踪调试过VB程序的一般都知道,程序代码99%的时间里都是在VBRUNxx里转来转去,根本看不出一个所以然来。这是因为跟踪的是VB的解释器,要从解释器中看出代码的目的是什么是相当困难的。但解释语言有一个致命的弱点,那就是解释语言的程序代码都是以伪码的方式存放的,一旦被人找到了伪码与源码之间的对应关系,就很容易做出一个反编译器出来,源程序等于被公开了。而编译语言因为直接把用户程序编译成机器码,再经过优化程序的优化,很难从程序返回到源程序的状态,但对于熟悉汇编语言的解密者来说,也很容易通过跟踪代码来确定某些代码的用途。
|
|
|