api - 编程语言和 OS API 之间的关系

标签 api operating-system jvm

在 C++ 中有程序语言中的方法,例如
cout<<"hello world"

编译时是否调用系统调用来执行实际工作 是否直接编译为二进制代码并由内核执行?

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

最佳答案

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

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

好的,让我们以您的为例:

cout << "hello world";

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

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

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

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

编辑:
这是一种粗略的过度简化。编译器的工作只是将您选择的语言中的代码转换为可以执行的代码。链接器将其与标准库相结合。库的选择是你的,尽管链接器可能具有默认隐藏,直到你准备好做出明智的选择。决定调用什么是相关库的工作。

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

关于api - 编程语言和 OS API 之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3941473/

相关文章:

ruby-on-rails - Rails 上的 OAuth(Twitter、Facebook、LinkedIn 等)

linux - PC引导过程一步一步

c++ - 如何将文件内容复制到虚拟内存中?

android - 无法启动Gradle守护程序。而且由于非ASCII字符而无法加载Project

c++ - 游戏引擎如何针对多个平台进行编译?

ruby-on-rails - 通过 ResourceNotFound 继续循环?

cpu - 更改中断 vector 表

java - intellij idea 创建JVM失败错误代码-1

java - 年轻代的大小将如何调整?

api - 是否有任何免费的自定义搜索API(例如Google自定义搜索)?