我可以用C语言编写C语言库吗?

时间:2013-05-07 20:33:13

标签: c dll

我想编写一个可以从C代码动态加载和调用的库,但我真的不想用C语言编写它 - 代码是安全关键的,所以我想要一种让它更容易有信心的语言我的代码是正确的。我有什么选择?

更具体一点,我希望C程序员能够#include这个,-l,并开始使用我的库,就像我用C编写它一样。我想要其他语言的程序员能够使用他们喜欢的工具链接到C库以链接到它。理想情况下,我希望在支持C的每个平台上都能实现这一点,但我会选择Linux,Windows和MacOS。

8 个答案:

答案 0 :(得分:5)

任何编译为本机代码的东西。所以你可能会谷歌 - “编译成本机代码的语言。”例如,参见Programming languages that compile to native code and have the batteries included

C ++通常是此选择。编译为本机代码,并为您提供简单易用的接口层。

目标C和Fortran也是可能的。

答案 1 :(得分:4)

听起来您正在寻找具有ABI兼容性的语言,或者可以将其描述为native代码。只要它可以编译为链接器接受的有效目标文件(通常是.obj或.o文件),那应该是主要标准。然后,您还需要编写头文件,以方便用C语言编写的任何客户端代码(或其密切相关的语言/变体)。

正如其他人所提到的,你需要一个很好的理由来选择C以外的语言,因为它是低级/系统软件的通用语言。汇编程序是一种选择,虽然难以在平台之间移植。 D是一种更便携但不太广泛的替代方案,旨在以最少的麻烦生成安全,高效的本机代码。还有很多其他的。

答案 2 :(得分:2)

我所知道的几乎所有安全关键应用程序都是用C语言编写的。我不相信在生成安全应用程序时还有其他语言具有更高的真实状态。

对于那些不理解的人来说,C语言被认为是一种糟糕的安全语言。

如果你想让C程序员使用你的图书馆,请使用C.做其他任何事情都是在一只手背后绑在一起,同时试图在平衡木上行走(体操设备)。当然,有许多其他语言能够与C接口,但它通常涉及使用C层,然后将C数据类型填充到特定于语言的数据类型(Java对象,Python对象等),以及调用完成后,使用相同的转换回C数据类型。只是让你更难以使用,如果你没有正确地做出所有的设计决定,可能会更慢。人们不会理解源代码,因此不喜欢使用它(请参阅下面的更多信息)。

如果您需要安全性,那么请编写非常好的代码,随时佩戴您的“安全方面”帽子,找到安全邮件列表或网站并将其发布在那里进行审核,在船上查看评论意见,了解评论,并修复任何有意义修复的评论。将源代码分发给用户,以便人们可以看到代码的作用。那些了解安全性的人会知道要找什么,并了解你做得很好(或者是一份糟糕的工作,无论哪种适用) - 而那些不了解安全的人则希望信任合适的人。如果它很好,人们会使用它。如果它“隐藏”,并且不容易访问,无论您使用何种语言,都不会得到很多客户。

别担心,你不会透露释放来源。如果代码中存在缺陷,并且它很受欢迎(或很重要),即使您只发布二进制文件,也会有人发现该缺陷。对于逆向工程技术人员来说,没有源代码只是一个小障碍。

安全不是源于使用特定语言或特定工具,而是源于良好的设计和对安全问题的良好基本理解。

并且通过默默无闻来记住安全性(无论这意味着“隐藏的源代码”或“不寻常的语言”或其他模糊的东西)是虚假的安全性。

答案 3 :(得分:2)

您可能对ATS http://ats-lang.sourceforge.net/感兴趣。 ATS通过C编译,可以像C一样高效,并且可以以与ABI兼容的方式使用。来自项目网站:

  

ATS是一种静态类型编程语言,它将实现与正式规范统一起来。它配备了一个高度表达的类型系统,该系统植根于应用类型系统框架,它为语言命名。特别是,ATS中可以使用相关类型和线性类型。 ATS(ATS / Anairiats)的当前实施是用ATS本身编写的。它可以像C / C ++一样高效(参见计算机语言基准游戏获取具体证据)并支持各种编程范例

ATS的依赖和线性类型系统有助于为您的代码提供静态保证,包括资源管理安全的各个方面。

Chris Double一直在撰写一系列文章,探讨ATS用于系统编程的类型系统的强大功能:http://bluishcoder.co.nz/tags/ats/。特别值得注意的是这篇文章:http://bluishcoder.co.nz/2012/08/30/safer-handling-of-c-memory-in-ats.html

本文档涵盖了在ATS和C代码之间来回呼叫的各个方面:https://docs.google.com/document/d/1W6DYQApEqKgyBzMbvpCI87DBfLdNAQ3E60u1hUiMoU0

主要的缺点是依赖类型编程仍然是一个令人生畏的前景,即使对于非系统编程也是如此。该语言的语法也有点奇怪:考虑词汇怪癖,例如使用abst@ype作为关键词。最后,ATS在某种程度上是一个研究项目,我个人不知道采取商业努力是否明智。

答案 4 :(得分:2)

理论上,它将是Fortran:更少间接(如:我的数组是[here],而不仅仅是指向这里的指针,大多数但不是所有的数据结构和变量都是如此)。

然而......在Fortran中有许多陷阱和怪癖:也许,与C中一样多,但你可能知道你在C周围的方式比Fortran更好。大多数评论背后的意思是“了解您的代码” - 但您真的知道您的编译器在做什么吗?

了解你,我准备接受你的信任,因为C.大多数程序员都没有。您不知道也无法知道本地JVM或JIT编译器的作用,如果您使用的是Java或C#r脚本语言,那么这就是安全模型中的一个黑洞。

忽略任何告诉你安全计算的毛茸茸的人都写自己的汇编程序的人:他们可能甚至不知道他们在他们发布的任何和所有重要项目中所犯的安全错误。确实知道你的编译器。

答案 5 :(得分:1)

您可以在lua中编写它 - 为Lua库提供C API相对简单。 C ++也是一个选项,当然你必须编写C包装器并确保没有异常可以逃避你的功能。但老实说,如果它的安全性至关重要,C语言的轻微不便应该不是那么重要。你真正应该做的是在可行的情况下证明你的程序的正确性,并在不适当的地方进行测试。

答案 6 :(得分:0)

您可以用Java编写库。 JNI通常用于从Java调用C,但它可以反过来使用。

答案 7 :(得分:0)

这个问题终于有了一个不错的答案:Rust