查看最多(如果不是全部)动态语言(例如Python,PHP,Perl和Ruby),它们都将被解释。如果我错了纠正我。动态语言有没有经过编译阶段的示例?动态语言与解释语言是否相同?
查看最多(如果不是全部)动态语言(例如Python,PHP,Perl和Ruby),它们都将被解释。如果我错了纠正我。动态语言有没有经过编译阶段的示例?动态语言与解释语言是否相同?
Answers:
查看最多(如果不是全部)动态语言(例如,Python,PHP,Perl和Ruby),它们都可以被解释。
不对。您可以编译Python源代码。那是一个存在的证明。
有用于静态类型语言的解释器和用于动态类型语言的编译器。这两个概念是正交的。
旁注:通常,一种语言就是:一种语言,具有一组表达语义的语法结构。如果您在白板上编写Python,它仍称为Python!它的实施,可以是翻译或编译器。静态类型或动态类型(两者的混合体)是语言的属性,而通过解释或编译执行程序是实现的属性。
.pyc
文件是字节码。Python源代码经过解析,优化和编译以创建它们。字节码指令是相对高级的,并且最流行的实现是普通的解释器(相比之下,请看PyPy,它在运行时通过JIT将字节码编译为非常聪明的机器代码),但是Python的编译过程并不比Java或Java少。 C#。仅当“编译”仅限于本机提前编译时,Python才“未编译” ,但是没有人对此发表任何意见,并且通常它可以引用任何语言到语言的转换。
Python
和CPython
,而后者是前者的实现,所以也是PyPy
。
Common Lisp是动态(强烈)键入的,通常是编译的。
由于这种动态性是在运行时实现的,因此可以在源代码中使用一些指令,以确保编译器符号仅包含某种值,以便编译器可以优化生成的代码并提高性能。
node.js基于Google的V8 JavaScript引擎。V8进行运行时编译。鉴于这一事实,V8的速度令人目眩。只需查看http://shootout.alioth.debian.org并比较V8与上述任何一种解释语言。
否-编译动态语言当然是可能的。
甚至有些动态语言总是通过设计编译的(例如Clojure)。
然而,这个问题涉及到一个重要的相关点:尽管可以编译动态语言,但通常情况下,无法将动态语言编译成与静态类型的语言一样有效的代码。这是因为动态语言中的某些固有功能需要进行运行时检查,而这在静态编译的语言中是不必要的。
这样的一个例子:允许对对象进行运行时修补的语言(例如Ruby)通常在您在对象上调用方法时都需要检查该对象(使用哈希表查找或类似方法)。即使已编译,编译器也将不得不在运行时生成代码以进行方法查找。在某种程度上,此方法查找与解释器必须执行的操作并无不同。
与Java之类的语言中的方法调用相比,这增加了相当大的开销,在Java中,正确的方法可以由编译器根据类定义静态确定,并可以用本机代码简化为简单的函数调用。
我相信,这种影响比其他任何因素都更能导致动态语言的性能平均比静态编译的语言慢。从有缺陷的基准中可以看到,排名靠后的是静态类型的语言(C,Java,Fortran等),而动态语言(Perl,Python,Ruby,PHP等)的运行速度最快。
从前,BASIC被解释了。BASIC的某些变体具有动态类型。您也可以为他们获得编译器。
(这可以追溯到10万张软盘驱动器的时代,当时恐龙仍在地球上漫游,并以毫无戒心的软件开发人员吃早餐。)
是。所有动态语言都是解释性语言(但解释性语言可能不是动态的)。
原因很简单:如果它是动态的,则需要一个解释器来在二进制编译级别执行动态性。
例如 :当我们将数据放入PHP变量中,然后再放入另一个不同类型的数据时,我们的程序无法编译为二进制代码,因为每种类型都有自己的二进制表示格式;解释器以动态方式管理二进制级别的移位