我想要一个更好的C.让我解释一下:
我在C中做了很多编程,这对于具有实时需求的应用程序是必需的,例如音频编程,机器人,设备驱动程序等.
虽然我喜欢C,但是在花了很多时间在Haskell之后让我紧张的一件事就是缺少一个合适的类型系统.也就是说,只要你想编写一个更通用的函数,说一些操纵泛型指针的东西(比如说一个通用的链表)就必须把东西投射到void*
什么东西上,然后你就会丢失所有类型的信息.它是一个全有或全无的系统,它不会让你编写泛型函数而不会失去类型检查的所有优点.
C++没有解决这个问题.我还是不想使用C++.我发现OO类和模板很令人头疼.
Haskell及其类型类确实解决了这个问题.您可以使用语义上有用的类型,并使用类型约束来编写对不依赖的类类操作的函数void
.
但是我正在使用的域名,我不能使用Haskell,因为它不具备实时功能 - 主要是因为垃圾收集.GC是必需的,因为很难进行功能编程,这种编程很重,没有自动内存管理.但是,类型类的概念并没有特别针对C的语义.我想要C,但是使用Haskell的可靠类型系统,可以帮助我编写好的系统.但是,我真的想要C:我想控制内存管理,我想知道数据结构是如何布局的,我想使用(井型)指针算法,我想要可变性.
有这样的语言吗?如果是这样,为什么它不适合低级编程呢?
旁白:我知道在这个方向上有一些小的语言实验,但我对在真实世界的项目中真正可用的东西很感兴趣.我对成长到发达的语言感兴趣,但不是那么多"玩具"语言.
我应该补充一下,我听说过Cyclone,这很有意思,但是我无法让它为我编译(Ubuntu)而且我还没有听说过任何实际使用它的项目......欢迎任何其他建议.
谢谢!
既然没有人提起它:我认为ATS语言是一个更好的C的更好的候选人!特别是因为你喜欢Haskell,因此功能强大的类型编程.请注意,ATS似乎是专门为系统编程和硬实时应用程序设计的,因为它大部分都可以在没有垃圾收集的情况下完成.
如果你查看枪战,你会发现性能基本上与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提倡以程序员为中心的程序验证方法,它将编程与定理证明以语法交织的方式结合起来.此外,该组件可以作为编码演绎系统及其(元)属性的逻辑框架.
那么Nimrod或Vala语言呢?
另一个(真正的)更好的C候选者是Rust编程语言.
与其他一些建议不同,(Go,Nimrod,D,......)Rust可以直接与C和C++竞争,因为它具有手动内存管理功能,不需要垃圾回收(参见[1]).
让Rust与众不同的是它具有安全的手动内存管理功能.(链接是pc walton的博客,Rusts的主要贡献者之一,一般值得阅读;)除此之外,这意味着它修复了无效指针的十亿美元错误.这里建议的许多其他语言要么需要垃圾收集(Go),要么默认启用垃圾收集,并且不提供超出C++提供的安全手动内存管理功能(Nimrod,D).
虽然Rust有一个迫切的核心,但它确实从函数式语言中借用了许多不错的东西,例如sum类型也称为标记的联合.它也非常关注成为一种安全且以性能为导向的语言.
[1]现在有两个主要的指针类型拥有指针(如C++中的std :: unique_ptr,但得到了来自typechecker的更好支持)和托管指针.顾名思义,后者确实需要任务本地垃圾收集,但有想法将它们从语言中删除并仅将它们作为库提供.
编辑以反映@ReneSacs评论:D和Nimrod不需要垃圾收集.
我对Haskell了解不多,但如果你想要一个强大的类型系统,请看看Ada.它广泛用于航空航天应用的嵌入式系统.SIGADA的动力是"我们信任的强力打字".但是,如果必须使用Windows/Linux类型的设备驱动程序,它将没有多大用处.
有几个原因它不是那么受欢迎:
详细语法 - 旨在读取,而不是写入
编译器历史上很昂贵
与国防部和设计委员会的关系,程序员似乎在敲门
我认为事实是大多数程序员不喜欢强类型系统.
Nim(前Nimrod)拥有强大的类型系统,具有概念和简单的泛型.它还具有广泛的编译时机制,包括模板和宏.它还具有简单的C FFI和您期望从系统编程语言中获得的所有低级功能,因此您可以编写自己的内核.
目前它编译为C,因此您可以在GCC运行的任何地方使用它.如果你只想使用Nim作为更好的C,你可以通过--os:standalone
编译器开关来实现,它为你提供了一个简单的标准库,没有操作系统关系.
例如,要编译为AVR微控制器,您可以使用:
nim c --cpu:avr --os:standalone --deadCodeElim:on --genScript x.nim
Nim有一个软实时GC,您可以在其中指定运行时间和最大暂停时间(以微秒为单位).如果你真的买不起GC,你可以完全禁用它(--gc:none
编译器开关)并只使用像C这样的手动内存管理,丢失大部分标准库,但仍然保留了更强大和更强大的类型系统.
此外,标记指针是一种计划的功能,可确保您不会将内核级指针与用户级指针混合在一起.
D可能会提供你想要的东西.它有一个非常丰富的类型系统,但如果需要,你仍然可以控制内存布局.它有像C这样的无限制指针.它是垃圾收集,但你不会被迫使用垃圾收集器,你可以编写自己的内存管理代码,如果你真的想要.
但是,我不确定您可以在多大程度上将类型丰富度与您想要使用的低级方法混合在一起.
如果您找到适合您需求的产品,请告诉我们.
我不确定状态Cyclone
是什么,但是为标准C提供了更多的安全性.D
在某种程度上也可以被认为是"更好的C",但是它在标准库中的裂脑状态并不十分清楚.
我选择的语言是"更好的C"是OOC.它还很年轻,但它很有趣.它为你提供了没有C++
杀手复杂性的OO .它使您可以轻松访问C接口(您可以"覆盖"C结构并在调用外部库时正常使用它们/以这种方式控制内存布局).它默认使用GC,但是如果你真的不想要它就可以关闭它(但这意味着你不能再使用标准库集合而不会泄漏).
另一条评论提到了我忘记的Ada,但这让我想起了:Oberon
它应该是一种安全(-er)语言,但它也包含垃圾收集机制.
您可能还想查看BitC.这是一种严肃的语言而不是玩具,但它还没有准备好,可能无法及时准备好对你有用.
尽管如此,BitC的一个特定设计目标是与Haskell风格的类型系统一起支持低级开发.它最初旨在支持Coyotos微内核的开发.我认为Coyotos被杀掉了,但BitC显然仍在开发中.