有一种语言可以同时支持静态和动态类型吗?

9

在SO上有很多关于静态和动态类型的问题,但我没有找到太多同时具备两者的语言。让我来说明一下。

似乎动态类型的语言在快速原型设计方面更具优势,例如Python或Perl,而静态类型的语言(如C++、OCaml)则允许进行更多编译时检查和优化。 我想知道是否有一种语言可以同时实现这两个目标:

  • 首先,使用动态类型进行快速原型设计,使用通用的(即接受任何类型的)打印函数进行简单调试和REPL,并适应可变的设计选择
  • 然后,更改一些内容并将代码编译成库,使用静态类型进行更安全的测试和最佳性能。为了允许静态类型,可以更改的内容包括:声明变量(但不需要注释所有内容,感谢类型推断)、添加编译器开关、使用特定函数而不是通用函数等

C#的默认是静态类型,但你可以写:

dynamic fooVar = new FooClass();

如果这种情况下使用fooVar,它就是动态类型。

似乎OCaml与http://www.lexifi.com/blog/runtime-types也提供类似的功能。

请不要提供主观意见关于哪种语言最好,只要客观描述其特性即可!


http://www.typescriptlang.org/ - Dave Bish
1
投票关闭;这不是一个坏问题(在我看来并不值得被踩),但很可能会引发争议,因此更适合程序员交流网站。 - dash
任何明智的编程语言,无论是否有类型,都需要声明变量。此外,“适应不断变化的设计选择”如果没有类型检查器的支持,通常并不容易(除非你有一个冗长的类型系统)。 - Andreas Rossberg
请查看http://www.shenlanguage.org/。 - SK-logic
1个回答

7
当然,这被称为“渐进式类型”,我认为它是时髦的。 "渐进式类型" 的近亲是“可选类型”。在这两种情况下,具有静态类型和无静态类型的代码共存。但是,在“可选类型”中,语言的语义完全不考虑静态类型,而在“渐进式类型”中,如果有静态类型,则语义可能会考虑静态类型。
从课程页面 "Integrating Static and Dynamic Typing" 可以看到,他们研究:
最近一些将静态类型和动态类型结合起来的语言设计,包括 Typed Racket(以前的 Typed Scheme)、C#4.0、Diamondback Ruby、Haskell、Sage 和 Thorn。
您可以将 Dart 加入到列表中,就像在立场文件 "Pluggable, Optional Type Systems" 中提出的那样,它提出了可选类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接