最动态的动态编程语言

Dar*_*rio 15 programming-languages

当它说明这一点时,似乎我必须同意这篇文章

[...]动态类型语言中的代码遵循静态类型约定

我遇到的很多动态语言代码确实看起来非常静态(思考PHP),而动态方法看起来有些笨拙或不必要.

大多数情况下,它只是省略类型签名,在类型推断/结构类型的上下文中,甚至根本不必暗示动态类型.

所以我的问题(并不意味着过于主观)是动态语言应用领域都是这些更高级的动态语言特性(不能在静态/编译语言中轻松复制)实际上和在语言使用.

例子:

  • 反射
  • 一流的延续
  • 运行时对象更改/生成
  • 元编程
  • 运行时代码评估
  • 不存在的成员行为

这些技术的有用应用是什么?

Con*_*lls 8

上述技术的广泛应用的一些例子是:

  • Continuations在Rails或Seaside等Web框架中出现.它们可用于允许API伪造本地上下文.在Seaside或Rails中,这使得API的行为更像是本地GUI表单处理程序,而不是HTTP请求处理程序,后者用于简化编写应用程序用户界面元素的任务.然而,尽管许多动态语言对延续有很强的支持,但它们肯定不是这种语言所特有的.

  • 反射被广泛用于O/R映射器和序列化,但许多静态类型的语言也支持反射.在duck typed语言中,它可用于在运行时查找是否通过查看对象的元数据来实现工具.一些O/R映射器(和类似工具)通过实现对实例变量的访问并将更新重定向到数据访问层中的高速缓存记录来工作.这有助于使持久性对开发人员相对透明,因为字段访问看起来很像局部变量.

  • 运行时对象更改稍微有用(想想猴子修补)但主要是噱头.立即浮现在脑海中并没有太多真正的杀手用途,但人们肯定会使用它.一个可能的用途是修复由于某种原因子类化不是一个选项时稍微破坏的行为.

  • 元编程是一个术语的模糊定义,但可以说泛型和C++模板是元编程的一个例子 - 发生在静态类型语言上.在具有元类支持的语言上,自定义元类可用于实现特定行为,例如单例或对象注册表.

    另一个元编程示例是Smalltalk的#notImplemented:方法,该方法在尝试调用不存在的方法时被调用.方法名称和参数提供给实现者#notImplemented:,并且随后可以用于反射地构造方法调用.可以使用陷阱(例如)来实现通用代理机制.

LISP程序员会认为LISP是所有语言中最具动态性的语言,因为它首先支持直接使用代码的解析树(称为"宏").该工具使得在LISP中实现DSL变得微不足道 - 并将它们透明地集成到您的代码库中.


Tho*_*ung 2

您枚举的所有功能也可以在静态类型语言中使用,其中一些功能有限制。

  • 反思:存在于 Java、C# 中(类型不安全)。
  • 一流的延续:Scala 中的有限支持(也许还有其他)
  • 运行时对象更改:C# 中通过扩展方法(将在 Java 7 中)和 Scala 中的隐式类型转换以受限形式支持更改对象的类型。尽管不支持开放类,但大多数用例都包含在类型转换中。
  • 元编程:我想说元编程是许多相关功能的标题,例如反射、运行时类型更改、AOP 等。

因此,仅由动态语言支持的内容已经不多了。例如,对反射的支持绕过了类型系统,但在需要这种灵活性的某些情况下它很有用。动态语言也是如此。

Ruby 支持的开放类特性是编译型语言永远不会支持的。它是最灵活的元编程形式(具有所有含义:安全性、性能、可维护性)。您可以更改平台的类。Ruby on Rails 使用它从元数据动态创建域对象的方法。在静态类型语言中,您至少必须创建域对象的接口(或生成其代码)。

如果您正在寻找“最具活力的语言”,所有同像语言(例如 LISP 和 Prolog)都是不错的候选者。有趣的是,C# 与 LINQ 中的表达式树有些同源。