关于动态语言的动态性

发布于: 2016-11-01 18:50
阅读: 905
评论: 0
喜欢: 8

作者:Enum

原文链接:http://posts.enumsblog.com/posts/16008

TAG: Other


引言

这是今天晚餐时候跟同事聊到的话题。大家如果有不同的见解欢迎评论提出。

正文

对于做 iOS 的同行们来说,动态语言这个词再熟悉不过。那么到底什么是动态语言呢?到底动态语言和静态语言有什么区别呢?

维基百科说:

Dynamic programming language, in computer science, is a class of high-level programming languages which, at runtime, execute many common programming behaviors that static programming languages perform during compilation. These behaviors could include extension of the program, by adding new code, by extending objects and definitions, or by modifying the type system.

百度百科说:

动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。

然而这些都是对用法和现象上的描述。例如在 Objective-C 中调用了A函数。但是我到底是不是真的会调用A函数呢?不一定。真正调用到什么函数是运行时决定的而非编译时决定的。

这个概念想必大家都听腻了,今天换个角度来说。例如维基百科在「Dynamic programming language」词条第一段就提到的LispLisp是动态语言,它可以做到自更新,程序在运行过程中自己维护自己,自己更新自己。然而它的编译器却是可以被C语言实现的,而C/C++却是静态语言。这就意味着Lisp的动态性,在C/C++上是完全可以实现的。

这是个非常有意思的问题,Lisp的动态性是静态语言赋予的。那么我完全可以用C/C++实现一个"dynamic C/C++"的编译器,新语言编写时全部使用C/C++的语法,在编译代码时将代码调用全部翻译成类似 Objective-C 中的msg_send形式,在运行时动态的调用函数指针,那么这时候的C/C++也获得了动态性。这样看来,动态性完全跟语言本身没有关系,动态能力是编译器赋予的。

所以,我得出的结论是:所谓语言的动态性是编译器赋予的,和语言本身无关。

One more thing

另一个小话题是关于语言本身。当一个语言能够自己实现自己的时候,也就意味着这门语言满足了某完备性(同事说的,没记住)。语言到达这个层面后就是平等的了。就像C语言,你说C是静态语言,那好,我首先在程序里用C实现一个 Objective-C Runtime,之后程序的代码都在这个 Runtime 上运行,那这时候你还能说C语言是静态语言吗?

更新

2016年11月02日 —— 关于 Objective-C 的动态性

经过昨晚被大神们的批判,澄清一下:

Objective-C 是动态语言!

Objective-C 是动态语言!

Objective-C 是动态语言!

Objective-C 的动态性是怎么获得的呢?这里用一下阳神的图:

这是Xcode的编译器结构,简单分为三层:

  • clang将代码翻译成 IR 语言的过程。
  • 优化过程。
  • IR 语言翻译成机器码过程。

在第一个过程中,有一个 oc 代码跟 Runtime 库进行对接的过程,即翻译成msg_send形式,将函数调用都翻译成这个形式以后再进入 IR 语言翻译阶段。因此 Objective-C 的动态性是在这一步获得的。

因此关于这个问题,殿神「酷酷的哀殿」有个更准确些的说法:

Objective-C 的动态性是由 runtime 相关的库赋予的

当然其他语言也完全可以运行在一个 Runtime 库上而获得动态性,由于多数高级语言的诞生都对应着一种编译器,因此将编译器的特性概括进语言里讲,也不是不可以。


Thanks for reading.

All the best wishes for you! 💕