
公司
早期为什么会有操作系统内置编译器的做法?这是因为当时的Unix世界实现的跨平台方式是源码级跨平台,而不是二进制跨平台。也就是说,每家小型机厂商可以使用不同的CPU架构,并且各自独立开发出自己的操作系统。那么,在不同的架构和操作系统中,如何让一个软件能够运行?为了解决这个问题,Unix引入了C语言,同时也设计了一种能够在多种不同CPU体系架构上编译的语言。只要操作系统提供了C语言编译器,代码就可以在该系统上运行。因此,我们可能会购买一台全新的、从未用过的CPU架构机器,搭载一个从未接触过的由厂商提供的操作系统(这些系统通常都与Unix体系兼容)。但只要操作系统厂商提供了编译器,并且软件能够在真实环境中编译通过,它就能运行。在我过去工作的
公司里,当我们购买Oracle数据库时,Oracle工程师会登录到实际的机器上进行编译、生成项目,然后删除源代码再交付给我们。这是因为
公司的几台
服务器,每台都有不同的操作系统、不同的CPU架构以及来自不同厂商的产品。换句话说,在Unix的世界里,C语言编译器确实是操作系统必须提供的工具。因为在那个年代,
计算机的体系架构非常多样化,类似Unix的系统也非常多,它们根本无法实现二进制兼容,只能做到源码级兼容。所以,操作系统必须提供编译器,否则用户买了机器后将无法安装软件。
linux也需要提供编译器的原因与此类似。因为世界上存在许多不同的
linux发行版(至少曾经如此),它们之间不一定能做到二进制兼容,但往往可以实现源码级兼容。只要有编译器,源代码通常都能被编译并通过运行。即使某些情况下无法直接运行,也可以现场修改代码解决问题。而如果是二进制程序,则可能面临无法运行的问题,甚至有时仅仅需要修改一行代码就能解决的难题,却因二进制不兼容而导致整个程序失效。至于
苹果提供Xcode,则完全是出于另一个原因:
苹果的一大卖点是将其硬件设备与
IOS开发绑定在一起。通过要求
IOS开发者必须购买
苹果电脑才能进行开发的方式,
苹果成功地把这些开发者牢牢绑定在
macOS生态系统中。既然吸引并绑定开发者是
苹果的重要策略之一,那么
苹果自然需要提供Xcode工具(虽然不是预装,但确实免费提供)。