1.编译型语言与解释型语言
编译型语言就是我们常见的高级编程语言(例如C/C++/Java等等),由编译型语言编写的程序文件需要先经过编译器编译链接为机器能识别的二进制机器文件,直接由机器识别执行,效率高。而解释型语言编写的程序文件称作解释器文件,不需要事先编译,而是由解释器识别执行(
解释器是执行解释型语言的程序
),效率低,常见的解释型语言有shell、perl等。
2.解释器文件执行过程
当在linux系统的shell命令行上执行一个可执行文件时,系统会另起一个子进程,在子进程中内核会首先将该文件当做是二进制机器文件来执行,但是内核发现该文件不是机器文件后就会返回一个错误信息,收到错误信息后进程会将该文件看做是一个解释器文件,然后扫描该文件的第一行,获取解释器程序的名字,然后执行该解释器,并将该解释器文件当做解释器的一个参数,然后开始由解释器程序扫描整个解释器文件,执行每条语句,当然会跳过第一行语句。这就是一个解释器文件的的大概执行过程。
当在linux系统的shell命令行上执行一个可执行文件时,系统会另起一个子进程,在子进程中内核会首先将该文件当做是二进制机器文件来执行,但是内核发现该文件不是机器文件后就会返回一个错误信息,收到错误信息后进程会将该文件看做是一个解释器文件,然后扫描该文件的第一行,获取解释器程序的名字,然后执行该解释器,并将该解释器文件当做解释器的一个参数,然后开始由解释器程序扫描整个解释器文件,执行每条语句,当然会跳过第一行语句。这就是一个解释器文件的的大概执行过程。
所有的UNIX系统都支持解释器文件,这种文件是文本文件,其起始行的形式是:
#! pathname [ optional-argument ]
shell解释器文件以下列行开始:
#! /bin/sh
pathname通常是绝对路径名。内核调用exec函数的进程实际执行的并不是该解释器文件,而是该解释器文件的第一行中pathname所指定的文件。注意解释器文件(文本文件,它以#!开头)和解释器(由该解释器文件第一行中的pathname指定)是两个概念。
下面调用exec执行一个解释器文件。