Most dynamic dynamic programming language
当这篇文章说
[...] code in dynamically typed languages follows static-typing conventions
号
我遇到的许多动态语言代码看起来确实是非常静态的(考虑到PHP),而动态方法看起来有点笨拙或不必要。
大多数情况下,它只是省略类型签名,在类型推断/结构类型化的上下文中,它甚至不必暗示动态类型化。
所以我的问题(这并不意味着太主观)是,动态语言或应用领域都是更高级的动态语言特性(不能用容易使用的静态/编译语言进行复制),实际和实际使用。
示例:
- 反射
- 一流的延续
- 运行时对象更改/生成
- 元程序设计
- 运行时代码评估
- 不存在的成员行为
这些技术有哪些有用的应用?
上述技术广泛应用的一些例子是:
延续使它们出现在Web框架中,如Rails或Seaside。它们可以用来允许API伪造本地上下文。在Seaside或Rails中,这使得API的行为更像本地GUI表单处理程序,而不是HTTP请求处理程序,后者用于简化对应用程序的用户界面元素进行编码的任务。然而,尽管许多动态语言对连续性有很强的支持,但它们肯定不是这种类型的语言所独有的。
反射被广泛用于O/R映射和序列化,但许多静态类型的语言也支持反射。在duck类型语言中,它可以用来在运行时通过查看对象的元数据来发现是否实现了一个工具。一些O/R映射器(和类似的工具)通过实现对实例变量的访问并将更新重定向到数据访问层中的缓存记录来工作。这有助于使持久性对开发人员相对透明,因为字段访问看起来很像局部变量。
运行时对象更改稍微有用(想想猴子补丁),但主要是一个花招。没有很多真正的杀手使用它来立即想到,但人们肯定使用它。它的一个可能用途是在由于某种原因子类化不是一个选项时修复稍微有缺陷的行为。
元编程是一个术语的模糊定义,但可以说,泛型和C++模板是元编程的一个例子,它发生在静态类型的语言上。在支持元类的语言上,自定义元类可用于实现特定的行为,如单例或对象注册表。另一个元编程示例是smalltalk的
#notImplemented: 方法,该方法在尝试调用不存在的方法时调用。方法名和参数被提供给#notImplemented: 的实现者,然后可以反射地用于构造方法调用。捕获这可以用来(例如)实现通用代理机制。
Lisp程序员会争辩说,Lisp是最动态的语言,因为它支持直接处理代码的解析树(称为"宏")。这个工具使得在Lisp中实现DSL变得简单——并将它们透明地集成到代码库中。
你应该访问DouglasCrockford的Wrrld万维网,看看他在javascript上的魔力。Javascript通常以非常简单和简单的方式编写,就像稍微简化的C一样,但它只是表面而已。不可变的关键字只是语言能力的一小部分。其中大部分都存在于系统导出的对象和方法中,并且这些对象和方法是完全可变的。您可以动态地替换/扩展方法,可以替换非常根深蒂固的系统方法,嵌套
感觉就像是javascript变成了一种元语言来修改javascript引擎,让javascript像一种不同的语言一样工作,然后你进一步修改它,使用已经修改过的,而你的实际的,最终的应用程序需要十几条非常直观的线来让语言做它所需要的。噢,并且在这个过程中修补了MSIE上JavaScript实现的无数错误和缺点。
您枚举的所有特性也可以在静态类型语言中使用,有些带有约束。
- 反思:目前在爪哇,C型(不安全型)。
- 第一类延续:scala中的受限支持(可能还有其他)
- 运行时对象更改:用扩展方法(将在Java 7中)和斯卡拉中隐式类型转换的方式来支持对象中的对象类型的更改。尽管不支持开放类,但大多数用例都由类型转换覆盖。
- 元编程:我会说元编程是很多相关特性的标题,比如反射、运行时的类型更改、AOP等。
因此,只有动态语言支持讨论的内容并不多。例如,对反射的支持避开了类型系统,但在需要这种灵活性的某些情况下,它是有用的。在动态语言中也是如此。
Ruby支持的开放类特性是编译语言永远不支持的。它是最灵活的元编程形式(包含所有的含义:安全性、性能、可维护性),您可以更改平台的类。RubyonRails使用它从动态元数据创建域对象的方法。在静态类型语言中,您至少要创建(或生成)域对象的接口。
如果你在寻找"最具二元性的语言",所有同形语言,如Lisp和Prolog都是很好的候选者。有趣的是,C在某种程度上与LINQ中的表达树具有相同的标志性。
我不认为Lisp是"最动态的"(我甚至不知道这意味着什么),但是Lisp程序员经常做其他语言难以做到的事情:
- 创建新的控制结构
- 为现有结构创建新的语法(我认为我见过的每个元类都有自己的defwhatever形式)
- 扩展运行时(每个.emacs都是运行时扩展,例如,为另一个编辑器编写日历模式需要什么?)
Yegge在这里讨论了一些w.r.t.emacs,例如,通过将XML转换为s表达式来解析XML,为您要处理的标记编写函数,并实际运行它。
是的,我觉得javascript很好。< BR>Javascript是如此的灵活,以至于从事不同语言工作的人对它有不同的变体。就像微软的Ajax库一样,它有典型的.NET/C类型语法。还有一些JavaScript库使用$类似于PHP语法。所有这些都是因为javascript是buatay一个人能分辨出哪些语言可以促进类似的事情?< BR>我们应该了解Javascript的关闭特性,这是最先进的,有助于创造出令人惊异的算法并取得巨大的效果。
归根结底,编写动态代码的不是语言,而是程序员;而且会有一条学习曲线来调整您的模式以适应您不习惯的样式。那么,什么类型的工作能够最好地利用动态能力呢?我首先想到的是中间件;异类系统之间的接口;尤其是那些具有不完全文档化的API或变化很大的API的接口,数据序列化是动态的。
我要说的是,无论您在哪里看到REST和Jason被应用,您都更有可能找到动态代码,例如,javascript、php、perl、ruby等。至少部分受欢迎是因为它们能够动态适应。
此外,还有许多JavaScript浏览器代码使用动态技术处理浏览器版本和品牌信息。