根据我迄今所读的,Bash似乎符合解释性语言的定义:
- 它不会编译成较低格式。
- 每个语句最终都会调用 一组子程序,已经被翻译成机器码(例如:
echo foo
调用了一个预编译的可执行文件)。 - 解释器本身,即
Bash
,已经被编译过了。
然而,我在Wikipedia关于解释型语言的页面上找不到关于Bash的参考资料,也经过Google的广泛搜索无果。我还在程序员堆栈交换网站上找到了一个页面,似乎暗示Bash不是一种解释性语言——如果它不是,那它是什么呢?
根据我迄今所读的,Bash似乎符合解释性语言的定义:
echo foo
调用了一个预编译的可执行文件)。Bash
,已经被编译过了。然而,我在Wikipedia关于解释型语言的页面上找不到关于Bash的参考资料,也经过Google的广泛搜索无果。我还在程序员堆栈交换网站上找到了一个页面,似乎暗示Bash不是一种解释性语言——如果它不是,那它是什么呢?
Bash肯定是被解释执行的;我认为这方面没有任何合理的疑问。
可能会有争议是否它是一种语言。它主要设计用于交互使用,执行由操作系统提供的命令。对于那种特定类型的使用方式,如果你只是输入命令,类似于
echo hello
或者cp foo.txt bar.txt
很容易认为它只是用于执行简单命令,因此在这个意义上,它与解释语言(如Perl和Python)非常不同。虽然后者可以交互式地使用,但主要用于编写脚本(解释性程序)。
因此,bash的设计针对的是交互式使用。字符串不需要引号,大多数命令在输入后立即执行,大多数操作会调用外部程序而不是内置功能等等。
但我们知道,也可以使用bash编写脚本,而且bash有很多特性,特别是流程控制结构,主要用于脚本(尽管也可以在命令行上使用)。
bash和许多脚本语言之间的另一个区别是,bash脚本是按顺序读取、解析和执行的。在bash脚本中间发生语法错误,直到执行达到该错误位置时才能检测出来。相比之下,Perl或Python脚本在执行之前完全解析。(诸如“eval”之类的东西可以改变这种情况,但总体思想是正确的。)这是一个重大区别,但并没有标志着一个清晰的分界线。如果说有什么区别的话,那就是它使Perl和Python更类似于编译语言。
总之:是的,bash是一种解释性语言。或者更准确地说,bash是一种解释另一种解释性语言的解释器。(“bash”的名称通常指的是shell/解释器,而不是它所解释的语言。)它与从一开始就设计用于脚本编写的其他解释性语言存在一些重要区别,但这些区别并不足以将其从“解释性语言”类别中排除。
这个回答是对Keith Thompson的回答的补充,我将留下即时的实际关注点。
总体而言,我认为询问"X作为一种语言在Y目的上有多好?"比起"我们应该将X分类为哪种类型的语言?"或者"X到底算不算是一门语言?"更有用。
即使没有 Bash 的更高级脚本特性和类似于编程语言的语义,Bash 绝对是一种语言,任何可能的命令行界面也是一种语言,实际上每个界面,甚至物理界面也都是语言。它们可能是非常简单的语言,连一个包含多个术语的表达式都没有构建机制,但我们完全可以像处理其他语言一样进行推理。机器对输入或操作的任何响应都可以被建模为机器“识别”输入“标记”,就像有限状态自动机或图灵机一样,并利用这种识别来改变某种内部状态。"按下"一些机械按钮可能在你停止按下后永久切换其状态,而其他按钮可能需要你按住,释放按钮时它们所控制的物体又恢复原状 - 它们对后者忽略的"释放"输入做出响应。旋转组合锁按顺序识别特定的输入;自行车锁则等待并行识别特定的输入(可以串行建模)。Bash 刚好属于图灵完备类别的语言,因此无论从任何客观标准来看,它都是一种"编程语言",唯一有趣的事情是关于其设计和人性化方面的:"用这种方式做事情有多容易,或者那种方式有多简单?"