除了C语言以外,我可以用哪些语言编写C库?

12

我想编写一个可从C代码中动态加载并调用的库,但我真的不想用C语言编写它--这段代码非常重要,因此我需要一种语言使得更容易确保我的代码是正确的。 我有哪些选择?

更具体地说,我希望C程序员能够 #include 这个库,并且 -l 那个库,就像我用C语言编写了这个库一样。 我希望其他语言的程序员可以使用他们喜欢的链接工具来链接到这个库。理想情况下,我希望在支持C的每个平台上都能够实现,但我将满足于Linux、Windows和MacOS。


2
这一点在安全方面并不像其他问题那样明显。 - Paul Crowley
8个回答

6

任何编译成本地代码的语言。您可以在Google上搜索“编译为本地代码的语言”。例如,请参见编译成本地代码并包含电池的编程语言

C ++通常是这种情况下的选择。编译成本地代码,并且只要保持接口简单,就可以轻松编写适配器层。

Objective C和Fortran也是可能的选择。


3
实际上,如果他真的想要的话,他可以使用更多的语言,例如使用Python的C API作为包装器(并在其中包含必要的库),他就可以使用Python。 - Dave
5
我认为C++不是编写C库的好选择。完全不是。 - user405725
3
@VladLazarenko,它并没有完全打败C++的意义,但无论如何,适配器层是一个 try/catch(exc) { return 1; } 的层。非常简单。 - djechlin
5
@djechlin:是啊,跟我说说吧。我想看看你愉快地将几百个类及其关系包装成一个漂亮的 C API,然后进行 try-catch(顺便说一句,在 C++ 代码中有一些“外部”异常是不允许被抑制的)。处理指向成员的指针,但由于超酷的“this”指针调整而无法适应 void*… 我也经历过这些。但当问题归结为“我能行吗?”时,嘿,当然可以。 - user405725
1
@VladLazarenko 是的,我也遇到过这种情况。在我的情况下,它很直接地起作用了。 - djechlin
显示剩余9条评论

4
看起来你正在寻找一种可以与 ABI 兼容或可以描述为生成 本机 代码的语言。只要它可以编译成一个被链接器接受的有效目标文件(通常是 .obj 或 .o 文件),那就应该是主要的标准。然后,你还需要编写一个头文件,以方便任何用 C 编写的客户端代码(或者其他密切相关的语言/变体)。
正如其他人所提到的,除非有足够好的理由,否则选择 C 作为低级系统软件的语言是最好的选择。汇编语言是一种选择,但在平台之间移植起来更加困难。D 是一种更加可移植,但不太普及的选择,旨在以最少的麻烦生成安全高效的本机代码。当然还有很多其他选择。

2
我所知道的几乎所有安全关键应用程序都是用C语言编写的。我认为没有任何其他语言在生成安全应用方面具有更高的实际地位。
那些不理解的人说C语言是一种安全性较差的语言。
如果你想让C程序员使用你的库,请使用C语言。做其他事情就像在平衡木上行走时把一只手绑在背后。当然,有很多其他语言可以与C语言进行接口,但通常需要使用C层,然后将C数据类型转换为特定于语言的数据类型(Java对象、Python对象等),并在调用完成后,再将其转换回C数据类型。这只会使工作更加困难,而且如果你不能正确处理所有设计决策,可能会更慢。人们也无法理解源代码,因此不愿使用它(有关此问题的更多信息请参见下文)。
如果你想要安全性,那么就要编写非常好的代码,始终戴着“安全方面”的帽子,找到一个安全邮件列表或网站,并将其发布以供审查,采纳审查意见,理解意见,并修复任何有意义的评论。向用户分发源代码,以便人们可以看到你的代码是如何运作的。那些了解安全性的人将知道要寻找什么并理解你做得好(或不好,视情况而定)-那些不了解的人希望信任正确的人。如果代码很好,人们就会使用它。如果它“隐藏”,不易访问,无论你使用哪种语言,你都不会有太多客户。
不用担心,发布源代码不会泄漏更多信息。如果代码中存在缺陷,并且它足够流行(或重要),即使你只发布二进制文件,某个人也会发现这个缺陷。对于熟练掌握反向工程的人来说,没有源代码只是一个小障碍。
安全性不是来自使用特定的语言或特定的工具,而是来自良好的设计和对安全问题的良好基本理解。
记住,通过模糊(无论是“隐藏源代码”还是“不寻常的语言”或其他模糊的东西)来保护安全是虚假的安全。

3
许多安全中心的开源项目已经被证明存在使用非指针安全语言(如C语言)产生的漏洞。为什么我要相信自己比所有人都是更好的程序员?如果我可以让计算机来确保我没有犯这些特别的错误,那么它更有可能做到彻底地工作。 - Paul Crowley
2
既然您已经意识到使用指针的问题,那么集中注意哪些区域应该相对容易。而不使用指针的语言通常是用C编写的,这意味着您最终会遇到同样的问题,但现在它被隐藏了(除非当然有“保证安全的语言”-但到目前为止我还没有遇到过保证安全的语言)。当然,代码审查的重点是让其他有经验的人查看代码中的缺陷-他们将寻找指针的易受攻击的使用方式。 - Mats Petersson
2
C语言也被那些*了解的人认为是一种不安全的语言。例如,Mark Miller在E语言上的工作、Jonathan Rees在W7上的工作以及Anil Madhavapeddy等人最近在Melange上的工作。2007年的论文《Melange: Towards a "functional" Internet》(PDF)使用OCaml语言来兼顾效率和安全性。请参见他们的表1,其中列出了由于语言弱点导致的OpenSSH CERT漏洞。 - Tony Garnock-Jones

2
你可能会对ATS感兴趣,它的网站为http://ats-lang.sourceforge.net/。ATS通过C编译,可以像C一样高效,并且可以与C兼容。从项目网站上了解到:

ATS是一种静态类型的编程语言,将实现与正式规范统一起来。它配备了一个高度表达性的类型系统,其根基在于 Applied Type System 框架,这也给了该语言名称。特别地,ATS中同时支持依赖类型和线性类型。ATS的当前实现(ATS/Anairiats)是用ATS本身编写的。它可以像C/C ++一样高效(具体证据请参见 The Computer Language Benchmarks Game ),并支持各种编程范例。

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 主要缺点是依赖类型编程仍然是一个具有挑战性的任务,即使对于非系统编程也是如此。语言的语法也有些奇怪:请考虑诸如使用abs@ype作为关键字的词汇怪癖等。最后,ATS在某种程度上是一个研究项目,我个人不知道是否明智地将其用于商业事业。

2
理论上来说,它会采用Fortran语言:指针间接性更少(例如,我的数组在这里,而不仅仅是指向这里的指针,并且大多数但并非全部的数据结构和变量都是如此)。然而…Fortran有很多陷阱和怪癖:也许不像C语言那样多,但你可能比Fortran更熟悉C语言。这就是大多数评论中提到“了解你的代码”的点 - 但你真的知道你的编译器在做什么吗?
我知道你会为C语言考虑得更周全。大多数程序员不会。你不知道并且无法知道本地JVM或JIT编译器在做什么,如果你使用Java或C#等脚本语言,这就是你安全模型中的黑洞。
忽略任何告诉你安全计算机专家编写自己的汇编代码的人:他们可能甚至不知道在任何非平凡项目中制造的安全错误。确实要了解你的编译器。

1
你可以使用lua来编写 - 为Lua库提供C API相对容易。C++也是一种选择,但当然你需要编写C包装器并确保没有异常会逃离你的函数。但说实话,如果安全性至关重要,C语言的小不便应该不是什么大问题。你真正应该做的是在可行的情况下证明程序的正确性,并在不可行的情况下进行广泛的测试。

0

你可以用Java编写一个库。JNI通常用于从Java调用C,但也可以反过来使用。


-1

终于有一个像样的答案回答了这个问题: Rust


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接