项目地址: https://github.com/mohanson/pydouz
该语言前端由 Python 书写, 后端采用 LLVM. 因此原生支持 LLVM 的一切生态, 包括编译到 wasm 或 riscv 指令集(编译到 riscv 指令集已经过简单测试).
Example: 斐波那契数列
def fib(n) {
if n 3 < {
n;
} or {
fib(n 1 -) fib(n 2 -) +;
};
}
(这个操作符后置的表达式学名叫 "逆波兰表示法")
目前还是早期开发状态, 但已经有可供运行测试的 Demo.
1
SingeeKing 2019-08-07 14:49:20 +08:00
一直觉得 RPN 很难受。。为什么要叫优化
|
2
luoyou1014 2019-08-07 14:50:33 +08:00
都采用后缀表达式了,不如采用前缀表达式好了,前缀表达式还能将操作符等价为函数,同样能避免优先级问题。
不过不管是后缀还是前缀,应该都不会被大众接受。 |
3
slanternsw 2019-08-07 14:51:39 +08:00 via Android
逆波兰式是给你让人写的??你让人手工画二叉树再遍历一遍给你写?
|
4
zjsxwc 2019-08-07 14:53:58 +08:00
不好阅读
|
5
PALELESS 2019-08-07 14:55:44 +08:00
后缀表达式只是便于计算机解析, 对于人而言相当相当不友好
|
6
missdeer 2019-08-07 14:58:55 +08:00
为啥前缀、后缀表达式混用?
|
7
lumotian 2019-08-07 14:58:56 +08:00
干脆做成 Lisp 算了
|
8
darksword21 2019-08-07 14:59:25 +08:00
说得好,我选择 python
|
9
aijam 2019-08-07 15:11:31 +08:00
@luoyou1014 lisp 情何以堪
|
10
luoyou1014 2019-08-07 15:28:44 +08:00
@aijam lisp 已经够小众了,我指的大众接受,至少要到 lua ruby 这一级别
|
11
kilen3a 2019-08-07 15:36:53 +08:00
逆波兰这是给人写?
|
12
nguoidiqua 2019-08-07 15:54:47 +08:00 via Android
代码是写给人看的,硬要标新立异的话,用前缀表示法感觉也要好些。
|
13
AsceticBear 2019-08-07 16:22:28 +08:00
xixi, haha
|
14
janxin 2019-08-07 16:29:35 +08:00
还是别用 def 了,用 fn 挺好的
|
15
Tomotoes 2019-08-07 16:30:37 +08:00 via Android
没有 return,即没有可读性。
|
16
Aruforce 2019-08-07 16:32:12 +08:00
非要跟习惯两道...
你们数学公式 1 1 + =2 这么写啊? 为不一样而不一样... 不解决问题总想弄个新闻... 混娱乐圈的啊... |
17
gpra8764 2019-08-07 16:41:09 +08:00
看完之后觉得很棒,所以我选择 Python
|
18
Mistwave 2019-08-07 16:44:25 +08:00
代码是给人读的,顺便给机器运行。
demo 看起来不伦不类,比如这个 if-or,比起常见的 if-else,除了少敲两个字符,有什么实际的意义吗? |
19
inhzus 2019-08-07 16:46:08 +08:00 via Android
都已经用后缀表达式了,不如彻底消灭括号,所以语法应该是(滑稽):
n 1 - fib n 2 - fib + |
20
Mohanson OP 统一回复下:保持对世界的好奇心和宽容心。感觉上升到语法战争了…… 不同的人对 美 的认知是不一样的,在我看来因为后缀表示法天生贴合栈结构,因此我认为后缀利于计算机理解,是美的。
不用中缀的语言有很多,比如 Lisp。世上除了恰饭语言外还有很多有意思的语言,比如 brainfuxk。 |
22
keith1126 2019-08-07 18:05:38 +08:00
|
23
Mohanson OP @keith1126 你可以在许多 c 库中见到作者手写 asm 代码,即使是 go 这种高级语言,标准库中也大量手写汇编,比如 go 标准库的加密库,早期有许多汇编, 比如 rc4 算法是纯汇编实现的,今年才大部分用 go 原生代码进行了替换。汇编直接操作的 cpu 寄存器,这可太不考虑使用者的感受了。我之前写的开源项目,用的测试用例就是零几年一位开发者写的纯汇编,熟悉后读起来并不比高级语言差。机器码和高级语言并不是有你没我的状态,他们都将长期共存,希望你能理解这一点。我说计算机容易理解所以美的意思并不是“机器容易理解牛逼,所以高级语言就不牛逼”的意思,它们不存在因果性。
中缀表示法是上世纪波兰数学家提出的,而 Lisp 语言的成功已经证明小部分计算机工程师可以接受非中缀表示法。 你所说的交给编译器解决是对的,有些语言会做前置的预编译?可能是这个名词,就是用户用中缀写,但是预编译阶段会将中缀替换为前缀或后缀再交给真正的编译器,有点类似编译器在真正编译前会自动给每行加分号一样。 |
24
alcarl 2019-08-08 00:31:06 +08:00 via Android 1
@Mohanson 机器方便的还是交给机器,人方便的交给人。汇编好不好不重要,重要的是它不适用于绝大多数人。手撸一个编程语言应该也是一样。当然自己写着玩的无所谓了,美的标准不好讨论一千个人有一千个样子
|
25
fluorinedog 2019-08-08 05:33:54 +08:00 via Android
tokenizer 和 parser 是编译器的基本操作,这一块都要迁就机器只能说明太菜。
还拿 lisp 举例,当年是什么 CPU,多大内存? 低层次级别优化,都是先考虑 intrinsic,不行再上 llvm ir,手写汇编维护性是最差的,手动分配的寄存器也不见得比图染色算法搞得好。 |
26
cstj0505 2019-08-08 09:22:17 +08:00
@fluorinedog lz 加油,先不用考虑使用者感受。这里没几个人手写过编译器,大部分人都是拿自己用的熟的语言和你的对比。很多事情不是一次就能成功的,但是你只要做了,至少在编译器这块,你就进了这个门槛。至于好与不好,别人用不用,别人怎么说,那是后话了。
|
28
wslzy007 2019-08-08 10:24:58 +08:00
开源过一个类 c 的脚本引擎,供参考: https://github.com/lazy-luo/lazyExcel
|