【问题标题】:Is there a programming language that meets these requirements?是否有满足这些要求的编程语言?
【发布时间】:2013-03-01 07:22:06
【问题描述】:

在实施我的下一个程序之前,我有一些要求 - 希望存在一种可以执行以下操作的编程语言:

  1. 给定一个类(或接口)C,编程语言允许用户访问扩展/实现 C 的所有类的列表。
  2. 编程语言允许用户遍历类的所有变量和方法。
  3. 用户能够确定函数将采用的参数的数量和类型。

    eg. foo(int a, String b, int c) can be queried 
    to return 3 or [int, String, int]
    

这些要求是荒谬的,还是某些语言将它们作为基本的反射技术来实现?

【问题讨论】:

  • .NET(任何语言)满足要求如果您愿意将“所有类”限制为“已知程序集中的所有类”。
  • 抱歉,我不太明白您所说的“已知程序集”是什么意思?
  • 他的意思是(例如)如果我从 C 继承一个类,编译它并将生成的二进制文件(在 .net 世界中称为程序集)保存在 USB 密钥中我的口袋,那么你不能对此使用反射。
  • @sdasdadas:在 .NET 中,代码内置在程序集中。您可以反映任何有效的程序集(可以由您正在使用的运行时加载),但它不会知道您没有告诉它的程序集中存在的类。
  • 语言需要静态类型吗?否则 Python 满足您的要求。

标签: reflection programming-languages requirements


【解决方案1】:

我知道你更喜欢静态类型的语言,但如果你认为动态类型的 Smalltalk 可能是一个不错的选择,因为一切都是对象(类和方法也不例外),因此一切都可以被操纵(不仅被查询,而且被改变)。满足您的要求:

给定一个类(或接口)C,编程语言允许 用户访问扩展/实现 C 的所有类的列表。

在 Smalltalk 中没有内置的接口概念(尽管我认为我已经看到了增加对它的支持的扩展)。但是,您可以:

  • 给定一个类,找到它的直接子类:Number subclasses 回答 {Fraction. Float. Integer}
  • 或者它下面的所有层次结构:Number allSubclasses 回答an OrderedCollection(Fraction Float Integer ScaledDecimal SmallInteger LargePositiveInteger LargeNegativeInteger)

您还可以找到所有实现给定选择器的类(在本例中为pop):

SystemNavigation default allClassesImplementing: #pop 回答{ContextPart. FileSystemGuide. LIFOQueue. Stack}

如您所见,定义一个“接口”对象来查询实现一组方法的类非常容易(只需拥有一组方法名称并查询实现每个方法的类,将类添加到集合中)。但是,如果您想在类中明确声明它实现了一个接口,那么您需要做更多的工作。

编程语言允许用户遍历所有 类的变量和方法。

Point instVarNames 回答#('x' 'y')

Point allMethods 回答CompiledMethods 的集合(表示方法的对象)

Point allSelectors 回答该类的实例可以回答的所有方法名称的集合。

用户能够确定参数的数量和类型 函数会占用。

在这种情况下,您与已编译的方法进行交互并询问它们所需的参数数量(没有参数类型的概念):

(Point methodNamed: #x) numArgs 回答 0,因为它只是一个吸气剂。

(Point methodNamed: #+) numArgs 回答 1

这只是 Smalltalk 反射功能的一个小预览;如果您想更深入,可以查看以下一些链接:

HTH

【讨论】:

  • 虽然我可能不会使用 Smalltalk,但这很有趣,并且彻底回答了我的问题。
【解决方案2】:

我希望大多数 Lisp 系统(Scheme、CommonLisp、...)都能满足这些要求。

【讨论】:

    【解决方案3】:

    Java 可以做到这一点。但请注意,没有语言可以:

    给定一个类(或接口)C,编程语言允许 用户访问扩展/实现 C 的所有类的列表

    原因是扩展 C 的类的数量是零(在最终类的情况下)或无限的。在后一种情况下(这是常态),实际上只有一小部分扩展 C 的类被编写和编译,并且只有您可以访问的那些。

    【讨论】:

    • “但是,请注意,没有语言会这样做:”,对不起,但这并不完全正确(请参阅我在 Smalltalk 上的回答)。由于 Smalltalk 是一种语言和环境,因此您可以查询(并据此执行)整个系统。
    • @AndrésFortier 你没看我的推理吗?根本不可能允许用户访问无限数量的尚未编写的类。
    • 我认为您的意思是系统中尚未编译/加载的类。如果您实际上指的是尚未编写代码的类,那么这根本不会为 OP 问题增加任何价值;要解决这个问题,您需要透视编程语言。您可以期望(Smalltalk 确实如此)能够添加一个新的子类并看到新的子类出现在列表中,而无需做任何花哨的事情。这就是 Smalltalk IDE 的实际工作方式,并且可以外推到您在其上编写的任何程序。
    • @Ingo Andres 是正确的——我不幻想我可以遍历所有扩展另一个类的 possible 类。只有编译过的我才感兴趣。
    猜你喜欢
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2021-08-30
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多