其他分享
首页 > 其他分享> > 可以为动态语言创建编译器而不会失去其动态特性吗?

可以为动态语言创建编译器而不会失去其动态特性吗?

作者:互联网

是否有一些原因使诸如Python或Ruby之类的动态语言无法编译而不被解释而又不会失去其任何动态特性?

当然,对于这种假设的编译器的要求是,这些语言在运行时不会失去元编程,扩展对象,添加代码或修改类型系统等特性.

总而言之,有可能创建一个Ruby或Python编译器而不会失去他作为动态编程语言的任何特征吗?

解决方法:

是的,绝对有可能为动态语言创建编译器.野外有无数动态语言编译器的示例:

> CPython是具有Python编译器的Python编程语言的实现.
> PyPy是具有Python编译器的Python编程语言的实现.
> Jython是具有Python编译器的Python编程语言的实现.
> IronPython是具有Python编译器的Python编程语言的实现.
> Pynie是具有Python编译器的Python编程语言的实现.
> YARV是具有Ruby编译器的Ruby编程语言的实现.
> Rubinius是具有Ruby编译器的Ruby编程语言的实现.
> MacRuby是具有Ruby编译器的Ruby编程语言的实现.
> JRuby是具有Ruby编译器的Ruby编程语言的实现.
> IronRuby是具有Ruby编译器的Ruby编程语言的实现.
> MagLev是具有Ruby编译器的Ruby编程语言的实现.
> Quercus是具有PHP编译器的PHP编程语言的实现.
> P8是具有PHP编译器的PHP编程语言的实现.
> V8是具有ECMAScript编译器的ECMAScript编程语言的实现.

通常,每种语言都可以由编译器实现,并且每种语言都可以由解释器实现.也可以从解释器自动导出编译器,反之亦然.

大多数现代语言实现都使用解释和编译,有时甚至使用几个编译器.以Rubinius为例:首先将Ruby代码编译为Rubinius字节码.然后,Rubinius VM会解释Rubinius字节码.经过多次解释的代码然后编译为Rubinius编译器IR,然后再编译为LLVM IR,然后再编译为“本机代码”(无论是哪种方式).因此,Rubinius有一个解释器和三个编译器.

V8是另一个示例.它实际上没有解释器,但是有两个不同的编译器:一个非常快速,非常节省内存的编译器,它会生成未优化的,有些慢的代码.然后,将多次运行的代码丢弃,并使用第二个编译器再次进行编译,这将产生经过积极优化的代码,但在编译过程中会花费更多时间并使用更多内存.

但是,最后,如果没有解释器,您将无法运行代码.编译器无法运行代码.编译器将程序从一种语言翻译成另一种语言.而已.您可以翻译所有想要的内容,最后,必须运行某些代码,而该事情是解释器.它可以用软件或芯片来实现,但它仍然是解释器.

标签:dynamic-languages,compiler-construction,ruby,python,compilation
来源: https://codeday.me/bug/20191122/2062588.html