大家好,我是 nature 编程语言的作者,自 2021 年第一次提交以来,一直到今天 nature 编程语言达到了早期可用版本。
为什么要实现这样一个编程语言?
golang 是我日常工作使用的编程语言,我一次使用 golang 时就被其所惊艳,语法简单,编程思想简洁自由,非常便利的进行交叉编译以及部署,拥有非常优秀且高性能的 runtime 实现,拥有先进的基于 goroutine 的并发风格设计等等。但是 golang 也有一些不方便的地方
nature 在设计理念上是对 go 编程语言的延续与改进,并追寻一定的差异性。在改善上述问题的同时,nature 拥有和 go 类似但更简洁的 runtime 、GMP 模型、allocator 、collector 、coroutine 、channel 、std 等等。并且 nature 同样不依赖 llvm ,有着高效的编译速度,方便的交叉编译与部署等,
基于 nature 编程语言已实现的特性,其适用于游戏引擎和游戏开发、科学计算和 AI 、操作系统和物联网、命令行、以及 Web 开发等领域。
当 nature 完成所有特性及优化时,预计 nature 可以在任何场景替代 golang 进行开发(转换为可读 golang 代码,以最低的试错成本的使用 nature ,并可以随时切换回 golang)。并且作为通用编程语言 nature 可以和任何的同类型编程语言进行竞争。[注意这还未完成]
两年前 nature 编程语言还不能使用,但我依旧在 V2EX 进行了分享,得到了很多鼓励,这是让我坚持到可用版本发布的动力之一。
但我知道, 这依旧有些迟了,我耗费了太久的时间,仅仅是又带来了一个编程语言而已,毕竟这个世界最不缺的就是编程语言。但是当我真的去思考类似 “我还要继续么?我能做好吗?” 这样的问题的时候,我发现我已经走了很远很远的路。
欢迎体验反馈~
github: https://github.com/nature-lang/nature
官网: https://nature-lang.org/ 首页包含一些语法特性示例,可以直接在 playground 尝试
语法文档: https://nature-lang.org/docs/syntax
playground: https://nature-lang.org/playground 在线尝试
贡献指南(点击右上角切换到中文)
https://nature-lang.org/docs/contribute 我在文档中详细介绍了 nature 编程语言是如何实现的。
nature 和 golang 一样,有着一个自研的编译器后端, 但 nature 的源码结构和实现非常的简洁。
这让参与 nature 编程语言的贡献变得容易且有趣, 不再只是编译器前端 + llvm ,你可以参与 SSA, SIMD, 寄存器分配,汇编器,链接器等等有趣的工作来验证你的学习成果和想法。你可以通过 issue 表达你的想法,我会指导你参与贡献。
这是我用 nature 实现的一些小项目, 我很喜欢使用 nature 编写代码的感觉。
https://github.com/weiwenhao/parker 轻量打包工具
https://github.com/weiwenhao/llama.n Llama2 推理模型 nature 编程语言实现
https://github.com/weiwenhao/tetris 绑定 raylib 实现的俄罗斯方块
https://github.com/weiwenhao/playground nature 官网的 playground server api 实现
最后,我正在寻找工作,如果你觉得这个项目还不错,希望能给我一个 star ,这对我有很大的帮助 🙏
101
Donahue 18 天前 ![]() 看语法像 java python golang 各自的好用语法集合,感觉语法确实比 golang 好
|
102
cndev233 18 天前 ![]() 非常的厉害,希望 op 能一直更新下去,这就是我心目中的完美 golang
|
![]() |
103
weiwenhao OP ![]() @xingcy 我 28 左右,马上有孩子 😄。我运气很好,上家公司双休还不需要加班。其实不是两年,写这个项目已经 4 年了,主要是下班写,偶尔摸鱼的时候也会写一点。因为我之前月薪够我家庭使用了,所以就狗住了,一家公司一呆就呆了 5 年。身边的朋友跳槽涨薪虽然让我有些嫉妒,但也仅此而已了。
|
![]() |
105
ZGeek 18 天前 ![]() 花了半个多小时,前前后后粗看了一遍,从最开始的不屑(一个人的项目能是什么项目)到后期的震惊(完备性真高),很多语法的设计真的很 nature ,OP 加油,虽然无法提供其他帮助,但是还是很感动,这些基层的事情,总要有人做,无论成功与否,祝好。
|
![]() |
106
qxmqh 18 天前 ![]() OP 能做出来就已经成功了。
|
107
aababc 18 天前 ![]() 感觉很不错呢,但是有一个比较疑惑
``` fn delay_sum(int a, int b):int { co.sleep(1000) return a + b } ``` 为啥不是这样 ``` fn delay_sum(a, b: int):int { co.sleep(1000) return a + b } ``` 这是比较细节的点,是有什么更好的考虑吗 |
108
Ghostisbored 18 天前 ![]() star
|
![]() |
109
dbskcnc 18 天前 ![]() 真的有毅力,支持!
|
![]() |
110
weiwenhao OP @aababc 主要还是类型前置还是后置的问题,在初期设计的时候进行了长时间的考虑,最终选择了类型前置。我认为类型前置的可读性更好,并且类型推断时可以直接将类型转换为推断语法 var 。
函数声明时由于类型必须明确声明(无论时类型前置还是类型后置),常见的类型后置声明在函数声明时并不简洁(你说的这种省略声明方式除外),比如 (a: int, b: int), 和 (int a, int b) 相比,后者更加简洁可读。 |
![]() |
111
zhuangzhuang1988 18 天前 ![]() 牛逼
|
![]() |
112
ygtq 18 天前 ![]() 居然 2025 年了还有人能把开发一门编程语言这种事进行下去,太 cool 了吧!
|
![]() |
114
lesismal 18 天前 ![]() 赞,虽然不打算再学习和使用新语言了,但支持 OP ,一键三连!如果能加入信创是个好路子,祝楼主发扬光大!
|
115
2018yuli 18 天前 ![]() 不太了解编译层面的东西,有 jit 规划么?
|
![]() |
117
weiwenhao OP ![]() @2018yuli 编译型的编程语言直接编译成机器码,就不需要 jit 技术啦。jit 就是运行时即时编译。在运行的时候生成机器码,然后将函数调用指向机器码。
|
![]() |
118
elltor 17 天前 ![]() 太 hacker 了 👍👍👍
|
119
itakeman 17 天前 via Android ![]() 好是好,就是编程语言太多了,主流的都没什么精力去学
|
![]() |
120
Pipecraft 17 天前 ![]() |
![]() |
121
zsj1029 17 天前 ![]() 何时能自举,有没有这个打算,当时 golang 自举,可是让人兴奋
|
![]() |
123
baobao1270 17 天前 ![]() 从语法看简直就是心目中的完美语言……
ptr 做成泛型的写法太戳我了 |
![]() |
124
michaelluang 17 天前 ![]() 敬佩楼主的毅力与实力!加油!
|
![]() |
125
weiwenhao OP ![]() @zsj1029 暂时没有这个打算,原则上自举并不利于编程语言的发展,不仅耗时耗力,并且等于抛弃了高性能的 C (golang 用汇编弥补了很多) 和标准库。我更多的精力会放在编程语言可用性上。
|
127
tangmanger 17 天前 ![]() 牛逼
|
128
hello158 17 天前 ![]() 太牛了,必须鼓励。
|
129
xjzshttps 17 天前 ![]() playground 崩了,首页的默认项目运行报 500
|
![]() |
130
anivie 17 天前 ![]() 如果能提供 llvm 和自研后端两种选择会更吸引人哈哈
|
![]() |
131
oneisall8955 17 天前 ![]() 太牛啦
|
![]() |
132
Gilfoyle26 17 天前 ![]() @Cestbonmmm #19 好主意👍,果然高手在民间
|
![]() |
133
anivie 17 天前 ![]() @anivie 个人认为调试的时候用自己的编译器快速调试,发布的时候用 llvm 优化,可能会是很吸引人的点,只要尽力保证行为一致(现在 llvm 轻易也不会因为优化导致行为不一致吧)就行了
|
![]() |
134
easing 17 天前 ![]() 给大佬端茶
|
135
5261 17 天前 ![]() 给大佬点赞,大佬为啥不给我改造下 rust 的,我觉得 rust 语法太恶心了
|
136
zeromake 17 天前
@weiwenhao #22
也行吧,不过有些情况下很多东西自己整的话老累人了,比如 go 的 pprof ,话说有考虑 windows 下的支持吗(看了 #38 有说计划 2023-12 而现在已经是 2025-05 了) |
![]() |
137
needhourger 17 天前 ![]() 这是我在 v 站看到的最具有程序员乌托邦氛围感的帖子,大佬加油。
|
![]() |
138
Felldeadbird 17 天前 ![]() 牛!期待大佬的语言越来越多软件基于 nature 编写。
|
![]() |
139
liuhan907 17 天前 ![]() @weiwenhao
函数参数和返回值的前后置感觉很割裂啊,为什么不选择单一方式呢?另外如果想做游戏的话调度器还是需要给开发者留下自定的接口,不然主线程调度会很难写,用起来非常恶心。 |
140
heqingpan 17 天前 via Android ![]() 牛🐮
看了一下样例,语法很简洁,符合个人直觉。 已 star |
141
anan1314git 17 天前
@weiwenhao #125 确实, typescript 自觉了这么多年, 最终还是选择了另攀高枝 go
|
![]() |
142
bronyakaka 17 天前 ![]() 6
|
![]() |
144
weiwenhao OP @5261 我编辑器 lsp 使用 rust 写的,总体的感受是写一些系统代码的时候需要大量的 clone 来避免所有权问题,导致最终整体代码的可读性不太好。另外就是 idea debug 不太方便,只能通过 dbg! 进行 dd 操作。
|
![]() |
145
iyaozhen 17 天前 ![]() |
147
bbao 17 天前 ![]() 完备程度超出想象呢~
|
![]() |
148
encro 17 天前 ![]() @weiwenhao
moonbit 今年会发布 1.0 。希望后面能发展起来。 个人认为用 wasm ,然后有统一的图形,网络,文件 api ,然后发展就会快了。估计 moonbit 现在还在搞基本功吧。 我看好用 wasm 搞游戏,图形化跨平台都比较有前景。当然是否能保持 go 的编译性能,rust 的语法仍然是个问号。 |
![]() |
149
weiwenhao OP |
![]() |
150
weiwenhao OP @iyaozhen 确实很像,如果说区别的话 vlang 除了语法和 golang 像以外,内核等都朝着 rust 发展了,包括所有权,autofree 之类的技术,并且在追求更高的性能,看起来作者比较喜欢 rust 。
nature 则相反,除了语法和 golang 不像以外,其他都是基本照搬的 golang 。 |
151
onlyForward 17 天前 ![]() 虽然用不到,star 支持一下
|
![]() |
152
swananan 17 天前 ![]() 我之前也是 cdn 的,算是半个同行了。
我最近也在看 llvm 相关,主要是想参考 bpftrace ,实现一个类似 gdb 的用户态进程实时抓取工具,基于 ebpf 和用户态二进制 dwarf 信息,来更好展现用户态进程的运行状态,比如可以自定义 trace 点,去看某个局部变量或者全局变量内容,或者抓取函数调用栈等等。 光是 llvm 就够我喝一壶了,闲得蛋疼的时候,准备慢慢写了,op 这个工作量比我大得多了,我受到了鼓舞,哈哈。 |
![]() |
153
pollux 17 天前 ![]() 厉害厉害,加 star 关注了,但还是要尽快找到一家认真做事,健康发展的公司或团队良性循环起来,走信创和开源是可行的,就是眼睛要擦亮。
|
155
myl0204 17 天前 ![]() 找到了最初来 V2EX 的感觉,谢谢你 weiwenhao
|
![]() |
157
pepesii 17 天前 ![]() 太棒了
|
158
oom 17 天前 ![]() 这就有点超纲了,star 完事
|
![]() |
159
goldeye0351 17 天前 ![]() 火前留名.
坛子里藏龙卧虎呀 |
![]() |
160
liuhan907 17 天前 ![]() @weiwenhao
预留接口我实际上是指能自定义调度器算法等逻辑,不过有栈协程这点确实不好搞。但是实际上有些业务确实很需要自定义调度器,比如全局一个 M:N 调度器,然后有 N 个 M:1 调度器,以及重入调度器非重入调度器。但这些感觉不是很容易的在有栈协程上实现,无栈的比较容易。我觉得可以考虑先能够创建多个调度器并挂到上下文里,以及限定调度器的并行度。后续可以提供协程本地变量以及挂在协程上的上下文,避免 go 那个恶心的 ctx 参数到处传 |
![]() |
161
iorilu 17 天前 ![]() 学习下
python 急需改造阿, 为什么没有大佬改进 python 得打包编译等功能, 要是能像 go, rust 等能方便得一键编译就好了 |
![]() |
162
x1aoYao 17 天前 ![]() 太牛 X 了。我也喜欢 Go 的协程,管道这些,但是不喜欢 Go 的不统一的泛型语法(自带的 map/slice 将泛型写在[]外),以及没有空安全,接口没法分开值类型方法/指针方法等等。先 Start 了关注
|
![]() |
163
Biebe 17 天前 ![]() 太强了
|
![]() |
166
x1aoYao 17 天前
简单看了下,为什么方法参数里又要类型前置呢,感觉有点点不统一?
看接口好像不是 go 的鸭子类型了,但好像依旧不能在接口指定是值方法还是引用方法,不过作者要想是能编译到可读的 go ,这种确实就没法有太大区别了,感觉略微有些些遗憾,如果是反过来能够使用 go 的包就好了 |
![]() |
167
JohnSmith 17 天前 via Android ![]() 看到了 zig 的影子
|
![]() |
168
GDAOE 17 天前 ![]() 加油,支持
|
![]() |
169
weiwenhao OP @x1aoYao 统一类型前置的,即使返回值放在了参数的后面,依旧是类型前置。 你应该也发现了和 golang 语法的对应性。
不是简单的编译成可读的 golang, 也会对 golang 源码进行解析,然后有代码提示的调用 golang 的库。本质上就是使用 nature 语法进行 golang 开发,觉得 nature 不好用了,直接换到 golang 就行(但是如果又觉得 golang 不好用了那就换不回 nature 了) |
![]() |
170
weiwenhao OP |
![]() |
171
dynastysea 17 天前 ![]() NB ,如果国内找工作的话可以看看华为吧,国内搞这方面的不多
|
![]() |
172
weiwenhao OP @dynastysea 我应该还是找后端相关工作,如果找编程语言编译器相关工作会有点撇不清,影响 nature 的发展。
|
173
Elemyin 17 天前 ![]() 看了楼主的帖子,突然觉得有些悲哀,这样的大佬在大环境里也只能卑微打工,可能还不是特别高级的农民工,可叹
PS:可能跟个人追求不同,或许我太理想化了,觉得大佬就应该在为改变世界奋斗着 |
![]() |
174
LightofHeven 17 天前 ![]() errorf 和 match 看着很顺眼,大佬牛逼
|
176
black1 17 天前 ![]() 支持一下。就是好奇这语言的 logo 为啥设计成千年隼
|
178
brcefy 17 天前 ![]() 惊为天人,遂 star ✨
|
179
Huelse 17 天前 ![]() 支持支持!期待实现 bootstrapping
|
![]() |
180
scyuns 17 天前 ![]() 这异常处理 比 GO 看起来舒服太多了
|
181
yzqdm 17 天前 ![]() 加油,支持
|
![]() |
183
touchfishcc 17 天前 ![]() @Pipecraft #126 用上了
|
![]() |
184
touchfishcc 17 天前
👍
|
![]() |
185
gy0624ww 17 天前 ![]() 已 start, 留影纪念
|
186
deepseawhale 17 天前 ![]() 佩服佩服,用四年时间写一个工程,真的已经打败了 99.9 的社畜们。四年之间会有太多诱惑让你坚持不下来。
合影留念。 |
187
toddruan1 17 天前 ![]() |
![]() |
188
wongy 17 天前 ![]() 已经 star
|
![]() |
189
wqsdfdddd 17 天前 ![]() 太牛,太 hacker 了.!!!!!!
必须 star |
![]() |
190
KyleRicardo 17 天前 ![]() 太强了,火钳刘明
|
![]() |
191
xiuming 17 天前 ![]() 去七牛云吧
|
![]() |
193
johnnyhao 17 天前 ![]() 支持大佬
|
194
zttviYang 17 天前 ![]() 之前在 Laravel 社区看过你分享的文章,印象就很深刻,现在真是越来越厉害了
|
![]() |
195
haha1903 17 天前 ![]() 大神,支持,国人提出的各种编程语言还在被嘲讽的路上,但坚持下去,希望有一天能在世界上有一席之地。
|
![]() |
196
liuhan907 17 天前 ![]() @weiwenhao
最终的核心还是在哪个线程上调度执行,也就是协程唤醒后在哪的这个问题。因为这牵扯到线程本地变量、线程特权之类的问题。至于如何通信那是很次要的问题 |
197
name1991 17 天前 ![]() 佩服毅力
|
198
bjfane 17 天前 ![]() 大佬,加油,膜拜,直接撸语言国内的非常少!
|
![]() |
199
FYFX 17 天前 ![]() 强!感觉挺有意思的
刚才看了一下文档,循环和异常处理的 catch 块中都有 break 不过语义不同,试了一下在循环语句里面的 catch 中用 break 跳出循环好像有点问题,似乎限制了 catch 中的 break 必须要带一个值? |