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

最近正在设计并实现一门编程语言(续)

  •  
  •   Mohanson · 2019-08-07 14:44:19 +08:00 · 3833 次点击
    这是一个创建于 1972 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址: 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.


    前情提要: https://www.v2ex.com/t/589166

    28 条回复    2019-08-08 10:24:58 +08:00
    SingeeKing
        1
    SingeeKing  
       2019-08-07 14:49:20 +08:00
    一直觉得 RPN 很难受。。为什么要叫优化
    luoyou1014
        2
    luoyou1014  
       2019-08-07 14:50:33 +08:00
    都采用后缀表达式了,不如采用前缀表达式好了,前缀表达式还能将操作符等价为函数,同样能避免优先级问题。

    不过不管是后缀还是前缀,应该都不会被大众接受。
    slanternsw
        3
    slanternsw  
       2019-08-07 14:51:39 +08:00 via Android
    逆波兰式是给你让人写的??你让人手工画二叉树再遍历一遍给你写?
    zjsxwc
        4
    zjsxwc  
       2019-08-07 14:53:58 +08:00
    不好阅读
    PALELESS
        5
    PALELESS  
       2019-08-07 14:55:44 +08:00
    后缀表达式只是便于计算机解析, 对于人而言相当相当不友好
    missdeer
        6
    missdeer  
       2019-08-07 14:58:55 +08:00
    为啥前缀、后缀表达式混用?
    lumotian
        7
    lumotian  
       2019-08-07 14:58:56 +08:00
    干脆做成 Lisp 算了
    darksword21
        8
    darksword21  
       2019-08-07 14:59:25 +08:00
    说得好,我选择 python
    aijam
        9
    aijam  
       2019-08-07 15:11:31 +08:00
    @luoyou1014 lisp 情何以堪
    luoyou1014
        10
    luoyou1014  
       2019-08-07 15:28:44 +08:00
    @aijam lisp 已经够小众了,我指的大众接受,至少要到 lua ruby 这一级别
    kilen3a
        11
    kilen3a  
       2019-08-07 15:36:53 +08:00
    逆波兰这是给人写?
    nguoidiqua
        12
    nguoidiqua  
       2019-08-07 15:54:47 +08:00 via Android
    代码是写给人看的,硬要标新立异的话,用前缀表示法感觉也要好些。
    AsceticBear
        13
    AsceticBear  
       2019-08-07 16:22:28 +08:00
    xixi, haha
    janxin
        14
    janxin  
       2019-08-07 16:29:35 +08:00
    还是别用 def 了,用 fn 挺好的
    Tomotoes
        15
    Tomotoes  
       2019-08-07 16:30:37 +08:00 via Android
    没有 return,即没有可读性。
    Aruforce
        16
    Aruforce  
       2019-08-07 16:32:12 +08:00
    非要跟习惯两道...
    你们数学公式 1 1 + =2 这么写啊?
    为不一样而不一样...
    不解决问题总想弄个新闻...
    混娱乐圈的啊...
    gpra8764
        17
    gpra8764  
       2019-08-07 16:41:09 +08:00
    看完之后觉得很棒,所以我选择 Python
    Mistwave
        18
    Mistwave  
       2019-08-07 16:44:25 +08:00
    代码是给人读的,顺便给机器运行。
    demo 看起来不伦不类,比如这个 if-or,比起常见的 if-else,除了少敲两个字符,有什么实际的意义吗?
    inhzus
        19
    inhzus  
       2019-08-07 16:46:08 +08:00 via Android
    都已经用后缀表达式了,不如彻底消灭括号,所以语法应该是(滑稽):
    n 1 - fib n 2 - fib +
    Mohanson
        20
    Mohanson  
    OP
       2019-08-07 17:01:33 +08:00 via Android
    统一回复下:保持对世界的好奇心和宽容心。感觉上升到语法战争了…… 不同的人对 美 的认知是不一样的,在我看来因为后缀表示法天生贴合栈结构,因此我认为后缀利于计算机理解,是美的。

    不用中缀的语言有很多,比如 Lisp。世上除了恰饭语言外还有很多有意思的语言,比如 brainfuxk。
    Sornets
        21
    Sornets  
       2019-08-07 17:22:13 +08:00
    @Mohanson 明年你再来看看你说的这些话,看看会不会感到尴尬
    keith1126
        22
    keith1126  
       2019-08-07 18:05:38 +08:00
    @Mohanson #20

    "利于计算机理解,是美的",照你这么说,机器语言最美?

    程序语言是给人用的,所以应该优先考虑使用者的感受,至于怎么让计算机执行起来方便,这应该交给你的编译器。
    Mohanson
        23
    Mohanson  
    OP
       2019-08-07 23:01:13 +08:00 via Android
    @keith1126 你可以在许多 c 库中见到作者手写 asm 代码,即使是 go 这种高级语言,标准库中也大量手写汇编,比如 go 标准库的加密库,早期有许多汇编, 比如 rc4 算法是纯汇编实现的,今年才大部分用 go 原生代码进行了替换。汇编直接操作的 cpu 寄存器,这可太不考虑使用者的感受了。我之前写的开源项目,用的测试用例就是零几年一位开发者写的纯汇编,熟悉后读起来并不比高级语言差。机器码和高级语言并不是有你没我的状态,他们都将长期共存,希望你能理解这一点。我说计算机容易理解所以美的意思并不是“机器容易理解牛逼,所以高级语言就不牛逼”的意思,它们不存在因果性。

    中缀表示法是上世纪波兰数学家提出的,而 Lisp 语言的成功已经证明小部分计算机工程师可以接受非中缀表示法。

    你所说的交给编译器解决是对的,有些语言会做前置的预编译?可能是这个名词,就是用户用中缀写,但是预编译阶段会将中缀替换为前缀或后缀再交给真正的编译器,有点类似编译器在真正编译前会自动给每行加分号一样。
    alcarl
        24
    alcarl  
       2019-08-08 00:31:06 +08:00 via Android   ❤️ 1
    @Mohanson 机器方便的还是交给机器,人方便的交给人。汇编好不好不重要,重要的是它不适用于绝大多数人。手撸一个编程语言应该也是一样。当然自己写着玩的无所谓了,美的标准不好讨论一千个人有一千个样子
    fluorinedog
        25
    fluorinedog  
       2019-08-08 05:33:54 +08:00 via Android
    tokenizer 和 parser 是编译器的基本操作,这一块都要迁就机器只能说明太菜。
    还拿 lisp 举例,当年是什么 CPU,多大内存?
    低层次级别优化,都是先考虑 intrinsic,不行再上 llvm ir,手写汇编维护性是最差的,手动分配的寄存器也不见得比图染色算法搞得好。
    cstj0505
        26
    cstj0505  
       2019-08-08 09:22:17 +08:00
    @fluorinedog lz 加油,先不用考虑使用者感受。这里没几个人手写过编译器,大部分人都是拿自己用的熟的语言和你的对比。很多事情不是一次就能成功的,但是你只要做了,至少在编译器这块,你就进了这个门槛。至于好与不好,别人用不用,别人怎么说,那是后话了。
    Mohanson
        27
    Mohanson  
    OP
       2019-08-08 09:35:16 +08:00 via Android
    @cstj0505 谢谢你的鼓励!!
    wslzy007
        28
    wslzy007  
       2019-08-08 10:24:58 +08:00
    开源过一个类 c 的脚本引擎,供参考: https://github.com/lazy-luo/lazyExcel
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1444 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 17:06 · PVG 01:06 · LAX 09:06 · JFK 12:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.