【CSDN编者按】Carbon真的能成为C的替代品吗?目前我们只能猜测,但请不要忘记Swift或Kotlin等语言的诞生。 原文链接:https:semaphoreci。comblogcarbon 未经授权,禁止转载! 作者ManuelRubio译者弯月出品CSDN(ID:CSDNnews) 在2022年的CppNorth大会上,ChandlerCarruth发表了一项主题演讲,标题是:CarbonLanguage:AnexperimentalsuccessortoC,其中提到了一门名为Carbon的全新开源开发语言,号称是C的继承者。 但是,为什么我们需要C的继承者?这个想法从何而来? 在2019年CppCon大会的最后一天,ChandlerCarruth和TitusWinters发表了一项惊人的演讲,他们讨论了什么是C?我认为,该演讲传达的一个最有趣的想法是,语言是工具,我们必须使用正确的工具来完成工作。 在谈话的最后,他们提出了不同的建议,旨在解决C开发人员面临的一些常见问题,这些建议包括: 注重性能的软件。我们不仅需要考虑速度,还要考虑延迟、内存利用率和电池利用率等。 软件的进化,语言的进化。C是几十年前编写的,语言设计者也会犯错,我们应该根据当前大多数语言的变化来改进和升级C但是,社区中总是有人反对改变。 简单且易于阅读、理解和编写。我认为JohnCarmack的这句话总结得很好:原始C语言的一大优点是,大多数高级开发人员都有能力编写自己的C编译器,而了解自己所用的工具是非常有价值的。但如果是C编译器的话,我就需要大量的时间来学习编写。 安全与测试。更安全的API、廉价的安全缓解措施以及使用持续集成单元和集成测试的综合测试方法。所有不受信任的输入都会持续进行模糊测试,所有测试都使用检查构建模式(sanitizer、断言等)。 快速且可扩展的开发,本质上就是模块。 硬件、操作系统、环境。定义我们承诺支持的内容,并以可预见的方式持续推进。我们不会有意去破坏已有20年历史的平台,但我们也不会继续支持。 我们可以改进C或使用其他语言吗? 在2022年的CppNorth大会上,Carruth为我们提供了这方面的信息。他首先提到了上一次演讲的建议,并讨论了为什么C无法实现这些它们。主要问题在于,C积累了几十年的技术债务,在此期间社区优先考虑的是向后兼容性,因此未能修复技术债务。 那么,是否可以利用现有的一种语言来代替C?使用垃圾回收的语言很棒,但我们不会考虑它们,因为这些语言会付出性能的成本,而且大多数C开发人员认为他们不想在这方面让步。 Rust编程语言是一个不错的选择,因为它是内存安全的,并且非常适合作为低级语言的替代品,但请看下面的替代关系,Rust实际上无法替代C: CC JavaScriptTypeScript ObjectiveCSwift JavaKotlin CRust? Rust是一门运行良好的语言,如果你准备开发一个新项目,那么非常推荐。但如果你需要将C生态系统连同各种深层次的依赖都迁移到Rust,那将会是一项非常艰巨的任务。我们不推荐这种做法。 我们需要的是一位继承者。这里的继承者指的是在现有生态系统中构建的语言,无需建立新语言,它可以提供互操作性,而且学习和采用也很方便,理想情况下,所有的辅助工具也可以继续提供支持。从本质上来说,继承者是其父辈语言的超集。 Carbon编程语言是什么? 在讨论了C的问题后,Carruth提出了一个问题:下一步该怎么办?在讨论了为什么我们不能改进C,为什么我们不能使用Go语言或其他垃圾收集语言,以及我们不能使用Rust语言(或其他低级语言)后,Carruth认为我们需要为C创建一门继承者:Carbon。 Carbon采纳了改进C的建议,并将其融入了语言的设计目标,同时他们还照顾到了一个新的关键性目标,也是最重要的一个目标:与现有C代码的互操作性和迁移。 根据官网的信息,Carbon语言的创建理由如下: 从根本上说,Carbon是一种后继语言,而不是尝试逐步发展C。Carbon将围绕与C的互操作性以及现有C代码库和开发人员的大规模采用和迁移而设计。〔。。。〕通过这种方法,我们可以在C现有生态系统的基础上构建软件,并继续支持现有的投资、代码库和开发人员群体。 Go或Dart会消失吗? Carruth是谷歌编程语言与软件基础技术主管,而且Carbon语言这项计划始于谷歌,所以人们担心Golang甚至Dart的支持可能会减弱。然而,谷歌是一家大公司,他们需要通过不同的平台和不同的项目开发软件。这意味着,他们需要不同的语言来处理不同的工作。 谷歌的生产环境使用Go来提供一些服务(dl。google。com的下载服务器),但正如Carruth所说,大型C项目的迁移非常困难,而且无法完成。 Dart是一种建立在JavaScript和其他语言之上的语言,其使命是成为Flutter项目的主要语言,解决跨平台创建应用程序的问题。由于Flutter不支持C,因此Carbon在这种环境下基本没有任何用处,因此Dart语言不会受到影响。 如何使用这种新语言? 在2022年的CoreC会议期间,JonRossPerkins(谷歌的资深软件工程师,拥有两年Carbon语言的经验)谈到了Carbon语言的语法和权衡弊端。 首先,他强调了目前这个项目仍处于实验阶段,但我想通过工具初步窥探一下这个生态系统。RossPerking提到了该项目的下列工具: 编译器。无需多说,代码的编译非常重要。 格式化程序。正确地格式化代码。 语言的自动升级。从比格式化程序更高的层次上整理我们的代码。 IDE和LSP支持。 重构支持。 包管理器。 关于编写代码,保持开发的上下文不变很重要,但是,我们需要保留那么多信息吗?为了简化上下文,Carbon提供了特定的保留字,这样工具的使用会更容易,代码的可读性也更高。这些保留字包括: var:用于声明变量。 class:用于定义类。 fn:用于定义函数。 interface:用于定义接口。 let:用于声明常量。 示例如下:spanclasscodesnippetouterspanclasscodesnippetkeywordvarspanradius:Printer(Circle);spanspanclasscodesnippetouterspanclasscodesnippetclassspanclasscodesnippetkeywordclassspanspanclasscodesnippettitleCirclespanspanspanspanclasscodesnippetouterspanclasscodesnippetclassspanclasscodesnippetkeywordclassspanspanclasscodesnippettitlePrinterspanspan(templatet:!Type)spanspanclasscodesnippetouterfnDraw()spanspanclasscodesnippetouterspanclasscodesnippetclassspanclasscodesnippetkeywordinterfacespanspanclasscodesnippettitleShapespanspanspanspanclasscodesnippetouterletPi:f32span 我认为,我们可以直接看看语法的细节以及代码示例。但在浏览代码之前,我需要说明该语言目前仍处于实验阶段,并且与大多数实验一样,它可能会逐步发展起来,也有可能会消失。但就目前的情况来看,这是一个很有希望的项目。 关于语法,由于第一版还没有正式发布,所以将来实际的代码可能会与这里有所出入。如果你想看看该语言最新的发展,可以查看设计文档https:github。comcarbonlanguagecarbonlangblobtrunkdocsdesignREADME。md),其中包含设计人员和开发人员贡献的建议和变更。spanclasscodesnippetouterspanclasscodesnippetkeywordimportspanspanclasscodesnippetbuiltinMspanspanclasscodesnippetouterspanclasscodesnippetcommentReturnsthesmallestfactorofn1,andspanspanspanclasscodesnippetouterspanclasscodesnippetcommentwhethernitselfisprime。spanspanspanclasscodesnippetouterfnSmallestFactor(n:i32)(i32,bool){spanspanclasscodesnippetouterspanclasscodesnippetkeywordletspanlimit:i32spanclasscodesnippetbuiltinMathspan。Sqrt(n)spanclasscodesnippetkeywordasspani32;spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspani:i32spanclasscodesnippetnumber2spanspanclasscodesnippetouterspanclasscodesnippetkeywordwhilespan(ilimit){spanspanclasscodesnippetouterspanclasscodesnippetkeywordletspanremainder:i32spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(remainderspanclasscodesnippetnumber0span){spanspanclasscodesnippetouterCarbon。Print(spanclasscodesnippetstring{0}isafactorof{1}span,i,n);spanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspan(i,spanclasscodesnippetliteralfalsespan);spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(ispanclasscodesnippetnumber2span){spanspanclasscodesnippetouterispanclasscodesnippetnumber3spanspanclasscodesnippetouter}spanclasscodesnippetkeywordelsespan{spanspanclasscodesnippetouterspanclasscodesnippetcommentSkipevennumbersoncewegetpast2。spanspanspanclasscodesnippetouterispanclasscodesnippetnumber2spanspanclasscodesnippetouter}spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspan(n,spanclasscodesnippetliteraltruespan);spanspanclasscodesnippetouter}span 以上代码使用了两个不同的函数。看来Carbon包中的函数是默认导入的,而Math包需要导入才能使用。 我们还使用了两个常量(let)。第一个limit是整个函数的常量,而第二个remainder是while循环范围内的常量,每次迭代都会创建并绑定一个值。常量limit还声明了一个不同于Math。sqrt函数返回的类型,但它利用asi32进行了转换。 我们看到return中定义了一个元组。基于这种技术,函数将返回两个值,而不是一个值。Python、Erlang或Elixir等语言也使用了这种数据类型。这样,我们就可以不同情况下处理一组值。 展望未来 目前Carbon还是一个实验性项目,但你可以查看它的线路图,了解近期的进展。通过前面所说的文档,我们可以看到Carbon的预期发布时间(停止实验)原定于2023年,后来变成了2024年,如今又推出到了2025~2026年。然而,我们可以看到Carbon正在快速发展,而且没有停止。 Carbon真的能成为C的替代品吗?目前我们只能猜测,但请不要忘记Swift或Kotlin等语言的诞生。在文本开头,我们列举了有关C的多项建议,相信大多数想要解决这些问题的大公司都会接受并采用Carbon。