为什么新的编程语言将类型转移到另一边?
Why are new programming languages shifting types to the other side?
如果您查看 Rust、Go、Swift、TypeScript 和其他一些语言,并将它们与 C/C++ 进行比较,我首先注意到的是类型如何移动位置.
int one = 1;
相比于:
let one:int = 1;
我的问题:为什么?
就我个人而言,将类型说明符读入一行很奇怪,因为我非常习惯它们在左边。所以让我感兴趣的是为什么要移动类型说明符——这不仅仅是一种情况,而是 table.
上的许多 modern/new 语言。
如果您进行网络搜索,不难发现新语言的开发人员用他们自己的话回答了这个问题。例如,Go 开发人员在他们的语言博客上有一个 FAQ entry on this, as well as an entire article。许多程序员已经习惯了类 C 语言,以至于任何替代方案都显得很奇怪,所以这个问题往往会出现很多...
但是,您可能会争辩说 C 类型声明语法本身充其量是奇怪的。指针和函数类型的类似模式的特性很快就会变得笨拙和不直观,并且从未作为任何类型的更通用的模式匹配工具的一部分或进入其中开发。为了熟悉起见,许多连续的类 C 语言或多或少地采用了它们,但该功能本身更像是一个失败的实验,为了向后兼容,我们不得不接受它。
从 C 类型语法中解脱出来的一个好处是,它可以更容易地在更多地方使用类型,而不仅仅是声明。如果您可以方便地将类型放在有意义的地方,则可以将您的类型用作注释,如 Swift documentation.
中所述
To me, personally, it is weird reading type specifiers that far into the line, since I am very used to them being on the left
英语是最好的语言,因为它是唯一一种按照我认为的相同顺序说出单词的语言。有人想知道为什么有人会说法语,而且单词的顺序都错了!
So it interests me on why the type specifiers are being moved - and this not being the case with just one, but many modern/new languages that are on the table.
我注意到您忽略了许多使用此模式的旧语言的存在。立即想到 Visual Basic(1990 年代中期)。
Function F(x As String) As Object
帕斯卡,1970 年代:
var
Set1 : set of 1..10;
简单类型的 lambda 演算,一种编程语言 在计算机 之前发明的,在 1940 年代:
λx:S.λy:T:S-->T-->S
整个ML家族。我可以继续。有很多非常古老的语言按照正确的约定使用类型。
但我们可以比 1940 年代老得多。当您在数学中说 f : Q --> R
时,您将函数名称放在左侧,将类型——从 Q 到 R 的映射——放在右侧。当你说 x∈R 表示 x 是实数时,你将类型放在右边。 "Type on the right" 比 C 中左边的类型早 个世纪 。这不是什么新鲜事!
事实上 "types on the left" 语法很奇怪!这对你来说似乎很自然,因为你在成长的岁月里碰巧使用过一种使用这种约定的语言。
出于多种原因,正确语法中的类型要优越得多。就几个:
var x : int = 1;
function y(z : int) : string { ... }
强调x是一个变量,y是一个函数。如果类型出现在左侧并且您看到 int y
,那么直到稍后您才知道它是函数还是变量。这使得程序更难被人类阅读,这已经够糟糕了。作为一名编译器开发人员,让我告诉你,在 C# 中类型在左边是很不方便的。 (我可以指出 C# 语法如何处理类型位置的许多不一致之处。)
另一个原因:在 "type on the right" 语法中,您可以将类型设为可选。如果你有
var x : int = 1;
然后你可以很容易地说"well, we can infer the int, and so eliminate it"
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;
}
我们得到了什么? return逻辑上尽可能向右,那么为什么函数声明将return的类型移到最远尽可能左边?”使用右边语法上的类型,我们有这个很好的流程:
function f(x : string) : int
{ ... ... ... return 123; }
函数调用会发生什么?声明的流程现在与控制流程相同:左边的事情——形式参数的初始化——首先发生,右边的事情——return 值的产生——最后发生。
我可以继续更深入地指出 C 风格如何完全倒退,但已经晚了。总结一下:首先,右边的字体几乎在所有可能的方面都更胜一筹,其次,它非常非常古老。使用此约定的新语言是与传统实践一致的语言。
如果您查看 Rust、Go、Swift、TypeScript 和其他一些语言,并将它们与 C/C++ 进行比较,我首先注意到的是类型如何移动位置.
int one = 1;
相比于:
let one:int = 1;
我的问题:为什么?
就我个人而言,将类型说明符读入一行很奇怪,因为我非常习惯它们在左边。所以让我感兴趣的是为什么要移动类型说明符——这不仅仅是一种情况,而是 table.
上的许多 modern/new 语言。如果您进行网络搜索,不难发现新语言的开发人员用他们自己的话回答了这个问题。例如,Go 开发人员在他们的语言博客上有一个 FAQ entry on this, as well as an entire article。许多程序员已经习惯了类 C 语言,以至于任何替代方案都显得很奇怪,所以这个问题往往会出现很多...
但是,您可能会争辩说 C 类型声明语法本身充其量是奇怪的。指针和函数类型的类似模式的特性很快就会变得笨拙和不直观,并且从未作为任何类型的更通用的模式匹配工具的一部分或进入其中开发。为了熟悉起见,许多连续的类 C 语言或多或少地采用了它们,但该功能本身更像是一个失败的实验,为了向后兼容,我们不得不接受它。
从 C 类型语法中解脱出来的一个好处是,它可以更容易地在更多地方使用类型,而不仅仅是声明。如果您可以方便地将类型放在有意义的地方,则可以将您的类型用作注释,如 Swift documentation.
中所述To me, personally, it is weird reading type specifiers that far into the line, since I am very used to them being on the left
英语是最好的语言,因为它是唯一一种按照我认为的相同顺序说出单词的语言。有人想知道为什么有人会说法语,而且单词的顺序都错了!
So it interests me on why the type specifiers are being moved - and this not being the case with just one, but many modern/new languages that are on the table.
我注意到您忽略了许多使用此模式的旧语言的存在。立即想到 Visual Basic(1990 年代中期)。
Function F(x As String) As Object
帕斯卡,1970 年代:
var
Set1 : set of 1..10;
简单类型的 lambda 演算,一种编程语言 在计算机 之前发明的,在 1940 年代:
λx:S.λy:T:S-->T-->S
整个ML家族。我可以继续。有很多非常古老的语言按照正确的约定使用类型。
但我们可以比 1940 年代老得多。当您在数学中说 f : Q --> R
时,您将函数名称放在左侧,将类型——从 Q 到 R 的映射——放在右侧。当你说 x∈R 表示 x 是实数时,你将类型放在右边。 "Type on the right" 比 C 中左边的类型早 个世纪 。这不是什么新鲜事!
事实上 "types on the left" 语法很奇怪!这对你来说似乎很自然,因为你在成长的岁月里碰巧使用过一种使用这种约定的语言。
出于多种原因,正确语法中的类型要优越得多。就几个:
var x : int = 1;
function y(z : int) : string { ... }
强调x是一个变量,y是一个函数。如果类型出现在左侧并且您看到 int y
,那么直到稍后您才知道它是函数还是变量。这使得程序更难被人类阅读,这已经够糟糕了。作为一名编译器开发人员,让我告诉你,在 C# 中类型在左边是很不方便的。 (我可以指出 C# 语法如何处理类型位置的许多不一致之处。)
另一个原因:在 "type on the right" 语法中,您可以将类型设为可选。如果你有
var x : int = 1;
然后你可以很容易地说"well, we can infer the int, and so eliminate it"
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;
}
我们得到了什么? return逻辑上尽可能向右,那么为什么函数声明将return的类型移到最远尽可能左边?”使用右边语法上的类型,我们有这个很好的流程:
function f(x : string) : int
{ ... ... ... return 123; }
函数调用会发生什么?声明的流程现在与控制流程相同:左边的事情——形式参数的初始化——首先发生,右边的事情——return 值的产生——最后发生。
我可以继续更深入地指出 C 风格如何完全倒退,但已经晚了。总结一下:首先,右边的字体几乎在所有可能的方面都更胜一筹,其次,它非常非常古老。使用此约定的新语言是与传统实践一致的语言。