V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

分享一个新的编程语言 Lemon 。

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

    项目地址 https://github.com/lemon-lang/lemon 官网地址 http://www.lemon-lang.org/

    简单介绍一下,

    纯 C 实现,支持 Linux, macOS, Windows,以及(未测试) FreeBSD, OpenBSD, NetBSD,Solaris 等支持 POSIX 的环境,如果选择关掉内置的 OS 和 SOCKET 模块,那么几乎任何有标准 C 编译器的平台都可以支持。Windows 需要 Windows XP 及以上,如果用的 Windows 2000 则需要安装 kernel extension。

    代码量少,算上内置模块,也只有 20ksloc 编译后 200 多 k。

    动态语言,语法和 C/C++, Java, JavaScript 接近,但注意和 JavaScript 是完全不同的语言。

    支持 GC, 面向对象,多重继承,闭包,Coroutine, Continuation 等现代编程语言的大部分功能。

    因为官方实现很小,你可以直接把实现放到项目里,这样就不用担心语言升级项目重写了。

    官网就是用 lemon 实现的,可以作为一个简单的参考 https://github.com/lemon-lang/website

    有另一个中文的简单介绍 https://www.textarea.com/zhicheng/lemon-bianchengyuyan-jieshao-884/ 更多信息请移步官网或在邮件列表中讨论论。

    96 回复  |  直到 2017-12-03 20:34:53 +08:00
        1
    isCyan   34 天前 via Android
    大佬自己写编程语言了,厉害
        2
    poorcai   34 天前 via iPhone
    666
        3
    jtsai   34 天前 via Android
    编程语言要火至少要解决一个问题
        4
    pynix   34 天前
    感觉是 python ruby javascript 的合体。。。
        5
    fuyufjh   34 天前
    支持一下,程序员三大浪漫
        6
    SuperMild   34 天前
    在 FAQ 里看到,Lemon 的最主要优势在于 1. 容易嵌入,2. “保护” 代码财产。

    那么,什么情况下需要使用容易嵌入的语言?以及,它为什么能够保护代码财产,怎样保护的?
        7
    wwqgtxx   34 天前 via iPhone
    有没有打算支持一下直接编译到 c 或者汇编。
        8
    zhicheng   34 天前   ♥ 1
    @SuperMild 任何一个规模到一定程度的项目,都需要嵌入一个语言,或做配置,或做策略,比如 emacs 嵌入了 lisp, vim 实现了 vimscript,Office 嵌入了 VBScript,浏览器实现了 JavaScript。你都可以把整个语言嵌到你的项目里了,就不要问我为什么和怎样保护你的代码了吧。

    @wwqgtxx 有计划直接编译到 C 的项目,但优先级非常低,很可能放弃。
        9
    bilberry   34 天前
    厉害,支持大佬
        10
    clino   34 天前 via Android
    嵌入这块市场主要是不是被 lua 占据了呢
        11
    zhicheng   34 天前
    @clino Lemon 首先还是一门编程语言,至于是不是嵌入到项目中,是取决于项目的,并不是说不嵌入到项目里就不可以用 Lemon 了,Lemon 也是一个支持面向对象和多重继承的现代编程语言,语法也很容易学习。
        12
    clino   34 天前
    嗯,还是挺厉害的,有借鉴其他语言吗?还是都从头自己写的?
    有 gc 吗?
    看 def 像 python 呢,另外还有所有都是对象,这个也有点像 python,这方面不会导致性能差吗?
        13
    zhicheng   34 天前
    @clino 现在开发一个新语言怎么可能不借鉴其它语言,不能闭门造车啊。def 是 define 的简写,也可以写成 define,同样也有 function 这个关键字,为了让匿名函数语义更合理。因为非常容易封装 C 函数,所以性能不是首要考虑目标。
        14
    Tunar   34 天前
    m 一下,持续关注~
        15
    ballshapesdsd   34 天前
    这个语言相对于其他的有什么优势
        16
    Reign   34 天前
    标题应该写成:lemon 是世界上最好的语言
        17
    wujunze   34 天前
    自己造编程语言 666 学习一下
        18
    jiqing   34 天前 via Android
    火钳留名
        19
    youEclipse   34 天前
    资兹
        20
    yanghaojy32   34 天前
    为何这么叼
        21
    littlewing   34 天前
    赞一个,大牛啊
        22
    voocel   34 天前 via Android
    厉害
        23
    acgnsstech   34 天前
    文档太简单了额。。。。
        24
    dobelee   34 天前 via Android
    目前有一些库吗?
        25
    hsuan   34 天前 via Android
    解释执行的?
        26
    glues   34 天前
    没看到任何亮点
        27
    Norie   34 天前 via Android
    @fuyufjh 哪三大
        28
    BXIA   34 天前 via iPad
    @Norie 操作系统 编译器 还有一个忘了…
        29
    hst001   34 天前
    @Norie #27 编译器、操作性和图形学,知乎上面的,有人叫三大浪漫,也有叫三座大山。
        30
    maomo   34 天前
    相比于 Lua 的优势在哪?
        31
    fuyufjh   34 天前
    @Norie 轮子哥杜撰的典故:编译原理,图形学,操作系统

    发明一门语言算是每个程序员的梦想,哈哈~
        32
    bjrjk   34 天前
    楼主能不能做个函数的文档啊,想知道怎么输入还要翻一翻 c 源代码……
        33
    wdlth   34 天前   ♥ 4
    语法树叫 Lemon Tree 么?
        34
    qdwang   34 天前 via iPhone
    不错 虽然品味堪忧 但是找工作甩出这个项目 人家还是会给你加分不少
        35
    Cbdy   33 天前 via Android
    我也想问相比 lua 优势在哪。。
        36
    Technetiumer   33 天前 via Android
    @Cbdy 语法好看?
        37
    Technetiumer   33 天前 via Android
    @wdlth 😂😂😂
        38
    SlipStupig   33 天前   ♥ 2
    我感觉是一个模仿 go 语言并可以运行 js 风格的 python 代码解释器
        39
    cs8425   33 天前
    還沒看 code...先弱弱的問一下...
    coroutine 支援多核嗎?
    還是說要自己包 thread 再處理?
    如果能像 go 那樣搞會很實用啊
    另外希望多一點 example code
    尤其是網路跟 coroutine 的部份
        40
    zhicheng   33 天前   ♥ 2
    @cs8425 头回听说 coroutine 要支援多核,lemon 的 coroutine 就是标准的 coroutine,可以参考 wikipedia 的定义。lemon 里完全没有线程的概念,和标准 C 里面也没有线程一样。如果需要线程,可以自己开几个线程然后每个线程运行一个 VM。

    @SlipStupig 请问哪里模仿 Go 语言了呢?我除了知道 Go 语言定义函数用 func 其它的就不知道了呢。

    @qdwang 请问品味是指什么呢?我已经退出怪异语法俱乐部好多年了。我觉得我设计的语法很“标准”,正常人都能看得懂。计算机科学是实用科学,不是艺术科学。
        41
    adadada   33 天前
    有文档介绍完整的语法和语义吗?
        42
    ghostsf   33 天前 via Android
    我也用 lemon 取名了 😂
        43
    qdwang   33 天前 via iPhone
    @zhicheng 高安全性(精心设计的类型系统),简洁(尽量少的语法规则),高表达力(尽量多的语法组合可能性),高一致性(所有语法与语法组合都服务于同一个中心逻辑思维模型)
        44
    zhicheng   33 天前
    @qdwang Brainfuck 是世界上最好的编程语言?
        45
    thinker3   33 天前
    好像是我要的,带大括号的 python
        46
    zhicheng   33 天前   ♥ 1
    @adadada parser.c 的注释里有完整的 BNF 定义,可以参考一下。
    @thinker3 Python 在很多设计上面非常合理,所以在构建对象系统的时候,我是直接按照 Python 的功能实现的。
        47
    thinker3   33 天前
    var 分号结尾的设计,我也喜欢
        48
    cs8425   33 天前
    @zhicheng #40
    了解你意思了
    抱歉 我表達的不是很清楚
    我是指像 go 的 goroutine(+channel)用法
    之前想嵌入 lua 遇到類似的問題
    如果已知某些低階 api/操作會 block 住
    要如何避開這個 block
    我只想到 2 種解法
    1 是全部徹底換成 event loop 的寫法(感覺就是重造一個 nodejs...)
    2 是開多個線程&VM
    再用 IPC 之類的溝通
    但是很煩瑣...要顧慮的東西不少容易(人為)出錯...
    不知道有沒有更好的解決方法?
    例如別人寫好的拿來用之類的 XD
        49
    zhicheng   33 天前 via iPhone
    @cs8425 Lemon 里有 Scheme 语言里的 callcc 不知道是不是符合你的需求。
        50
    thinker3   33 天前
    有没有 from ... import ... as ... 这样的语法?
        51
    slince   33 天前 via Android
    下一步差文档,就是幼儿园老师式的文档,和学习案例,再者框架
        52
    araraloren   33 天前
    对于那些不喜欢 python 缩进的人会有吸引力,比如 我
        53
    szetrov   33 天前 via Android
    项目是楼主自己写的?先赞一个。不过你发错节点了
        54
    zhicheng   33 天前
    @thinker3 没有 from ... import ... as ... 这样的语法,只有 import ... as ... 。

    import 'path.lm' as name;

    import 的是包的文件路径。之所以不想支持 from ... import ... 是因为这个语法容易造成一个歧义,比如

    a.lm
    ```
    class A() {
    }

    print('a');
    ```

    如果是 from 'a.lm' import A 容易给人造成一个直观的感受是 import 只 eval 了 class A (不执行 print('a') ),但实际上整个文件都会被 eval 的。所以 lemon 只支持 import 整个包。如果引用的时候不想加包名,可以加个本地变量。

    import 'a.lm';

    var A = a.A;

    @slince 已经写好一个教程了,在找朋友帮忙审校一下。

    @araraloren 我觉得 Python 的缩进已经成累赘了。

    @szetrov 所以 “程序员” 结点可以讨论 “双拼使用体会” 和编程完全无关的内容,不可以讨论程序员使用的编程语言吗?
        55
    llbgurs   33 天前
    @zhicheng 大神,要学习源码,需要什么基础哇
        56
    zhicheng   33 天前
    @llbgurs 会点儿 C 就可以了 Lemon 的代码非常简单直观,没有用任何第三方工具和第三方依赖。
        57
    fenglangjuxu   33 天前
    nb,lemon 这个名字我喜欢。
        58
    PythonAnswer   33 天前
    哎呀有分号。。。
        59
    guyskk0x0   33 天前
    Python + Javascript 杂交语法,感觉有点怪异
        60
    alber1986   33 天前
    这个暂时就不学了,脑子不够用了
        61
    qdwang   33 天前
    @zhicheng brainfuck 与其说是一种语言,不如说是一种基础指令集。我们这里讨论的是高级语言,请不要混淆两者。
        62
    vocalman   33 天前
    666
        63
    zhicheng   33 天前
    @qdwang 所以你说的东西没有任何实际意义,请不要因为别人的 “品味” 和你不一样就是 “品味差” 。
        64
    thinker3   33 天前
    @PythonAnswer 有分号才好分行写
        65
    faywong8888   33 天前
    @zhicheng 支持大佬!
        66
    yanzixuan   33 天前
    希望后续的库支持更好些吧。挺喜欢这样的咚咚的。
        67
    xsd3169   33 天前
    谢谢 dalao 的工作~!

    另外有个问题,能不能同时支持通过 indent 来分句以及直接 import 包名不加引号?这样少打点字。。而且能够使用 pycharm 来开发这个编译 233

    可能您会说要我直接写 python 得了,但是 python 性能差呀。。

    弱弱泣求
        68
    cy97cool   33 天前 via Android
    要是能自动把其他语言的库代码翻译过来就精彩了
        69
    ftdejo   33 天前
    已 star··话说想问下 LZ 用了大概多久的时间··
        70
    qdwang   33 天前 via iPhone
    @zhicheng 看来是对牛弹琴了,也罢
        71
    zhicheng   33 天前
    @ftdejo Lemon 的虚拟机大概用了一两个星期,解释器和编译器一个月,对象系统花的时间最长,光实现 callcc 这个函数就花了一个多星期,总共应该用了一个季度左右,其实 Lemon 三个月前就做完了,之所以现在发是因为 lemon-lang.org 的域名十月五号才过期可以注册。
        72
    cholerae   33 天前
    这语言跟别人比有没有什么优越之处?
        73
    zhicheng   33 天前
    @xsd3169 Lemon 的性能并不比 Python 好。。。感觉你的需求挺无聊的。。。
        74
    zhicheng   33 天前
    @cholerae 一个项目选择一个语言,不是因为一个语言比别的语言有什么优越之处,而是这个语言能不能符合项目的需求。
        75
    GeruzoniAnsasu   33 天前   ♥ 1
    我感觉新创造的语言一定要专注于解决某个痛点的问题,一味吸收各种特性最后并不会变得优秀,只会看起来四不像

    C++这种大而全但东西和概念太多神 tm 难用,内存管理靠上帝之眼,new 一下下辈子再回收
    python 动态类型 项目一大立马吃屎传进来的是个什么鬼完全不知道,文档少写一点都要命
    JS PHP 弱类型 = == === 数字字符串数组一混分分钟自己挖个洞
    java 要性能被虚拟机拦死,内存占用 1 个 T (看向 jetbrains ),GC 一动卡三年

    这些语言都有独特的短板,而相当多语言就是专门解决痛点诞生的,比如 rust typescript lua

    我觉得 lua 就非常独特而且很成功,目标就是在一个高性能低抽象难开发的系统中引入能快速实现逻辑的脚本,而高级数据结构和库都可在宿主中提供,lua 只专注提供方便于宿主沟通的相互接口。看看游戏结构,一个引擎+一坨数据+一坨琐碎的特效 /动作 /剧本等等业务逻辑,与 lua 简直天作之合,于是几乎在所有游戏里都能见到 lua 的身影



    再看看 lz 发的官网文档。。。首先语法大杂烩,python js 都有,然后同样是动态类型,有着 python 一样的短板,也没有更多语法糖尝起来更甜,到这就已经 emmmmmmmmm 了,然后仔细一看还有两种空类型,两种数字,还跟 lua 一样从较少的数组解包到更多变量不会报错自动 nil,感觉已经眼前一黑。括号和分号的问题其实……挺 hhh 的,看起来就是凭个人口味的结果,并没有重新思考过各种 token 到底起什么作用,不然你应该能发现那么多种注释没什么用并且分号作为单行分句符并不需要行尾强制

    能自主实现编程语言是非常牛逼的大牛,我表示很崇拜。。。但是大牛玩玩具也只是玩具,变不成宝剑
        76
    zhicheng   33 天前
    @qdwang 所以我不止 “品味差” 又成 “牛” 了?我觉得通过攻击别人获得优越感挺无聊的,你觉得呢?如果你要批评 Lemon,有理有据的,你说得对的地方,我可能会修改,如果我觉得你说得不对的地方,我可能会发表一下看法。如果你觉得我 “品味差” 那我建议你憋在心里不要说出来。
        77
    zhicheng   33 天前
    @GeruzoniAnsasu 对不起,我无法理解你的评论。如果你是过来表达 “哇,作者在两万行代码的实现里提供了 Python JS 和 Lua 所有的功能” ,那么谢谢你地夸奖。
        78
    ftdejo   33 天前
    @zhicheng YM 大佬 有博客地址吗 拜读下 --from 一个汇编就根本没学懂的渣渣
        79
    zhicheng   33 天前
    @ftdejo https://www.textarea.com/zhicheng/ 不需要学汇编,你只要看一下 opcode.h 里的虚拟机指令就可以了,Lemon 是通过虚拟机解释执行的。
        80
    ftdejo   33 天前
    @zhicheng emmmm 听着你解释 想起了上次给我一个丝毫不懂编程的朋友解释写代码的时候··简直一模一样··蛤蛤
        81
    3dwelcome   33 天前   ♥ 1
    楼主评论还是一如既往的犀利。

    楼上那些 JJYY,挑三拣四的,talk is cheap, 有本事自己拿一个出来。

    纯支持。
        82
    liqiazero   33 天前
    elm?
        83
    wxsm   33 天前
    https://github.com/lemon-lang/lemon/issues/10

    敢问大佬,js 哪里 close to java 了?
        84
    cholerae   33 天前
    @zhicheng 额,我的意思就是在什么情况下用这个语言有好处,它适用于什么需求
        85
    clino   33 天前
    从 group 和 issues 来看,国际化方面做得不错
        87
    sensui7   33 天前
    为什么要两个 null 呢, 楼主并没有在文档里详细解释设计的原因, sentinel 目测要成为最大的黑点
        88
    zhicheng   32 天前
    @sensui7 正常的是 nil。sentinel 是用来停止 iterator 的,除此之外不应该使用 sentinel。在 Python 里没有这个值,用的是异常,我不喜欢 Python 的这个设计。很多语言都有多个 null 值,比如

    Objective-C 有 nil 和 [NSNull null]
    JavaScript 有 null 和 undefined
        89
    lzyroot   32 天前
    无论如何,都得赞一个
        90
    sensui7   32 天前
    @zhicheng JS 的 null 很多人并不提倡使用啊, typescript 压根就不用 null, 导致了虽然使用===用来判断, 可是要判断是否为空时, 却又使用 == undefined(因只有 null 和 undefined 会返回 true, 0 , ''都返回 false)
        91
    zhicheng   31 天前
    @sensui7 没明白你的意思,在一个不支持指针的静态类型语言里确实是可以不用 null,但在 typescript 的官网里 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html 有 null,而且在动态类型语言里,变量声明用的是 var 你不知道变量类型,如何设置它的初始值?像 C 一样随机?明显不符合现代语言的特征,如果你说像 JS 一样设置成 undefined 这明显不符合语义,并且 undefined 确实也是另一种 null。事实是 JSON 标准里有 null,所以你无论如何都要有 null。=== 这种特殊语法 Lemon 并不支持。

    所以在 Lemon 里一种是代表一个值的 nil,就像其它任何语言里的 nil,它是一个正常值对象。还有一个 sentinel 代表的是一个特殊值,这个值是用来停止 iterator 的,你可以在 iterator 返回 nil,因为它是合法的值对象,但如果你返回 sentinel,就代表停止 iterator,在字典里就代表删除这个 key,这有什么无法理解或可黑的吗?在其它任何时候你也可以用 sentinel 这个值,但它没有任何实际意义,和 nil 也并不相等。它要比 JS 的 undefined 更符合语义。
        92
    findex   31 天前
    感谢楼主分享。
    只是简单看了下程序语法,感觉命名很像 JS,语法结构体看似深得 Python 深传,但是好像很多语法糖还没有实现。
    @cs8425 我觉得目前要把这些特性都集成进去,是一个非常大的工作量。

    @GeruzoniAnsasu 我比较赞同部分你的观点。毕竟某门语言发明是要解决痛点的。lua 不仅在游戏行业如鱼得水,而且在某些嵌入式领域也是风风火火。

    楼主的能力可以得到认可。但是语言发明,要解决痛点。如果没有亮点证明比其他的更好,用户为什么要用这门语言呢?我有朋友自己写的 lisp 方言,开发了自己的语言(语法各种难读),除了在自己网站使用了下,其他还没有怎么利用到。我觉得原因有很多。

    做 App 产品 /游戏也是一个道理。
    1、受众人群(谁是你的客户)
    2、消费能力(是否愿意买单,这里就是是否有兴趣下载尝试)
    3、产品优势(为什么比其他家强,痛点)
    4、产品劣势(哪里不如他们)
    5、机会(还有哪些潜力有待开发)
    6、竞争风险(同类竞争产品带来的威胁)

    只是个人的一些见解,希望楼主继续努力,比较欣赏楼主!
        93
    sensui7   31 天前
    @zhicheng 先说明并不是黑, 我的水平哪里敢黑- -. 纯询问.

    js 和 ts 很多人只是从实践的角度不用 null, 虽然语义上用 undefined 代表空置不合理, 但能省掉很多麻烦.
        94
    noli   16 天前
    @zhicheng #91

    “没明白你的意思,在一个不支持指针的静态类型语言里确实是可以不用 null ”。

    Rust 支持指针,静态类型,不使用 NULL,通过用 Option 来封装掉 出现 null 的场合,强迫所有代码知道并且处理所有可能出现 null 的场合但又不需要显示地使用 null。

    我觉得这是一种优秀的思想,“有物名无物”。
        95
    zhicheng   16 天前
    @findex 你说的没实现的语法糖是 [x for x in a] ? 对不起这是故意没实现的,因为这个完全可以用 map 取代,这套语法除了让人看了头晕没有太大的实际价值。

    你说的关于 selling point 都很有道理,但你犯了一个关键性的错误,Lemon 语言不是一个商业项目,我不会向使用这个语言的用户收钱。

    另外关于你说的痛点,其实是 marketing,App 用户和编程语言的用户不是一个群体,如果工程师真的有痛点,那么他就会去直接创造一个编程语言了,所以你说的 “痛点” 其实大部分时候都是伪需求。

    我之所以开发 Lemon,是因为我自己有需要,之所以开源,是觉得 Lemon 的代码写得还可以,如果有跟我相似需求的,可以和我一起改进。它的目标并不是要取代 Python Lua 之类的语言,换句话说,如果你用 Python 用得很好,为什么要换呢?
        96
    ghostsf   13 天前 via Android
    @zhicheng 😂 还是要问
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1186 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 69ms · UTC 16:59 · PVG 00:59 · LAX 08:59 · JFK 11:59
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1