编程语言和操作系统API之间的关系

dan*_*nny 5 api operating-system jvm

C++ 中的程序语言中有一些方法,例如

cout<<"hello world"

编译时,它会调用系统调用来执行实际工作,还是直接编译成二进制代码并由内核执行?

如果使用OS API,不同的平台使用不同的OS API,语言怎么可能相同呢?

Pre*_*gha 4

好吧,用我能想到的最简单的术语来说。

语言编译为您编写的可执行代码,并且与为相关平台编写的代码库链接。可以通过定义 API 来标准化库代码。对于每个平台,通常需要不同的标准库。对于大多数平台,还可以使用较低级别的 API(由操作系统定义)。然后,语言标准库可以选择访问操作系统 API 或直接复制功能。您可以打赌,在大多数情况下都会使用操作系统 API - 但这并不是我所指出的唯一选择。

好的,让我们以你的例子为例:

cout << "hello world";
Run Code Online (Sandbox Code Playgroud)

假设你编译了这个。本质上,您的编译实质上会将其转换为一个调用,该调用将字符串发送到一段代码,该代码要么调用操作系统 api(称为 WriteStringToConsole),要么调用较低级别的组件,例如要显示的视频卡拼出字符串内容的像素。或者它可以介于两者之间。这就是它的选择。重要的是语言定义被您选择的平台上的编译器更改为对某些标准函数的调用。

现在代码是否可以写入机器或必须进行操作系统调用是操作系统设计者的选择。例如,在 MS DOS 中,您可以直接写入硬件。然而,在当前版本的 WINDOWS 中,操作系统设计者采用许多策略来确保满足系统设计目标(例如安全性或稳定性等),并且他们可能会迫使您在标准库中使用特定的操作系统调用,而不是较低级别的调用。

然而,这一切都归结为一件事。您使用编译器制造商已使其与一个或多个标准库兼容的语言编写代码。注意您可能自己编写了其中一些库(例如可重用代码,例如您语言中的函数)。

简单来说,该语言就是您的 API。该语言可以使用许多其他 API(库),其中一些比其他 API 更标准。然后,这些库将使用其他库/API 等,直到一些电子并沿着电气轨道移动。然而,随着电气组件也具有标准化 API,这种范例实际上会进一步延续,只是实现方式与软件不同。

编辑:这是一个严重的过度简化。编译器的工作只是将您选择的语言的代码转换为可以执行的代码。链接器将其与标准库结合起来。库的选择是您的,尽管链接器可能有默认值,这些默认值被巧妙地隐藏起来,直到您准备好做出明智的选择。相关图书馆有责任决定拨打哪些电话。

现在,如果您编写代码并且不进行自己的操作系统调用,而只调用标准库,那么您开始获得称为可移植代码的东西,可以将其带到另一个平台并进行编译,从而在那里执行。这又是一种简化,因为还有许多其他特定于平台的事情需要考虑。实际上,您可以通过称为交叉编译的过程进一步实现这一点,在该过程中,您在一个平台上进行编译,但代码将在另一个平台上执行 - 但我将其作为练习留给读者。