应用软件是现实世界的抽象。
元编程是现实世界的抽象的利器。
具有元编程的特性的语言如Java,python。
举例而言,java提供了Class对象,Method对象,Field对象,已经足够应付面向对象了。
比如,Class Route{
Field IPPrefix;
Method Distribute();
Method Revoke();
}
但由于要运行在运行环境(machine)上,有一个指令系统要面向,即面向机器,因此定义了非对象的类型。
这些类型(type)是不可扩展的,面向指令系统,如整型,浮点型,字符型,字符串等。为了与对象统一,java有对应的包裹类。
而在java中,type也抽象为现实世界中的一种对象,能够应用面向对象的方法,比如运算符重载,虚函数,序列化等。
python中,同样,一切皆为对象。type也是对象。
有一些语言世界的理论需要说明的是,语法和语义的规则,在形式语言自动化和人工智能方面必不能少。
拿python而言,字符,列表,字典,内建类型和自定义的类是对象,而内建类型本身type(称为内建元类)和自定义的类的基类object是对象。可以继承type自定义元类。
而type既然是对象,那么应该有个元类,但是不能无限嵌套,该元类就不能再称为对象而再有元类了。
然后就是实例化了,变为内存中的代码和数据。不像java,上述内容应该是通过函数调用来实现的。
java有所不同,java的类定义是可以动态加载的,按需根据classpath去搜索。因此class对象会在虚拟机内存中有唯一一个,用来校验加载的类定义,主要是确认版本问题。因为type是不可扩展,没有类定义文件的,所以不涉及检验版本的问题,可能在机器移植方面能够起作用,比如虚拟机内关于32位和64位的type定义有所不同,但目前看来oracle似乎也未确认有此特性。