黎明(第1部分)

2021-04-09 12:10:09

请允许我向您介绍黎明,这是一名工作进度的编程语言。我是一种实用,通用的编程语言,即Haskell的纯洁和表达性的实用,通用编程语言,以及C的性能和控制,安全性和正确性保证了Rust提供的那些。现在,如果你熟悉这些语言,那么只需阅读那句话,你可能会有一个墨水,即我要么是accrackpot或痛苦的天真。如果你这样做,那么我赞扬了你的怀疑主义。无论如何,我相信我已经瞥见了这个看似不可能的属性的道路,并且在这一系列博客帖子中我希望与你共享这一愿景的一部分。

为了适当地激励在黎明中制造的选择,我们将谈论四种语言,如何实现这些非凡的属性,以及Wecan如何利用他们的优势和脾气暴躁,从而开始。

FART是一种非常小而简单的编程语言,其中功能定义为堆栈上的一系列操作。在第四,功能参数不是给出的名称。相反,参数通过堆栈隐式传递。这导致高度重置和可重构的代码,因为可以沿任何句法边界分开和重新组合。根据Chuck Moore,Forth的原始设计师,实践性是定义特征:

是高度考虑的代码。除非是定义,我还不知道别的话说。如果您有很多小定义,则您正在写入福可中。为了编写大量的小定义,你必须有一个堆栈。

另一个,更一般,描述这种编程语言的方式是说ITIS连接。连接性编程语言与组合逻辑密切相关,这与编程语言的APLFIMINGE相对相关。所有这些中的常见线程是Concept的“无点”或“默契”编程,其中函数完全作为其他功能的组成。

不幸的是,这种规划风格历史上有几个态度。首先,严格的数值排序到第四次是最少的堆栈混洗数量,这可能是乏味的andError容易发生,掩盖程序的含义。第二(和相关),因为任何人都试图了解别人的别人或APL代码可以证明,那个参数和价值名称可以导致经常被称为“写入次代码” - 这是,对难以读取的代码难​​以阅读andunderstand。最后,与强大的统计学语言相比,结束和默塞特编程语言几乎普遍地宣传,几乎普遍地普遍地逐步打字,这绝对地限制了它们的重新读取性。

这些优势和缺点中的大部分是由Jon Purdy在他的2012Blog帖子中阐述的,标题为“为什么连接规划事项”,在继续阅读读物之前,我强烈推荐停止读取。在标题为“黑暗面”的部分中,JON举例说明了传统的数学符号中的以下功能的示例,

对于熟悉传统数学符号的人来说,渠道定义的含义将立即非常清楚。相比之下,甚至有人熟悉所在阶段中的每个术语的含义,定义的整体含义被不多的堆栈混洗术,即掉落,杜普,交换和rot3模糊。通过重构连接符号效果新定义的方形函数和高阶函数BI和DIP来显着提高介绍:

但是,潜在的含义仍然没有立即明确,因为它是对分子数学符号的影响。

在认识到这种不同和持续的抵消对支援的缺点时,许多连接性编程语言设计师,例如SlavaPestov,因子设计师和小猫的设计者Jon Purdy,决定包括逃生舱口 - 一种对本地命名变量的方法。遗憾的是,这部分地破坏了连接性符号的初级态度之一:可以在任何句法边界-1中逐渐分裂函数。他们的因子。

在黎明时,我采取了一种重大保留因子的新方法。通过将值分配给本地命名变量而不是为vavoiding stackling而不是,dawnprogrammer可以使用任意数量的任意命名堆栈。 Indawn,功能f(x,y,z)=y²+x² - | y |可能是如此定义:

{Fn Square =>克隆mul} {fn f => {Spread $ x $ y $ z} {$ z drop} {$ y clone square pop} {$ x square pop}添加{$ y abs pop} sub}

首先,方形的定义非常简单。它克隆当前堆栈顶部的Value,然后将顶部两个值乘以,将其产品留在当前堆叠的顶部。这与中锋广场=>杜普×,上面给出的,只需克隆而不是杜帕和MUL而不是×。

{Spread $ x $ y $ z}是句法糖1,它从ChiCurrent堆栈中取出前3个值(被称为F的堆栈)并分别将它们传播到x,$ y和$ z,其中最高(最右)的价值达到$ z。

{$ z drop}从$ z堆栈的顶部删除值。那个价值是永久消失的。 (它通过了!它不再是!它已经停止了!)

{$ y clone square pop}克隆$ y堆栈顶部的值,平方体,然后将正方形从$ y堆栈上弹出到CusterStack上。

{$ x square pop}将$ x堆栈顶部的值与$ x堆栈的正方形正方形方块在当前堆栈上。

添加从当前堆栈中取出顶部两个值,将它们放在一起,并在当前堆栈的顶部离开总和。

{$ y abs pop}从$ y堆栈的顶部取下剩余值,取出它的绝对值,然后将$ ystack从$ ystack上弹出到当前堆栈上。

子来自当前堆栈的顶部两个值,从左侧减去大多数大多数,并留下差异堆叠的差异。

虽然这个黎明翻译肯定比传统的传统符号更冗长,但我希望你能看到(现在我已经解释了每个人的手段),这是一个相当直接的句法翻译,而Theoverall意思几乎可以清楚地清楚传统的数学。黎明翻译中的额外冗长是在大型方面到期的,到黎明的所有功能都是线性的,在LineAregic的意义上 - 也就是说,每个值都是一次使用一次。为了使用少于或多于一次的值模拟,必须使用组合物滴克隆,这增加了冗长。然而,当我们谈论Haskell,C和Rust时,谈论黎明的催化符号的固有线性度是制作黎明宣传的编程语言的另一个主要动力 - 在增加的媒体上支付的价格不仅仅是由在其他例子中表现,控制和冗长的股息。

此外,尽管它可能不立即显而易见,但是这种函数定义扫描被术语分裂并在任何有效的句法边界处重新组合。要成为{$ y克隆广场pop} {$ x square pop}和提取square pop} {$ x square进入辅助功能,它不会有效。它没有有效的tosplit嵌套卷曲支撑对。但是,您可以轻松地重新推荐{$ y clone square pop} {$ x square pop}进入{$ y clone} {$ y square} $ y-> {$ x square} $ x->(其中$ y->和$ x->是{$ y pop}和{$ x pop}的句法糖,然后它将完全有效地提取{ $ y square} $ y-> {$ x square}进入辅助功能。

在Dawn中,没有局部变量呼吸或重命名 - 那里的函数在命名堆栈上运行。概念上,这些命名的StackScan被认为是一个大多数堆栈的不同部分。在阶段,函数被定义为堆栈的一系列操作...之外,除了具有副作用的功能,例如设置全局变量或执行intopput或输出。在黎明时,每个功能都被定义为多堆栈的一系列操作。没有例外情况。

在下一个帖子中,我们将谈论Haskell,看看它是如何对此规则的例外情况 - 也就是说,像Haskell一样黎明是一种纯粹的功能语言,以及你应该关心的原因。我们会看到我们如何进一步提高黎明的重构,超出了(绝大多数)现有的连接性编程语言,静态,推断的类型。最后,我们将开始看看为什么连接符号的固有线性非常值得偶尔增加冗长的成本。

在目前的黎明阶段1原型中,{Spread $ x $ y $ z}通过前端进入($ s1和s2< $ s3< $ s3< $ s3< $ x x< - $ s3 $ y $ z} )($ s2-> $ y&lt ;-)($ s1-> $ z< -)。 ↩︎