当我们运行java程序时,如果没有安装JRE,它就不起作用 我发现大多数着名的应用程序,如Google Chrome浏览器都是用C ++编写的。那么Windows如何在没有任何C ++运行时环境的情况下运行这样的程序?安装过程中究竟发生了什么?
答案 0 :(得分:25)
那么Windows如何在没有任何运行时间的情况下运行这样的程序 C ++的环境?
问题的前提实际上并非如此。至少在Windows上,实际上有一个C ++的运行时环境。此运行时的一个组件(可能是最重要的组件)称为C运行时或CRT。 : - )
通常在程序进入main()
函数之前,CRT会执行一系列初始化例程,当您从main()
函数返回时,它会自行清理。这种舞蹈的重点在于提供几乎所有C和C ++程序都需要的标准功能。
如果您在启动Windows程序时遇到过丢失msvcrt.dll
或类似错误(例如msvcr110.dll
更新程序)的错误,那么缺少CRT就是程序抱怨。 msvcrt.dll
是实现CRT的文件。它代表“Microsoft Visual C Runtime”。
显然,msvcrt.dll
及其亲属附带Windows操作系统,这就是为什么通常不会遇到缺少运行时环境的问题,这与JRE不同,JRE必须由用户安装或由计算机制造商。
但是,Windows C ++应用程序被编译为使用特定版本的MSVCRT,如果您有错误的版本的MSVCRT,那么操作系统会抱怨它的方式与缺少。*安装人员通常做的是检查操作系统是否具有正确的版本,如果没有,则将其从计算机的某个位置复制到自己的安装文件中。
但是,对于所有Windows程序来说,MSVCRT不是必需的,也不是充分条件。编写一个不依赖于MSVCRT的程序是完全可能的,并且完全有可能Windows程序将具有除MSVCRT之外的依赖项。几乎所有重要的Windows程序都依赖于MSVCRT和其他操作系统组件。该程序的安装程序也会检查这些。
JRE和MSVCRT之间存在一些重要差异。一个很大的区别是JRE实现了Java应用程序的虚拟机环境(这就是它实现了它的“跨平台”功能),这可能涉及即时编译等,而MSVCRT只提供标准功能而且什么都不做关于C ++程序的汇编代码。
*这并不严格正确,因为C ++应用程序可以静态链接到MSVCRT,而MSVCRT不依赖于DLL。但是,大多数Windows C ++应用程序动态地链接到它,在这种情况下需要正确的DLL。
答案 1 :(得分:3)
这个问题似乎很明显,但如果我们稍微挖掘一下,那就显而易见了。 让我给你一个更抽象的观点:
每种语言都可以通过合适的机器“执行”,该机器将语言指令连接到特定的硬件“操作”。不同之处在于“接线”是如何完成的: direct <多少/ em>当设置时和。
一个窗口(但同样适用于linux)的机器至少是由处理器机器代码调用的某些“重要”DLL(例如Kernel.dll)所暴露的一组函数。
C程序通常在编译时被转换为机器代码,该机器代码将系统调用置于该“协议”之下。不需要任何其他功能的程序可以在该环境中本地执行。
需要其他功能的程序可以:
Java程序,就像设计和实现Java语言一样,不会直接转换为机器代码。它转换为一种中间语言(字节代码),必须用作实际执行其指令的interpeter(java机器)的“输入”,方法是将机器代码作用到底层机器上。
由于Windows本身不是用Java编写的,因此它本身不需要这样的解释器,因此您无法直接在Windows安装中找到它,但如果需要,您必须将它放在那里。
答案 2 :(得分:2)
澄清一下,java程序通过jdk编译为字节码,然后在jre中运行
将c ++程序直接编译为机器可读代码,就像jre必须编译为在windows中运行一样
答案 3 :(得分:2)
运行时(或C或C ++标准库)通常安装有操作系统(glibc,msvcrt,...)。
C / C ++程序也可以“静态”编译,程序使用的库部件链接(合并)到可执行文件中,因此程序在其自己的二进制文件中有库。
执行Java代码的“虚拟机”。 C ++通常被编译为将运行的系统的本机机器代码。 CPU是将运行它的非虚拟机。
也可以将C ++程序编译成各种“字节码”(.NET CLR,LLVM),但这种情况不太常见。