7

谈谈对编程语言的一般性认识

 2 years ago
source link: https://changkun.de/blog/posts/%E8%B0%88%E8%B0%88%E5%AF%B9%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E7%9A%84%E4%B8%80%E8%88%AC%E6%80%A7%E8%AE%A4%E8%AF%86/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

谈谈对编程语言的一般性认识

Published at:

2014-03-22

  |  

Reading: 858 words ~2min

  |  

PV/UV: 8/8

前段时间做了个无聊的事情,算了算我大概学会使用了多少门编程语言,最后的结果是:十二门。(C, C++, Objective-C, Mathematica, Maple, Linux Shell, Java, Matlab, Lua, Python, assembly, R.)

然而细细一想又觉得很不靠谱,因为真正我自己觉得可能算是精通的的语言只有两门:Mathematica(我把它简称为MM) 和 Objective-C(我把它简称为OC)。

OC学起来很快,它和C++、Java这些面向对象的语言十分类似,不过,差距也显得比较突兀,我自己的学习顺序是:C -> C++ -> Java -> OC,好在我在学习OC之前对Java有了一个较为全面的了解,加之对C++一些肤浅的理解,算是稍微理解了一些OC的范式与模板了。

OC采用的是一种叫做“Messaging Structure”而非"Function Calling"的机制。我们可以对比一下下面的代码:

// Function Calling (c++)
Person *person = new Person;
person->walk(parameter1, parameter2);
#pragma mark Messaging Structure (oc)
Person *person = [Person new];
[person walkWith:parameter1 and:parameter2];

他们一个比较本质的区别在于,使用Messaging Structure的语言,运行时所应执行的代码是由运行环境决定的,而使用函数调用的语言,则是由编译器决定的。如果调用的函数是多态的,那么运行时就需要一种叫做“Virtual Table”的机制来检查到底应该执行哪个寒素实现。采用消息结构的语言,不论是否多态,总是在运行时才会去查找所需执行的方法。其实,编译器都不会去关心接受消息的对象是什么类型。接受消息的对象问题也需要再运行时处理,其实这样的一个过程就是我们所熟知的“Dynamic Binding”。

OC的重要工作都是由运行期组件而非编译器完成的。举个例子,运行期组件里面含有全套内存管理的方法,运行期组件本质上就是一种与开发者所编代码相链接的一个所谓的"Dynamic Library",其代码能把开发者编写的所有程序粘合起来。这样的话,只要更新相应的运行期组件,马上就可以获得性能的提升,而那些很多工作都是处于编译期完成的语言(比如C++),想要获得类似的性能提升,就需要重新编译了。

下面配一张动态绑定这一特性,c++的OOP和其他语言的OOP的态度。

1.jpg


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK