为什么大多数脚本语言都是松散输入的?

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称为脚本语言,尽管它可以达到类似的表达水平(如果不是更多!).


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


Jör*_*tag 1

我不太明白你的问题。除了 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、...