编程的第四个十年:如何赢得网络

个人编程史第四章的第二部分

编程的第四个十年:如何赢得网络

C去上课

在SmallTalk之前,存在另一种使用对象的语言。 它被称为Simula。 它不是通用语言。 它是专门为在研究环境中运行模拟而设计的。 丹麦计算机科学家Bjarne Stroustrup在攻读博士学位时就了解了这一点。 论文。 后来,当他在AT&T贝尔实验室工作时,遇到了为分布式计算更新Unix的问题。

分布式计算正是它的初衷。 在多台计算机上运行的计算机程序。 为了成功做到这一点,必须将程序分成多个块,并且由于计算机之间的联网不是100%可靠的,因此必须以某种方式使这些块彼此独立。 对象是执行此操作的好方法,这正是Stroustrup想到Simula的原因。

在进行OOP之前,通常的做法是使用称为全局变量的东西。 全局变量是一种存储一条信息的方法,该信息需要通过程序中不同位置的不同代码位使用,并且可能在不同时间更改。

例如,如果一家大公司需要审核跟踪来跟踪对accountBalance的修改,那么我必须在每台可以向accountBalance发送修改的计算机上的每个子例程中都有代码来执行此操作 由于必须同步子例程,因此,如果在一个子例程中更改操作方式,则必须记住要找到所有其他子例程并在其中进行更改。 如果这些子例程在不同的计算机上运行,​​则需要在物理上独立的CPU或计算机之间设计某种共享内存。

我可以创建一个名为“ accountBalance ”的全局变量 ,并将其初始化为零。 然后在我的程序中,我将有一些用于存入和提取的子例程,这些子例程将添加到accountBalance或从其中减去。 这种策略存在许多问题,这些问题主要围绕许多代码所引起的冲突,这些冲突从未“知道”另一代码是否已更改了该共享内存中存储的内容。

在OOP中,我可以创建一个称为单例的特殊类,该类只能用于构造一个实例,一个对象。 这将是一个独立的代码包,它完成了有关更改帐户余额的所有工作。 它会创建自己的私有变量,并且知道如何保存和存储对其所做的更改记录,而不会发生任何潜在的冲突,以及如何将同时到达的请求排队。 它将具有错误检查和验证代码。 并且它将具有用于增加和减少存储量的代码。 然后它将“发布”所谓的公共方法。

方法是访问方法。 因此,我将称为accountBalanceObject的对象具有一个增量方法和一个减量方法。 在大多数语言中,“调用”方法看起来像这样: accountBalanceObject.incrementaccountBalanceObject.decrement 每当我从另一个对象( 发件人 )调用这些方法之一时,我都会随调用一起传递一个金额(作为参数 ), accountBalanceObject内部的代码将使用该金额执行适当的操作,然后accountBalanceObject返回一个值。 返回值要么是某种成功代码(通常是新值),要么是某种错误代码。 发件人将拥有等待返回值的代码,如果成功则将继续执行,如果出错则将采取纠正措施。 这样,两个对象现在可以位于单独的CPU上,并且仍然可以正常工作。

由于Stroustrup熟悉使用Simula博士的对象。 论文中,他顺理成章地采取了行动,取而代之的是C,这是Unix已经被使用的语言,并向其中添加了对象。 最初称为C with Classes,后来简称为C ++,这是另一个 ¹程序员的笑话。 “ ++”是程序员在数字上加一个的捷径,而带有类的C已添加到C中。

如今,C仍被广泛使用。 大多数“嵌入式”系统(即您的汽车,自动售货机或收银机等系统)都是用C实现的。尽管C仍然是几乎每个平台都支持的通用语言,但是C ++几乎一样通用,并且由于OOP提供的便利,它更可能用于编写应用程序。 大多数Adobe应用程序都是用C ++编写的,因为它减少了在Windows和Mac上发布版本的工作量。 Google的重要部分以及Chrome浏览器,Firefox浏览器和MySQL用C ++编写。

如果您要编写一个非常大的应用程序,并且想要对其硬件的使用方式进行大量控制,C ++将通过对象的便利为您提供C的功能,从而使工作更轻松,但是C ++并未真正改变其方式程序员的工作。 这可能就是为什么它如此受欢迎的原因。 您的普通 程序员不太喜欢大变化。 他们为学习语言投入了很多钱,因此不喜欢从头开始。

“ C使脚部射击变得容易。 C ++使它变得更难,但是当您这样做时,它会炸掉您的整个腿。”
〜Bjarne Stroustrup

如何赢得网络。

编程的第四个十年:如何赢得网络

我们将在本章中讨论的最后一种语言是由Brad Cox和Tom Love在80年代初创建的Objective-C。 他们特别关注跨平台开发问题,但是他们还有另一个议程。

考克斯有一个大想法:可互换的软件组件,或他所谓的软件IC。 我们将在本书的第三部分中深入研究互换性的一般概念,但是现在让我们仅关注Objective-C,而不必研究为什么互换性如此重要。 目前,我们只是简单地说,Cox希望将一种众所周知的制造技术应用于软件,并且他想证明这一点可以在不对当时存在的软件开发流程进行大修和大批量中断的情况下完成。 他通过简单地扩展C而不添加任何称为pre-processor的方法来完成它

C ++是一种完整的语言,具有自己的编译器,可以直接编译为机器语言,而Objective-C的设计目的是首先由预处理程序转换为标准C,然后再将其编译为机器代码。 尽管C ++仅包含标准库,但Objective-C附带了旨在推广软件IC概念的广泛类库,最后,尽管两年后C ++附带了描述语言语法的简单参考手册,但Objective-C却是Cox和Andy Novobilski在与面向对象程序设计同时发布的同时介绍了一种进化方法 ,不仅描述了语言,而且还描​​述了面向对象设计和开发的系统方法。

基于对象Pascal的MacApp的失败对于史蒂夫·乔布斯来说显然是一个很棒的学习经历,因为当他指导将Objective-C的OpenStep的收购和进一步开发引入其NeXT工作站的NextStep对象框架时,他和他的团队取得了本垒打。 。 NextStep是一个健壮且非常有用的框架,至今仍广泛用于Mac,iPhone和iPad。 它极大地提高了生产率,因为它使开发人员可以轻松,一致地访问复杂的预编程功能,例如电视上的频道转换器。

如前所述,万维网是使用NeXT计算机上的Objective-C中的NextStep框架创建的。 蒂姆·伯纳斯·李爵士(Sir Tim Berners-Lee)在CERN粒子物理研究机构担任软件顾问的同时,发明了一种网络来共享研究文档。 他说,由于NextStep库的简单性和直接性,创建HTTP和Web浏览器“ 非常容易 ”。²

我们将在以后看到的很多类库是下一个抽象级别,它将带来一个数量级的生产率提高。 尽管一条FORTRAN指令可能会编译成数十行汇编语言,但程序员可能会使用单行NextStep 类方法调用 ,该方法调用包含几百行的Objective-C,它们已预编译为几千行的C,然后编译为几万行汇编语言。

在1996年,为了让乔布斯重返苹果,苹果收购了NeXT,并将其更名为Cocoa。 今天,它为在iMac,iPhone,iPad和Apple Watch上运行的应用程序提供动力。 在第一年,iPhone便有65,000个应用程序,其中大部分来自小型独立程序员,这是因为iPhone应用程序的开发很容易。 如此出色的生产力是三件事紧密协作的结果:受SmallTalk强烈影响的Objective-C语言; Xcode,Apple的集成开发环境,是SmallTalk IDE的直接后代; 和可可类库。 真的三个是密不可分的。 那是SmallTalk的遗产。

正如乔布斯以前做过的很多次一样,他会一次又一次地做,史蒂夫·乔布斯做出的技术选择将对整个计算机行业产生持久的影响。

“编程语言中最重要的是名称。 没有好名声,语言就不会成功。 我最近发明了一个很好的名字,现在我正在寻找一种合适的语言。”
〜DE Knuth

<-该系列的上一篇文章

该系列的下一篇文章->

[1] http://catb.org/jargon/html/Y/Yet-Another.html

[2]伯纳斯·李,蒂姆。 “史蒂夫·乔布斯和实际可用的计算机| W3C博客”。 W3.Org ,2011, https: //www.w3.org/blog/2011/10/steve-jobs/

From: https://hackernoon.com/the-fourth-decade-of-programming-how-the-web-was-won-9e4c258ec9fb