我写了一个编程语言,受 golang 启发
大家好,我是 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: github.com/nature-lang/nature
官网: nature-lang.org/ 首页包含一些语法特性示例,可以直接在 playground 尝试
语法文档: nature-lang.org/docs/syntax
playground: nature-lang.org/playground 在线尝试
贡献指南(点击右上角切换到中文)
nature-lang.org/docs/contribute 我在文档中详细介绍了 nature 编程语言是如何实现的。
nature 和 golang 一样,有着一个自研的编译器后端, 但 nature 的源码结构和实现非常的简洁。
这让参与 nature 编程语言的贡献变得容易且有趣, 不再只是编译器前端 + llvm ,你可以参与 SSA, SIMD, 寄存器分配,汇编器,链接器等等有趣的工作来验证你的学习成果和想法。你可以通过 issue 表达你的想法,我会指导你参与贡献。
这是我用 nature 实现的一些小项目, 我很喜欢使用 nature 编写代码的感觉。
github.com/weiwenhao/parker 轻量打包工具
github.com/weiwenhao/llama.n Llama2 推理模型 nature 编程语言实现
github.com/weiwenhao/tetris 绑定 raylib 实现的俄罗斯方块
github.com/weiwenhao/playground nature 官网的 playground server api 实现
最后,我正在寻找工作,如果你觉得这个项目还不错,希望能给我一个 star ,这对我有很大的帮助 🙏
只能说声加油!
这异常处理看着舒服多了
非常 cool 非常 hacker
研究的越深就越容易走火入魔。性能才是核心!
真滴大佬,太酷了~
加油
我谨记
牛逼,加油
能有实际行动去做的话,非常的 hifi ,老兄加油。
粗浅问一下,编译是原生编译,还是在其他语言上实现的寄生语言。比如 rust
NB 支持
我艹,坛子里真是卧虎藏龙啊,还有这种大神,膜拜
6
import co ; 这个 co 希望能改下
编译是原生编译,不转换为 llvm 或者 c 语言,直接编译成汇编逻辑,然后通过汇编器生成可链接器文件(object), 再通过链接器连接成目标机器的可执行文件。
牛逼啊 这片大陆还能长出这种嫩芽
这异常处理有点像 Java (我只写过 java python go )
之前是 import coroutine , 我通常的写法是 import coroutine as co, 但因为 coroutine 使用太过频繁所以我直接改成了 co 。这个名字我纠结了很久,考虑过 coro(lua 就是这样),考虑过 coroutines, coroutine,cor 等等。 你的意见是啥,我会考虑进来的
就是类似 java 的传统异常处理,但是融入了基于 golang 和 rust 的值的错误处理思想。官网示例部分我没有展示完全,实际上也可以使用 try {} catch e {} 这种模式进行多行代码的错误捕捉。
建议直接进军信创业务
牛逼,加油
虽然我不是很想打击 op ,但是仔细看了一下发现二进制后端竟是手撸的 amd64 仅支持 linux osx ,真的不考虑投奔 llvm 吗……
光是文档质量就能看出来 op 是个大佬
问下写这个要看哪些书和资料?我目前把 craftinginterpreters 看完并且用自己熟悉的语言做了个类似的,但是感觉还差得挺远
不依赖 llvm 的话,其他的都好说,优化器怎么办。
arm64 也支持的,毕竟 osx 现在都是 arm64 了,我本地调试也是用 macmini m4 了。
投靠 llvm 的话就失去了简洁高效的编译器后端实现,llvm 太过的繁重,并且无法很好的支持交叉编译。
因为我一开始的设计目标是和 golang 一样方便的交叉编译和高效的编译速度,所以和 golang 一样,自研了编译器后端。
我很好奇被 Go 语法简单的吸引的用户,其他语言的高级特性不用也没什么影响。而 Go 这样衍生语言很多什么 go+,walang 还有这个 nature ,最终也是将其他特性丰富的语言的碎片组合,除了使生态分裂,感觉也没什么好处。
大佬发 hacker news 了吗
很棒,加油
写编程语言的复杂度可想而知,op 是怎么坚持下来的。
论编程语言的简洁与优雅,我感觉 python 相当不错了
虽然看不懂,但这种大牛,github 上还是要 star 一下表示支持~
今晚或者明晚发。
加油,但是编程语言没个 5-10 年成不了气候,还要有自己的杀手锏应用。比如 go 有 docker, k8s 。rust 有 Wasm ,Firecracker 等。
NB ,加油!
其实这里有一个很大的区别
vlang/go+/walang 和语法上都和 golang 很像或者是基于 golang 的语法进行了优化, 其他的和 golang 已经没有太大的关系了。
nature 语法上和 golang 不像,但是其他的都和 golang 基本保持一致(runtime ,协程,channel, GMP, GC ,mutex, 编译部署等等)。
生态分裂上面不可否认,但即使没有 go+,vlang,walang 。rust/zig/swfit/vlang 等系统编程语言也在瓜分 golang 的用户。
优秀
很有想法,但是信创对编程语言的支持不是很好,主要以数据库,操作系统等运行终端工具为主,编程语言属于开发工具。
强力支持大牛
牛逼,STAR 双击了
牛的牛的 加油~
在性能和编译速度之间进行一个平衡,只进行主要优化。
打开后发现,已经在当年 star 过了
支持一下,希望能发展的更好。
虽然看不懂+1 。个人感觉,你这种水平的大牛,带着这样一份早期可用版本的编程语言加入一家信创公司,会有人帮你把这个牛吹起来的。
感觉可以尝试下加入原生 AI 编程语言特性
主要是兴趣,另外我总是鼓励自己 “我可以做好”,算是给自己洗脑了。
牛的牛的
加油
我觉得那些语法上的优化都是小问题,
golang 的核心问题是不能把性能提升到和 C++/Rust 一个数量级
这使得很多底层/核心组件要考虑高性能的,一开始就不会选 Golang
不过能自己写编程语言 大佬还是很厉害
没有 AI 编程语言吧,我倒是一直在思考 AI 时代的编程语言是什么样子的,我最终的想法大概是
- 测试变得无比重要
- ai 编写代码后应该由开发者 review ,所以可读性很重要
传统的以文件为载体的编程结构可能不适合 ai 进行开发(具体的想法我就先不透漏了)
太有毅力了我只能说
我以前也造过 lisp 风格的脚本语言,但发现这只是开始,后需要配套解释器,lsp ,标准库,甚至语法高亮都得考虑进来,自己一个人做这些实在痛苦的没边。
坚持了几个月都放弃了。
但上天从不会让你经历没有用的事情。我这个小玩具最终让我得到了下一份工作。因为 boss 找到了应用场景,编译为字节码后用于某游戏的风控,动态下发检测。由于语法和生态都是没公开的,所以还是有一定价值。
我也坚信 op 做这些并非毫无意义,灿烂的花朵终会因你此前的灌溉开放,星光也从不会辜负埋头赶路的人。看完文档提一点疑问:
如下是变量的定义方式:
int foo = 1 // v
float bar = 2.2 // v
string car = 'hello world'
如下是函数的定义方式:
fn function_name(parameter_list):return_type {
// 函数体
}
请问这两种为什么不统一呢?要么都类型后置,要么都类型前置,这样是不是一致性更好呢
golang 只是选择了 rust 不同的道路,所以有着不同的应用方向。但是选择 golang 的人确实会被上述问题影响到,但也知道无奈写下去。
支持一下,顺便问一下现在的稳定性怎么样呢?
如果你写过 golang, 其实 golang 的返回值可以声明变量载体,大概是像这样func sum(a int, b int):(total int) {}
我想表达的就是,其实依旧是类型前置,只是函数的返回值的类型放在了参数的后面,函数 body 的前面。
语法本身会大幅度影响最终性能,不可不仔细考虑。不过只要还关注编译速度等指标,那终究不能和完全不关心编译性能的一众语言比较最终性能的。
谢谢你的鼓励 🥹
现在是 AI 时代了,都有 vibe coding 了,可能以后的语言想火也难了, 不如做 AI native 的编程语言,对大模型友好,结合函数式编程 lisp+逻辑编程 prolog 的语言
这里给几个参考
"中文提示词之神" 李继刚的 lisp 提示词写法
zhuanlan.zhihu.com/p/4903964046
将自然语言提示无缝嵌入到 Python 程序中,保持提示的可读性,同时继承宿主编程语言的模块化、可重用性、动态性和生态系统。
支持大模型生态的协议 MCP, A2A
对提示词做到编程增强
prompt-declaration-language
github.com/IBM/prompt-declaration-language
github.com/appl-team/appl
这是我的中肯建议。
强👍
#33 大语言模型已经在力大飞砖了,编程语言生态还在分裂。我觉得一门编程语言生态非常重要。很多人说编程语言只是工具,但是我真不想用不同的工具造相同/相似的轮子了。
没有经过中大型项目验证,还有较多的 bug 。
作为早期的编程语言,目前适合以下类型的开发人员
- 技术探索者 —— 愿意尝试新事物,并能够承受早期版本存在的各种 bug 、有兴趣参与语言设计和改进的讨论
- 语言开发者和研究者—— 对编程语言设计和实现感兴趣的开发者、学习编译原理、学习如何实现一门编程语言
- 反馈贡献者 —— 愿意提供使用反馈的开发者、能够提交 bug 报告和改进建议、有兴趣参与项目建设及标准库完善
不适用于以下类型的开发人员
- 需要在生产环境使用的企业用户
- 对稳定性要求较高的项目开发者
- 想要寻找一份编程相关工作的初学者
需要大量第三方库支持的开发者
强,我一直关注 moonbit 。但是发现发展很慢。
#53 这样设计是为了多返回值考虑吗?因为一般来说写法都是统一的,也符合直觉。
你看你方法里面的变量是类型前置:fn sum(int a, int b) 但是返回值成了后置。
不过这个语言的整体风格我很喜欢,我是主写 java 和 go 的,看到你这个异常处理,我真是太感动了我对 n8n 类似的低代码流程编排很感兴趣,我有关于 vibe coding 的 idea ,后续会逐步完善。但可能独立于 nature 项目。
STAR 双击了
别闹,star 双击那是等于没 star 呀
无论是 ai 写还是人写,代码都只是载体,总归是要写。只要你开始一个项目,总是要选择一种合适或者自己熟悉的编程语言,进行代码编写,不存在造轮子的说法。
牛逼,刚好有我喜欢的 3 门语言 C# / kt / go 的不同优点,从没见过这么心动的语言
厉害了,op 加油
我也很关注 moonbit ,感觉 moonbit 有点骑虎难下的感觉,在 AI 时代正在发展中的语言可能难以有很好的突破。moonbit 一开始是基于 wasm 的语言,后续增加了 c 后端等宣传是通用编程语言和工具链。
虽然现在是大模型的时代,但我觉得 moonbit 还是应该将核心放在 wasm 生态,并进行推动与发展,张老师肯定也有这个实力。wasm 可能是比 ai 更早实现编程语言环境统一的工具。
可以关注关注提示词增强的编程语言, 面向提示词的编程语言,未来肯定是提示词+编程混合语言的天下
n8n 不算多先进,多看看 deep research agent, 我也在搞专门的 k8s deep research agent,
openai 发布的 codex 又一次加速了 AI 编程
如果说 Cursor 是需要我们结对编程才能干活的实习生,那么 Codex 就是外包员工,任务甩过去就不用管了,完成后验收一下,不合格就让它重做一遍,直到满意为止, 现在 codex 还没完善。
#65 哈哈同感,无论是异常处理,还是协程,结构体默认值,都感觉很舒适。恨不得马上流行起来,太适合写业务了
真这厉害啊。
唯一有一个我觉得不太明确的地方
int n = 3
match n {
1 | 2 -> ...
3 -> ..
_ -> ...
}
这里的 1 | 2 是否容易造成歧义?第一眼我会纠结一下是 1 | 2 = 3 还是逻辑表达 1 or 2 。这里是不是用 or / and 这样的关键字和位运算符 | 区分一下更好呢
一开始的考虑是完全和 c 一样 int sum(int a, int b), 但是这样在编写匿名函数时可读性很差。call(int sum(int a, int b)) 类似这样难以读,所以添加了 fn 引导函数。此时面临的选择就是 fn int sum(int a, int b), 一个叫 c3lang 的编程语言的选择就是这样。而我最终的选择就是将返回类型放在后面。
这文档看着是真的舒服, 只能佩服大佬
我最喜欢的是 rust 的 cargo ,一只在幻想有一天 Golang 也有 cargo ,但是迟迟没有动手自己搞一个。看了一下,你的基础太扎实了,nature 的编译器后端还是自己做的。
op 这样的是我心中的程序员
不支持 win 谈游戏开发还是有点遥远 233
嗯,我会考虑。实现上我进行了优先匹配,| 会被识别成分隔符,如果需要逻辑或需要 (1|2) 这样写。
我来 V2EX 就是为了看这样的大佬的……真的牛
哈哈,其实支持 win 只有一步之遥,我在等一个交叉链接器,能够在 macos 上直接连接成 windows 程序。自己写还是有些困难和繁琐。目前只找到 zig ld 实现了,可惜没有独立过来,但恰好我使用了 c 语言实现源码,我在考虑要不要拥抱 zig 生态。
几年前在 V 站发的时候就 star 了,当时觉得 OP 很有想法,也非常强, 好长时间没看到了,今天又看到了,OP 原来一直在坚持,牛批
现在的轮子都开始卷到语言层面了吗
挺好,新语言好像类型后置比较多,个人也比较喜欢类型后置。
看着像是受 rust 启发吧😅
老哥之前是干啥工作的,这功底可以
我的天啊,真是太酷了!!!
既有 go 的协程,又没有 go 恶心的错误处理,又是原生编译,而且还有联合类型/nullable ,尖括号泛型,模式匹配
太厉害了!
#72 我刚刚第一时间也想到了这个,类型前置的话写匿名函数和多返回值时确实不好看。这门语言确实非常棒,有我喜欢的所有特性,考虑支持 win 吗
建议加入仓颉团队。
一个协程实现+抢占式调度直接把我干懵逼了,耗费了我差不多半年时间也无法妥善处理, 有点难以继续的感觉。然后其他事情也比较多导致开发上一直断断续续,所以在这期间只是默默开发,没有发过任何版本和推广,打算直接写到可用版本,一眨眼就过了两年。
我也很感觉 V2EX 的用户们,给了我很多的支持和帮助
混迹 v 站多年, 终于见到牛批的人了
主要是兴趣,我们都是 hacker
支持下,加油!
和 rust 关系基本不大,我也不太熟悉 rust 编程语言。仅仅是类型声明上参考了 rust 实现。
推荐 “Writing a C Compiler“ 这本书( 24 年出版)。编译器前后端整个实现流程,无任何三方库依赖,手把手带你走一遍,复杂的东西都拆解为很简单的概念给你讲解。章节设计,语言表达都很棒。没有学过编译原理看他也是很轻松,可以看完这本书合作和看的同时补一下。要是有编译原理基础的,基本上就是把理论直接落地实现,把那些离散/抽象的点,联系并应用起来,经脉都畅通了。
有能坚持的事情真的是太美好了,关键是 OP 还能坚持下来,厉害 👍
之前做 CDN 和边缘计算。编程语言主要是兴趣推动和工作关系不大。
千万不要和什么原生 AI 提示词编程语言挂钩,这一块还不明朗,大部分人只能看到眼前的这部分,当前的 LLM 已经是强弩之末了。不是捧一踩一,你比另外一个喷天喷地的 wangying 牛逼。江湖最高礼仪,star 奉上。
只能说 op 太强了,好奇 op 年龄多大,是否结婚,是否有孩子了?
我只是感叹,人们一直说国内的开源氛围并不好,企业 996 ,下班回家还有家庭,有孩子,还要挤出时间来做开源,一做就是 2 年。
好奇 op 是如何平衡工作、家庭、开源之间的关系的。
我是个俗人,如果说我有 op 这样的技术能力,可能还是想用自己的本事多赚些钱,哈哈,采访一下 op 关于这些点是如何权衡的。
主要是这些资料,我也看了 crafting interpreters ,还不错。
- sicp (有 python 和 js 版本),推荐和视频一起观看。
- 编译器设计(第二版),部分章节,推荐看英文版,中文版实在是看不懂。
- 现代编译原理 —— C 语言描述,部分章节,主要是 ssa 部分。
- crafting interpreters 非常推荐
- 自己动手构造编译系统 —— 编译、汇编、与连接,主要看了汇编部分
- Linear Scan Register Allocation for the Java HotSpotTM Client Compiler ,线性扫描寄存器分配基于该论文编写
- Linear Scan Register Allocation on SSA Form ,ssa 形式线性扫描寄存器分配
- Writing a Memory Allocator 内存分配与垃圾回收课程
- golang/tcmalloc ,内存分配和垃圾回收实现上参考,不过我源码阅读能力有限,所以看的都是文章解析。
- bspaans/jit-compiler 汇编器部分参考实现,具体指令编码参考 intel 手册第二卷
- 程序员的自我修养——链接装载与库,学习连接器与 ELF 文件构成
Tiny C Compiler 连接器部分参考实现
不要自己写,找几个伙伴一起写。最好直接入 llvm 快速验证想法,最好规划好开发周期,不要投入过度的时间。不要用 C 语言实现。推广是一个持续的过程,要不时和用户进行分享。
背景 在一个不小的大厂里面拧螺丝,发现很多部门都在重复造轮子。没有引入好用的开源组件,自己造的轮子也没有复用,公司内部相同的轮子都有好几种。编译体系简陋,加个文件也要改编译脚本…
以前这个软件是不温不火。随着 Gemini2.0 的推出,显示了其强大的能力,几乎要超越 ChatGPT 。所以它又被很多程序员提起。 idx.dev/#introducti…
长江存储这么便宜 心动想搞个全闪存 nas 有推荐的型号吗 不需要 gpu 解码功能 当个纯 nas 就好 如果有云同步到 azure blob/aws s3 功能就更好了 …