V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
weiwenhao
V2EX  ›  程序员

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

  weiwenhao ·
weiwenhao · 18 天前 · 20925 次点击

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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