TL;博士:
- 有没有办法指定调用约定/函数在编译后检索其参数/另一个函数的返回值的方式?
- 是否可以生成以后可以根据上下文进一步优化的汇编/机器代码?
- 如果这些是可能的,那么依靠广泛使用的/标准工具(如用于 C/C++ 的 gcc 或 clang)并支持所有编译语言有多难?
我目前正在开发一种代码引擎(开源),我想尽可能多地制作,目标是拥有一堆完全独立的模块,可以与一个复杂的“管道”系统连接在一起,管理模组之间的控制流和数据交换,其中一个值得注意的功能是能够在运行时创建这些链接。对我来说,多价意味着使用引擎也应该可以达到高性能,尽管可能比“正常”使用引擎需要更多的工作。
由于各种原因,我得出的结论是,mod 可能应该以某种形式的汇编代码出现(很可能是通过用未指定的语言编译某些源代码生成的,最初的想法是使用 加载动态库dlopen
)。我目前正在探索这个想法的局限性(在思想实验中),在我所有的考虑中,一个问题比其他问题更频繁地出现:我需要 mods 能够处理任何类型的调用约定,这主要是因为两个原因;
- 我不想假设我有足够的知识来了解在每种可能的架构上在 mod 之间传递数据的最佳调用约定/方式,所以我希望 mod 不知道他们将检索数据的方式。
- 在当前规范中,mod 可以在其控制流中间将某些任务委托给另一个任务,并且一旦返回它们应该能够检索任意数量的数据。这不能用当前的调用约定来完成,除非传递一个动态分配的数组,这会产生性能问题。
其他一些考虑因素与此密切相关:
- 我希望模组能够进行任意优化(例如,通过将一个模组内联到另一个模组来生成新模组)
- 由于所有这些在运行时都应该是可能的,我真的希望它很快,所以链接时代码生成可能是不建议的。
- Mods 可以在程序启动之前链接到“实现库”(在这种情况下不需要快速编译),这通过允许它
dlopen
像最初设计的那样简单地调用来简化主程序的任务,或者链接由 mod 在运行时生成(在这种情况下需要快速编译)。
还应该记住,所有这些功能都应该与大多数/所有当前的编译语言兼容。我知道我所要求的可能是不可能的,但我想在选择要保留的功能之前清楚地了解什么是可能的,什么是不可能的,以及为什么。
我已经开始想一种方法来实现它,但是它不完整并且有很多问题:
initialize_input_data_pipe(&variable, "pipe name")
代替通过参数列表传递参数,函数将它们的参数保留为堆栈变量,并通过调用将由实现提供的类似函数的符号(类似于 )来初始化它们。
我用这种方法发现的一些问题:
- 忽略传递参数的标准方式会导致源代码臃肿、错误等。
- 出于性能原因,当这个函数被链接时,它应该被内联,但是,据我所知,这对于动态库是不可能的,并且通过使用静态库和链接时优化/链接时代码生成,会相当减缓。