挑战 50 年霸主 C 语言:新语言 Hare,“异端”中的保守派

Hare 原意为野兔,它的开发者希望这种编程语言能够如野兔般拥有顽强的生命力。

本周,软件开发者 Drew DeVault 公布了一种名为 Hare 的全新系统编程语言,并用“简单、稳定和健壮”作为核心形容词。那它有什么特别的吗?这回可能还真有。

世界上先后涌现 300 多种编程语言,而 Hare 偏偏把矛头指向了最强大的那个——C 语言。没错,Hare 的目标就是取代过去 50 年来最重要的编程语言。

DeVault 和大约 30 名项目贡献者已经在 Hare 身上投入了两年半时间。如今成果终于出炉,Hare 面向开发者正式开放。

DeVault 在一篇博文中介绍道,“Hare 跟 C 其实特别想像,几乎一切用 C 编写的程序都能用 Hare 写出来。但重要的是,Hare 比 C 更简单。

Hare 的设计原则是:

  1. 信任程序员。
  2. 如果程序员不敢信任自己,则提供辅助工具。
  3. 倾向认为显式行为比隐式行为好。
  4. 认为好的程序必须既正确、又简单。DeVault 解释称,“Hare 使用静态类型系统、手动内存管理和最小运行时,所以特别适合编写操作系统、系统工具、编译器、网络软件以及其他低级高性能任务。”

在接受 The Register 的采访中,DeVault 也坦言 Hare 的很多设计灵感都源自 C 语言。

DeVault 强调,跟大部分其他语言设计者不同,他们对 C 其实非常认同。Hare 只是想对 C 中的基本设计理念做出一些保守的改进,也可以说是在经历了多年的实践应用后、重新探索 C 语言能不能做得更好。

DeVault 还透露,Hare 的标准库还融合了谷歌 Go 语言的思想,特别是内置丰富多样的标准库——即各种“电池”(编程术语)——尽量避免再额外导入外部依赖项。

在他看来,“Hare 在设计上强调提供丰富的‘电池’以支持各类用例,帮助程序员摆脱复杂的外部依赖项,将开发项目保持在良好的可管理范围之内。我认为 Go 语言在这方面就做得很好;实际上,Hare 也有相当一部分模块(特别是加密模块)多少受到了 Go 语言的启发。”

Hare 的“电池”储备包括:

  • 加密套件;
  • 网络支持;
  • 日期/时间操作;
  • I/O 与文件系统抽象;
  • Unix 原语,例如 poll、fnmatch 和 glob;
  • POSIX 扩展正则表达式;
  • 解析器与类型检查器。标准库是系统编程发展中的一个新起点,也标志着开发者正式摆脱了 POSIX 和 libc 的遗留问题。Hare 默认不接入 libc C 语言标准库,而是基于 qbe 编译器后端。因此,Hare 中的“Hello, world!”程序如下所示:

复制代码

据称 Hare 也可以说是 Zig 的精简版。Zig 是一种包含手动内存管理功能的低级系统语言,只是同样作为 C 语言的替代方案,Zig 在人气上远远不如另一位竞争对手 Rust。

再换个角度,DeVault 还想把 Hare 塑造成一种有效的“避坑版”C 语言。

“我觉得很多想跟 C 竞争的新语言都走错了方向。Hare 其实是一种相当保守的语言,核心思路就是把过去 30 年间 C 语言的编程经验提炼成一种小巧、简单而又强大的新语言,在后面的 30 年里继续服务好开发者。我不太关心什么大胆创新,只求对既有功能做出精心设计。

目前 Hare 语言仍在开发当中,现阶段目标就是打造出可以稳定执行、包含标准库增强功能(如 TLS 和原始 IP 套接字支持)的 1.0 版本。

DeVault 指出,“我觉得在项目早期,大部分工作主要集中在语言本身。但现在已经初见成果,命令行工具、cron 等守护程序和 init 系统管理进程等均已就绪。”

DeVault 还表示,他正在使用 Hare 编写密钥管理器(Himitsu)和一套内核(Helios)——这些都是 Hare 语言最擅长的应用方向。

Himitsu 能将密钥存储为键/值对,用户可以为各个键/值对添加附加信息,例如用户名、主机和协议等。Himitsu 还能兼容各种“代理”,例如存储 SSH 私钥并充当 SSH 代理。

Helios 是一款面向 x86_64 架构的微内核,如果一切顺利,它未来还将支持其他架构(团队已经完成了 RISC-V 版本的开发)。目前它的功能还比较基础,比如启动为 Long Mode 模式、提供几个串行驱动程序、设置分页等。“虽然还有很多工作要做,但这确实是个不错的项目,能够展示出 Hare 在低级任务中的强大能力。”

“我认为在获得 TLS 的支持之后,还会有更广泛的用例可供大家探索。”DeVault 说道。

Hare 目前仍然依赖 BDFL(Benevolent Dictator For Life,终身仁慈独裁者)开源治理模式。DeVault 指出,“Hare 语言高度强调稳定与不变特性,所以需要的治理资源应该不会太多”,目前的项目筹款主要用于支付密码系统实现所需的第三方审计费用。

对于 Hare 的开发思路,DeVault 提到,“我们一直是比较保守的。我们希望 Hare 能在开发者的项目中稳定起效,又不会占用太多的语言学习时间。在即将推出的 1.0 版本中,我们将完成规范、确定语言设计,而且只对标准库做出向下兼容方面的变更。”

此外,DeVault 还有其他计划。目前,Hare 只支持三种指令集架构:x86_64、aarch64 以及 risc-v64。“我们希望能进一步扩展,增加 32 位平台和更多其他架构。目前能够支持的操作系统也只有 Linux 和 FreeBSD,后续会推进更多移植。暂时没有登陆非自由系统平台的计划,但考虑到 Hare 本身属于标准化语言,所以也可以在必要时通过第三方实现或者 fork 开发出 Windows 或 MacOS 版本。”

在标准库方面,DeVault 等人目前最主要的任务就是完成加密实现,目标是支持 TLS 1.2 和 1.3。

“我们为此付出了很多,为它的顺利诞生而骄傲,也希望能有更多朋友使用它、喜爱它。”DeVault 总结道。

感兴趣的读者可以在下方链接了解 Hare:

安装流程:https://harelang.org/installation/

使用教程:https://harelang.org/tutorials/introduction/

参考链接:

https://www.theregister.com/2022/04/26/hare_c_software/

https://harelang.org/blog/2022-04-25-announcing-hare/

了解更多软件开发与相关领域知识,点击访问 InfoQ 官网:https://www.infoq.cn/,获取更多精彩内容!

C/C++编程笔记:运算符—所有编程语言的基础!一文带你搞懂

运算符是任何编程语言的基础。因此,如果不使用运算符,则C / C ++编程语言的功能是不完整的。我们可以将运算符定义为符号,以帮助我们对操作数执行特定的数学和逻辑计算。换句话说,我们可以说运算符对运算对象进行运算。

例如,考虑以下语句:

c = a + b;

在这里,“ +”是称为而“ a”和“ b”是操作数。加法运算符告诉编译器将操作数“ a”和“ b”相加。

C / C ++具有许多内置的运算符类型,它们的分类如下:

算术运算符:这些运算符用于对操作数执行算术/数学运算。示例:(+,-,*,/,%,++,–)。算术运算符有两种类型:

一元运算符:与单个操作数运算或一起使用的运算符是一元运算符。例如:(++,–)

二进制运算符:与两个操作数运算或一起使用的运算符是二进制运算符。例如:(+,–,*,/)

关系运算符:这些运算符用于比较两个操作数的值。例如,检查一个操作数是否等于另一个操作数,一个操作数是否大于另一个操作数,等等。一些关系运算符是(==,> =,<=)。

逻辑运算符:逻辑运算符用于组合两个或多个条件/约束或补充所考虑的原始条件的评估。逻辑运算符的运算结果是布尔值true或false。例如,当两个条件同时满足时,在C或C ++中\’&&\’运算符表示的逻辑AND将返回true。否则,它返回false。因此,当a和b都为真(即非零)时,a && b返回true。

按位运算符:按位运算符用于对操作数执行位级运算。首先将运算符转换为位级,然后对操作数执行计算。诸如加法,减法,乘法等数学运算可在位级别执行,以加快处理速度。例如,用C或C ++表示为&运算符按位AND将两个数字用作操作数,并对两个数字的每一位执行AND。仅当两个位均为1时,AND的结果才为1。

赋值运算符:赋值运算符用于将值分配给变量。赋值运算符的左侧操作数是一个变量,而赋值运算符的右侧操作数是一个值。右侧的值必须与左侧的变量的数据类型相同。否则编译器将引发错误。

不同类型的赋值运算符如下所示:

“ =”:这是最简单的赋值运算符。该运算符用于将右侧的值分配给左侧的变量。

例如:

a = 10;b = 20;ch =\’y\’;

“ + =”:此运算符是\’+\’和\’=\’运算符的组合。该运算符首先将左侧变量的当前值添加到右侧值,然后将结果分配给左侧变量。

例:

(a + = b)可以写成(a = a + b)

如果存储在a中的初始值是5。那么(a + = 6)= 11。

“-=”:此运算符是“-”和“ =”运算符的组合。该运算符首先从左侧变量的当前值中减去右侧的值,然后将结果分配给左侧的变量。

例:

(a-= b)可以写成(a = a-b)

如果存储在a中的初始值是8,则(a-= 6)= 2。

“ * =”:此运算符是\’*\’和\’=\’运算符的组合。该运算符首先将左侧变量的当前值与右侧值相乘,然后将结果分配给左侧变量。

例:

(a * = b)可以写成(a = a * b)

如果存储在a中的初始值是5。那么(a * = 6)= 30。

“ / =”:此运算符是\’/\’和\’=\’运算符的组合。该运算符首先将左侧变量的当前值除以右侧值,然后将结果分配给左侧变量。

例:

(a / = b)可以写成(a = a / b)

如果最初存储在a中的值为6。则(a / = 2)= 3。

其他运算符:除上述运算符外,还有其他一些C或C ++运算符可用于执行某些特定任务。这里讨论其中一些:

sizeof运算符:sizeof在C / C ++编程语言中被大量使用。它是一个编译时一元运算符,可用于计算其操作数的大小。sizeof的结果是无符号整数类型,通常用size_t表示。基本上,sizeof运算符用于计算变量的大小。

逗号运算符:逗号运算符(用标记表示)是一个二进制运算符,它求值第一个操作数并丢弃结果,然后求值第​二个操作数并返回此值(和类型)。逗号运算符的优先级最低。逗号同时充当运算符和分隔符。

条件运算符:条件运算符的格式为。此外,表达式1是要评估的条件。如果condition(Expression1)为,则将执行并返回Expression2的结果;否则,如果condition(Expression1)为,则将执行并返回Expression3的结果。我们可能会替换条件运算符对if..else语句的使用。

希望对你有帮助~

另外如果你想更好地提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!笔者这里或许可以帮到你~

编程学习书籍分享:

编程学习视频分享:

分享(源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

C语言C++编程学习交流圈子,点击下方【了解更多】获取更多学习资料帮助你学习成长~

聊聊C语言-程序和编程语言

前几天看到新闻说是美国总统奥巴马写代码并且鼓励全部的美国人都应该学习编程,一时编程成了人们热议的话题。那么小编接下来将要写一个系列的文章来带你进入C语言编程的奇妙世界。

什么是编程?

编程简单来说就是用计算机能够识别的语言来编写程序。我们平时用的电脑、平板、手机、电视机、计算机以及工厂用的各种设备无一不包含程序。

上面这幅画面肯定大家都见过它包含不少人对儿时的回忆,它就是一个计算机程序。

什么是编程语言?

了解了什么是编程,那么我们就来了解一下编程语言。不论是我们平时说的汉语、英语、法语还是其他语言,它们从来就是我们用来沟通的工具。如果我们要和计算机进行沟通,对它说这些语言肯定行不通(或许未来计算机可以听懂我们说的语言,自己进行编程吧。小编也期待那一天),我们就要用计算机能够懂的语言。只要计算机能够听得懂的语言我们就可以叫它编程语言。

计算机懂的语言是什么呢?

就是010101这些二进制语言(也叫机器语言)。计算机只能对数字做运算,最早的程序员就是用这些010101来编写程序的。想想也是醉了,整天面对这些010101该是一件多么苦逼的事情。后来人们为了解决这件苦逼的事情发明了很多种高级语言(也叫形式语言)。

上面这幅图展现了人们发明的大多数高级语言,但是并不包含全部。我们现在用的程序基本都是用这些高级语言编写的。

高级语言与机器语言的联系是什么?

上面说的高级语言其实也并不能被计算机直接识别处理的,它们需要转化成机器语言。转化的方法有两种-编译和解释。只有经过编译或者解释完后,我们的程序才能在计算机或者其他设备上运行。经历的过程如下:

为什么选择C语言?

既然有那么多的高级语言我们为什么选择C语言编写程序呢,也许是小编对C语言有着独有的情怀吧,也许是因为我们上过大学的人基本上学的第一门编程语言都是C语言吧,也许它是至今为止用的最多的和底层硬件打交道的语言吧,也许它是这么多高级语言中经历时间的考验最长,至今仍被频繁使用的语言吧。

这篇就写到这里,下一篇我们将讲述与编程的一些术语以及常用的工具。如果想了解更多与编程有关的东西,请关注微信公众号:程序员互动联盟(coder_online)

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。