Mac OS中carbon和cocoa的那些事
mac的全称你知道是什么吗?Macintosh,译名是麦金塔。
苹果电脑的第一个版本发布于1984年,其命名为Macintosh System 1,一直到第9个版本(1999年推出9.0版本),这些系统被统称为Classic Mac OS。而Classic Mac OS 最初使用 Pascal作为首要的开发语言,然而到了1990年,大部分的mac 软件、库都是使用c++进行开发的。
1985年,乔布斯离开苹果公司,独立创建了NEXT公司,开了NeXTSTEP操作系统,该系统基于Mach和BSD,以object-c 为语言基础完成1。1995年发布了最后一个版本3.3。NEXT公司后来和SUN公司合作将NEXTSTEP操作系统重新命名为OpenStep。
1996年,乔布斯重回苹果。2
苹果公司随后收购了NEXT公司,基于OPENSTEP,开发出了一个新的操作系统Rhapsody(狂想曲)。该系统为了与之前的Classic Mac OS 兼容,使用了一个新的策略:保留了大部分的OPENSTEP的对象库,移植了大部分的OPENSTREP的GUI的api,并命名为 “Yellow Box”(黄盒)。并添加了一个运行现有Mac OS软件的名为“Blue Box”(蓝盒)的模拟器。在这个模拟器中运行过去的软件。(因为过去的软件大部分是c++,而openstep基于object-c编写)
可以看到Rhapsody是openStep的一个直接继承,但是增加了一个模拟器用于兼容过去系统中的软件。即Rhapsody = 黄盒 + 蓝盒,其中的黄盒则基本上是openstep代码的一个重组。
这个改变在1997年的WWDC大会上公布,很多开发者不满,他们不希望他们的软件运行在一个可能不会更新的“Blue Box”的模拟器中。他们甚至把这个蓝盒子亲切的称为“惩罚盒子”。
正是这一个问题,乔布斯在1998年的WWDC大会上宣布,苹果会发布一个现代化的版本,并且很好的兼容过去的系统。
这正是carbon库的由来。carbon库基于c编写,而carbon框架也是苹果将Mac OSX带入市场的一个策略。
为了推出carbon,苹果对Rhapsody整个系统进行了修改,Rhapsody模型实际上是带有仿真器的OpenStep。在新系统中,苹果使用纯c重写了openStep中的被称为Foundation部分的许多底层代码,并命名为core foundation(所以core foundation是基于c,并是carbon框架的一部分)。而yellowbox中代码逐渐演变成了cocoa框架。
除此之外,carbon和cocoa则尽可能的共享通用代码。所以carbon和cocoa之间关于foundation模块中代码会进行一些函数映射,比如在cocoa中foundation kit 模块中,你可以随处看到类似typedef CGPoint NSPoint;的数据结构和函数的映射,将NS的数据结构和api转换到CF中。
虽然这对cocoa的项目有一些性能影响,因为调用cocoa的一些函数还需要将对象方法转换成c。但是据苹果称使用了toll-free bridging的技术降低了这个影响。
carbon 发布于2000年,在2001年,苹果发布了Mac OSX第一个版本,这个X 即是10的意思。此后几乎所有的软件都在使用carbon,苹果的官方应用也是如此,如finder。
在新系统中,carbon和cocoa是peer关系。Rhapsody演变成了macosx,而yellowbox演变成了cocoa。
好景不长,2007年,苹果发布了Mac OSX 10.5,从这个版本开始,苹果开始过渡到64位的应用程序。与此同时,苹果宣布64位的c编程环境不再提供与carbon的界面交互相关的api兼容。 Introduction to 64-Bit Guide for Carbon Developers 当年的apple 开发者首页是这样介绍10.5的变化的:
Most APIs in Mac OS X v10.5 are available to both 32-bit and 64-bit applications, but some APIs commonly used by Carbon applications are not. In particular, the APIs used to implement a Carbon user interface are generally available only to 32-bit applications. If you want to create a 64-bit application for Mac OS X, you need to use Cocoa to implement its user interface.
即与界面交互相关的api只能适用于32位的程序,否则需要使用cocoa来进行创建应用程序。
2012年,苹果发布了 OS X 10.8 版本。此时carbon大部分的api都已经被deprecated,但仍然可以使用,苹果并宣布不再更新carbon的框架内容。2017年苹果发布的10.13,苹果宣布此后的mac os 版本将不再支持32位应用程序,这一决定在mac os 10.15正式的生效了。
在命名前缀规则中,从一开始Mac OS X 到2012年发布的10.8中,命名前缀改成了OS X 10.8。一直到2016年发布的10.12版本及其之后的版本中中,命名的前缀又改成了Mac OS。
历史就到这里了,carbon已经完成了Mac OSX 的使命——发布现代化并且兼容旧系统程序的操作系统。但是随着64位应用程序的普及,mac已经不再推荐使用carbon。尽管如此,如果不使用界面库相关的api,carbon库实际上仍然可以在64位的应用程序中使用。
下面简单介绍cocoa和 carbon两个框架中包含的内容:
carbon#Architecture) 的一部分是来自于Macintosh Toolbox,Toolbox是Classic Mac OS中的一个库,是由许多manager组成。实现了很多高级功能,如绘制图形、菜单管理器、内存管理等等。
carbon最初来自于toolbox的重组,所以carbon也是由多个manager组成的。后续增加的代码大部分代码都是基于core foundation。
其中core foundation包含了下面几个模块:
Core Animation
Core Audio
Core Data 这个在cocoa中也包含了同样的代码,同样基于c开发
Core Graphics
Core Image
Core Location
Core OpenGL
Core Services
Core Text
Core Video
cocoa) 包含了
Foundation Kit 作为openstep中的遗产,其类的前缀为NS,是一个通用的面向对象的库,提供字符串和值操作,容器和迭代,分布式计算,事件循环(运行循环)以及其他未直接与图形用户界面绑定的功能。拥有的class有
1.1 NSObject
1.2 NSString and NSMutableString
1.3 NSValue and NSNumber
1.4 NSArray and NSMutableArray
1.5 NSDictionary and NSMutableDictionary
1.6 NSSet and NSMutableSet
1.7 NSData and NSMutableData
1.8 NSDate, NSTimeZone and NSCalendar
AppKit 同样是openstep的遗产,其类和变量的前缀为NS,它包含可用于创建图形用户界面并与之交互的代码程序。拥有的class有:
NSApplication,获得某个应用的对象
NSWindow: 获得窗口的对象
NSView
NSResponder
NSDocument
NSController
core data 是core foundation的一部分,也被包含在了cocoa中。
可以看到虽然cocoa和carbon 在很早是平行的关系,事实上他们的绘制窗口相关的界面库并不是相同的,界面的显示效果也是不同的。其中一个来自toolbox,另一个来自openstep。
如果简单粗略的说,其中
cocoa = openstep中的大部分对象库–>foundation + openstep中的UI库–>Appkit + core data
carbon = core foundation + toolbox重组过来的界面库
其中foundation kit 有很多与core foundation函数的映射,所以foundation.h中也包含了很多core foundation模块中的头文件。
参考资料
macOS
Classic Mac OS
cocoa)
Carbon (API))
Cocoa是什么
OpenStep
mac系统的整体架构复杂,历史很长,如有知识性的错误欢迎指出。
- 点赞
- 收藏
- 关注作者
评论(0)