1.1.3 主流平台简介

UNIX和Linux

在微型计算机诞生后,越来越多的人开始使用这个跨时代的工具。由于CPU只能执行二进制指令,这增加了人们使用它的难度。

1972年,贝尔实验室的丹尼斯·里奇(Dennis M.Ritchie,1941—2011)和肯·托马森(Kenneth Lane Thompson,1943—)设计发明了C语言。C语言不仅定义了一套标准易用的编程符号,还使用了栈结构来实现基于函数的计算,使计算机的编程过程化、结构化。他们用C语言重写了UNIX操作系统。

借助操作系统和编程语言,人们使用计算机的便利性大大增强。

1991年,在芬兰赫尔辛基大学就读的李纳斯·托瓦兹(Linus B.Torvalds,1969—),基于x86架构的CPU开发了一个可移植的操作系统——Linux。这个系统完全免费并且开源。后来,又有相当多的开源工具集成其中。

Linux使用C语言与汇编语言进行开发,提供的API也是纯C语言接口,有着“一切皆文件”的设计理念。

UNIX和Linux都基于命令行的操作界面,有一定的学习门槛。但是这些系统的资源利用率往往极高,程序运行也十分高效。掌握使用命令行的方法,是计算机专业人士必备的技术。

Linux并没有官方的编程套件,人们通常会使用Vim/Emacs进行代码编辑,使用GCC(GNU Compiler Collection)进行编译,使用GDB(GNU Debugger)进行调试,一切都是基于命令行的。本书推荐使用VSCode+RemoteSSH插件进行可视化开发。

DOS和Windows

1980年8月,24岁的程序员蒂姆·帕特森(Tim Paterson,美国,1956—)基于Intel的16位芯片8086,开发了操作系统QDOS(Quick and Dirty Operating System)。

1981年7月,微软的CEO比尔·盖茨(Bill Gates)意识到未来个人电脑将有巨大的市场规模,他将QDOS收购,并将其改名为MS-DOS(Microsoft Disk Operating System)。

随后,DOS系统一直持续更新,直到Windows XP中的8.0版本。

1985年11月,微软发布了视窗操作系统Windows 1.0。

Windows系统的诞生,在计算机发展史上具有里程碑式的意义。图形化的操作界面,让计算机的使用更加便利。大量的软件工具在其上蓬勃发展。其中一类应用便是实时通信(Instant Messaging,IM)。

20世纪90年代,中国各城市中建起了大小规模的网吧。人们通过当时最著名的IM软件——QQ结交网友,通过各种聊天室互相问候,通过局域网联机玩游戏并进行语音协作。

Windows与实时通信的普及,提高了一代人的打字速度。

Windows系统提供C/C++接口的API,供开发者进行软件开发。

微软提供开发者文档MSDN,以及编程IDE(Integrated Development Environment)—Visual Studio,其社区版本可以免费安装使用。

用户使用Windows API时,需要记得3 件事。

(1)包含头文件(.h)。 img

(2)链接库文件(.lib)。 img

(3)动态链接时,在运行时目录[6]放置dll文件。

微软基于Win32 API封装了C++的基础库MFC(Microsoft Foundation Classes),用于简化开发任务。

微软还提供了ATL(Active Template Library),用于简化COM组件的开发。

微软同时维护着WTL(Windows Template Library),这是一套轻量高效的窗口模板类,本书的大部分Windows Demo都是用WTL开发的。

iPhone和macOS

2007年1月9日,Apple公司的CEO史蒂夫·乔布斯(Steve Jobs,1955—2011)发布了第一款iPhone——iPhone 2G。这标志着智能手机时代的正式到来。

之后几乎每一年,Apple公司都会发布一款全新的iPhone手机,代表着业内手机的最高水准。

iPhone手机内置摄像头和麦克风,这极大地降低了人们进行实时通信的门槛。

iPhone采用更加友好的全触屏操作界面,这对于消费者非常友好,再次彻底改变了人们使用计算机的习惯。iPhone的操作系统iOS,其底层XNU由UNIX的某个分支发展而来。每个iOS App都是一个独立的沙盒进程,彼此隔离。

同时,Apple公司也推出了自己的桌面操作系统——macOS。与微软不同的是,Apple官方提供的API是基于Objective-C(OC)和Swift的。Apple开发者的官网提供IDE——Xcode,以及在线开发文档。成为正式应用的开发者需要向Apple公司支付一定的费用。

使用OC接口的方式与Windows类似。

(1)包含头文件(.h)。 img

(2)引入库文件(.framework文件)。

(3)链接非系统库时,需要配置rpath选项。

本书介绍的示例都使用OC代码,因为其和C/C++的混合编译比较方便。

Android和Chrome

2008年9月,Google紧随Apple其后,发布了Android 1.0系统。

与Apple公司的选择不同,Android系统使用的是开源许可,各大手机制造厂商都可以基于Android系统的代码,定制自己的移动操作系统。国内如华为、小米、OPPO、vivo,大都采用Android的基线进行定制。Android的底层内核是Linux,其上有各种Java的Framework,供应用程序使用。Android应用开发使用Java和Kotlin语言。Google开发者的官网提供Android Studio和官方文档。

本书介绍的示例都使用Java的代码,在其和C/C++进行交互时,需要借助JNI。

根据Statcounter 2023年9月的统计,Android、Windows、iOS、macOS的使用占比分别为37.59%、30.85%、16.59%、9.08%,如图1-2所示。

img

图1-2 各操作系统的市场占有率(2022年9月—2023年9月)

因此,目前的主流计算机系统,实际上由3大桌面系统(Windows、macOS、Linux)和两大移动终端系统(iOS和Android)组成。要进行跨平台的RTC通信,就必须将RTC构建于多种操作系统之上。

Web浏览器具备天然的跨平台性,可以用来隔离平台之间的差异。

基于这样的思路,Google公司借助其Chrome浏览器的优势,于2020年10月推出了WebRTC标准,意在借助浏览器的便利性,统一RTC领域的技术标准。

WebRTC的标准指W3C的JavaScript的API标准,包含1000多个API。WebRTC的实现涉及IETF 100多个RFC协议,本书会陆续介绍一些。下节我们将介绍如何利用最少的代码屏蔽各个平台之间的差异。