为什么大多数脚本语言都是松散类型的?例如
javascript、python等?
首先,您的术语存在一些问题。没有松散类型的语言,脚本语言这个术语也很模糊,最常见的是所谓的动态编程语言。
关于如何严格区分不同类型(即如果产生或错误),存在弱类型与强类型。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 称为脚本语言,尽管它可以达到类似的表现力水平(如果不是更多的话!)。
所以总而言之,脚本语言是动态类型的,因为这允许您在不指定的情况下对正在运行的系统进行原型设计,但假设所涉及的每一个操作都存在,这就是脚本语言的用途。
我不太明白你的问题。除了 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 , 珀尔, ...