如果您发明了21世纪的编程语言

本文的作者讨论了现代编程语言的问题以及纠正缺陷的方法。


仅在过去的18年中,人们就想出了许多种语言,其中可能最受欢迎的是Swift,Kotlin和Go。 同时,21世纪编程语言的显着特征是没有任何显着特征。 使用此类语言最令人愉快的是,您可以花一个周末学习其中一种语言,最后说您设法掌握了一种流行的新颖性,但实际上您还没有学到任何新知识。 他们真的不是什么新鲜事物。 所有现代语言都是根据一些正确且经过验证的公式创建的,其名称很可能是Objective-C,Java或C。

“缺乏新颖性”可以被认为是一项有价值的功能,但是这种情况引发了一个问题。 我们是真的面对新的21世纪的语言,还是所有这些都只是20世纪不良编程习惯的反映?

如果我发明了这种语言,那么我不会尝试纠正过去,而是会尝试创建一种在现代条件下可以很好地工作的东西,但是也能够发展并经受时间的考验。 如果这需要根本的建设性解决方案,那就这样吧。

用语法下来!


现代语言的语法反映了试图将粉笔和黑板的自由压缩为ASCII的束缚。 记录的某些元素(例如算术符号或方括号)或多或少自然地被感知。 但是,只有在按下电传打字按钮时才省力才能证明其他许多名称是合理的。

从键盘输入文本不再困难。 我们不需要摆在需要猜测语法含义的位置。 像(($:@(<#[),(=#[),$:@(>#[)))({〜? (顺便说一下,这是用真实语言编写的真实代码),但是它并不能以任何方式提高可读性。 而且,更重要的是,很难通过堆栈溢出对其进行“谷歌”搜索或查找。

对于函数的神秘名称,返回码约定和含糊不清的属性,也可以这样说。 他们过去的服务很好,在打孔卡上节省了很多空间,但是今天是时候该休息了。



FILE * test_file = fopen("/tmp/test.txt", "w+");

应该转变成

create file /tmp/test.txt for input and output as test_file

我们不需要所有这些括号,引号,星号和分号(当然,除非它们确实不能更清楚地传达这个想法)。 语法高亮完全可以完全替代语法符号。

在21世纪,有很多可用的东西:例如解析速度,计算机内存,在线搜索。 其他资源仍在定价中:开发时间,程序员的记忆力,花在学习语言特性上的精力。 更改代码编写规则应将重点转移到更便宜的资源上,并节省更昂贵的资源。

内置类型下来!


您可能熟悉JavaScript悖论 。 例如:

> 10.8 / 100
0.10800000000000001


此结果并非JavaScript独有。 这根本不是一个悖论,而是绝对正确遵守受人尊敬的IEEE 754标准的一个示例,几乎在所有体系结构中都可以找到类似的浮点数实现方式。 考虑到我们正在尝试将无限数量的实数填入32、64或256位,这还不错。

数学家认为这是不可能的,工程师为了实际实现而通过拒绝常识来体现它们。 IEEE解释中的浮点数根本不是数字。 数学需要从它们的加法运算中结合。 float和double类型并不总是保存此属性。 数学要求实数集包括整数,但是即使对于相同大小的float和uint32_t也不能满足此要求。 数学要求实数的元素为零。 好吧,在这方面,IEEE标准超出了所有期望,因为浮点数具有两个零元素而不是一个。

不仅浮点数具有相似的功能。 嵌入式整数没有更好的实现。 您知道尝试将两个这样的16位数字相加会发生什么情况吗?

0xFFFF + 0x0001

没有人会给出确切答案。 本能告诉我们,溢出将给出0x0000。 但是,任何国际标准都没有记录这种结果。 在处理此操作时,每个人都应以C方法和x86处理器系列为指导。 或者,可能会导致0xFFFF,或者将触发中断,或者某些表示溢出的特殊位将被存储在特殊位置。

通常不会在任何地方考虑此类时刻,并且处理此类操作的规则因语言而异。 如果浮点奇数至少由标准固定,那么原则上提出的最后一个问题是不可预测的。

相反,对于数值计算,我建议引入具有固定点和标准化行为的可定义值的数据类型,以防止准确性下降或超出上限或下限。 像这样:

1.000 / 3.000 = 0.333
0001 + 9999 = overflowed 9999
0.001 / 2 = underflowed 0


不必附加所有尾随的零:数据类型的定义必须隐含它们的存在。 但是重要的是,能够自己选择最大和最小边界,而不取决于处理器体系结构。

这样的计算会更慢吗? 是的,他们会的。 但问自己:您必须多久编写一次高性能计算程序? 我相信,如果您不是该领域的专家,那将是非常罕见的。 并且,如果您从事此类任务,则可以使用专用设备和编译器来实现这些目的。 据我所知,典型的21世纪程序员很少求解微分方程。

尽管如此,没有任何事情可以阻止过去使用快速,复杂和不可预测的内置类型作为替代,而不是作为默认选项。

用元语言练习!


发明了许多奇妙的语言,它们不是用于执行任务,而是用于创建能够执行任务的语言。 球拍,Rebol和Forth只是几个例子。 我喜欢他们所有人,和他们一起玩是纯粹的乐趣。 但是,正如您可能猜到的那样,使用该语言获得的乐趣并不是使该语言具有普遍性和流行性的主要标准。

在一种语言中创建新语言以执行特定任务的能力是一种非常强大的工具,在独立研究工作中会获得全部回报。 不幸的是,如果代码不仅对作者清晰,而且除了主要代码清晰之外,您还必须教其他人和新的内部语言。 问题就从这里开始。

人们想完成任务,而不是学习一种语言,它只会帮助完成一次工作,而后又不会派上用场。 对于局外人来说,掌握您的语言的想法是一笔不大可能会得到回报的投资。 但是学习标准化的东西是对生命的投资。 因此,相反,他们将再次重写您的代码,然后才可以学习它。 因此,一个应用领域出现了无数方言。 人们争论美学,意识形态,建筑和其他不重要的事物。 数月之内,成千上万的代码行被淹没了。

Lisp家伙在80年代经历了这一过程。 他们意识到标准化的应用语言元素越多越好。 因此应运而生。

而且他很大。 INCITS 226–1994标准有1,153页。 17年后的记录仅由C ++打破,其标准为ISO / IEC 14882:2011(1338页)。 尽管C ++并不总是那么庞大,但它不得不放弃它难以忍受的遗产。 Common Lisp大部分都是从头开始创建的。

编程语言不应太大。 这不是必需的。 他只需要一个好的标准库,里面充满了各种有用的东西,这样人们就不必重新发明轮子了。

当然,要在大小和应用程序适用性之间保持平衡并不容易。 C ++的实践经验表明它是多么困难。 我认为,为了实现必要的平衡,应该在特定的应用领域中有条件地增强21世纪的语言。 由于大多数问题现在正好出现在业务应用程序领域中,因此该语言可能应该专注于业务问题,而不是游戏开发或Web设计。

所以...


21世纪的语言应面向业务,使用清晰的语言表达,而不要依赖内置类型。 这样的语言已经存在真是太好了! 您怎么看,我们在说什么?

是的,这是COBOL。

这是最早被人们遗忘的高级语言之一。 我必须承认,我故意将COBOL的古老功能描述为超现代且令人难以置信。 我这样做是为了展示一件事。 该代码不是通过语言功能编写的。 你去做

认为该语言对代码的质量负责是很幼稚的,并且添加一些小工具(或删除它们)可以自动改善所有功能。 曾经,程序员不喜欢Fortran和COBOL,因此,他们发明了C ++和Java,最终导致20或30年后,他们也不喜欢每个人的情况。

根据我的感觉,问题的根源在于社会学和心理学领域,而不是编程领域。 我们真的很讨厌语言吗? 我们是否对工作环境感到满意? Windows容易受到攻击,Visual Studio太慢,无法退出Vim。 实际上,引起不满的是这些东西,而不是创造过程本身。

但是,您始终必须找到一个要怪的人。 作为软件工程师,他们对程序的糟糕程度负有部分责任,我们不会自责,对吧? 因此,我们正在寻找工具中的缺陷。 让我们发明新的COBOL,直到有一天太阳开始明媚,鸟儿不大声唱歌,并且Windows在2秒内开始加载。

但是这一天很可能永远不会到来。

因此,如果我想发明21世纪的编程语言,那么我将尝试寻找一种新的责任方法。 或者是更好地掌握现有工具的新方法。 我将尝试更注意基本细节,并毫不留情地摆脱任何不必要的复杂性。 总是有一些基本的东西需要不断重新思考,而不是进入时尚和过时的语言。

图片

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


All Articles