programming-languages - 为什么新的编程语言将类型转移到另一端?

标签 programming-languages

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

int one = 1;

相比:
let one:int = 1;

我的问题:为什么?

就我个人而言,阅读类型说明符很奇怪,因为我很习惯它们在左边。因此,我对为什么要移动类型说明符很感兴趣——这不仅仅是一种情况,而是许多现代/新语言。

最佳答案

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 是一个实数时,你把类型放在右边。 “右侧类型”比 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;
}

我们有什么? return 在逻辑上尽可能地向右,那么为什么函数声明将 return 的类型尽可能地向左移动呢?
function f(x : string) : int 
{ ... ... ... return 123; }

函数调用中会发生什么?声明流程现在与控制流程相同:左边的事情——形式参数的初始化——首先发生,右边的事情——返回值的产生——最后发生。

我可以继续指出 C 风格是如何完全倒退的,但已经晚了。总结:首先,右边的字体几乎在所有可能的方面都优越,其次,它非常非常古老。使用此约定的新语言是与传统做法一致的语言。

关于programming-languages - 为什么新的编程语言将类型转移到另一端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35966358/

相关文章:

programming-languages - 什么是最好的屏幕抓取语言?

programming-languages - 是否存在具有动态类型甚至弱类型的编译* 编程语言?

programming-languages - 除了 try/catch 及其变体之外,您还知道其他错误处理方法吗?

java - 为java创建词法分析器

programming-languages - try/catch/finally 语法的起源

resources - Fortran 90 资源?

c# - C# 或 Java 类型语言的技术术语是什么?

programming-languages - 编程语言的显着特点

c# - 编程语言/库如何与硬件通信?

c# - 一次在屏幕上显示多个实体的 OpenGL 游戏,使用什么语言?