- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
是否可以编写 C 或 C++ 源文件并自动创建源文件中函数的客户端/服务器实现而不需要接口(interface)定义语言?考虑以下示例:
prog.c
int foo() {
return 2;
}
我想将foo.c
分成两个文件:client.c
和server.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-passing和 MPI维基页面...
关于c++ - 自动将 C/C++ 源代码划分为分布式应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19918722/
我想做的是,如果鼠标位于“下一个”按钮上,它会以慢速向右滚动,如果鼠标没有位于“下一个”按钮上,它会停止滚动? 这是我的尝试http://jsfiddle.net/mdanz/nCCRy/14/ $(
StyleCop 是一个很棒的视觉工作室小插件。但它不会向您显示实时提示或提供任何自动修复。 随之而来的是 reSharper 和 StyleCop for reSharper,这是理想的解决方案,但
我为我的MatchQuery使用了模糊性选项,但是我想将模糊性值设置为auto。有什么办法吗? 另外,对于完成建议程序,您可以将其设置为支持unicode,对于我的MatchQuery,有什么方法可以
我想从表中获取一行[字符串名称,字符串密码,int 某些内容]并将其映射到一个 User 对象,该对象具有 3 个属性,如上面的 getter 和 setter有什么方法可以自动完成吗?我考虑过反射,
我有一个像这样的方法:void m1(string str) 并且有一个像这样的类: public class MyClass { public bool b1 { set; get; }
我正在尝试使用 $rootScope 从一个 Controller 向另一个 Controller $broadcast 一些数据。 如果我使用像 ng-click 这样的触发器来运行将广播的功能,它
我考虑了很多关于是要使用完全自动化的缓存还是手动缓存。 我们的自动方法是一种解决方案,它可以挖掘数据库、查询和格式化每个潜在和 future 的数据请求,并将其保存到适当的缓存存储(内存缓存或基于磁盘
我的 CSS 必须使用过渡来更改,直到现在我都使用 div:hover 来实现。 当您单击另一个 div 时需要激活过渡,而不是当您将鼠标悬停在必须移动/更改的 div 上时。 我该怎么做? 谢谢 永
在我的应用程序中,我需要一些动画,但如果它已经设置了动画,则不需要持续时间。但我的问题是它会自动添加持续时间。 在这里你可以看到 2 个函数,第二个没有持续时间但它确实有持续时间(可能从 1 秒开始)
两年前,我需要制作一个工具,通过 POST 自动将 txt/csv 文件上传到我的 Web 服务器,然后使用 cronjob 通过 PHP 对其进行解析。 这有两次在每天午夜自动发生。尽管这行得通,但
请阅读下面程序中的评论: #include void test(char c[]) { c=c+2; //why does this work ? c--; printf("%
也许是个幼稚的问题,但是...... 确认或拒绝: 自动和静态存储持续时间的对象/变量的内存的存在是在编译时确定的,程序运行时失败的可能性绝对为零,因为没有足够的内存用于自动对象。 自然地,当自动对象
有没有什么方法可以自动获得类中属性更改的通知,而不必在每个 setter 中都编写 OnPropertyChanged? (我有数百个属性,我想知道它们是否已更改)。 安东建议 dynamic pro
我们在使用 Azure DevOps 的项目中采用了 gitflow 流程。我有以下场景: 当功能分支合并到 Develop 时,我想在完成拉取请求的同时执行压缩合并策略 当 Release 分支定期
我的网站上有一个评论部分,我将 html 编码的评论保存在我的数据库中。所以我添加了这条评论- "testing" `quotes` \and backslashes\ and html 并将其保存在
是否存在“ checkin 前 TFS 自动 checkout ”这样的功能,以便在我说“ checkin ”之前我不会 checkout 任何文件,例如以防我只是临时更改文件 - 这一直发生。 换句
我有一个运行在 Linux/Apache/Tomcat 堆栈上的网站,它需要每隔几个月自动脱机以进行服务器维护,这将持续任意时间。有哪些选项可以让 Apache 建立和取消“服务器维护”页面? 我需要
我经常在工作中创建文档,在公司内部,由于我们使用的首字母缩写词和缩写词的数量,我们几乎拥有自己的语言。因此,我厌倦了在发布文档之前手动创建首字母缩写词和缩写表,并且快速的谷歌搜索发现了一个可以有效地为
我希望在用户或宏将计算模式从自动更改为手动或手动更改为自动时运行代码。是否有为此触发的事件? (属性是 Application.Calculation 在 Excel 互操作中。) 使用 Excel
这个问题在这里已经有了答案: Repeat command automatically in Linux (13 个回答) 6年前关闭。 我想创建一个脚本来获取另一个文件夹中的所有文件夹名称。并为这些
我是一名优秀的程序员,十分优秀!