一般来说,我对动态语言没有太多经验,但是我知道的一种动态语言 JavaScript(又名 ECMAScript),我非常喜欢。
好吧,等等,这里讨论的是什么?动态编译?还是动态类型?JavaScript 涵盖了这两个基础,所以我想我会讨论这两个:
动态编译:
首先,编译动态语言,编译只是推迟到以后。Java 和 .NET 确实被编译了两次。一次是他们各自的中间语言,然后是动态地,再次是机器代码。
但是当编译被推迟时,您可以更快地看到结果。这是一个优势。我很喜欢简单地保存文件并很快看到我的程序运行。
另一个优点是您可以在运行时编写和编译代码。这在静态编译的代码中是否可行,我不知道。我想它一定是,因为编译 JavaScript 的最终都是机器代码和静态编译的。但在动态语言中,这是一件微不足道的事情。代码可以自己编写和运行。(而且我很确定 .NET 可以做到这一点,但是 .NET 编译成的 CIL 无论如何都是动态编译的,而且在 C# 中并不是那么简单)
动态类型:
我认为动态类型比静态类型更具表现力。请注意,我非正式地使用表达性一词来表示动态类型可以用更少的东西说更多。下面是一些 JavaScript 代码:
var Person = {};
你知道现在的人是什么吗?这是一本通用字典。我可以做这个:
人["First_Name"] = "约翰";
人["姓氏"] = "史密斯";
但它也是一个对象。我可以像这样引用这些“键”中的任何一个:
Person.First_Name
并添加我认为必要的任何方法:
Person.changeFirstName = function(newName) {
this.First_Name = newName;
};
当然,如果 newName 不是字符串,可能会出现问题。它不会立即被抓住,如果有的话,但你可以检查自己。这是一个用表达能力和灵活性换取安全性的问题。我不介意自己添加代码来检查类型等,而且我还没有遇到一个让我很伤心的类型错误(我知道这没什么。这可能是时间问题: ))。然而,我非常喜欢这种即时适应的能力。