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