【问题标题】:How can you tell if a language is a "dynamic language"?如何判断一种语言是否是“动态语言”?
【发布时间】:2010-12-12 02:10:36
【问题描述】:

我试图更好地理解语言“动态”的真正含义。我对 Lingo 有相当多的经验,它是 Adob​​e(以前的 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# 的次数越来越多,而 Director/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. 宏 - 维基百科文章描述的方式,我不这么认为。但是,可以在运行时编辑脚本,所以这可能很重要。

因此,Lingo 在动态功能上的得分似乎在 2 到 3 分(满分 6 分),但我对闭包和延续还不够清楚,无法确定 Lingo 不支持它们。我想我不确定要得出什么结论。欢迎评论。

【问题讨论】:

  • 您使用的定义似乎很不一致。例如,尚不清楚为什么 lambdas/closures 应该与“动态语言”有任何关系。看起来eval 是唯一有意义的定义。当然,还有“动态类型”,我不确定你的“动态”应该是同一个东西,还是完全不同的概念。
  • @Pavel,感谢您的评论,但这不是我的定义。马克在他的回答中引用了维基百科的文章。如果您查看那篇文章,它会被标记为需要工作的几个警告,因此您可能对定义提出质疑。
  • 坦率地说,这个问题与询问“棕色”是什么颜色一样有用。如果没有明确且广泛接受的“动态编程语言”定义,将语言分类为“动态”与否并不能真正告诉您任何事情。
  • @DanM - 鉴于您同意@Pavel 对引用的定义提出质疑是正确的,您可能不应该将其用作您的问题的基础。
  • @Stephen,对我来说,这个问题就像指着一块巧克力棒问,这是棕色的吗?一旦你意识到你熟悉的东西具有属性 x,你就可以识别出其他不那么熟悉的东西,看看它们是否具有属性 x。至于我的编辑,这确实是一种回应比可以合理放入评论中更长的答案的方式,而不是对维基百科文章的认可。

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


【解决方案1】:

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

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

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

1 - Eval - Lingo 有 dovalue 关键字。另外,您可以在执行时编译脚本。请参阅 LingoF 的功能“Lingo Expressions”。

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

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

4 - 延续 - LingoF 语法助手使用延续技术定义。可以用延续传递风格编写函数。检查这个(取自 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 的反射特性实现的。

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

所以我在动态特征上的得分是 5 到 6 分(满分 6 分)。

【讨论】:

    【解决方案2】:

    “动态”是那些很时髦的词之一,但实际上仅意味着“所做的事情很酷”......它没有一个精确的定义。

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

    一种类型化的语言会检查您永远不会最终尝试对变量执行某些操作,而在运行程序之前无法执行此操作。无类型语言不做这种检查——它只是希望最好的,如果它有一个不适合它需要的值,就会给出一个错误。

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

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

    这两个都可能是问题。但是随着类型语言变得更好,这两个问题都变得不那么重要了。例如,为什么有这样的代码:

    String s = "hello"
    

    当它很明显时

    s = "hello"
    

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

    因此,当您查看为具有 Hindley Milner 类型系统的语言编写的程序时,它可能看起来好像没有类型。但这是一个错误。在程序运行之前,它仍然会计算出所有变量的所有类型必须是什么,并检查你不会因为尝试使用错误的类型做某事而出现任何错误(我认为这太棒了——它接近于一种人工智能……)

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

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

    我称之为“无类型”(或动态类型)的语言确实有类型。例如,在 Python(这是一种无类型的动态语言)中,字符串和整数之间仍然存在差异。但是他们没有额外的逻辑来检查程序在运行之前。所以说他们有类型,但没有类型 system 会更准确。

    相比之下,“类型化”语言,正如我所说,在程序运行之前检查,因此不仅要有类型,还要有额外的逻辑来完成这项工作。

    【讨论】:

    • -1 - 将动态类型语言称为“无类型”是对公认术语的公然滥用。您所说的“类型化”语言是一种“静态类型化”语言。 en.wikipedia.org/wiki/…
    【解决方案3】:

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

    一旦您阅读了那篇文章,我认为您应该知道任何给定语言是否符合静态或动态类型的要求。

    【讨论】:

    • 感谢您的指点。阅读并部分理解了这篇文章后,我可以告诉您,我的示例语言 Lingo 没有类型检查器。如果确实确保您不会尝试使用从未分配过的变量,但仅此而已。也就是说,我认为我并没有真正理解什么是动态类型系统。我对它不擅长什么、擅长什么、不擅长什么有一些感觉,但我想我需要一些不那么抽象的东西才能真正理解它。
    • @DanThMan:我对 Lingo 不熟悉,但我确信它确实有一个类型系统。只是听起来很松散(也就是做了大量的隐式转换)。松散类型系统通常与“动态”语言相关联,但绝不是必需的。例如,Python 有一个相当严格的类型系统,但是是非常动态类型的。在我看来,动态类型语言对很多事情都很有用,但松散类型语言只是让你陷入困境的好方法。 YMMV。
    【解决方案4】:

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

    "Dynamic programming language" 是一个定义相当松散的术语,但我认为如果您必须将其限制为一个限定符,那将是运行时反射。如果您可以进行反射,您可能可以执行 Wikipedia 文章中列出的其他限定符(评估、对象运行时更改、闭包、宏...)。

    我对 Lingo 语言一无所知,但我想说,取消一种语言是动态的通常比限制一种语言更容易. Lingo 可以做维基百科文章中的任何/所有限定词吗?如果不是,那么它可能只是不是动态的。如果它可以做任何事情,那么它可能至少“足够动态”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2011-06-18
      • 1970-01-01
      • 2012-02-19
      • 2014-04-26
      • 1970-01-01
      • 2011-10-07
      相关资源
      最近更新 更多