我在研究静态类型化和动态类型化的概念,发现有另一种类型系统叫做逐步类型化。
来自维基百科
渐进式类型系统是一种类型系统,可以在编译时(静态类型)或运行时(动态类型)输入变量,允许软件开发人员在一种语言中酌情选择两种类型的范式。尤其是,渐进式类型使用一种名为dynamic的特殊类型来表示静态未知类型,而渐进式类型用一个名为一致性(也称为一致性)的新关系取代了类型相等的概念。(兼容性),它将动态类型与所有其他类型关联起来。一致性关系是对称的,但不是传递的。
如果我正确理解这些概念,"Javascript“是一种逐步类型化的语言。我说的对吗?
发布于 2014-06-23 10:50:29
混合静态和动态类型仍然是一个开放的研究问题,有几种相互竞争的方法,包括但不限于Jeremy Siek的渐进式打字(您提到过)、准静态类型、软类型、混合类型(Flanagan)、可选的静态类型(例如Gilad Bracha)、责怪Calculus (Wadler和Findler)、强制Calculus (Henglein)、合同(Findler和Felleisen)、Manifest合同(Greenberg、still和Weirich)等等。
ECMAScript / JavaScript不是逐步输入的。如果在生产语言(如ECMAScript )中添加仍然是一个开放的研究问题的内容,那将是愚蠢的。语言设计委员会并不是进行前沿研究的地方。
实际上,ECMAScript委员会试图通过在ECMAScript 4…中混合静态和动态类型来进行前沿研究。这是一个惊人的失败。
ECMAScript / JavaScript是动态类型的。没有静态类型,也没有类型注释的语法。
发布于 2014-06-24 17:46:21
为了详细说明为什么JavaScript没有逐步类型化,让我们看看C#的另一个方向,它是静态地使用隐式类型输入的。
根据MSDN的说法,C#在2007年发布的3.0版本中引入了var关键字。它只允许在“在方法作用域中声明的变量”上,我称之为局部变量。var关键字并不是动态类型,因为它允许编译器确定声明应该什么类型,但随后将对该变量的所有引用作为给定类型来处理,就像您自己静态声明它一样。
下面是一些如何使用和不能使用它的示例。
class MyClass {
// Standard member variable
public string MyName = "Patrick";
// Illegal declaration - var cannot be used here even though the type may be inferred
// from the literal definition; compiler throws an error
private var LuckyNumber = 7;
// Have to do it like this:
private int LuckyNumber = 7;
private MyClass(int luckyNumber) {
LuckyNumber = luckyNumber;
}
public MyClass MyClassFactory(int newLucky) {
// Legal - myInstance is in the method scope
var myInstance = new MyClass(newLucky);
// Not legal - myInstance is not a dynamic type just because we declared it with var
myInstance = new MyOtherClass();
// We can return myInstance because its type matches the method signature
return myInstance;
}
}换句话说,C#没有提供一种方法来声明可以容纳任意类型的变量。您能得到的最接近的是多态,其中的赋值仅限于继承树。
注意,与之形成鲜明对比的是,JavaScript将允许MyClassFactory中的非法行。以下内容在JS中是完全合法的:
var foo = "foo";
foo = 1;
foo = 2.0;
foo = new Date();
foo = [];
foo = {};
foo = function() {};每一行都会更改foo的类型。此外,无法将foo声明为不可更改的类型。
请注意,有一些方法可以将静态类型压缩到JavaScript中,但它们实际上是实际JS代码的包装层,最终会以动态输入方式结束,就好像您是手工编写的一样。事实证明,有比我想象的更多的方法:下面是一个看似全面的语言列表(或者更恰当的语法或解析器),这些语言可以生成JavaScript。。在我的经验中,CoffeeScript是最常见的。
最后,一种语言必须同时提供动态和静态声明,才能被认为是动态类型的。换句话说,必须有一些语法才能做到以下几点:
// Statically typed declaration
Integer myNumber = 3;
// May be legal if the language provides for auto-conversion or dynamic-casting; may
// throw an error. It depends on the language
myNumber = 7.5;
// Static type declaration of an object class
MyParentType instance = new MyParentType();
// legal if MyChildType inherits/extends MyParentType - illegal otherwise
instance = new MyChildType();
// Illegal always - MUST throw an error
instance = new IncompatibleType();
// Dynamic typed declaration
dynamic otherInstance = new MyParentType();
// Legal for variables declared dynamic - MUST NOT throw an error
otherInstance = new IncompatibleType();注意,正如所演示的那样,C#或JS都不支持这两种类型的变量声明,原因不同。
https://softwareengineering.stackexchange.com/questions/245742
复制相似问题