源码

首页 » 归档 » 源码 » 讨论:关于动态语言的动态性-ios学习从入门到精通尽在姬长信

讨论:关于动态语言的动态性-ios学习从入门到精通尽在姬长信

分享最热门的资讯

正文

  对于做 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 的动态性是怎么获得的呢?这里用一下阳神的图:

538901-4d589bb84147337d.jpg

ios学习从入门到精通尽在姬长信

(1)

本文由 姬長信 创作,文章地址:https://blog.isoyu.com/archives/1567.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:11 月 7, 2016 at 07:57 下午

热评文章

发表回复

[必填]

我是人?

提交后请等待三秒以免造成未提交成功和重复