有更好的C吗?

时间:2010-08-24 13:43:15

标签: programming-languages language-features real-time

我想要一个更好的C.让我解释一下:

我在C中做了很多编程,这对于具有实时需求的应用程序是必需的,例如音频编程,机器人,设备驱动程序等。

虽然我喜欢C,但是在花了很多时间在Haskell之后让我紧张的一件事就是缺少一个合适的类型系统。也就是说,只要你想编写一个更通用的函数,说一些操纵泛型指针的东西,(比如说一个通用的链表),你必须把东西投射到void*或者其他什么,然后你松了所有类型的信息。它是一个全有或全无系统,它不会让你编写泛型函数而不会失去类型检查的所有优点。

C ++没有解决这个问题。我还是不想使用C ++。我觉得OO课程和模板很头疼。

Haskell及其类型类解决了这个问题。您可以使用语义上有用的类型,并使用类型约束来编写对不依赖于void的类类操作的函数。

但是我正在使用的域名,我不能使用Haskell,因为它不具备实时功能 - 主要是因为垃圾收集。 GC是必需的,因为很难进行功能编程,这种编程很重,没有自动内存管理。但是,类型类的概念并没有特别针对C的语义。我想要C,但是使用Haskell的可靠类型系统,可以帮助我编写好的系统。但是,我真的想要C:我想控制内存管理,我想知道数据结构是如何布局的,我想使用(井型)指针算法,我想要可变性。

有这样的语言吗?如果是这样,为什么它不适合低级编程呢?

除此之外:我知道在这个方向上有一些小型的语言实验,但我对在现实世界的项目中真正有用的东西很感兴趣。我对成长良好的语言感兴趣,但对“玩具”语言并不那么感兴趣。

我应该补充一点,我听说Cyclone,这很有意思,但是我无法为它编译(Ubuntu)而且我还没有听说过任何实际使用它的项目......其他任何其他项目我们欢迎这方面的建议。

谢谢!

9 个答案:

答案 0 :(得分:23)

由于没人提起它:我认为ATS language是一个更好的候选人,更好的C!特别是因为你喜欢Haskell,因此功能强大的类型编程。请注意,ATS似乎是专门为系统编程和硬实时应用程序设计的,因为它大多数都可以在没有垃圾收集的情况下完成。

如果你检查the shootout,你会发现性能基本上与C相当。我认为这是非常令人印象深刻的因为现代c编译器有多年和多年的优化工作,而ATS是基本上由一个人开发。 - 而提供类似安全功能的其他语言通常会引入开销ATS确保完全在编译时完成,从而产生与C非常相似的性能特征。

引用网站:

  

什么是ATS?

     

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

     

功能编程。 ATS的核心是一种基于渴望(又称为按值调用)评估的功能语言,它还可以适应懒惰(又称需要呼叫)评估。 ATS中线性类型的可用性通常使得在其中编写的函数程序不仅具有惊人的高效率(与C相比),而且还具有令人惊讶的小(内存)占用空间(与C相比)。

     

命令式编程。在ATS中进行命令式编程的新颖而独特的方法牢牢扎根于具有定理证明的编程范式。 ATS的类型系统允许在ATS中安全地支持许多在其他语言中被认为是危险的特征(例如,显式指针算法和显式存储器分配/解除分配),使得ATS成为用于低级系统编程的可行编程语言。

     

并发编程。 ATS配备了多核安全的垃圾收集实现,可以通过使用pthread来支持多线程编程。用于跟踪和安全操作资源的线性类型的可用性提供了构建可以利用多核架构的可靠程序的有效手段。

     

模块化编程。 ATS的模块系统很大程度上受到Modula-3的影响,它既简单又通用,并且有效支持大规模编程。

     

此外,ATS包含一个子系统ATS / LF,它支持一种(交互式)定理证明形式,其中证明被构造为总函数。有了这个组件,ATS提倡以程序员为中心的程序验证方法,它将编程与定理证明以语法交织的方式结合起来。此外,该组件可以作为编码演绎系统及其(元)属性的逻辑框架。

答案 1 :(得分:22)

NimrodVala种语言呢?

答案 2 :(得分:15)

更好的C的另一个(真正的)候选者是The Rust Programming Language

与其他一些建议不同,(Go,Nimrod,D,...)Rust可以直接与C和C ++竞争,因为它具有手动内存管理功能,不需要垃圾回收(参见[1])。 /秒>

什么让Rust与众不同之处在于它有safe manual memory management。 (链接是pc walton的博客,Rusts的主要贡献者之一,一般值得阅读;)除此之外,这意味着它修复了billion dollar mistake的无效指针。这里建议的许多其他语言要么需要垃圾收集(Go),要么默认启用垃圾收集,并且不提供超出C ++提供的安全手动内存管理功能(Nimrod,D)。

虽然Rust有一个迫切的心,但它确实从函数式语言中借用了许多不错的东西,例如sum类型也称为标记的联合。它也非常关注成为一种安全且以性能为导向的语言。

[1]现在有两个主要的指针类型拥有指针(如C ++中的std :: unique_ptr,但得到了来自typechecker的更好支持)和托管指针。顾名思义,后者确实需要任务本地垃圾收集,但there are thoughts将其从语言中删除,并仅将它们作为库提供。

编辑反映@ReneSacs评论:D和Nimrod不需要垃圾收集。

答案 3 :(得分:13)

我对Haskell了解不多,但如果你想要一个强大的类型系统,请看看Ada。它广泛用于航空航天应用的嵌入式系统。 SIGADA的动力是“我们信任的强力打字”。但是,如果你必须使用Windows / Linux类型的设备驱动程序,它将没有多大用处。

有几个原因不太受欢迎:

  • 详细语法 - 旨在阅读,而非写入
  • 编译器历史上很昂贵
  • 与国防部和设计委员会的关系,程序员似乎在敲打

我认为事实是大多数程序员不喜欢强类型系统。

答案 4 :(得分:13)

Nim(前尼姆罗德)拥有强大的类型系统,具有概念和简单的泛型。它还具有广泛的编译时机制,包括模板和宏。它还具有简单的C FFI和您期望从系统编程语言中获得的所有低级功能,因此您可以编写your own kernel,例如。

目前它编译为C,因此您可以在GCC运行的任何地方使用它。如果你只想使用Nim作为更好的C,你可以通过--os:standalone编译器开关来实现,它为你提供了一个简单的标准库,没有操作系统关系。

例如,要编译为AVR微控制器,您可以使用:

nim c --cpu:avr --os:standalone --deadCodeElim:on --genScript x.nim

Nim有一个软实时GC,您可以在其中指定运行时间和最长暂停时间(以微秒为单位)。如果你真的无法负担GC,你可以完全禁用它(--gc:none编译器开关)并只使用像C这样的手动内存管理,丢失大部分标准库,但仍保留更强大和更强大的功能类型系统。

此外,标记指针是一个计划的功能,可确保您不会将内核级指针与用户级指针混合在一起。

答案 5 :(得分:9)

D可能会提供您想要的内容。它有一个非常丰富的类型系统,但如果需要,你仍然可以控制内存布局。它有像C这样的无限制指针。它是垃圾收集,但你不会被迫使用垃圾收集器,你可以编写自己的内存管理代码,如果你真的想要。

但是,我不确定你可以在多大程度上将类型丰富度与你想要使用的低级方法混合起来。

如果您找到适合您需求的信息,请告知我们。

答案 6 :(得分:7)

我不确定状态Cyclone是什么状态,但这为标准C提供了更多安全性。D在某种程度上也可以被视为“更好的C”,但其状态不是标准库中的裂脑非常清晰。

我选择的语言是“更好的C”OOC。它还很年轻,但它很有趣。它为你提供了没有C++杀手复杂性的OO。它使您可以轻松访问C接口(您可以“覆盖”C结构并在调用外部库时正常使用它们/以这种方式控制内存布局)。它默认使用GC,但是如果你真的不想要它就可以关闭它(但这意味着你不能再使用标准库集合而不会泄漏)。

另一条评论提到了我忘记的Ada,但这提醒我:有Oberon,它应该是一种安全的(-er)语言,但它也包含垃圾收集机制。

答案 7 :(得分:5)

您可能还想查看BitC。这是一种严肃的语言而不是玩具,但它还没有准备好,可能无法及时准备好对你有用。

尽管如此,BitC的一个特定设计目标是与Haskell风格的类型系统一起支持低级开发。它最初旨在支持Coyotos微内核的开发。我认为Coyotos被杀了,但BitC显然仍在开发中。

答案 8 :(得分:1)

  

C ++没有解决这个问题。我还是不想使用C ++。我觉得OO课程和模板很头疼。

克服这种态度。只需使用C ++。你可以从用C ++编写C开始,逐渐转向更好的风格。