gpt4 book ai didi

c++ - 自动将 C/C++ 源代码划分为分布式应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:04 25 4
gpt4 key购买 nike

是否可以编写 C 或 C++ 源文件并自动创建源文件中函数的客户端/服务器实现而不需要接口(interface)定义语言?考虑以下示例:

prog.c

int foo() {
return 2;
}

我想将foo.c 分成两个文件:client.cserver.c,如下所示:

客户端.c

int foo() {
return server_foo();
}

server.c

int server_foo() {
return 2;
}

我希望 server.c 与运行 client.c 的机器不同,因此我需要实现某种形式的 RPC。我研究过的所有内容(ONC RPC、XML RPC、Apache Thrift...)都需要在接口(interface)文件中手动定义函数原型(prototype)。有什么方法可以将prog.c 提供给可以自动生成分布式应用程序源代码的程序吗?

注意:我希望这些程序在 Unix 系统上运行!

最佳答案

一般来说这是不可能的(特别是因为没有通用的方法来 serialize 任意 C 数据(或 C++ 数据),比如一些 FILE*句柄或一些 void* 指针 - 例如通过 dlopen(3) 获得 ...,或 std::thread 的一些 C++11 实例)。

通常这是不可能的:共享内存与具有消息传递功能的代理集合不同。

但我们可以假设您的 prog.c 仅包含涉及易于序列化类型的函数。这是一个强有力的假设,通常是不正确的。 (例如,如果您使用一些 struct-s 表示一棵树或一些有向无环图,C 代码不知道它是一棵树还是一个 DAG,也不知道它应该如何序列化;如果你的数据结构代表一个更一般的 graph 你应该比它的 C 编码类型知道更多来序列化它,因为它的天真的序列化将是无限的......因为我们不知道什么是可共享数据...)。

此外,即使您的所有类型都是可序列化的,您实际上也不想分发每个函数。例如,在计算字符串的 strlen 时进行远程调用在实践中没有意义:在本地计算 strlen 比进行远程调用快数千或数百万倍过程调用(即使是无限快的远程服务器,考虑到当前的网络延迟;RPC 需要几毫秒来传输和接收数据)。

因此您必须在您的 prog.c 中巧妙地选择要在远程服务器上分发的函数。

例如,如果 prog.c 包含以下函数:

// return a heap-allocated string to be free-d by caller
char* make_name(int x) {
char buf[24];
snprintf(buf, sizeof(buf), "NAME_%d", x);
return strdup(buf);
}

您不想分发它。从中进行 RPC 调用没有任何实际意义。

但是,例如,您可能会考虑自定义 GCC (假设您有最新版本,例如 4.7 或 4.8)与您的 MELT自动处理一些常见情况的扩展。

MELT 是一种 lisp-y 领域特定语言,作为 GCC [元] 插件实现,用于扩展 GCC

因此您可以在 MELT 中为 gcc(和 g++)编写您的扩展,它将处理 prog.c(当 GCC 正在编译它时)并转储适当的粘合代码(例如,ONC RPC 的一些 prog_generated.x 文件...),至少对于那些签名涉及可序列化类型的函数。

问题是定义您的可序列化类型到底是什么以及如何序列化它们(以及您想要远程分发的例程是什么);然后您将花费一周或更长时间来编写该 MELT 扩展程序。请在gcc-melt@googlegroups.com list上询问寻求帮助和建议。您可以考虑添加自己的 #pragma-s 和/或您自己的 __attribute__ 来指导序列化和远程分发...

另见 application checkpointing , message-passingMPI维基页面...

关于c++ - 自动将 C/C++ 源代码划分为分布式应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19918722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com