Bash是一种解释型语言吗?

21

根据我迄今所读的,Bash似乎符合解释性语言的定义:

  • 它不会编译成较低格式。
  • 每个语句最终都会调用 一组子程序,已经被翻译成机器码(例如:echo foo 调用了一个预编译的可执行文件)。
  • 解释器本身,即 Bash,已经被编译过了。

然而,我在Wikipedia关于解释型语言的页面上找不到关于Bash的参考资料,也经过Google的广泛搜索无果。我还在程序员堆栈交换网站上找到了一个页面,似乎暗示Bash不是一种解释性语言——如果它不是,那它是什么呢?


1
只是为了澄清 - 你的问题是因为你不确定维基百科上的特定页面是否可以被信任,以保证其100%完整和正确吗? - Greg Hewgill
2
这似乎是一种问题,它会引起争议,因为每个人都同意实际发生了什么,但每个人在如何定义术语上都有强烈而相互冲突的意见。我只是尝试避免这个话题。 - user2357112
3
我认为毫无疑问地,Bash是一种解释性语言,但这只是我的观点。您是否正在寻找支持这种观点的参考资料? - Greg Hewgill
3
我会回复一个答案,只用写一个“是”字就可以了,但它会被拒绝因为太短了。 - Keith Thompson
1
@ShellFish,嗯,那不一定是一个决定性因素——存在编译语言,可以通过解释器风格的shebang调用,然后编译给定的源代码并运行生成的代码。就此而言,tcc是一个可以为C语言做到这一点的编译器。另请参见Clojure——它有一个REPL,但是输入的所有内容,即使是通过该REPL输入的内容,在被调用之前也会被编译为Java类;同样也提供了基于shebang的Clojure调用方式。 - Charles Duffy
显示剩余5条评论
3个回答

29

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/解释器,而不是它所解释的语言。)它与从一开始就设计用于脚本编写的其他解释性语言存在一些重要区别,但这些区别并不足以将其从“解释性语言”类别中排除。


回复:关于“它是一门语言”可能会有一些争议,或许是编程语言。例如,我认为更多的人会接受 HTML 被浏览器“解释”,而不是被视为“解释性语言”,因为“解释性语言”暗示着“解释性编程语言”,排除了标记语言的可能性。 - ruakh

8

Bash是一个解释器,根据GNU Bash参考手册的定义:

Bash是GNU操作系统的shell或命令语言解释器。


-2

这个回答是对Keith Thompson的回答的补充,我将留下即时的实际关注点。

总体而言,我认为询问"X作为一种语言在Y目的上有多好?"比起"我们应该将X分类为哪种类型的语言?"或者"X到底算不算是一门语言?"更有用。

即使没有 Bash 的更高级脚本特性和类似于编程语言的语义,Bash 绝对是一种语言,任何可能的命令行界面也是一种语言,实际上每个界面,甚至物理界面也都是语言。它们可能是非常简单的语言,连一个包含多个术语的表达式都没有构建机制,但我们完全可以像处理其他语言一样进行推理。机器对输入或操作的任何响应都可以被建模为机器“识别”输入“标记”,就像有限状态自动机或图灵机一样,并利用这种识别来改变某种内部状态。"按下"一些机械按钮可能在你停止按下后永久切换其状态,而其他按钮可能需要你按住,释放按钮时它们所控制的物体又恢复原状 - 它们对后者忽略的"释放"输入做出响应。旋转组合锁按顺序识别特定的输入;自行车锁则等待并行识别特定的输入(可以串行建模)。Bash 刚好属于图灵完备类别的语言,因此无论从任何客观标准来看,它都是一种"编程语言",唯一有趣的事情是关于其设计和人性化方面的:"用这种方式做事情有多容易,或者那种方式有多简单?"
Bash是一种语言;它只是一种非常糟糕的语言,因为它的语法和语义(求值规则)不一致且过于复杂,这是由于无能和试图在同一个接口上做两件截然不同的事情所导致的。现在我们都被迫使用它笨拙的语言,就像我们被迫居住在这个继承自各种应急措施和临时修补的现代计算堆栈之中一样,真是个诅咒。

该死的,当你批评那些糟糕设计的东西,颈胡子们会非常生气!谁能想到呢? - iono

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接