我想为我编写的玩具语言处理器编写一个非常小的概念验证JIT编译器(纯粹是学术性的),但我在设计的中间高度上遇到了一些麻烦.从概念上讲,我熟悉JIT的工作原理 - 您将字节码编译成(机器或汇编?)代码来运行.然而,在螺栓和螺栓水平上,我并不是在想你实际上是怎么做的.
我的(非常"新手")下意识的反应,因为我没有第一个线索从哪里开始,将尝试类似以下内容:
这甚至接近正确的算法吗?我已经尝试过阅读我知道有JIT编译器学习的不同项目(比如V8),但是由于它们的大小,这些代码库很难被消费,而我几乎不知道从哪里开始寻找.
std::byte是C++ 17中的新类型,它是作为enum class byte : unsigned char.如果没有适当的转换,这将无法使用它.所以,我为这种类型的向量做了一个别名来表示一个字节数组:
using Bytes = std::vector<std::byte>;
Run Code Online (Sandbox Code Playgroud)
但是,它不可能在旧式中使用它:接受它作为参数的函数失败,因为这种类型不能轻易转换为旧std::vector<unsigned char>类型,例如,zipper库的用法:
/resourcecache/pakfile.cpp: In member function 'utils::Bytes resourcecache::PakFile::readFile(const string&)':
/resourcecache/pakfile.cpp:48:52: error: no matching function for call to 'zipper::Unzipper::extractEntryToMemory(const string&, utils::Bytes&)'
unzipper_->extractEntryToMemory(fileName, bytes);
^
In file included from /resourcecache/pakfile.hpp:13:0,
from /resourcecache/pakfile.cpp:1:
/projects/linux/../../thirdparty/zipper/zipper/unzipper.h:31:10: note: candidate: bool zipper::Unzipper::extractEntryToMemory(const string&, std::vector<unsigned char>&)
bool extractEntryToMemory(const std::string& name, std::vector<unsigned char>& vec);
^~~~~~~~~~~~~~~~~~~~
/projects/linux/../../thirdparty/zipper/zipper/unzipper.h:31:10: note: no known conversion for argument 2 from 'utils::Bytes {aka std::vector<std::byte>}' to 'std::vector<unsigned char>&'
Run Code Online (Sandbox Code Playgroud)
我试图表演天真的演员,但这也没有帮助.那么,如果它被设计为有用,它在旧的上下文中是否真的有用?我看到的唯一方法是 …
这是我想要做的:
我希望能够既要做到这一点C,并C++使用gcc(并最终Java在类Unix系统(特别是Linux和Mac OS X)).我们的想法是基本上为这些语言实现一个read-eval-print循环,它们在输入时编译表达式和语句,并使用它们来修改现有的数据结构(在脚本语言中一直都是这样).我正在编写这个工具python,它生成C/ C++文件,但这不应该是相关的.
我已经探讨了使用共享库执行此操作,但了解到修改共享库不会影响已在运行的程序.我也尝试过使用共享内存但无法找到将函数加载到堆上的方法.我还考虑过使用汇编代码但尚未尝试这样做.
我宁愿不使用任何编译器,gcc除非绝对没有办法gcc.
如果有人有任何想法或知道如何做到这一点,任何帮助将不胜感激.
除了boost(Bind&Function)之外,如何在C++中动态调用函数?
PHP有:
$obj = new MyObject();
$function = 'doSomething';
$obj->$function();
Run Code Online (Sandbox Code Playgroud)
Objective-C有:
MyObject *obj = [[MyObject alloc] init];
SEL function = NSSelectorFromString(@"doSomething");
[obj performSelector: function];
Run Code Online (Sandbox Code Playgroud) python中的魔术方法真的很神奇。例如:
class DynMember:
def __getattr__(self, name: str):
def fn(self, **kwargs):
print(kwargs)
setattr(self.__class__, name, fn)
return lambda **x: fn(self, **x)
if __name__ == "__main__":
d = DynMember()
d.someFn(title="Greeting", description="Hello world!") # outputs {'title': 'Greeting', 'description': 'Hello world!'}
d.someFn(k1="value 1", k2="value 2") # outputs {'k1': 'value 1', 'k2': 'value 2'}
Run Code Online (Sandbox Code Playgroud)
有没有someFn在DynMember类。该方法是使用__getattr__魔法方法和setattr内置方法在类上设置的。这些方法非常强大,让类在 python 中创造奇迹。(仅用 40 行代码编写了一个 html 生成器)。如何在 C++ 中实现类似的东西?