编译语言与解释型语言
我试图更好地了解这种差异。我在网上找到了很多解释,但它们倾向于抽象的差异,而不是实际的含义。
我的大部分编程经验都是使用CPython(动态的,解释的)和Java(静态的,编译的)。但是,我知道还有其他种类的解释和编译语言。除了可执行文件可以从用编译语言编写的程序中分发之外,每种类型的类型是否有任何优点/缺点?我经常听到人们争辩说解释型语言可以交互式使用,但我相信编译语言也可以具有交互式实现,对吗?
我试图更好地了解这种差异。我在网上找到了很多解释,但它们倾向于抽象的差异,而不是实际的含义。
我的大部分编程经验都是使用CPython(动态的,解释的)和Java(静态的,编译的)。但是,我知道还有其他种类的解释和编译语言。除了可执行文件可以从用编译语言编写的程序中分发之外,每种类型的类型是否有任何优点/缺点?我经常听到人们争辩说解释型语言可以交互式使用,但我相信编译语言也可以具有交互式实现,对吗?
编译语言是程序一旦编译,就用目标计算机的指令表示的语言。例如,源代码中的加法“+”操作可以直接转换为机器代码中的“ADD”指令。
解释型语言是指指令不是由目标机器直接执行,而是由其他程序(通常用本机的语言编写)读取和执行的语言。例如,解释器将在运行时识别相同的“+”操作,然后解释器将使用适当的参数调用自己的“add(a,b)”函数,然后执行机器代码“ADD”指令。
你可以做任何你能用编译语言的解释型语言做的事情,反之亦然 - 它们都是图灵完备的。然而,两者在实现和使用方面都有优点和缺点。
我将完全概括(纯粹主义者原谅我!)但是,粗略地说,以下是编译语言的优点:
以下是解释型语言的优点:
请注意,诸如字节码编译之类的现代技术增加了一些额外的复杂性 - 这里发生的事情是编译器针对的是与底层硬件不同的“虚拟机”。然后,可以在稍后阶段再次编译这些虚拟机指令以获取本机代码(例如,由Java JVM JIT编译器完成)。
一种语言本身既不是编译的,也不是解释的,只有语言的特定实现才是。Java就是一个很好的例子。有一个基于字节码的平台(JVM),一个本机编译器(gcj)和一个用于Java超集(bsh)的interpeter。那么现在的Java是什么呢?字节码编译、本机编译还是解释?
其他语言,编译和解释,是Scala,Haskell或Ocaml。这些语言中的每一种都有一个交互式解释器,以及一个字节码或本机机器码的编译器。
因此,通常按“编译”和“解释”对语言进行分类没有多大意义。