复杂化C ++是不可避免的。 不仅是C ++

我一直想写类似的文字,但是我的手没有伸开。 但是,在C ++标准化委员会的夏季会议结束后,以及语言的复杂性进一步增加的呼啸声之后,我不得不抽出时间并就此问题发表自己的看法。


会有很多文字,因此那些不为自己的时间感到抱歉的人,我邀请您在猫下看。


编程语言是一种技术产品,但不是那么简单


前段时间,我有机会读了一本有趣的书,《创新者的困境》 。 那里以高科技产品为例,展示了新产品如何出现,这些新产品首先输给了当前主导市场的决策,然后从根本上改变了市场状况。


最引人注目的例子之一是1990年代完全不存在的数码摄影,但仅在20年后就导致了像柯达(Kodak)这样的20世纪庞然大物的崩溃(顺便说一下,它是第一个制造数码相机原型的人)。


图片

接近开发人员的另一个示例是硬盘驱动器的发展。 从大型机和小型计算机时代的庞然大物,到小型的3.5英寸和2.5英寸英寸小型号,再到M.2格式的SSD,并直接连接到eMMC板。


图片

软盘的情况也一样,首先达到3.5英寸,然后在USB闪存驱动器的压力下消失了。


图片

我们专业领域的另一个例子是个人计算机的开发。 最初无法与1970年代中期的“真实”计算机竞争。 然后,他们只是将小型计算机作为一个整体销毁了。 然后,它们导致了现代服务器的出现,这在某种程度上让人想起当时的微型计算机。 现在,在笔记本电脑,平板电脑和智能手机的影响下,个人电脑已从大众消费中消失。


图片

该书的作者声明,在所有这种情况下,事件都是根据相同的情况发展的:


  • 首先,需要一种解决特定问题的产品。 假设是软磁盘;
  • 由于在起步阶段,所有竞争解决方案(原则上很少)都基于相同的技术,因此市场大致分为相似的产品;
  • 成功产品的制造商开始相互竞争,在这场竞争中,他们的产品几乎达到了最优惠的价格质量比。 而且,最重要的是,尽管现有产品与关于如何解决这些产品的任务的观点尽可能一致。 粗略地说,每个人都知道8英寸软盘非常适合使用软盘将信息从一台微型计算机传输到另一台微型计算机。没有人能想到主流中的另一种方式。
  • 在一些新发现/新材料/新技术的基础上,新产品似乎在几乎所有方面都比现有产品逊色。 通常比较贵。 通常,在能力上不具有可比性。 但是它具有非常重要的质量:可以在不可能或很难应用主流解决方案的地方使用。 例如,您不能将8“驱动器插入个人计算机。但是PC所有者对携带8”软盘不感兴趣。 只是不切实际。 5.25“软盘本身就足够了。不必担心,以千字节5.25”软盘为代价,它本来要比8贵。
  • 围绕新产品形成了一个新市场,最初对于主流产品制造商来说根本不感兴趣。 但是,由于这是一个新市场,因此新的参与者蜂拥而至,这给彼此带来了激烈的竞争。 这场竞争很快将边际和无效的技术转化为极为有效的技术。 它很快就不再是边际产品了,因为一旦它的整体数量超过了旧的主流产品,它很快就以自己的利基市场取代了它们。 粗略地说,如果周围有成千上万的5.25“驱动器和数百万个5.25”软盘,那么现在保留更多边缘的8“设备的意义何在?

将编程语言作为技术产品


乍一看,在编程语言成为主流的方式中可以看到类似的类比。 也许这里最引人注目的示例是Java和Go语言。


Java语言是由于尝试创建“适当的C ++”而产生的。 但是任何人都几乎不需要这种语言,因为 他非常悲惨,更重要的是,他又慢又。 在当时的台式机上,即使考虑到当时PC功能的快速增长,Java也没有机会。


但是,Java从一个完全不同的角度进入了“市场”,进入了一个没有人真正可以工作的利基市场:通过Internet和浏览器小程序(一切都比较复杂,并且JavaCard和STK小程序仍然有市场,但是我们不会离开在野外)。 互联网是一个非常热门的话题,因此根本就没有动态站点/页面可以做(JavaScript在Java发布后就出现了)。 而且,由于除了Java之外没有其他要使用的东西,因此开始使用Java。 嗯,然后,随着Java的发展并克服了儿童疾病,Java进入了其他领域,从那里挤出了其他技术。 尽管她不能在同一个桌面上咬自己的一块馅饼。


Go语言几乎不会使C,C ++,Java,C#,Python,Ruby等已经存在的传统领域的任何人感兴趣。 但是用于Internet的产品开发催生了另一个利基市场-RESTful服务。 对于Java过于强大的开发来说,C ++太复杂,太危险了,Python / Ruby和其他动态特性太慢了。 现在,在21世纪开发的语言的表达方式中,最悲惨的语言之一几乎成为了这种应用领域的灵丹妙药。 随着时间的流逝,它可能会在其他地方扩散(鉴于年轻一代开发人员的一般资格水平,我个人不会感到惊讶)。


因此,人们会感觉到编程语言应该与其他技术产品相同:新语言的出现要么导致几乎完全消失,要么将以前的语言逐出单独的边际空间。 同时,在竞争环境的框架内,古老的语言在发展过程中正变得越来越强大,并能以更便宜的解决方案来解决其典型任务。 结果,古老的语言变得越来越庞大和复杂。 在它们已经占据的那些利基之外使用它们的吸引力较小。


因此,似乎创新者困境中描述的技术产品的生命周期也应该扩展到编程语言。


但是并不是所有的编程语言都这么简单


在创新者困境中描述的将新技术产品渗透到市场的计划中,用户从旧的主流产品转换为新产品的最重要原因之一,要么是所有权成本的显着降低,要么是获得先前可用的机会,再加上所有权成本的下降。


可以说,个人计算机的发展及其功能的增长使拥有个人计算机的机队比拥有一台或多台小型计算机的成本低。 结果,三英寸软盘每单位容量的价格比5.25英寸便宜(考虑到更高的可靠性和其他因素)。结果,数码摄影的每帧价格比胶卷便宜。依此类推。


但是,从一种产品到另一种产品的过渡与两个更重要的指标相关-这是过渡本身的成本/复杂性,以及切换到新产品的速度。 这些指标可以用金钱来估算。 并且,如果存在向新产品过渡的好处,则将执行过渡。 也许不是很快,但是进行了。


事实证明,从一种编程语言切换到另一种编程语言的成本要比从微型计算机切换到PC,从8个“软盘到5.25”或从HDD切换到SSD的成本高得多。 由于更改编程语言通常是对软件产品的完全重写。 通常是从头开始。


重写是什么意思? 新的程序员团队的薪水,这将需要重复产品中已经提供的功能。 即使新的PL使您的团队规模减半,这仍将意味着高昂的成本。 如果在开发该产品的旧版本上花费了1000万美元,那么重写将至少需要500万美元。


但是,更重要的是,这是因为重写后的产品不会立即出现。 需要时间。 很多时间。 同样,如果我们假设新语言允许您以两倍的速度编写工作代码,然后重写该产品(旧版本的开发需要5年的时间),则只需2.5年。


事实证明,现在您需要开始投入大量资金才能获得已经使用了很长时间并且现在可以带来收益的产品的副本。


而且必须提到这一方面的另一面:如果软件产品在不断变化的条件下运行,那么将不可避免地对产品进行定型或加工以满足现代需求。 同时,企业没有机会等待一年半的时间,直到新版本的产品出现在新的PL上,通常在可预见的将来需要新的功能。 通常是昨天。


因此,在重写时,费用会增加:您需要同时编写一个新版本并开发旧版本。


在我看来,这正是解释为什么“开除”新语言的原因,主要是在针对新应用程序利基的新应用程序开发中。 但是将旧语言从先前占领的地区挤出来已经很慢了。 Fortran和Cobol可能是最引人注目的例子。 不仅编写在他们身上的软件仍在运行,所以他们继续用这些语言编写新代码。 这些语言本身也在不断发展。


在我看来,Cobol中软件产品所有者的最美梦之一就是用Java或C#重写产品;)


另一个重要因素:IT本身的发展


我想提请注意的另一点是,IT不久以前就已存在,高级语言的发展历史更短。 这个故事的第一部分不太可能为我们讨论某些语言如何替代其他语言提供坚实的支持。 1950年代和1960年代是实验的年代。 此外,计算机市场本身细分了很多年,并且该软件的很大一部分是为特定的计算机和OS编写的,而对可移植性没有特殊要求。 现有软件开发人员的数量以及广泛使用计算机的领域范围无法与当前状况相提并论。


恕我直言,从1970年代开始,情况发生了根本变化,自1980年代以来,我们已经看到核武器的出现,这些武器既基于过去几年的实践经验,又基于理论研究的结果。 对我而言,正是1980年代(也许是1970年代末)才是面向工业规模制造软件的编程语言时代的开始。 因为在这里我们看到了Modula-2,SmallTalk,Ada,C ++,Eiffel,Pascal的对象扩展,Objective-C,Perl。


因此,我将进一步从这个工业核武器时代出现的情况出发。


顺便说一句


列出了1980年代出现的语言后,我记得尼克劳斯·沃思(Niklaus Wirth)开发的PL:首先是Pascal,然后是Modula / Modula-2,然后是Oberon。


通过这些语言的示例,可以看到他们的作者的经验如何导致工具的出现,这些工具既考虑了先前尝试的缺点,又满足了时代的新要求。


但是,这些相同的语言也显示了YaP用户保持在曾经选择的语言框架内的重要性。 从Pascal到Modula-2的过渡是。 但是绝不是大规模的。 而且,尽管Modula-2或多或少地得到了积极使用,但它并没有像Pascal的继承人那样受欢迎,尤其是Delphi。 据我所知,根本没有观察到向Oberon的过渡。


流行的编程语言不能只被替换。 那呢?


因此,根据我先前的推理,主要的信息是,如果某种语言已或多或少地得到了广泛使用,并且在其帮助下已经创建了许多日常使用的各种软件产品,那么该语言就不能简单地被其他编程语言完全取代。 特别是在短时间内。


成功的编程语言注定要继续使用多年。 并且最有可能发展。


编程语言的发展意味着该语言具有新功能的扩展。 这是不可避免的,因为 进步不会停滞不前。 人们想出了更方便的方法来解决已知问题。 面对新任务,这些任务需要编程语言具有附加的表达能力。 而且,由于编程语言只是一种工具,所以人们正在朝着改进其工具的方向发展。


这意味着,广泛使用的编程语言注定要变得越来越庞大和复杂,因为它们在发展过程中会获得机会,而这些机会甚至是一开始都没有讨论的。


原则上,Bjarn Straustrup早就谈到了这一点。 甚至我本人近三十年来一直在观察的事实也证实了斯特拉斯特鲁普的话。 说,现代Java已经与1995年的Java 1.0截然不同。 C#语言展示了从令人印象深刻的演变,从成功的第一个Java克隆到适合印度教程序员(不论其国籍)使用的最具表现力的主流语言。


但是对我而言,最引人注目的示例仍然是Go语言。 早在21世纪,他们就通过故意扔掉一堆在不同核材料中广泛使用了数十年的方法证明了自己的方法而开始这样做。 并且,包括此在内的感谢变得流行。 但是,尽管如此,生命却蒙受了巨大的损失,Go被迫添加了一些作者最初有意拒绝的东西- 通用编程工具(又名模板/泛型)


因此,流行的编程语言朝着扩展其功能的方向发展。 这意味着并发症。 由于需要添加新功能,以免严重破坏已经编写的代码。 对于第二和第三版Python的史诗故事,这是一个很好的例子,几乎没人敢重复。


真的好不好吗


编程语言(尤其是诸如C ++之类的语言)的复杂性日益增加的不利方面似乎很明显:输入阈值太高。 为了在可接受的时间范围内开始发布质量可接受的代码,学习语言需要花费太多时间。 是什么使得使用复杂的编程语言进行开发既昂贵又冒险。 如果一个或多个合格的开发人员离开该项目会怎样? 找到替代品有多快又容易? 难题。


另一方面,由于编程语言是用于记录特定人的意图的相同工具,例如数学表达式,因此用数学类比是合适的。


在学校,我们开始从最简单的算术运算开始学习数学。 然后我们继续研究更复杂的事物:分数,度和根。 然后,我们进一步走近对数。 然后我们进行一些积分。 与几何相似。


结果,普通高中的毕业生具有一定的数学工具,这对于单身人士可能是多余的。 如果我假设许多课后都不需要使用对数或取积分来计算任何东西,我不会弄错。


然而,高中掌握的数学仪器不能与大学生随后将接受高等数学课程的事实相提并论。 尤其是如果它是数学或物理系的学生(不仅认真下载许多专业的高等数学)。


但是归根结底,任何人都不会因为您投入的越深,难度就越大而怪数学。 因为如果一个人面对需要TFKP的活动区域,那么什么也做不了,因此TFKP必须学习。 不管有多困难。 是的,不是每个人都能成功是正常的。


实际上,编程语言也是一样。


如果您需要解决相对简单的问题,则可以选择:使用更简单的编程语言,或者使用更复杂的语言的有限子集。 但是,如果您面临艰巨的任务(或解决方案的特定条件),那么您可能根本就没有这样的选择:用“简单”语言解决此问题的复杂性可能太大。


谈到任务


, (.. , , , .., ..), , .


. , .. , . , , . , , , . , , , .


, , Go, Python, Ruby PHP, , , , . , , , , . .


, , , , . , 25 GUI , . , 25 .


, , , . , / , , .


, , , , , C++, Scala Haskell. , , . , , Go C.


. . , , : , , . , - C++, . .., -, C++ . , -, C++ , , .


合计


, ? :


  • -, . , , , « », 1960-1970- , . , . , . ( ). - X, , X . , C. , . . , — . ;
  • -, , 40 , . , , . , .. , , ;
  • -, . - Ruby/Python, - Go, - Java. - Rust-, C++, Scala Haskell-. , . - , « », . .

, , - : , - . - . , ( , , ). , - , , : , , -. ;)

Source: https://habr.com/ru/post/zh-CN463745/


All Articles