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

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

  •  
  •   daqing ·
    daqing · 1 天前 · 5894 次点击

    语言暂时取名叫:Emo 。

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

    看图说话:

    pAgSuVg.png

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    改成通过:

    define(MAX_AGE, 35)

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

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

    正确的口号是:用 emo ,不 emo 。
    ixoy
        88
    ixoy  
       3 小时 4 分钟前
    新语言解决了什么特别问题?有什么别于其他语言的新特性?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3112 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:21 · PVG 21:21 · LAX 05:21 · JFK 08:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.