Java 运行时提供一组标准系统库供程序使用。这些库在多大程度上类似于操作系统的系统调用,又在多大程度上不同???
4 回答
java 的一半目的是让它独立于平台,所以它试图做的是提供一个不管它下面的操作系统如何都保持不变的 api。
如果操作系统功能不足,Java 将添加库代码来弥补它。
如果操作系统有一个不映射的实现,Java 会尽力映射它。
如果新功能变得流行并且 Java 用户需要提供对它的访问权限,则可以创建一个新库,您可以通过该库访问新功能。如果这个库很流行,它将在某个时候进行重组并添加到 Java SDK 中
例如,一些并发库的实现变得流行起来,很快它们就被投票通过并添加到标准库中。这事儿常常发生。
这显然取决于您运行的操作系统,因为每个操作系统的系统调用通常都不同:-)。
也就是说,我相信 Java 主要是受到 Unix 约定的启发(并不奇怪,因为 Sun 是 Unix 供应商),所以一些 Java 系统库类似于 Unix 系统调用。
例如 java.nio.MappedByteBuffer 可能是受到 Unix 的 mmap() 调用的启发。但最终大多数概念都出现在大多数操作系统上,所以你不能真正说出是什么启发了什么。
Java 的一些“低级”函数基本上是一些操作系统系统调用的“包装器”。
我没有看到“比较”两者的客观方式(和理由)。
如果您对此主题感兴趣,可以在 Java 源代码中搜索native关键字,它表示一些“隐藏”(主要是操作系统相关)功能。
与原生库相比,Java 的标准库通常具有相似的功能集,但有几个重要的区别。
- Java 是面向对象的,不管你喜不喜欢。这样做的好处是某些概念更容易管理。例如,大多数与文件相关的操作都可以直接在 File 对象中找到。将此与 Posix 进行比较,其中 FILE 是一个句柄,实际上只是一个数字;进程的打开文件列表的索引。Posix 方法非常接近操作系统的实际实现方式。但是在 Java 中,您看不到、不知道或不在乎。
- 在某些情况下,Java 具有某些最低公分母行为。有许多 AWT API 就是它们的样子,因为 AWT 需要在许多不同的平台上是相同的。事实证明那是疯狂的,Sun 准弃用了大部分 AWT,因为支持平台同样意味着糟糕地支持每个平台。较新的库 Swing 几乎在纯 Java 中实现了所有内容,因此在跨平台方面做得更好,因此具有更丰富的 API。该 API 与本机窗口库非常不同。此外,Swing 没有很好地集成,因为它使用的本机操作系统非常少。
- Java 有一些本地库没有的限制。例如,您没有函数指针。因此,您拥有
Listeners
和Runnable
其他 Java 模式来执行 C++ 中涉及函数指针的事情。因此,任何需要这些功能之一的 API 在 Java 中与在本机操作系统中都会有很大不同。
因此,总而言之,Java 通常具有提供与本机操作系统类似的行为的库,有时提供完全不同的行为,但最好将 Java 本身视为一个平台。有时您需要高级性能,例如 OpenGL 或超快速数据传输,在这种情况下,您会需要特定的 Java API(Jogl、nio),但大多数时候您应该将 Java 视为自己的东西。