应用程序依赖于操作系统来提供服务。
您可以创建一个对操作系统的依赖性最小的应用程序。但即使(通过一些严肃的 Fu、Magic 和挥手)你让它在“每台计算机”上运行,这也不是我们想要的。
脚本和类脚本语言(如前面提到的 Python 和 Perl)就是这样:它们使用操作系统的最少功能,并在其之上构建它们提供的所有内容。这对于命令行应用程序来说非常有用,因为您需要(或多或少)读取和写入文件和用户控制台。
然而,今天的丰富应用程序需要更多的服务,它们需要“在操作系统上运行”而不是单独“在 CPU 上”:我们希望它们与操作系统集成,用户界面应该看起来是原生的,你想使用剪贴板, “打开文件”对话框应提供其他打开文件对话框提供的所有功能。
像 Java 这样的环境试图通过使用更高级别的抽象以可移植的方式提供它:有窗口和小部件以及所有美丽的东西。但这有其自身的一些问题:
首先,您必须始终在“虚拟化平台一致性”(即应用程序无论在何处运行都一样)和“主机平台一致性”(即应用程序像本地应用程序一样工作)之间取得平衡。
您可以尝试完全放弃“原生内容”以避免该问题,但随后您的目标是所有平台提供的功能的交集。你在苹果上运行?取消第二个鼠标按钮。等等。此外,您的抽象平台将始终落后于主机平台的创新。
它的要点是没有灵丹妙药:你总要做出妥协。市场上有不同的折衷方案。