Programming languages 动态规划语言

Programming languages 动态规划语言,programming-languages,Programming Languages,当它说 动态类型语言中的[…]代码遵循静态类型约定 我遇到的许多动态语言代码看起来确实非常静态(想想PHP),而动态方法看起来有些笨拙或不必要 大多数时候,它只是关于省略类型签名,在类型推断/结构类型化的上下文中,甚至不必暗示动态类型 所以我的问题(也不是太主观)是,在动态语言或应用程序领域中,所有这些更高级的动态语言特性(无法在静态/编译语言中轻松复制)实际上都是我以自己的方式使用的 示例: 倒影 第一类延续 运行时对象更改/生成 元编程 运行时代码评估 不存在的成员行为 这些技术的有用应

当它说

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

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

大多数时候,它只是关于省略类型签名,在类型推断/结构类型化的上下文中,甚至不必暗示动态类型

所以我的问题(也不是太主观)是,在动态语言或应用程序领域中,所有这些更高级的动态语言特性(无法在静态/编译语言中轻松复制)实际上都是我以自己的方式使用的

示例:

  • 倒影
  • 第一类延续
  • 运行时对象更改/生成
  • 元编程
  • 运行时代码评估
  • 不存在的成员行为

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

上述技术广泛应用的一些示例如下:

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

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

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

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

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


LISP程序员会认为LISP是所有语言中最具动态性的语言,因为它的第一类支持直接篡改代码的解析树(称为“宏”)。这种功能使得在LISP中实现DSL变得非常简单,并将它们透明地集成到您的代码库中。

最终,编写动态代码的不是语言,而是程序员;这将是一个学习曲线来调整你的模式,使之适应你不习惯的风格。那么,哪些类型的工作可以最好地利用动态功能呢?我首先想到的是中间件;异构系统之间的接口;尤其是那些API文档不完整或API变化很大,并且数据序列化是动态的API

我想说的是,无论您在哪里看到REST和jason被应用,您都更有可能找到动态代码,例如,javascript、php、perl、ruby。。。它们之所以受欢迎,至少部分是因为它们具有动态适应能力


此外,还有许多javascript浏览器代码使用动态技术处理浏览器版本和品牌的兼容性。

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

  • 反射:存在于Java、C#中(不是类型安全的)
  • 第一类延续:Scala中的受限支持(可能还有其他)
  • 运行时对象更改:在C#中,通过扩展方法(将在Java 7中)和Scala中的隐式类型转换,以限制形式支持更改对象的类型。尽管不支持开放类,但大多数用例都包含在类型转换中
  • 元编程:我想说元编程是许多相关特性的发展方向,如反射、运行时类型更改、AOP等
因此,只有动态语言支持讨论的内容已经不多了。例如,对反射的支持绕过了类型系统,但在需要这种灵活性的某些情况下,它是有用的。在动态语言中也是如此

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

如果您正在寻找“最动态语言”,那么像LISP和Prolog这样的语言都是不错的选择。有趣的是,C#有点像h