静态类型语言可以支持像 smalltalk/python/ruby 这样的元类吗?
Can a statically typed language support metaclasses like smalltalk/python/ruby?
我发现 metaclass 的概念很吸引人,它将 classes 视为第一个 class 对象。您可以将 class 分配给变量,将其传递给方法,甚至可以在运行时创建新的 classes。看来,所有支持metaclasses的编程语言要么是动态类型语言(Smalltalk,Python,Ruby),要么是渐进类型语言(Objective C和Groovy 都支持静态和动态类型)。我还没有看到支持 metaclasses 的静态类型语言。
静态类型和元classes 彼此不兼容吗?在我看来,metaclass' 功能需要一定程度的活力。我仍然想知道像 Java、C# 和 Kotlin 这样的静态类型语言在技术上是否有可能支持元 class 并将 classes 作为第一个 class 对象,或者是理论上不可能吗?
鉴于Python本身是用C实现的,其对象可以"seen"并通过其API在C中使用,答案是"yes"。
在某些语言中可能更难的是属于 class 层次结构的对象如果它们具有适当的元classes、内省和运行时 class 创建可能有点更严格 - 要求实现此类元 classes 的代码复制语言运行时本身的一部分,或者在运行时调用不同的代码生成函数 - 至少,一个 class 可以生成源代码使用动态创建的 classes 的声明编写代码,并与运行时一起迭代以编译该代码并将其加载到当前进程中。
例如,对于 C++,可以完全控制数据的内存布局,也许可以用一种更轻便的方法来模拟已编译的 classes,它只填充数据结构并重做名称修改部分以附加 class 成员。
如果那样方便的话,这完全是另一个问题。也许最好为开箱即用的支持它的语言保留 metaclasses,或者对于您从头开始实施 class 系统的语言(例如 Python运行时确实使用 C).
我发现 metaclass 的概念很吸引人,它将 classes 视为第一个 class 对象。您可以将 class 分配给变量,将其传递给方法,甚至可以在运行时创建新的 classes。看来,所有支持metaclasses的编程语言要么是动态类型语言(Smalltalk,Python,Ruby),要么是渐进类型语言(Objective C和Groovy 都支持静态和动态类型)。我还没有看到支持 metaclasses 的静态类型语言。
静态类型和元classes 彼此不兼容吗?在我看来,metaclass' 功能需要一定程度的活力。我仍然想知道像 Java、C# 和 Kotlin 这样的静态类型语言在技术上是否有可能支持元 class 并将 classes 作为第一个 class 对象,或者是理论上不可能吗?
鉴于Python本身是用C实现的,其对象可以"seen"并通过其API在C中使用,答案是"yes"。
在某些语言中可能更难的是属于 class 层次结构的对象如果它们具有适当的元classes、内省和运行时 class 创建可能有点更严格 - 要求实现此类元 classes 的代码复制语言运行时本身的一部分,或者在运行时调用不同的代码生成函数 - 至少,一个 class 可以生成源代码使用动态创建的 classes 的声明编写代码,并与运行时一起迭代以编译该代码并将其加载到当前进程中。
例如,对于 C++,可以完全控制数据的内存布局,也许可以用一种更轻便的方法来模拟已编译的 classes,它只填充数据结构并重做名称修改部分以附加 class 成员。
如果那样方便的话,这完全是另一个问题。也许最好为开箱即用的支持它的语言保留 metaclasses,或者对于您从头开始实施 class 系统的语言(例如 Python运行时确实使用 C).