..

Lambda_calculus

最近在设计编程语言的时候思考出了一些东西。

例如对于无类型语言-js来说,js在定义函数的时候其实是不用像 c/java 那样去声明返回值类型。

why?因为都是无类型语言了,当然不用定义返回值类型了,乍一看这个结论一点都没问题。但是再想一想?真的没有返回类型吗?

结论是这玩意儿当然有返回类型啊,无类型不是真的从头到尾都没类型,无类型更多的是类型不对开发者所见。那开发都见不到,那类型在哪呢?答案是解释器里。

对于 js 来说代码是动态运行的。比如我们在定义一个 add 函数的时候,该函数传入两个参数,函数对俩参数进行相加并且返回。

function add(p1,p2){
    return p1+p2;
}

那么add(1,2)add("123","456")的返回类型一样吗?明显是不一样的!如果你知道c++中的泛型,你大概知道在编译期的时候,编译器会对类似这个 add 函数进行对应类型的实例化。那么可以肯定的是,js执行引擎也是在某处进行了”实例化”的。

如果你明白c++的模板机制的话,可以理解为js的function总是写了一个模板,然后在运行的时候根据类型推导实例化的。也可以这样理解,你写了一个泛型模板,然后在js运行的时候将输入和输出的类型分析之后,获得了一个确定的类型T,然后通过类型T实例化函数模板。不过在c++程序中这个阶段总是在编译阶段进行的,在js或者说是动态无类型语言中,总是在运行时去做的相关工作。