V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
weiwenhao
1.3D
V2EX  ›  程序员

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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