最动态的动态编程语言

时间:2010-01-27 14:38:47

标签: programming-languages

当它陈述

时,似乎我必须同意这个post
  动态类型语言中的

[...]代码遵循静态类型约定

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

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

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

示例:

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

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

6 个答案:

答案 0 :(得分: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变得微不足道 - 并将它们透明地集成到您的代码库中。

答案 1 :(得分:2)

您枚举的所有功能也可以使用静态类型语言,其中一些具有约束条件。

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

所以没有很多东西只能由动态语言来支持讨论。例如对Reflection的支持规避了类型系统,但在需要这种灵活性的某些情况下它很有用。在动态语言中也是如此。

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

如果您正在寻找“最痴迷的语言”,那么像LISP和Prolog这样的所有homoiconic languages都是不错的选择。有趣的是,C#与LINQ中的表达式树有些同质。

答案 2 :(得分:2)

你应该访问Douglas Crockford's Wrrrld Wide Web并通过Javascript查看他的魔法。 Javascript通常以非常直接和简单的方式编写,就像略微简化的C.但它只是表面。不可变的关键字只占语言能力的一小部分。其中大部分位于系统导出的对象和方法中,这些都是完全可变的。您可以动态替换/扩展方法,您可以替换非常根深蒂固的系统方法,嵌套eval(),即时加载生成的<SCRIPT>,等等。这可用于编写各种语言扩展,框架,工具箱等。在简单的Javascript中,您可以编写50行来修改Javascript的工作方式,而使用新语法来完成工作,而不是使用简单的Javascript编写200行代码。您可以动态生成整个页面,包括嵌入其中的JS。您将网页结构转换为数据存储。您可以替换常用对象和常用对象的常用方法,以便即时更改其行为,只需单击即可更改外观,还可以更改网页的功能。

真的感觉Javascript成为修改Javascript引擎的元语言,并使Javascript功能像一个不同的语言,然后你使用已修改的进一步修改它,你的实际,最终的应用程序需要十几个非常直观的行获取语言完全符合它的需要。哦,并在此过程中修补了MSIE上Javascript实现的无数错误和缺点。

答案 3 :(得分:1)

我不会声称Lisp是“最有活力的”(我甚至不确定这意味着什么),但是Lisp程序员经常做其他语言难以做到的事情:

  • 创建新的控制结构
  • 为现有构造创建新语法(我认为我见过的每个元类都有自己的defwhatever形式)
  • 扩展运行时(每个.emacs是一个运行时扩展,例如,为另一个编辑器编写日历模式需要什么?)

Yegge talks about it some here w.r.t。 Emacs,例如,通过将XML转换为s表达式,为要处理的标记编写函数以及实际运行它来解析XML。

答案 4 :(得分:0)

最终,它不是编写动态代码的语言,它是程序员;并且将会有一个学习曲线来调整您的模式以适应您不习惯的风格。那么什么类型的工作可以充分利用动态功能?我想到的第一个是中间件;异构系统之间的接口;特别是那些文档不完整的API或API发生了很大变化,数据序列化是动态的。

我会说你看到REST和jason被应用的任何地方,你更有可能找到动态代码,例如,javascript,php,perl,ruby,...至少部分受欢迎,因为它们有能力动态适应。

此外,还有很多javascript浏览器代码可以使用动态技术处理浏览器版本和品牌的不足。

答案 5 :(得分:0)

是的,我认为JavaScript是好的。
JavaScript非常灵活,使用不同语言的人可以使用不同的变体。像Microsoft一样,Ajax库具有典型的.NET / C#类型语法。还有一些JavaScript库使用$看起来类似于PHP语法。一切都在那里,因为JavaScript是bueaty有多少其他语言可以告诉哪些可以促进这样的事情?
人们应该了解JavaScript闭包功能,这是一种先进的技术,可以帮助创建出色的算法并获得很好的效果。