一个简单的问题,我想了解“运行时”这个术语在编程和软件工程中的具体含义。
我对这个术语的研究越多,我越觉得它可能有几种不同的含义,比如
1 程序实际执行的时间空间
2 系统运行时
3 运行环境
4 运行时系统
5 运行时库
那么当使用术语“运行时”时,它指的是其中哪一个?或者也许它不是指其中任何一个,而是指完全不同的东西。
这也是我在维基百科上运行时所指的一个例子
谢谢
2
5 个回答
5
运行时这个词(也可能是同音双词术语“运行时间”或复合术语“运行时”)在计算环境中确实具有多种含义。
那么当使用术语“运行时”时,它指的是其中哪一个?或者也许它不是指其中任何一个,而是指完全不同的东西。
您似乎是从只有一种含义这一想法出发的。事实上,含义有很多种,而且同一个术语可以用于所有含义。
可能会想出一个像“运行时的运行时”这样愚蠢的句子,但它却非常有意义(即使不是非常清楚)。
第一个运行时间指的是执行速度,第二个运行时间指的是支持特定编程语言并在执行已编译程序时使用的库模块,第三个运行时间指的是程序执行的时间(与编译时或存储但未运行的时间相反)。
使用哪种含义应由读者根据上下文来判断。
3
-
5多重含义的一个典型例子是
– -
1“你似乎是从只有一种含义的想法出发的。事实上,有很多种含义,同一个术语可以用于所有含义。”—— OP 的问题本身就是一个很好的例子,因为 OP 使用的编程术语在软件工程和电视中有着非常不同的含义。
– -
@JörgWMittag,确实如此,尽管至少在这种情况下,他可以说它们是两个完全不同的上下文 – 就像铸造厂里的铁和洗衣房里的铁的含义不同。我认为让 OP 感到惊讶的是,即使在同一个软件上下文中,一个词仍然可以有多种含义。
–
|
是的,这是一个模棱两可的术语。
由于通常情况下,歧义术语都是如此,为了消除歧义,您需要检查该术语所处的上下文。
-
如果您看到“在运行时”,则表示程序正在运行。
-
如果您看到“通过运行时”,则意味着通过执行环境。
-
在 C 语言的上下文中,这是 C 运行库。
-
在 Java 语言的上下文中,这是 Java 虚拟机和相关的运行时库。
-
…事情就这样继续下去。
|
从经验上来说:
“运行时间”这两个词很可能是指程序运行的实际时间。这可能是用时钟测量的时间,或者更抽象的东西,例如“算法的运行时间为 O(n^2)”(与输入大小的平方成正比)。
“运行时”带连字符,通常表示“程序执行时,而不是编译时”。例如:“自动测试是将运行时崩溃转变为编译时错误的好方法”,或“在有故障硬件的系统上,正确的程序通常仍会在运行时崩溃。”
“运行时”这个词通常表示程序运行所需的支持软件和库,但通常不是指硬件或操作系统。例如:“Java 运行时一直比 Python 运行时快,但差距正在缩小”,或“要在 Windows 上运行此程序,您需要最新版本的 .NET 运行时”。说“此程序是为 Windows XP 编写的,因此在 Windows 11 运行时会崩溃”是不合时宜的。您只会说“它在 Windows 11 上崩溃了”。
您的问题涉及“系统运行时”、“运行时环境”、“运行时系统”和“运行时库”,这些都是“程序所需的支持软件”主题的变体。按照惯例和传统,不同的语言甚至不同的个人作者倾向于对类似的支持软件使用不同的措辞。
其中存在细微差别。对于 Java,您可能会说“系统运行时”来描述在整个操作系统中全局安装的 Java 版本,这与“应用程序运行时”或“本地运行时”不同,后者是您自己安装的用于程序的特定 Java 版本。在这种情况下,“系统”起形容词的作用。
类似地,“运行时环境”通常被解释为当前活动的配置,尤其是环境变量。你永远不会说“运行时系统”是指这个意思。就像精通一门外语一样,学习这个术语的最好方法就是亲身体验。
1
-
我觉得如果能添加词源并强调运行时是程序所需的支持软件,在运行时可以找到并连接到该软件,那就更好了。或者换句话说,这个支持软件在编译时不包含在内——它存在于用户的计算机上(在倒数第二个 P 中)。理想情况下,这只需要几个词,但我认为不是最好的地方。
–
|
从负面角度考虑是最有用的。运行时 == “不是编译时”
|
运行时最有趣和最棘手的用法与编译时形成对比,并且通常与错误有关。运行时是指客户运行您的程序时,错误导致程序崩溃并让您看起来很糟糕。编译时(基本上)是指您(程序员)仍在编写程序时。在编译时,相同的错误会在行的一部分下产生红色波浪线,并告诉我们为什么那件事可能是个问题。从这个意义上讲,运行时意味着“糟糕”,而编译时意味着“好”(要清楚,运行时库和运行时环境以及运行时系统是它们各自不同的东西)。
例如,“ C# 繁琐的继承规则允许编译时检查”是说,C# 确实需要更长的时间来输入,但代价是它会立即标出可能的错误。而“ python 具有超级简单的多态性,但它是在运行时检查的”意味着,Python 确实写起来更快,但也有不好的一面。更具体地说,如果你说“giftWrap(x)”,但忘记了 x 可能是一只猫,C# 会立即在其下划线 (*),并警告你有关猫的信息。Python 不会。程序在测试时会运行良好,直到你最终用猫运行测试时它崩溃了。两种情况下的错误相同,但在运行时,需要更长的时间才能找到它,我们可能会错过它。
显然,我们之所以说“编译时”需要解释一下。过去,您基本上是在记事本中输入程序。计算机从未将您的文字视为程序,直到您将其通过编译器(程序)运行。编译器会尝试读取它,如果读不出来就会向您大喊大叫,将其转换为 0 和 1,然后对其进行优化并给出有用的警告。所花费的时间是“编译时”,它给出的消息是编译时错误。但如今,编译器被拆分了。IDE 不断运行一半的版本(检查它是否可以读取您的程序的部分,以及寻找可能的逻辑错误的部分)。这就是您得到红色波浪线的原因。另一半在您按下“创建可执行文件”按钮时运行(分解为低级代码并进行优化)。出于传统,我们仍然说“编译时”,就好像编译器以旧方式运行一样。
这并不总是与错误有关,而是同一个概念。例如,“ Java 编译为字节码,并在运行时进行解释”意味着部分工作在客户获得 Java 程序之前完成,这是好的,但其余工作在客户运行它时完成,这会使它稍微慢一点,所以是不好的。或者“重载运算符在编译时处理”是说一件好事。您可能认为 w1+w2 会使程序在运行时暂停并在 3+6 或“cup”+“cake”之间做出选择。但这里的“编译时”表示它可以提前弄清楚,这使它运行得更快。
一旦你对编译时和运行时感到满意,你就应该能够弄清楚其他用途。例如,编译时库显然是提前添加到程序中的库,而运行时库意味着它在运行程序时以某种方式获取它。了解这么多可能足以阅读一篇关于它们的好文章。
(*) 假设您的程序没有定义一种包装猫咪的方法。如果定义了,则不会出现错误,也不用担心。
|
–
–
|