为什么大多数脚本语言都是松散类型的?例如
javascript,python等?
答案 0 :(得分:13)
首先,您的术语存在一些问题。没有松散类型的语言,术语脚本语言也很模糊,最常见的是所谓的动态编程语言。
弱打字与强打字关于如何在不同类型之间进行严格区分(例如,如果1 + "2"
产生3
或错误)。
还有动态与静态类型,这是关于确定类型信息时的 - 在运行时或之前。
现在,什么是动态语言?一种被解释而不是编译的语言? 肯定不是,因为语言的运行方式绝不是语言的一些固有特性,而是纯粹的实现细节。实际上,可以使用同一种语言的解释器和编译器。 Haskell有GHC和GHCi,甚至C也有Ch解释器。
然而,什么是动态语言?我想通过如何与他们合作来定义它们。
在动态语言中,您希望快速制作程序原型并以某种方式使其工作。你不想做的是正式指定你的程序的行为,你只是希望它的行为与预期的一样。
因此,如果你写
foo = greatFunction(42)
foo.run()
在脚本语言中,您只需假设有一些greatFunction
获取的数字会返回一些您可以run
的对象。您没有以任何方式为编译器证明这一点 - 没有预定义类型,没有IRunnable
....这会自动进入动态类型域。
但也有类型推断。类型推断意味着在静态类型语言中,编译器会自动为您确定类型。生成的代码可以非常简洁,但仍然是静态类型。举个例子
square list = map (\x -> x * x) list
在Haskell。 Haskell提前计算出所有涉及的类型。我们list
是一个数字列表,map
一些函数将一些其他函数应用于列表的任何元素,square
生成另一个数字列表中的数字列表。< / p>
尽管如此,编译器可以提前证明一切正常 - 任何支持的操作都是正式指定的。因此,我永远不会将Haskell称为脚本语言,尽管它可以达到相似的表达水平(如果不是更多!)。
总而言之,脚本语言是动态类型,因为它允许您在不指定的情况下对正在运行的系统进行原型设计,但假设每一个涉及的操作存在,这是脚本语言的用途。
答案 1 :(得分:1)
我不太明白你的问题。除了PHP,VBScript,COMMAND.COM
和Unix shell之外,我真的不能想到任何松散类型的脚本语言。
非松散类型的脚本语言的一些示例是Python,Ruby,Mondrian,JavaFXScript,PowerShell,Haskell,Scala,ELisp,Scheme,AutoLisp,Io,Ioke,Seph,Groovy,Fantom,Boo,Cobra,Guile, Slate,Smalltalk,Perl,...