相关疑难解决方法(0)

如何设计一个可以在许多客户端语言中使用的C/C++库?

我打算编写一个应该可以被广泛的平台上的大量人使用的库.我需要考虑什么来设计它?为了使这个问题更具体,最后有四个"子问题".

选择语言

考虑到所有已知的要求和细节,我得出结论,用C或C++编写的库是可行的方法.我认为我的库的主要用途是在用C,C++和Java SE编写的程序中,但我也可以考虑从Java ME,PHP,.NET,Objective C,Python,Ruby,bash scrips中使用它的原因,等等......也许我无法针对所有这些,但如果有可能,我会做到的.

要求

在这里描述我的库的全部目的将是很多,但有些方面可能对这个问题很重要:

  • 图书馆本身起初很小,但肯定会变得非常复杂,因此不能同时维护多个版本.
  • 但是,大多数复杂性将隐藏在库中
  • 该库将构建一个在内部大量使用的对象图.库的某些客户端只对特定对象的特定属性感兴趣,而其他客户端必须以某种方式遍历对象图
  • 客户端可以更改对象,并且必须通知库
  • 库可以更改对象,并且如果客户端已经具有该对象的句柄,则必须通知客户端
  • 该库必须是多线程的,因为它将维护与其他几个主机的网络连接
  • 虽然一些请求到图书馆可以同步处理,其中许多人将采取太长,必须在后台进行处理,并通知客户端上的成功(或失败)

当然,无论答案是满足我的具体要求,还是以一般方式回答问题,对更广泛的受众都有帮助,我们都欢迎回答!

我的假设,到目前为止

以下是我在过去几个月收集的一些假设和结论:

  • 在内部我可以使用我想要的任何东西,例如C++与运算符重载,多重继承,模板元编程......只要有一个可移植的编译器来处理它(想想gcc/g ++)
  • 但我的界面必须是一个干净的C接口,不涉及名称修改
  • 另外,我认为我的界面应该只包含函数,基本/原始数据类型(也许是指针)作为参数传递并返回值
  • 如果我使用指针,我想我应该只使用它们将它们传递回库,而不是直接在引用的内存上操作
  • 对于在C++应用程序中的使用,我可能还提供面向对象的接口(也容易出现名称错误,因此App必须使用相同的编译器,或者以源代码形式包含库)
  • 在C#中使用也是如此吗?
  • 对于在Java SE/Java EE中的使用,Java本机接口(JNI)适用.我有一些关于它的基本知识,但我绝对应该仔细检查它.
  • 并非所有客户端语言都能很好地处理多线程,因此应该有一个线程与客户端通信
  • 对于在Java ME上的使用,没有JNI这样的东西,但我可能会使用嵌套VM
  • 要在Bash脚本中使用,必须有一个带命令行界面的可执行文件
  • 对于其他客户端语言,我不知道
  • 对于大多数客户端语言,使用该语言编写适配器接口会很好.我认为有一些工具可以自动为Java和其他一些人生成这个
  • 对于面向对象的语言,有可能创建一个面向对象的适配器,它隐藏了库的接口是基于函数的这一事实 - 但我不知道它是否值得努力

可能的子问题

  • 这是可行的,可管理的努力,还是只是太多的便携性?
  • 有关于这种设计标准的好书/网站吗?
  • 我的任何假设是错误的吗?
  • 哪些开源库值得学习从他们的设计/界面/源中学习?
  • meta:这个问题相当长,你有没有办法把它分成几个较小的?(如果您回复此问题,请将其作为评论,而不是作为答案)

c c++ portability

43
推荐指数
1
解决办法
6195
查看次数

标签 统计

c ×1

c++ ×1

portability ×1