代码之家  ›  专栏  ›  技术社区  ›  Steve

有更好的C吗?[关闭]

  •  25
  • Steve  · 技术社区  · 15 年前

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

    我用C语言编写了很多程序,这是有实时需求的应用程序所必需的,比如音频编程、机器人技术、设备驱动程序等等。

    虽然我喜欢C,但在和Haskell相处了很长时间后,有一件事让我很紧张,那就是缺乏一个合适的类型系统。也就是说,只要你想写一个更通用的函数,比如说操纵一个泛型指针的东西(比如说泛型链表),你就必须把它转换成 void* 或者别的什么,你就失去了所有的类型信息。它是一个全有或全无的系统,它不允许您编写泛型函数而不丧失类型检查的所有优点。

    C++解决不了这个问题。我不想用C++。我发现OO类和模板是一个令人头痛的问题。

    Haskell及其类型类 void .

    但在我工作的领域,我不能使用Haskell,因为它不具备实时性——主要是由于垃圾收集。之所以需要GC,是因为函数式编程非常困难,因为函数式编程需要大量的分配,而且没有自动内存管理。然而,在类型类的概念中,没有什么特别违背C的语义。我想要C语言,但是用Haskell可靠的类型系统,来帮助我编写类型良好的系统。然而,我真的想要C:我想要控制内存管理,我想要知道数据结构是如何布局的,我想要使用(类型良好的)指针算法,我想要可变性。

    有这样的语言吗?如果是这样的话,为什么它不是更流行的低级编程呢?

    我对现实世界中的一些小项目很感兴趣,但我知道有些小项目是有用的。我对发展成熟的语言很感兴趣,但对“玩具”语言不感兴趣。

    我应该补充一句,我听说 Cyclone ,这很有趣,但是我无法为我编译它(Ubuntu),而且我还没有听说任何项目实际使用它。。任何这方面的建议都是值得欢迎的。

    谢谢!

    9 回复  |  直到 15 年前
        1
  •  24
  •   Community Mohan Dere    6 年前

    既然还没人提起,我想 ATS language 是一个很好的C候选人!特别是因为您喜欢Haskell,因此函数式编程具有强类型。请注意,ATS似乎是专门为系统编程和硬实时应用程序设计的,因为大多数ATS都可以在没有垃圾收集的情况下完成。

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

    什么是ATS?

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

    函数式编程。ATS的核心是一种基于eager(aka)的函数式语言。(按值调用)求值,也可以容纳lazy(aka。按需呼叫)评估。ATS中线性类型的可用性常常使得用它编写的函数程序不仅运行效率高得惊人(与C相比),而且占用内存也小得惊人(与C相比)。

    命令式编程。ATS中命令式程序设计的新颖而独特的方法,植根于定理证明的程序设计范式。ATS的类型系统允许在ATS中安全支持其他语言中被视为危险的许多特性(例如,显式指针算法和显式内存分配/释放),使ATS成为低级别系统编程的可行编程语言。

    模块化编程。ATS的模块系统主要受Modula-3模块系统的影响,它既简单又通用,能有效地支持大规模编程。

        2
  •  22
  •   Grzegorz Adam Hankiewicz    13 年前

    那怎么办 Nimrod Vala 语言?

        3
  •  15
  •   Paul    12 年前

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

    与其他的一些建议不同,(RO,Nimrod,D,…)RID可以直接与C和C++竞争,因为它具有手动内存管理,不需要垃圾收集(见[ 1 ])。

    区别生锈的是它有 safe manual memory management . (链接指向pc walton的博客,这是Rusts的主要贡献者之一,通常值得一读;)除此之外,这意味着它修复了 billion dollar mistake 空指针的数目。此处建议的许多其他语言都需要垃圾回收(GO)或垃圾收集在默认情况下打开,并且不提供超出C++提供的安全手动内存管理的设施(NimLod,D)。

    虽然Rust有一颗命令式的心,但它确实从函数式语言中借用了很多好东西,例如sum类型或标记的unions。它还真正关心的是如何成为一种安全的、面向性能的语言。

    [1] 现在有两种主要的指针类型 拥有的指针 (类似于STD::UNIQUIGPTR在C++中,但从Type检查器得到更好的支持) 托管指针 . 顾名思义,后者确实需要任务本地垃圾收集,但是 there are thoughts 将它们从语言中删除并仅作为库提供。

        4
  •  13
  •   Dr. Watson    15 年前

    我不太了解Haskell,但如果你想要一个强大的类型系统,可以看看Ada。它被广泛应用于航空航天领域的嵌入式系统中。SIGADA moto是“我们信任的强类型”的,但是如果你必须使用Windows/Linux类型的设备驱动程序,它就没有多大用处了。

    它不那么受欢迎的几个原因:

    • 冗长的语法——设计为读而不是写
    • 编译器在历史上是昂贵的
    • 与国防部和设计委员会的关系,程序员似乎对此感到不满

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

        5
  •  13
  •   ReneSac    10 年前

    Nim (前Nimrod)有一个强大的类型系统,有概念和简单的泛型。它还具有广泛的宏编译时机制。它还具有简单的cfi和系统编程语言的所有底层特性,因此您可以编写 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,失去了大部分的标准库,但仍然保留更健全和强大的类型系统。

    另外,标记指针是一个计划好的特性,它可以确保您不会将内核级指针与用户级指针混合在一起。

        6
  •  9
  •   Daniel Cassidy    15 年前

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

    然而,我不确定你能在多大程度上将类型丰富性与你想要使用的低级方法结合起来。

    如果你需要的话就告诉我们。

        7
  •  7
  •   viraptor    15 年前

    我不知道是什么状态 Cyclone 但这为标准C提供了更多的安全性。 D 在某种程度上也可以被认为是一个“更好的C”,但其在标准库中的地位并不十分清楚。

    我选择的“更好的C”语言是 OOC . 它还年轻,但很有趣。它给你的OO没有 C++

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

        8
  •  5
  •   Daniel Cassidy    15 年前

    你可能还想看看 BitC . 这是一种严肃的语言,不是一个玩具,但它还没有准备好,可能不会准备好,在时间上对你有任何用处。

        9
  •  0
  •   wilx    12 年前

    C++解决不了这个问题。我不想用C++。我发现OO类和模板是一个令人头痛的问题。

    克服这种态度。只使用C++。你可以从C++中的C开始,并逐渐地移动到更好的样式。

    推荐文章