V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
daqing
V2EX  ›  分享创造

我在设计开发的编程语言, Hello, World 跑通了

  •  
  •   daqing ·
    daqing · 38 天前 · 7661 次点击
    这是一个创建于 38 天前的主题,其中的信息可能已经有所发展或是发生改变。

    语言暂时取名叫:Emo 。

    目前实现了函数和类的调用。

    看图说话:

    pAgSuVg.png

    89 条回复    2024-11-15 01:05:33 +08:00
    pdxjun
        1
    pdxjun  
       38 天前
    图裂了
    4332weizi
        2
    4332weizi  
       38 天前   ❤️ 1
    头一次见这种 new😂
    daqing
        3
    daqing  
    OP
       38 天前
    @pdxjun 要翻墙吧
    chashao
        4
    chashao  
       38 天前
    new 是一个库函数调用么?
    daqing
        5
    daqing  
    OP
       38 天前
    再贴一个例子:

    menglizhi2333
        6
    menglizhi2333  
       38 天前
    这个语言设计目的是什么?
    daqing
        7
    daqing  
    OP
       38 天前
    @chashao 是关键字,语言层面的机制,用来创建和初始化对象。
    daqing
        8
    daqing  
    OP
       38 天前
    @menglizhi2333 目的是希望能更加清晰的表达思想
    bzj
        9
    bzj  
       38 天前   ❤️ 1
    语法像 go ,但是面向对象简直就是画蛇添足
    sankooc
        10
    sankooc  
       38 天前
    编译成目标代码么 还是需要运行时啊
    Ocyss
        11
    Ocyss  
       38 天前
    类型首字母大写有什么好处, 小写能作为变量么?
    fsq
        12
    fsq  
       38 天前   ❤️ 1
    不懂设计开发语言底层逻辑,纯好奇,为什么新语言就要定义一种和其他语言都不一样的语法(比如这个 new ),为了表明是不一样的语言?
    dandycheung
        13
    dandycheung  
       38 天前 via Android
    这个 new 设计的挺好的。想当年从 C 语言拓展到 C++ 的时候,一开始接触到 new 的用法非常不自在,感觉明明是一个执行动作的函数,为什么不用小括号,毕竟连 if 后面都有嘛,😀
    InDom
        14
    InDom  
       38 天前
    看着像 GoScript 。
    wunonglin
        15
    wunonglin  
       38 天前
    go 和 js 的杂交版
    finab
        16
    finab  
       38 天前
    不如改成 new HelloName(name: name) ,多个参数 new HelloName(name: name, name2: name2)
    Felldeadbird
        17
    Felldeadbird  
       38 天前
    底层用什么写。
    thinkwei2012
        18
    thinkwei2012  
       38 天前
    @finab 有同感

    支持楼主,期待开源
    Leviathann
        19
    Leviathann  
       38 天前
    出现了关键字 func
    goboy:像 go
    daqing
        20
    daqing  
    OP
       38 天前
    @sankooc 目前是解释型语言,没有编译。
    daqing
        21
    daqing  
    OP
       38 天前
    @Ocyss 类型的首字母,都是大写,用于区分变量和类型
    ztty
        22
    ztty  
       38 天前
    我的理解设计新的编程语言所需要做的就只是写个新的编译器,不知道我的理解对不对
    daqing
        23
    daqing  
    OP
       38 天前
    @fsq 对呀,如果语法都一样,干嘛还要弄一个新语言呢?一定要有不同的东西吧。
    daqing
        24
    daqing  
    OP
       38 天前
    @dandycheung 是的,Emo 的设计目标之一,是尽可能的符合常识。
    daqing
        25
    daqing  
    OP
       38 天前
    @InDom 哈哈,有点那个感觉
    ztty
        26
    ztty  
       38 天前
    不知道楼主实现了编译器的哪些部分
    @ztty
    daqing
        27
    daqing  
    OP
       38 天前
    @wunonglin 就因为有 const 吗?我可不想和 js 产生什么关系
    daqing
        28
    daqing  
    OP
       38 天前   ❤️ 1
    @Felldeadbird 目前是用 Go 实现的
    daqing
        29
    daqing  
    OP
       38 天前
    @ztty #22 准确的讲,是实现一个解释器,就可以。
    PTLin
        30
    PTLin  
       38 天前
    你这风格融合了不少语言呀,rust dart 什么的
    daqing
        31
    daqing  
    OP
       38 天前
    @ztty #26 我从 token 解析,到语法解析,到构建 AST ,到执行代码,都实现了。
    daqing
        32
    daqing  
    OP
       38 天前
    @PTLin 是的,主要参考了 3 个语言:Go, Ruby, Swift
    wunonglin
        33
    wunonglin  
       38 天前
    @daqing #27

    还有 ```name: String``` ts 里的就是这样,go 的是 ``` func hello (name string)

    而且你函数还没设计返回类型呢,默认难道是 void ?
    MrLiu04
        34
    MrLiu04  
       38 天前   ❤️ 1
    很好,我想用你这款语言来编写一个外卦 APP ,就是监听微信抢红包,定时打开钉钉打卡,还能自动帮我薅羊毛,可以吗?
    shintendo
        35
    shintendo  
       38 天前
    @ztty 错误的,设计新的编程语言只需要写一份规范😁
    CEBBCAT
        36
    CEBBCAT  
       38 天前   ❤️ 1
    老实交代,是不是看了那本《用 Go 语言自制解释器》
    Donahue
        37
    Donahue  
       38 天前
    大学生 编译原理课程设计水平?
    rxswift
        38
    rxswift  
       38 天前
    6 啊
    yolee599
        39
    yolee599  
       38 天前
    前面有 var name ,后面有 const runner ,有点看不懂。
    这个 new 的语法属实有点抽象,比较啰嗦,以及难看懂,看样子是可以传任意多参数?只要在类里面加一个变量就可以再加一个构造参数?
    ztty
        40
    ztty  
       38 天前
    @daqing #31 可以的,厉害
    asdhak
        41
    asdhak  
       38 天前
    @fsq #12 语言已换壳为本
    jsq2627
        42
    jsq2627  
       38 天前   ❤️ 4
    > V2EX 第 51 号会员

    哇 真大佬
    2024
        43
    2024  
       38 天前
    可以开源出来吗,代码学习学习
    Pantheoon
        44
    Pantheoon  
       38 天前
    文件后缀为啥是 emo?是因为写这个语言的这段时间情绪状态不高吗
    OnlyO
        45
    OnlyO  
       38 天前
    厉害, 支持, 虽然我看着感觉像是 Kotlin
    fcten
        46
    fcten  
       38 天前
    objective-go
    Nzelites
        47
    Nzelites  
       38 天前
    虽然一下没理解设计思路 但是看起来挺有趣的
    iamzuoxinyu
        48
    iamzuoxinyu  
       38 天前
    提一点:如果你的类型不作为运行时的一种数据(类似 lua/js 那种 prototype oriented 模式),new 作为关键字,最好不要用函数调用的语法, 否则 new() 的第一个参数传入类型名字其实也挺奇怪的(除非)。
    Ghostisbored
        49
    Ghostisbored  
       38 天前
    都已经卷到这个程度了么
    mayli
        50
    mayli  
       38 天前
    @daqing 恭喜你,搞定了本科阶段的编译原理大作业。
    byp
        51
    byp  
       38 天前
    啥时候自举啊
    yangliudi123
        52
    yangliudi123  
       38 天前 via iPhone
    编译器不是必须的,解释器也行。
    caola
        53
    caola  
       38 天前
    6 啊,我也有过自己写一套语言。
    我的想法是开发一个全部只有 字符串(string) 一种类型的语言,这样就不用去处理各种类型上的烦事,考虑到内存分配问题可以提前手动指定是属于 tinytext 、text 、mediumtext 、longtext ,默认是自动变长的。随着以后的计机算性能越来越好,这种单一类型的语言性能不会很差,重要的是开发效率上去了。
    与 PHP 不同的是 这个语言是面向底层级的语言,与 rust 一样要属于内存安全型。

    好了,我的想象已经完了,但我肯定不会去开发的,除非财务自由了再考虑付出行动研究。
    newtype0092
        54
    newtype0092  
       38 天前
    想起来以前做游戏的时候,用 lua 这种没有 class 的脚本语言需要模拟 class 的时候就会定义一个类似这样的 new 方法来初始化。

    这里 new 的第二个参数是个 kv 字典,如何保证 k 和 class 的成员属性对应就很麻烦,能处理的方式非常多,对 class 这种基础特性来说就有点太自由了。
    asche910
        55
    asche910  
       38 天前
    本来想找找茬的,一看“V2EX 第 51 号会员”,算了,我不够格
    Jirajine
        56
    Jirajine  
       38 天前 via Android
    @caola #53 上一个只有字符串一种类型的语言是 shell 脚本,还有一个 Tcl 也能算。开发效率如何我就不说什么了。
    qcbf111
        57
    qcbf111  
       38 天前
    @finab flutter-dart 就是这样写的
    Kilerd
        58
    Kilerd  
       38 天前
    看了看源码:
    手搓 parser 、没有抽象出 VM ,用了 native golang 来做 eval ,没有抽象出 opcode 和 bytecode

    还在初始阶段就是了。 看起来是一个强类型的解析式语言
    lambdaX999
        59
    lambdaX999  
       38 天前
    确实像 swift
    daqing
        60
    daqing  
    OP
       38 天前
    @MrLiu04 你有 API 接口,就肯定可以呀
    daqing
        61
    daqing  
    OP
       38 天前
    @CEBBCAT 是的,代码就是基于那个的基础
    daqing
        62
    daqing  
    OP
       38 天前
    @yolee599 var 是变量,const 是声明常量,应该不难理解吧。new 是一个构造函数,用于创建类的实例。new 的第二个参数,是用于初始化类的实例变量的。
    daqing
        63
    daqing  
    OP
       38 天前
    @Pantheoon 因为语言就叫 Emo ,所以文件名是 abc.emo
    daqing
        64
    daqing  
    OP
       38 天前
    @OnlyO 天下语言一大抄。其实都差不多的
    daqing
        65
    daqing  
    OP
       38 天前
    @iamzuoxinyu 类本身,也是一个对象。HelloWorld 是类对象,传入这个名字没问题吧,你要是有 ruby 经验,就能理解。
    daqing
        66
    daqing  
    OP
       38 天前
    @byp 那估计要等 1.0 之后了,现在还是语法设计阶段
    daqing
        67
    daqing  
    OP
       38 天前
    @newtype0092 最简单的对应方法,就是一一对应啊。比如:

    class Foo {
    var name: String
    var title: String
    }

    cosnt foo = new(Foo, {"name": "David", "title": "CTO"})

    这里的规则,就是一一对应。Foo 声明了哪些字段,后面的 kv 字典,就去初始化赋值。
    daqing
        68
    daqing  
    OP
       38 天前
    @fcten 这个名字不错,犀利
    daqing
        69
    daqing  
    OP
       38 天前
    @Kilerd 是的,还在非常早期的阶段,连 0.1 都算不上吧。
    daqing
        70
    daqing  
    OP
       38 天前
    @lambdaX999 是的,受 Swift 影响比较大
    newtype0092
        71
    newtype0092  
       38 天前
    @daqing #67 我是指维护这种简单的对应方式,可能会需要复杂的处理逻辑。

    举个例子,如果把 "name" typo 成 "nama" 会怎么样?

    如果严格不允许这种情况,那这里 k 作为一个字符串类型就很奇怪,因为字符串不匹配的错误一般在执行时才会抛出。但这种问题明显在静态检查时就抛出来更好。
    daqing
        72
    daqing  
    OP
       38 天前
    @newtype0092 首先,这里说的静态检查问题,通过写一个静态检查器,是可以捕捉这种 typo 的情况的。

    另外,对于语言来说,如果 name 写错了,匹配不上,那么,对象的初始值,就是 nil
    daqing
        73
    daqing  
    OP
       38 天前
    不过,从语义上讲,如果 new()的第二个参数,用来初始化值,那么,不应该出现,和 class 中的定义,对不上的情况。所以,这时候也可以作为 Error ,抛出。
    xiangyuecn
        74
    xiangyuecn  
       38 天前
    回复一句 没别的意思 单纯见不得 const 关键字
    daqing
        75
    daqing  
    OP
       38 天前
    @xiangyuecn 是的,我也觉得不太好,所以最新的代码,已经去掉了 const 关键字。

    改成通过:

    define(MAX_AGE, 35)

    这种语句,来定义常量。
    inframe
        76
    inframe  
       38 天前
    开发角度:用这种技能用来写 DSL 比较方便
    moudy
        77
    moudy  
       38 天前
    @daqing #72 静态检查搞不定 { kv2.get("fieldName"):kv2.get("fieldValue")}
    Kevin2
        78
    Kevin2  
       38 天前 via Android
    感觉超酷!
    daqing
        79
    daqing  
    OP
       38 天前
    @inframe 今天也有朋友提到 DSL 的问题
    daqing
        80
    daqing  
    OP
       38 天前
    @Kevin2 谢谢支持啦
    struggle001
        81
    struggle001  
       38 天前
    推广下 www.fibjs.org
    struggle001
        82
    struggle001  
       38 天前
    levelworm
        83
    levelworm  
       38 天前
    @caola 我觉得 C 加上 C++的少数特性写起来就很舒服了。
    levelworm
        84
    levelworm  
       38 天前
    @inframe 我觉得如果团队允许的话,的确蛮爽的,相当于自己创造一门语言了。只不过大多数时候大伙还是会选用已有的选项。创造一门语言需要的精力实在是太多了。光是测试就要写很多。

    楼主这种如果能够编译成 LVVM 的 IR 就可以了,不用自己写后端。
    mengzhuo
        85
    mengzhuo  
       37 天前
    @levelworm 想起了仓颉为了适配 LVVM IR 有些语言特性还要砍哈哈哈
    zhiyu1998
        86
    zhiyu1998  
       37 天前
    Emo 语言,越写越 Emo
    daqing
        87
    daqing  
    OP
       37 天前
    @zhiyu1998 口号错了。

    正确的口号是:用 emo ,不 emo 。
    ixoy
        88
    ixoy  
       37 天前
    新语言解决了什么特别问题?有什么别于其他语言的新特性?
    Mslxl
        89
    Mslxl  
       37 天前
    @daqing #23 我觉得优秀的语法可以直接沿用。对于新语言,我更期待它在类型系统、应用落地上有更好的表现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2207 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:40 · PVG 09:40 · LAX 17:40 · JFK 20:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.