6

为什么大多数脚本语言都是松散类型的?例如

javascript、python等?

4

2 回答 2

14

首先,您的术语存在一些问题。没有松散类型的语言,脚本语言这个术语也很模糊,最常见的是所谓的动态编程语言

关于如何严格区分不同类型(即如果产生或错误),存在弱类型强类型。1 + "2"3

并且有动态静态类型,这是关于何时确定类型信息 - 在运行时或运行之前。

那么现在,什么是动态语言?一种解释而不是编译的语言?当然不是,因为语言的运行方式从来都不是该语言的固有特征,而是纯粹的实现细节。事实上,对于同一种语言,可以有解释器和编译器。Haskell 有 GHC 和 GHCi,甚至 C 也有 Ch 解释器。

但是,什么是动态语言?我想通过一个人如何与他们合作来定义他们。

在动态语言中,您喜欢快速制作程序原型并以某种方式使其工作。您不想做的是正式指定程序的行为,您只希望它的行为符合预期。

因此,如果你写

foo = greatFunction(42)
foo.run()

脚本语言中,您将简单地假设有一些greatFunction可以返回一些对象的数字run。您不会以任何方式为编译器证明这一点 - 没有预定的类型,没有IRunnable... 。这会自动让您进入动态类型的领域。

但是也有类型推断。类型推断意味着在静态类型语言中,编译器会自动为您找出类型。生成的代码可以非常简洁,但仍然是静态类型的。举个例子

square list = map (\x -> x * x) list

在哈斯克尔。Haskell 会提前计算出这里涉及的所有类型。我们有list一个数字列表,map一些函数将其他函数应用于列表的任何元素,并square从另一个数字列表生成数字列表。

尽管如此,编译器可以证明一切都提前解决了——任何支持的操作都是正式指定的。因此,我永远不会将 Haskell 称为脚本语言,尽管它可以达到类似的表现力水平(如果不是更多的话!)。


所以总而言之,脚本语言动态类型的,因为这允许您在不指定的情况下对正在运行的系统进行原型设计,但假设所涉及的每一个操作都存在,这就是脚本语言的用途。

于 2010-11-24T13:45:08.853 回答
1

我不太明白你的问题。除了 PHP、VBScriptCOMMAND.COM和 Unix shell(s),我真的想不出任何松散类型的脚本语言。

一些非松散类型的脚本语言示例包括 Python、Ruby、Mondrian、JavaFXScript、PowerShell、Haskell、Scala、ELisp、Scheme、AutoLisp、Io、Ioke、Seph、Groovy、Fantom、Boo、Cobra、Guile、Slate、Smalltalk , 珀尔, ...

于 2010-11-22T03:12:49.690 回答