• 请不要在回答技术问题时复制粘贴 AI 生成的内容
weiwenhao
1.3D
V2EX  ›  程序员

我写了一个编程语言,受 golang 启发

  weiwenhao ·
weiwenhao · May 20, 2025 · 32235 views
This topic created in 533 days ago, the information mentioned may be changed or developed.

大家好,我是 nature 编程语言的作者,自 2021 年第一次提交以来,一直到今天 nature 编程语言达到了早期可用版本。


为什么要实现这样一个编程语言?

golang 是我日常工作使用的编程语言,我一次使用 golang 时就被其所惊艳,语法简单,编程思想简洁自由,非常便利的进行交叉编译以及部署,拥有非常优秀且高性能的 runtime 实现,拥有先进的基于 goroutine 的并发风格设计等等。但是 golang 也有一些不方便的地方

  • 语法过于简洁导致表达能力不足
  • 类型系统不够完善
  • 错误处理机制繁琐
  • 自动 GC 和抢占式调度的设计虽然非常优秀,但是也让 go 的应用范围受限。
  • 包管理方式
  • interface{}
  • ...

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 ,这对我有很大的帮助 🙏

315 replies  •  2025-05-24 21:33:40 +08:00
1  2  3  4  
❮ ❯
Donahue
Donahue
May 20, 2025❤️1
101
看语法像 java python golang 各自的好用语法集合,感觉语法确实比 golang 好
cndev233
cndev233
May 20, 2025❤️2
102
非常的厉害,希望 op 能一直更新下去,这就是我心目中的完美 golang
weiwenhao
weiwenhao
OP
May 20, 2025❤️2
103
@xingcy 我 28 左右,马上有孩子 😄。我运气很好,上家公司双休还不需要加班。其实不是两年,写这个项目已经 4 年了,主要是下班写,偶尔摸鱼的时候也会写一点。因为我之前月薪够我家庭使用了,所以就狗住了,一家公司一呆就呆了 5 年。身边的朋友跳槽涨薪虽然让我有些嫉妒,但也仅此而已了。
weiwenhao
weiwenhao
OP
May 20, 2025
104
@cndev233 是的,我真的很喜欢 golang ,但我觉得 golang 可以更好,。
ZGeek
ZGeek
May 20, 2025❤️2
105
花了半个多小时,前前后后粗看了一遍,从最开始的不屑(一个人的项目能是什么项目)到后期的震惊(完备性真高),很多语法的设计真的很 nature ,OP 加油,虽然无法提供其他帮助,但是还是很感动,这些基层的事情,总要有人做,无论成功与否,祝好。
qxmqh
qxmqh
May 20, 2025❤️1
106
OP 能做出来就已经成功了。
aababc
aababc
May 20, 2025❤️1
107
感觉很不错呢,但是有一个比较疑惑
```
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
}
```
这是比较细节的点,是有什么更好的考虑吗
Ghostisbored
Ghostisbored
May 20, 2025❤️1
108
star
dbskcnc
dbskcnc
May 20, 2025❤️1
109
真的有毅力,支持!
weiwenhao
weiwenhao
OP
May 20, 2025
110
@aababc 主要还是类型前置还是后置的问题,在初期设计的时候进行了长时间的考虑,最终选择了类型前置。我认为类型前置的可读性更好,并且类型推断时可以直接将类型转换为推断语法 var 。

函数声明时由于类型必须明确声明(无论时类型前置还是类型后置),常见的类型后置声明在函数声明时并不简洁(你说的这种省略声明方式除外),比如 (a: int, b: int), 和 (int a, int b) 相比,后者更加简洁可读。
zhuangzhuang1988
zhuangzhuang1988
May 20, 2025❤️1
111
牛逼
ygtq
ygtq
May 20, 2025❤️1
112
居然 2025 年了还有人能把开发一门编程语言这种事进行下去,太 cool 了吧!
aababc
aababc
May 20, 2025
113
@weiwenhao #110 感谢大佬的回复,有点理解了
lesismal
lesismal
May 20, 2025❤️1
114
赞,虽然不打算再学习和使用新语言了,但支持 OP ,一键三连!如果能加入信创是个好路子,祝楼主发扬光大!
2018yuli
2018yuli
May 20, 2025❤️1
115
不太了解编译层面的东西,有 jit 规划么?
weiwenhao
weiwenhao
OP
May 20, 2025
116
@lesismal 哈哈,实际上每个 star 都是我以后选择和谈判的资本。现在都算是入股了,如果能搞出不错的东西,我一定会回馈社区。
weiwenhao
weiwenhao
OP
May 20, 2025❤️1
117
@2018yuli 编译型的编程语言直接编译成机器码,就不需要 jit 技术啦。jit 就是运行时即时编译。在运行的时候生成机器码,然后将函数调用指向机器码。
elltor
elltor
May 20, 2025❤️1
118
太 hacker 了 👍👍👍
wojiugaiming
wojiugaiming
May 20, 2025 via Android❤️1
119
好是好,就是编程语言太多了,主流的都没什么精力去学
Pipecraft
Pipecraft
May 20, 2025❤️1
120
真大佬,太强了。打个标签做个备注。

zsj1029
zsj1029
May 20, 2025❤️1
121
何时能自举,有没有这个打算,当时 golang 自举,可是让人兴奋
weiwenhao
weiwenhao
OP
May 20, 2025
122
@Pipecraft 有趣,我说怎么没见过这个功能,原来是你自己开发的扩展。
baobao1270
baobao1270
May 20, 2025❤️1
123
从语法看简直就是心目中的完美语言……
ptr 做成泛型的写法太戳我了
michaelluang
michaelluang
May 20, 2025❤️1
124
敬佩楼主的毅力与实力!加油!
weiwenhao
weiwenhao
OP
May 20, 2025❤️1
125
@zsj1029 暂时没有这个打算,原则上自举并不利于编程语言的发展,不仅耗时耗力,并且等于抛弃了高性能的 C (golang 用汇编弥补了很多) 和标准库。我更多的精力会放在编程语言可用性上。
Pipecraft
Pipecraft
May 20, 2025❤️1
126
@weiwenhao #122 是的,大佬,叫 [小鱼标签] 的一个插件。

tangmanger
tangmanger
May 20, 2025❤️1
127
牛逼
hello158
hello158
May 20, 2025❤️1
128
太牛了,必须鼓励。
xjzshttps
xjzshttps
May 20, 2025❤️1
129
playground 崩了,首页的默认项目运行报 500
anivie
anivie
May 20, 2025❤️1
130
如果能提供 llvm 和自研后端两种选择会更吸引人哈哈
itechify
itechify
May 20, 2025❤️1
131
太牛啦
Gilfoyle26
Gilfoyle26
May 20, 2025❤️1
132
@Cestbonmmm #19 好主意👍,果然高手在民间
anivie
anivie
May 20, 2025❤️1
133
@anivie 个人认为调试的时候用自己的编译器快速调试,发布的时候用 llvm 优化,可能会是很吸引人的点,只要尽力保证行为一致(现在 llvm 轻易也不会因为优化导致行为不一致吧)就行了
easing
easing
May 20, 2025❤️1
134
给大佬端茶
5261
5261
May 20, 2025❤️1
135
给大佬点赞,大佬为啥不给我改造下 rust 的,我觉得 rust 语法太恶心了
zeromake
zeromake
May 20, 2025
136
@weiwenhao #22
也行吧,不过有些情况下很多东西自己整的话老累人了,比如 go 的 pprof ,话说有考虑 windows 下的支持吗(看了 #38 有说计划 2023-12 而现在已经是 2025-05 了)
needhourger
needhourger
May 20, 2025❤️1
137
这是我在 v 站看到的最具有程序员乌托邦氛围感的帖子,大佬加油。
Felldeadbird
Felldeadbird
May 20, 2025❤️1
138
牛!期待大佬的语言越来越多软件基于 nature 编写。
liuhan907
liuhan907
May 20, 2025❤️1
139
@weiwenhao
函数参数和返回值的前后置感觉很割裂啊,为什么不选择单一方式呢?另外如果想做游戏的话调度器还是需要给开发者留下自定的接口,不然主线程调度会很难写,用起来非常恶心。
heqingpan
heqingpan
May 20, 2025 via Android❤️1
140
牛🐮
看了一下样例,语法很简洁,符合个人直觉。
已 star
anan1314git
anan1314git
May 20, 2025
141
@weiwenhao #125 确实, typescript 自觉了这么多年, 最终还是选择了另攀高枝 go
bronyakaka
bronyakaka
May 20, 2025❤️1
142
6
weiwenhao
weiwenhao
OP
May 20, 2025
143
@xjzshttps 感谢反馈 bug ,fd 有泄露,我调整了 Max open files ,晚点把 bug 也修复一下。
weiwenhao
weiwenhao
OP
May 20, 2025
144
@5261 我编辑器 lsp 使用 rust 写的,总体的感受是写一些系统代码的时候需要大量的 clone 来避免所有权问题,导致最终整体代码的可读性不太好。另外就是 idea debug 不太方便,只能通过 dbg! 进行 dd 操作。
iyaozhen
iyaozhen
May 20, 2025❤️1
145
让我想起了 https://vlang.io/compare#go

在这啥事都说 ROI (工作到结婚生娃)的时代,真的是一股清流👍
weiwenhao
weiwenhao
OP
May 20, 2025
146
@zeromake 其实现在离 windows 支持只差一个能够交叉编译的链接器而已。这个东西自己写确实累死人,我一直在找有没有现成的。
bbao
bbao
May 20, 2025❤️2
147
完备程度超出想象呢~
encro
encro
May 20, 2025❤️1
148
@weiwenhao

moonbit 今年会发布 1.0 。希望后面能发展起来。

个人认为用 wasm ,然后有统一的图形,网络,文件 api ,然后发展就会快了。估计 moonbit 现在还在搞基本功吧。

我看好用 wasm 搞游戏,图形化跨平台都比较有前景。当然是否能保持 go 的编译性能,rust 的语法仍然是个问号。
weiwenhao
weiwenhao
OP
May 20, 2025
149
@liuhan907 还不太了解这个,我写简单的俄罗斯方块的时候,确实是必须在主线程上运行。关于手动的协程调度我有在考虑了,现在的协程运行方式是预留的参数的,通过 @async(hello(), co.SAME) 类似这样的行为,本来是有 co.SOLO 这样的单独线程运行协程的参数,但是 GC 支持有些问题,所以删掉了。后续还是会想办法支持的。
weiwenhao
weiwenhao
OP
May 20, 2025
150
@iyaozhen 确实很像,如果说区别的话 vlang 除了语法和 golang 像以外,内核等都朝着 rust 发展了,包括所有权,autofree 之类的技术,并且在追求更高的性能,看起来作者比较喜欢 rust 。

nature 则相反,除了语法和 golang 不像以外,其他都是基本照搬的 golang 。
onlyForward
onlyForward
May 20, 2025❤️1
151
虽然用不到,star 支持一下
swananan
swananan
May 20, 2025❤️1
152
我之前也是 cdn 的,算是半个同行了。
我最近也在看 llvm 相关,主要是想参考 bpftrace ,实现一个类似 gdb 的用户态进程实时抓取工具,基于 ebpf 和用户态二进制 dwarf 信息,来更好展现用户态进程的运行状态,比如可以自定义 trace 点,去看某个局部变量或者全局变量内容,或者抓取函数调用栈等等。 光是 llvm 就够我喝一壶了,闲得蛋疼的时候,准备慢慢写了,op 这个工作量比我大得多了,我受到了鼓舞,哈哈。
pollux
pollux
May 20, 2025❤️2
153
厉害厉害,加 star 关注了,但还是要尽快找到一家认真做事,健康发展的公司或团队良性循环起来,走信创和开源是可行的,就是眼睛要擦亮。
weiwenhao
weiwenhao
OP
May 20, 2025
154
@swananan 我们之前在对路由器上的程序使用 ptrace 进行流量分析,对客户程序性能的影响蛮大的,后面改成了基于 libpcap 的网卡抓包。
myl0204
myl0204
May 20, 2025❤️1
155
找到了最初来 V2EX 的感觉,谢谢你 weiwenhao
weiwenhao
weiwenhao
OP
May 20, 2025
156
@pollux 对,我感觉我辜负了这个项目,我犯了很多错误,明明可以做的更好。😭
pepesii
pepesii
May 20, 2025❤️1
157
太棒了
oom
oom
May 20, 2025❤️1
158
这就有点超纲了,star 完事
goldeye0351
goldeye0351
May 20, 2025❤️1
159
火前留名.
坛子里藏龙卧虎呀
liuhan907
liuhan907
May 20, 2025❤️1
160
@weiwenhao
预留接口我实际上是指能自定义调度器算法等逻辑,不过有栈协程这点确实不好搞。但是实际上有些业务确实很需要自定义调度器,比如全局一个 M:N 调度器,然后有 N 个 M:1 调度器,以及重入调度器非重入调度器。但这些感觉不是很容易的在有栈协程上实现,无栈的比较容易。我觉得可以考虑先能够创建多个调度器并挂到上下文里,以及限定调度器的并行度。后续可以提供协程本地变量以及挂在协程上的上下文,避免 go 那个恶心的 ctx 参数到处传
iorilu
iorilu
May 20, 2025❤️1
161
学习下

python 急需改造阿, 为什么没有大佬改进 python 得打包编译等功能, 要是能像
go, rust 等能方便得一键编译就好了
x1aoYao
x1aoYao
May 20, 2025❤️1
162
太牛 X 了。我也喜欢 Go 的协程,管道这些,但是不喜欢 Go 的不统一的泛型语法(自带的 map/slice 将泛型写在[]外),以及没有空安全,接口没法分开值类型方法/指针方法等等。先 Start 了关注
Biebe
Biebe
May 20, 2025❤️1
163
太强了
Hooooooey
Hooooooey
May 20, 2025
164
@encro 上次 meetup ,我听张老师表示很快语言稳定,要进入 beta 了,我甚至觉得是超快的速度了
Hooooooey
Hooooooey
May 20, 2025❤️1
165
@weiwenhao 现在是 AI 云原生的编程语言,我觉得他们可以在大模型时代有一些自己独特的优势
x1aoYao
x1aoYao
May 20, 2025
166
简单看了下,为什么方法参数里又要类型前置呢,感觉有点点不统一?
看接口好像不是 go 的鸭子类型了,但好像依旧不能在接口指定是值方法还是引用方法,不过作者要想是能编译到可读的 go ,这种确实就没法有太大区别了,感觉略微有些些遗憾,如果是反过来能够使用 go 的包就好了
JohnSmith
JohnSmith
May 20, 2025 via Android❤️1
167
看到了 zig 的影子
GDAOE
GDAOE
May 20, 2025❤️1
168
加油,支持
weiwenhao
weiwenhao
OP
May 20, 2025
169
@x1aoYao 统一类型前置的,即使返回值放在了参数的后面,依旧是类型前置。 你应该也发现了和 golang 语法的对应性。

不是简单的编译成可读的 golang, 也会对 golang 源码进行解析,然后有代码提示的调用 golang 的库。本质上就是使用 nature 语法进行 golang 开发,觉得 nature 不好用了,直接换到 golang 就行(但是如果又觉得 golang 不好用了那就换不回 nature 了)
weiwenhao
weiwenhao
OP
May 20, 2025
170
@liuhan907 还有一个地方预留了更多的可能。

`var fut = go delay_sum(1, 1) // eq: future_t<int> fut = @async(delay_sum(1, 1))`

fut 本质就是用于协程之间进行通信和运行时处理的,虽然现在还没有进行很多的支持,但是 fut.term() 这样的功能都是可以实现的,本质还是 ctx, 但是是另外一种实现方式了。
digitv
digitv
May 20, 2025❤️1
171
NB ,如果国内找工作的话可以看看华为吧,国内搞这方面的不多
weiwenhao
weiwenhao
OP
May 20, 2025
172
@dynastysea 我应该还是找后端相关工作,如果找编程语言编译器相关工作会有点撇不清,影响 nature 的发展。
Elemyin
Elemyin
May 20, 2025❤️1
173
看了楼主的帖子,突然觉得有些悲哀,这样的大佬在大环境里也只能卑微打工,可能还不是特别高级的农民工,可叹
PS:可能跟个人追求不同,或许我太理想化了,觉得大佬就应该在为改变世界奋斗着
LightofHeven
LightofHeven
May 20, 2025❤️1
174
errorf 和 match 看着很顺眼,大佬牛逼
weiwenhao
weiwenhao
OP
May 20, 2025
175
@Elemyin 我就是一个理想主义者,我也许可以做的更好,但结果还是辜负了这个还不错的项目。当然也辜负了自己。
encoreee
encoreee
May 20, 2025❤️1
176
支持一下。就是好奇这语言的 logo 为啥设计成千年隼
weiwenhao
weiwenhao
OP
May 20, 2025
177
@black1 你要反过来看头和尾,圆圆的才是头,这是一个星际航行器,参考《三体》里面的自然选择号。
brcefy
brcefy
May 20, 2025❤️1
178
惊为天人,遂 star ✨
Huelse
Huelse
May 20, 2025❤️1
179
支持支持!期待实现 bootstrapping
scyuns
scyuns
May 20, 2025❤️1
180
这异常处理 比 GO 看起来舒服太多了
yzqdm
yzqdm
May 20, 2025❤️1
181
加油,支持
weiwenhao
weiwenhao
OP
May 20, 2025
182
@black1 不对,我设计能力有限,一直画不出来自己想要的曲线效果,所以外形确实参考的千年隼,理念上是自然选择号。
touchfishcc
touchfishcc
May 20, 2025❤️1
183
@Pipecraft #126 用上了
touchfishcc
touchfishcc
May 20, 2025
184
👍
gy0624ww
gy0624ww
May 20, 2025❤️1
185
已 start, 留影纪念
deepseawhale
deepseawhale
May 20, 2025❤️1
186
佩服佩服,用四年时间写一个工程,真的已经打败了 99.9 的社畜们。四年之间会有太多诱惑让你坚持不下来。
合影留念。
toddruan1
toddruan1
May 20, 2025❤️1
187
@weiwenhao
我觉得这个项目至少感动了很多人
让真正喜欢计算机的人看到了过去的理想

我想你确实付出了很多,但是项目也真的很棒

有那么一瞬我甚至都有点想加入了(如果能帮上忙的话
wongy
wongy
May 20, 2025❤️1
188
已经 star
wqsdfdddd
wqsdfdddd
May 20, 2025❤️1
189
太牛,太 hacker 了.!!!!!!
必须 star
KyleRicardo
KyleRicardo
May 20, 2025❤️1
190
太强了,火钳刘明
xiuming
xiuming
May 20, 2025❤️1
191
去七牛云吧
weiwenhao
weiwenhao
OP
May 20, 2025
192
@xiuming 这个确实挺合适的,而且许老板都当 ceo 了还在亲自维护 go+, 我是真的有点想替他了哈哈
Hazard001
Hazard001
May 20, 2025❤️1
193
支持大佬
zttviYang
zttviYang
May 20, 2025❤️1
194
之前在 Laravel 社区看过你分享的文章,印象就很深刻,现在真是越来越厉害了
haha1903
haha1903
May 20, 2025❤️1
195
大神,支持,国人提出的各种编程语言还在被嘲讽的路上,但坚持下去,希望有一天能在世界上有一席之地。
liuhan907
liuhan907
May 20, 2025❤️1
196
@weiwenhao
最终的核心还是在哪个线程上调度执行,也就是协程唤醒后在哪的这个问题。因为这牵扯到线程本地变量、线程特权之类的问题。至于如何通信那是很次要的问题
name1991
name1991
May 20, 2025❤️1
197
佩服毅力
bjfane
bjfane
May 20, 2025❤️1
198
大佬,加油,膜拜,直接撸语言国内的非常少!
FYFX
FYFX
May 20, 2025❤️1
199
强!感觉挺有意思的
刚才看了一下文档,循环和异常处理的 catch 块中都有 break 不过语义不同,试了一下在循环语句里面的 catch 中用 break 跳出循环好像有点问题,似乎限制了 catch 中的 break 必须要带一个值?
weiwenhao
weiwenhao
OP
May 20, 2025
200
@FYFX 是的,catch 中如果使用 break 会优先应用于 catch ,同理还有 match 中也使用了 break 。当然我有考虑 catch 和 match 要不要单独搞一个关键字,什么 default, recuse 等等都考虑过,但是都没有 break 这么答意。 共用 break 带来的问题就是你说的这个问题。
1  2  3  4  
❮ ❯
About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2795 Online   Highest 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 167ms · UTC 14:07 · PVG 22:07 · LAX 06:07 · JFK 09:07
♥ Do have faith in what you're doing.