最动态的动态编程语言
看来我必须同意这篇文章,当它说
动态类型语言中的代码遵循静态类型约定
我遇到的很多动态语言代码似乎确实是相当静态的(思考PHP),而动态方法看起来有些笨拙或不必要。
大多数情况下,它只是在省略类型签名,而在类型推断/结构类型的背景下,甚至不必暗示动态类型。
所以我的问题(并不意味着过于主观)是动态语言或应用领域都是这些更高级的动态语言特性(它不会被容易地在静态/编译语言中复制)实际和习惯性地使用。
例子:
什么是这种技术的有用的应用程序?
列举的所有功能也都可以在静态类型语言中使用,其中一些具有约束条件。
所以现在没有很多只有动态语言才支持的讨论。 支持Reflection的例子绕过了类型系统,但在需要这种灵活性的某些情况下它是有用的。 动态语言也是如此。
Ruby支持的公开类功能是编译语言永远不会支持的功能。 这是可能的最简单的元编程形式(具有所有含义:安全性,性能,可维护性)。您可以更改平台的类。 它被Ruby on Rails用于根据元数据即时创建域对象的方法。 在静态类型语言中,您至少需要创建(或生成)域对象接口的代码。
如果你正在寻找“最动态的语言”,像LISP和Prolog等所有同音代语言都是不错的选择。 有趣的是,C#与LINQ中的表达树有点同心。
上述技术的广泛应用的一些例子是:
Continuations在Rails或Seaside等Web框架中出现。 它们可以用来允许API伪造本地上下文。 在Seaside或Rails中,这使得API的行为更像一个本地GUI表单处理程序,而不是一个HTTP请求处理程序,它可以简化编写应用程序用户界面元素的任务。 但是,尽管许多动态语言对延续有很强的支持,但它们当然不是这类语言所特有的。
反射广泛用于O / R映射器和序列化,但许多静态类型的语言也支持反射。 在鸭子类型的语言中,它可以用来在运行时发现设施是否通过查看对象的元数据来实现。 一些O / R映射器(和类似工具)通过实现对实例变量的访问并将更新重定向到数据访问层中的缓存记录来工作。 这有助于使开发人员对持久性相对透明,因为字段访问看起来很像本地变量。
运行时对象更改稍微有用(想想猴子修补),但主要是一个噱头。 立即想到真正的杀手用途并不多,但人们肯定会使用它。 一种可能的用途是修复由于某种原因子类化不是选项时的轻微中断行为。
元编程对某个术语来说是相当模糊的定义,但可以说泛型和C ++模板是元编程的一个例子 - 发生在静态类型语言上。 在支持元类的语言上,可以使用自定义元类来实现特定行为,如单例或对象注册表。
另一个元编程示例是Smalltalk的#notImplemented:
方法,该方法试图调用不存在的方法。 方法名称和参数提供给#notImplemented:
的实现者,并且可以随后用于反射地构造方法调用。 可以使用陷阱(例如)来实现通用代理机制。
LISP程序员会争辩说LISP是所有语言中最动态的语言,因为它的第一类支持直接与代码的分析树(称为“宏”)进行交涉。 这个工具使得在LISP中实现DSL变得微不足道 - 并将它们透明地集成到您的代码库中。
您应该访问道格拉斯克罗克福德的Wrrrld Wide Web,并通过Javascript了解他的魔力。 Javascript通常以非常直接和简单的方式编写,就像略微简化了一下C.但它只是表面。 不可变关键字只占语言能力的一小部分。 它大部分位于由系统导出的对象和方法中,并且这些对象和方法是完全可变的。 您可以随时替换/扩展方法,可以替换相当根深蒂固的系统方法,嵌套eval()
,即时加载生成的<SCRIPT>
等等。 这可用于编写各种语言扩展,框架,工具箱等。 您可以用50行代码来修改Javascript的工作方式,而另外50行代码使用新语法来完成工作,而不是使用直接的Javascript中的200行代码。 您可以随时生成整个页面,包括嵌入其中的JS。 您将网页结构转换为数据存储。 您可以替换常用对象和您自己的常用方法,以便即时更改其行为,不仅可以改变外观,还可以通过单击即可更改网页的功能。
它真的感觉就像Javascript成为一种元语言来修改Javascript引擎,并使Javascript的功能像一种不同的语言,然后你使用已经修改的进一步修改它,你的实际的最终应用程序需要十几条非常直观的语言来获取语言正是它所需要的。 哦,并且在这个过程中为MSIE补充了Javascript实现的无数缺陷和缺点。
链接地址: http://www.djcxy.com/p/72313.html