首先,您的术语存在一些问题。不存在这样的事情松散类型语言和术语脚本语言也很模糊,最常见的是所谓的动态编程语言.
有弱类型 vs. 强类型关于如何严格区分不同类型(即,如果1 + "2"
yields 3
或错误)。
并且有dynamic vs. 静态类型,这大约是when类型信息在运行时或运行前确定。
那么现在,什么是动态语言?一种解释而不是编译的语言?当然不是,因为语言的运行方式从来不是语言的某些固有特征,而是纯粹的实现细节。事实上,同一种语言可以有解释器和编译器。 Haskell 有 GHC 和 GHCi,甚至 C 也有 Ch 解释器。
那么,什么是动态语言呢?我想通过人们如何使用它们来定义它们。
在动态语言中,您喜欢快速构建程序原型并使其以某种方式运行。你不想做的是正式指定你的程序的行为,你只是希望它按照预期的方式运行。
因此,如果你写
foo = greatFunction(42)
foo.run()
in a 脚本语言,你会简单地假设有一些greatFunction
获取一个将返回某个对象的数字,您可以run
。您不以任何方式向编译器证明这一点 - 没有预先确定的类型,没有IRunnable
....这会自动让您进入以下域动态类型.
但是还有类型推断也。类型推断意味着在静态类型语言,编译器会自动为您找出类型。生成的代码可以非常简洁,但仍然是静态类型的。举个例子
square list = map (\x -> x * x) list
在哈斯克尔。 Haskell 提前计算出这里涉及的所有类型。我们有list
是一个数字列表,map
某个函数将其他函数应用于列表的任何元素,并且square
从另一个数字列表生成一个数字列表。
尽管如此,编译器可以提前证明一切正常 - 任何支持的操作are正式指定。因此,我永远不会称 Haskell 为脚本语言,尽管它可以达到类似的表达水平(如果不是更高!)。
所以总而言之,脚本语言 are 动态类型因为这允许您在不指定的情况下对正在运行的系统进行原型设计,但是assuming所涉及的每个操作都存在,这就是脚本语言的用途。