为什么新的编程语言将类型转移到另一方?

时间:2016-03-13 04:09:43

标签: programming-languages

如果你看看Rust,Go,Swift,TypeScript和其他几个,并将它们与C / C ++进行比较,我注意到的第一件事是类型如何移动位置。

int one = 1;

比较:

let one:int = 1;

我的问题:为什么?

就我个人来说,这是一个奇怪的阅读类型说明符,因为我很习惯他们在左边。因此,我感兴趣的是为什么类型说明符被移动 - 而不是只有一个,而是许多现代/新语言的情况。

2 个答案:

答案 0 :(得分:22)

  

就我个人来说,这是一个奇怪的读取类型说明符,因为我很习惯他们在左边

英语是最好的语言,因为它是唯一一种语言,我认为这些语言的语言顺序相同。人们想知道为什么有人会说法语,所有的话都是错误的顺序!

  

因此,我感兴趣的是为什么要移动类型说明符 - 而这种情况并非只有一种,而是桌面上的许多现代/新语言。

我注意到你忽略了使用这种模式的许多旧语言的存在。立即浮现在Visual Basic(20世纪90年代中期)。

Function F(x As String) As Object
帕斯卡,20世纪70年代:

var
  Set1 : set of 1..10;

简单类型的lambda演算,一种在计算机之前发明的编程语言,在20世纪40年代:

λx:S.λy:T:S-->T-->S

整个ML家庭。我可以继续有很多非常古老的语言使用正确约定的类型。

但我们可以比20世纪40年代更老。当您在数学f : Q --> R中说,您将左侧的函数名称和右侧的类型 - 从Q到R的映射。当你说x∈R表示x是真实的时,你就把这个类型放在右边。 “右侧的类型”在C的左侧以类型几个世纪的类型出现。这不是什么新鲜事!

事实上,“左侧的类型”语法是奇怪的!这对你来说似乎很自然,因为你碰巧在你的成长时期使用了一种使用这种惯例的语言。

由于种种原因,正确语法的类型要优越得多。只是几个:

var x : int = 1;
function y(z : int) : string { ... }    

强调x是变量,y是函数。如果类型出现在左侧并且您看到int y,那么直到稍后您才知道它是函数还是变量。这使得程序更难以阅读,这已经够糟糕了。作为一名编译器开发人员,让我告诉你,这个类型在C#左边是非常不方便的。 (我可以指出C#语法如何处理类型位置的许多不一致。)

另一个原因:在“右侧输入”语法中,您可以使类型可选。如果你有

var x : int = 1;

然后你可以很容易地说“好吧,我们可以推断出int,从而消除它”

var x = 1;

但是如果int在左边,那么你做什么?

反过来:你提到TypeScript。 TypeScript是逐渐类型化的JavaScript。 JavaScript中的约定已经是

var x = 1;
function f(y) { }

鉴于这一点,显然更容易修改现有代码和整个语言,在右侧引入可选类型元素,而不是将“var”和“function”关键字替换为类型

还要考虑定位。当你说:

int x = 1;
然后,必须保持一致的两件事 - 类型和初始化器 - 尽可能地分开。 var x : int = 1;他们是并排的。并在

int f() {
   ...
   ...
   return 123;
}
我们得到了什么?返回逻辑上是尽可能向右,那么为什么函数声明会将返回的类型尽可能地移到左边?“在正确的语法上我们有这个很好的流程:

function f(x : string) : int 
{ ... ... ... return 123; }

函数调用会发生什么?声明的流程现在与控制流程相同:左边的东西 - 形式参数的初始化 - 首先发生,右边的东西 - 产生返回值 - 最后发生。< / p>

我还可以继续指出C风格是如何完全倒退的,但是已经很晚了。总结:首先,右侧的类型几乎在所有可能的方式都是优越的,其次,它非常非常老。使用此惯例的新语言与传统实践保持一致。

答案 1 :(得分:1)

如果你进行网络搜索,就不难发现用他们自己的话来回答这个问题的新语言的开发者。例如,Go开发人员对此有一个FAQ entry,以及他们语言博客上的entire article。许多程序员都习惯于类C语言,任何替代方案看起来都很奇怪,所以这个问题往往会出现很多......

但是,您可能会认为C类型声明语法本身最多只是奇数。指针和函数类型的类似模式的特性很快变得笨拙和不直观,并且从未被开发为任何类型的更一般的模式匹配工具的一部分或进入。为了熟悉起见,它们被许多连续的类C语言或多或少地采用,但是这个特征本身更像是一个失败的实验,为了向后兼容,我们必须忍受这个实验。

从C类型语法中解脱出来的一个好处是,它使得在更多地方使用类型比仅使用声明更容易。如果您可以方便地将类型放在任何有意义的位置,您可以使用类型作为注释,如Swift documentation中所述。