相关疑难解决方法(0)

如何动态生成和运行本机代码?

我想为我编写的玩具语言处理器编写一个非常小的概念验证JIT编译器(纯粹是学术性的),但我在设计的中间高度上遇到了一些麻烦.从概念上讲,我熟悉JIT的工作原理 - 您将字节码编译成(机器或汇编?)代码来运行.然而,在螺栓和螺栓水平上,我并不是在你实际上是怎么做的.

我的(非常"新手")下意识的反应,因为我没有第一个线索从哪里开始,将尝试类似以下内容:

  1. mmap()一块内存,设置对PROT_EXEC的访问
  2. 将本机代码写入块中
  3. 存储当前寄存器(堆栈指针,等等)
  4. 修改当前寄存器以指向映射区域中的本机代码块
  5. 现在,本机代码将由机器执行
  6. 恢复以前的寄存器

这甚至接近正确的算法吗?我已经尝试过阅读我知道有JIT编译器学习的不同项目(比如V8),但是由于它们的大小,这些代码库很难被消费,而我几乎不知道从哪里开始寻找.

c++ linux compiler-construction x86 jit

32
推荐指数
2
解决办法
9871
查看次数

如何在需要旧式unsigned char的地方使用新的std :: byte类型?

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++ vector c++17

31
推荐指数
1
解决办法
1万
查看次数

有没有办法在运行时用C或C++编译其他代码?

这是我想要做的:

  1. 运行程序并初始化一些数据结构.
  2. 然后编译可以访问/修改现有数据结构的其他代码.
  3. 根据需要重复步骤2.

我希望能够既要做到这一点C,并C++使用gcc(并最终Java在类Unix系统(特别是Linux和Mac OS X)).我们的想法是基本上为这些语言实现一个read-eval-print循环,它们在输入时编译表达式和语句,并使用它们来修改现有的数据结构(在脚本语言中一直都是这样).我正在编写这个工具python,它生成C/ C++文件,但这不应该是相关的.

我已经探讨了使用共享库执行此操作,但了解到修改共享库不会影响已在运行的程序.我也尝试过使用共享内存但无法找到将函数加载到堆上的方法.我还考虑过使用汇编代码但尚未尝试这样做.

我宁愿不使用任何编译器,gcc除非绝对没有办法gcc.

如果有人有任何想法或知道如何做到这一点,任何帮助将不胜感激.

c c++ linux gcc runtime-compilation

15
推荐指数
3
解决办法
1万
查看次数

如何在c ++中动态调用函数

除了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)

c++ function

11
推荐指数
2
解决办法
9260
查看次数

如何在 C++ 中注册动态成员

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)

有没有someFnDynMember类。该方法是使用__getattr__魔法方法和setattr内置方法在类上设置的。这些方法非常强大,让类在 python 中创造奇迹。(仅用 40 行代码编写了一个 html 生成器)。如何在 C++ 中实现类似的东西?

c++

4
推荐指数
1
解决办法
128
查看次数

标签 统计

c++ ×5

linux ×2

c ×1

c++17 ×1

compiler-construction ×1

function ×1

gcc ×1

jit ×1

runtime-compilation ×1

vector ×1

x86 ×1