你怎么知道一种语言是否是一种“动态语言”?

时间:2009-11-01 18:39:04

标签: c# dynamic dynamic-languages esoteric-languages lingo

我正在努力更好地处理语言“动态”的真正含义。我对 Lingo 有很多经验,它是Adobe(以前的Macromedia)Director产品系列的脚本语言,我只是想知道它是否会被视为“动态语言”。

处理变量和列表的方式似乎非常“动态语言” - 对我而言。

使用变量,您只需编写foo = 3bar = "Hello World"。您没有将变量声明为intstring - 它会按原样来表示。

使用列表,您可以编写类似miscCollection = [3, "Hello World", #helloWorld, ["Embedded List", "Goes Here", 3], [#phrase: "Property List goes here", #value: 3]]的内容。这不会与tuple相似吗?

这些功能是否足以符合“动态语言”状态?

有趣的是,我一直在使用C#而且导演/ Lingo要少得多,但是现在对动态语言感到非常兴奋,我想知道我是否真的反对谷歌。

修改

关于Mark Rushakoff的回答,下面,这是尝试使用此Wikipedia article来分析Lingo是否符合“动态”:

  1. Eval - Lingo有dovalue个关键字。 do将执行整个命令,例如do "foo = 23"do "foo = sum(20, 3)"value尝试将字符串转换为数字,但它不仅仅是一个解析运算符 - 它实际上可以将变量的字符串表示转换为其数字,例如,假设foo = 23,语句value("foo")将评估为23。

  2. 高阶函数 - 如果我理解这一点,这基本上就是我在C#中被称为“委托”的东西。据我所知,Lingo并不直接支持这种情况,尽管您可以创建一个具有函数的类型(称为“父脚本”)并传递该类型的实例。

  3. 关闭 - 据我所知,不支持此事。

  4. 延续 - 据我所知,不支持此事。

  5. 反思 - 至少从某种意义上讲,是的。实际上,您使用字符串创建了新的类型实例,例如fooInstance = script("Foo").new(bar)。也可以将类型的实例转换为包含类型名称的字符串(这样您就可以模仿c#的GetType()功能)。您还可以在不知道属性名称的情况下查询类型的属性(例如,按索引查找属性)并按索引查找属性的名称。

  6. 宏 - 维基百科文章描述的方式,我不相信。但是,可以在运行时编辑脚本,因此可能很重要。

  7. 所以,似乎Lingo在动态特性上得分为2比3,但我对闭包和延续不够清楚,因为他们确定Lingo不支持它们。我想我不知道该结论。欢迎评论。

4 个答案:

答案 0 :(得分:5)

类型推断(例如foo = 3bar = "Hello World"的示例)并不意味着动态语言。 C#中的var关键字在编译时推断出变量类型,Haskell也可以对所有变量使用隐式类型,即使在编译的程序中也是如此。

"Dynamic programming language"是一个非常松散定义的术语,但我认为如果你必须将它限制为一个限定符,它将是运行时反射。如果你可以做反思,你可以做维基百科文章中列出的其他限定词(eval,对象运行时更改,闭包,宏......)。

我对Lingo语言一无所知,但我认为取消资格一种语言比使用限定一种语言更容易。 Lingo可以在维基百科文章中做任何/所有限定符吗?如果没有,那么它可能只是不动态。如果它可以做任何事情,那么它可能至少“足够动态”。

答案 1 :(得分:2)

“动态”是那些时髦的词汇之一,但实际上只不过是“我做什么很酷”......它没有精确的定义。

话虽如此,我可以回答你关于类型的问题,或者至少尝试解释有类型和无类型(有些人称之为动态或动态类型)语言之间的区别。

键入的语言会检查您永远不会最终尝试使用运行程序前无法执行的变量。一种无类型的语言不会做这种检查 - 它只是希望最好的,如果它有任何一点,它有一个不适合它需要的值,就会产生错误。

这是两个极端。就像生活中的一切一样,在实践中语言介于两个理论极端之间。因此,有时很难说语言是键入的或无类型的 - 通常你可以说的是“语言X在编译时比语言Y有更好的类型检查,因为这些错误在X中被捕获但在Y中没有:... 。“

鉴于该定义,您可能会担心(1)类型化语言需要在程序中添加更多文本(因为您需要说出每个值的类型)和(2)键入的语言可能会限制您可以执行的操作不必要的(因为类型系统不够聪明,不允许你能看到的东西会起作用)。

这两个都可能是问题。但是随着打字语言变得更好,它们都是不那么重要的问题。例如,为什么代码如下:

String s = "hello"

只有

才显而易见
s = "hello"

“s”必须是字符串?像这样“聪明”的语言,你不需要说出所有类型的东西,但它们仍然被检查,通常被称为“Hindley Milner”,因为那些人​​首先想出如何做到这一点详细。

因此,当您查看使用Hindley Milner类型系统编写的语言程序时,它可能看起来没有类型。但这是一个错误。在程序运行之前,它仍然会计算所有变量的所有类型,并检查您是否因为尝试使用错误的类型而无法获得任何错误(我认为这很棒 - 它接近于一种人工智能...)

这意味着有时候知道某种语言是否被输入的唯一方法就是了解它是如何实现的。仅仅看一下来源可能并不明显。

编辑:我刚刚重新阅读了上述内容,我本可以更清楚一点。我试图做的区别是具有类型系统 的语言和不具有类型系统 的语言。 类型系统包括两件事:类型本身和用于检查类型是否正确的逻辑。

我称之为“无类型”(或动态类型)的语言确实有类型。例如,在Python中(这是一种无类型的动态语言),String和Integer之间仍然存在差异。但是它们没有额外的逻辑来检查运行之前的程序。因此,更准确地说它们有类型,但没有类型系统

相比之下,“类型化”的语言,正如我所说的,在程序运行之前检查,因此必须不仅仅是类型,而是执行此操作的额外逻辑。

答案 2 :(得分:1)

当人们谈论编程语言是“动态的”时,他们通常指的是动态类型系统。我所读过的关于动态类型系统(以及它不是什么)的最佳定义是Chris Smith的优秀文章What to Know Before Debating Type Systems

一旦您阅读了该文章,我认为您应该得到关于任何给定语言是否符合静态或动态类型的答案。

答案 3 :(得分:0)

我想证明Lingo是一种动态语言。

我为Lingo做了LingoF功能编程框架。 这个框架完全用Lingo编写,没有xtra,没有使用低级组件,因此如果语言不是动态的话,就不可能开发这样的框架。

考虑到这个框架,这是我对Lingo作为动态语言的评价:

1 - Eval - Lingo拥有dovalue个关键字。另外,您可以在执行时编译脚本。参见LingoF的特征“Lingo表达式”。

2 - 高阶函数--LingoF展示了如何在Lingo中广泛使用高阶函数。

3 - 闭包 - LingoF再次展示了如何使用Lingo中的闭包。

4 - Continuation - 使用延续技术定义LingoF语法助手。可以在Continuation Passing Style中编写函数。检查一下(取自LingoF模块):

on public_factorialCPS_2
on fac me, n,k
  x = LingoF().var()
  if ( n = 0 ) then return k [1] 
  else return me.factorialCPS[$(#-,n,1) ] [ LingoF().fun(x) [ k [ $(#*,n,x) ]  ] ]
end

5 - 反思 - 已经回答是,我同意。例如,LingoF模块管理器是使用DanM提到的Lingo的Reflection功能实现的。

6 - 宏 - 我将不得不在这个领域做更多的研究。 由于Director支持Linked Scripts(存储在外部文本文件中的脚本),因此可以实现某种宏。也许宏管理器可以截取一些事件,如startMovie(扩展它们)和stopMovie(再次压缩它们)。 另一种可能性是使用字段作为脚本并在脚本成员中展开它们,我相信它会正常工作。

因此动态功能的得分为6到6分。