实例化 Julia "对象"(调用包装的 C/C++ 函数)时触发包装的 C/C++ 重建



我发现以下范式非常有用,我希望能够在Julia中以某种方式复制它,以利用Julia的速度和C包装功能。

我通常在Python/Matlab中维护一组对象,这些对象表示管道的块(算法(。设置单元测试等

然后,通过使用等效的python/Matlab对象(相同的API(来开发等效的C/C++代码,这些对象包裹C/C++以实现相同的功能并必须通过相同的测试(我指的是用python/Matlab编写的完全相同的测试,其中我生成合成数据或加载记录数据(。

我将并行维护完整的python和python/C++对象,并使用大量的测试套件强制执行奇偶校验。仅python版本和python/C++版本完全可以互换。

每次我需要修改管道的行为或调试问题时,我都会首先使用我需要修改的特定对象/块的完全python版本,通常与运行在python/C++模式下的其他块结合使用以提高速度,然后更新测试以匹配修改后的python块的行为,并最终更新C++版本,直到它达到奇偶校验并通过更新的测试。

每次我在块上实例化Python/C++版本时,我都会在构造函数中运行一个";制造";如果有任何修改,它将重建C++代码。为了确保我总是测试最新版本的C++。

有没有什么优雅的方法可以用Julia/C++组合重现同样的范式?通过自动测试并行维护julia/C++版本。例如,当我实例化对象而不是每个函数调用时,我如何只检查/重建C++一次(这太慢了(。

我想我可以称之为";制造";在运行不同块的所有测试之前,在测试套件级别进行一次。但是,如果我正在为调试会话编写快速python脚本,那么我将不得不手动调用它。

让我们选取一个小过滤器对象的例子,该对象具有更改过滤器参数的configure方法和过滤传入数据的过滤器方法。

我们会有这样的东西:

f1 = filter('python');
f2 = filter('C++'); % rebuild C++ as needed
f1.configure(0.5);
f2.configure(0.5);
x1 = data;
x2 = data;
xf1 = f1.filter(x1);
xf2 = f2.filter(x2);
assert( xf1 == xf2 )

通常情况下,会有一堆测试,以仅python模式或python/C++模式实例化对象并对其进行测试。

我想我想说的是,因为在Julia中,范式是有一个过滤器类型,然后";外部";修改/使用过滤器类型的方法没有集中的方法来检查/重建其所有包装C代码的方法。除非该类型包含跟踪相关方法的变量列表。看起来很尴尬。

我将感谢您的意见/想法。

不能将函数封装在这样的结构中是有原因的吗?

struct Filter 
FilterStuff::String
Param::Int
function Filter(stuff::String, param::Int)
# Make the C++ code here
# Return the created object here
obj = new(stuff, param)
end
end

最新更新