0

大家好
我最近遇到一些疑惑
比如说 objective-c是一种运行时
我想问一下 具备什么特征才称为 运行时?

我看到有说 动态绑定 的。也举了个例子,在C语言中,比如函数指针调用函数的时候,这就是动态绑定(在运行时确定函数入口),那么C算运行时吗?

以及,为什么会出现 运行时 这种东西呢,为了解决什么问题呢?

admos 569
2016-03-09 提问
4 个回答
2

已采纳

引用一楼的

程序一般都有2个阶段,一个是编译阶段,一个是运行阶段,编译阶段主要是语法问题,当程序编译成机器识别的2进制代码后,第二个阶段才是运行,运行时,是指程序运行过程中的操作。

但也有说得不准确的地方,并不是所有的源码都被直接编译成二进制代码,比如Java,是被javac编译器编译为Java字节码(即所谓的.class文件),然后用JRE(Java Runtime Environment,即Java运行时环境)在运行时即时将字节码翻译成二进制代码运行(字节码本身当然不能直接运行,cpu可只认二进制代码)。而C则不同,编译器直接将其编译为二进制文件,一旦开始运行,就全速运行二进制代码,即所谓的编译型语言。而Java则在运行时多了一步解释Java字节码,所以理论上会慢一些。Java算是一种半编译半解释型语言,而像python这种可以说是纯粹的解释型语言,直接将源码拿着解释执行,为了提升速度,有一些工具也可以将解释型语言强行编译成二进制代码。
所谓的运行时,其实就是指程序运行的时候,有的时候也会直接代表运行时环境(就是直接把环境两个字给省略掉了),比如所谓的C语言运行时。像类继承中的虚函数的动态绑定,假设DerivedClass继承自BaseClass,BaseClass中定义了一个虚方法,并在DerivedClass中将其复写(即override),对一个BaseClass指针或者引用调用该虚方法,那么到底是调用DerivedClass中的方法还是BaseClass的方法,则是在运行时根据该指针或者引用的具体指向的对象的类型决定的,在编译期可无法进行判断。还可以举一个例子(因为我对Java语法不是很熟,就不写源代码了。。。),就是Java中类型转换,比如你要将一个BaseClass引用转化为DerivedClass引用,那么在编译期会干什么呢?编译器会检查DerivedClass是不是确实是BaseClass的派生类,转化是不是在语法上就可行。那么在运行时会干什么呢?Java虚拟机会检查该引用是不是确实指向一个DerivedClass对象,是的,才能转化,不是,当然不能转化,而该引用到底是不是指向一个DerivedClass对象,这只能在运行时判断,不能在编译期判断。
至于题主说到的函数指针,我想那个举例子的人的意思大概是,函数指针可以随意指向任何具有该签名式的函数,当你解引用函数指针并调用的时候,具体调用哪个函数,是在运行时由函数指针具体指向的地址来决定的,而在编译期没法判断具体指向哪个函数。(另外,由于函数指针本身就是个指针,所以它指向的位置到底是不是个正确的函数,编译器没法判断,万一你一不小心给了一个错误的地址,那么你的程序在编译的时候很肯能不会报错,而一旦开始运行,多半是会crash的,所以说函数指针不是很安全。)
希望以上能够帮助题主理解“运行时”!

1

程序一般都有2个阶段,一个是编译阶段,一个是运行阶段,编译阶段主要是语法问题,当程序编译成机器识别的2进制代码后,第二个阶段才是运行,运行时,是指程序运行过程中的操作。

1

你需要先了解何谓 静态语言 ,何谓 静态语言

1

你需要先了解何谓 静态语言 ,何谓 静态语言

Runtime is when a program is running (or being executable). That is, when you start a program running in a computer, it is runtime for that program. In some programming languages, certain reusable programs or "routines" are built and packaged as a "runtime library."

撰写答案

你可能感兴趣的

推广链接