【问题标题】:Can a statically typed language support metaclasses like smalltalk/python/ruby?静态类型语言可以支持像 smalltalk/python/ruby 这样的元类吗?
【发布时间】:2019-08-31 06:26:14
【问题描述】:

我发现元类的概念很吸引人,它将类视为第一类对象。您可以将类分配给变量,将其传递给方法,甚至在运行时创建新类。似乎每一种支持元类的编程语言要么是动态类型语言(Smalltalk、Python、Ruby),要么是渐进类型语言(Objective C 和 Groovy 都支持静态和动态类型)。我还没有看到支持元类的静态类型语言。

静态类型和元类是否相互不兼容?在我看来,元类的功能需要一定程度的活力。我仍然想知道像 Java、C# 和 Kotlin 这样的静态类型语言在技术上是否可以支持元类并将类作为第一类对象,还是理论上是不可能的?

【问题讨论】:

    标签: metaclass static-typing


    【解决方案1】:

    鉴于 Python 本身是用 C 实现的,它的对象可以通过它的 API 在 C 中“看到”和使用,答案是“是的”。

    在某些语言中可能更难的是,如果对象具有适当的元类、内省和运行时类,则属于类层次结构的对象可能更难一些 - 要求实现此类元类的代码复制部分语言运行时本身,或者在运行时调用不同的代码生成函数——至少,一个类可以生成带有动态创建类的声明的源代码,并与运行时一起迭代以编译该代码并将其加载到当前进程中。

    例如,使用 C++,可以完全控制数据在内存中的布局,也许可以用一种更轻松的方法来模拟已编译的类,只需填充数据结构并重做名称修改部分附加班级成员。

    但是,如果这样方便的话,那就完全是另一个问题了。也许最好为支持开箱即用的语言保留元类,或者对于您从头开始实现类系统的语言(就像 Python 运行时使用 C 所做的那样)。

    【讨论】:

    • 看来C++23会有这样一个特性叫做'Metaclass'。既然你在这里提到了C++,你怎么看?是否类似于 Smalltalk 和 Python 等动态类型语言中的元类?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多