在c ++中有程序语言的方法,如
cout<<"hello world"
。
编译时它调用系统调用来执行实际工作 OR 它是否直接编译成二进制代码并由内核执行?
如果它使用OS API,使用不同OS API的不同平台,语言怎么能相同?
答案 0 :(得分:3)
我能想到的最简单的术语。
语言编译为您编写的可执行代码,并且与为相关平台编写的代码库链接。可以通过定义API来标准化库代码。对于每个平台,通常需要不同的标准库。对于大多数平台,也可以使用较低级别的api(由OS定义)。然后,语言标准库可以选择访问OS API或直接复制功能。您可以打赌,在大多数情况下,将使用OS API - 但这并不是我所指出的唯一选择。
好的,举个例子:
cout << "hello world";
让我们说你编译它。从本质上讲,你的编译本质上将把它变成一个调用,它将一个字符串发送到一段代码,该代码将调用OS api(比如称为WriteStringToConsole),或者它可以调用较低级别的组件,比如要显示的视频卡拼写字符串内容的像素。或者它可以介于两者之间。这是它的选择。重要的是语言定义在您选择的平台上被编译器调用为某些标准函数。
现在,操作系统设计人员是否可以选择代码是否可以写入机器还是必须进行OS调用。例如,在MS DOS中,您可以直接写入硬件。然而,在当前版本的WINDOWS中,OS设计人员采用了许多策略来确保满足系统设计目标,例如安全性或稳定性等,并且它们可能会迫使您在标准库中使用特定的OS调用,而不是低级调用。
然而,所有这些归结为一件事。您使用编译器制造商已与一个或多个标准库兼容的语言编写代码。您可能自己编写了一些这些库(例如可重复使用的代码,例如您的语言中的函数)。
语言是简单意义上的API。该语言可以使用许多其他API(库),有些比其他API更标准。然后,这些图书馆将使用其他库/ API等,直到一些电子向下移动电轨。然而,这种模式实际上还在继续,因为电子组件也有标准化的API,只是实现与软件不同。
编辑: 这是一个严重的过度简化。编译器的工作就是将您所选语言的代码转换为可执行的代码。 Linker采用了这种方式并与stanard库结合使用。库的选择是你的,虽然链接器可能有默认隐藏,直到你准备做出明智的选择。有关图书馆的工作是决定要拨打什么电话。
现在,如果您编写代码并且不进行自己的OS调用并且只调用stanard库,那么您就会开始获得一些称为可移植代码的东西,这些代码可以被带到另一个平台并进行编译并在那里执行。再次简化,因为许多其他平台特定事项需要考虑。实际上,您可以通过一个称为交叉编译的过程来进一步实现这一点,您可以在一个平台上进行编译,但代码将在另一个平台上执行 - 但我将其留作读者练习。
答案 1 :(得分:1)
C \ C ++背后的想法是写一次 - COMPILE 很多,不像java应该写一次运行很多。 基本上你是对的,当你编译基本的cout \ printf \ puts等..只是程序中的标题,实际实现驻留在一个dll \ so文件或一个静态obj \ a文件(depandig你静态链接哪个使您的executabl可移植或动态密码链接,使您的软件和它编译的库(包括版本)之间的依赖关系。 这个实现通常附带编译器(VS \ gcc),除非你得到一些包含一些低级系统交互的外部库。