爱意满满的作品展示区。
daqing

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

  •  
  •   daqing ·
    daqing · Nov 13, 2024 · 11731 views
    This topic created in 720 days ago, the information mentioned may be changed or developed.

    语言暂时取名叫:Emo 。

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

    看图说话:

    pAgSuVg.png

    89 replies  •  2024-11-15 01:05:33 +08:00
    pdxjun
    pdxjun
    Nov 13, 2024
    1
    图裂了
    69257
    69257
    Nov 13, 2024❤️1
    2
    头一次见这种 new😂
    daqing
    daqing
    OP
    Nov 13, 2024
    3
    @pdxjun 要翻墙吧
    chashao
    chashao
    Nov 13, 2024
    4
    new 是一个库函数调用么?
    daqing
    daqing
    OP
    Nov 13, 2024
    5
    再贴一个例子:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    改成通过:

    define(MAX_AGE, 35)

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

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

    正确的口号是:用 emo ,不 emo 。
    ixoy
    ixoy
    Nov 14, 2024
    88
    新语言解决了什么特别问题?有什么别于其他语言的新特性?
    Mslxl
    Mslxl
    Nov 15, 2024
    89
    @daqing #23 我觉得优秀的语法可以直接沿用。对于新语言,我更期待它在类型系统、应用落地上有更好的表现
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5008 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 118ms · UTC 09:17 · PVG 17:17 · LAX 01:17 · JFK 04:17
    ♥ Do have faith in what you're doing.