项目地址 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/ 更多信息请移步官网或在邮件列表中讨论论。
1
isCyan 2017-11-12 13:11:35 +08:00 via Android
大佬自己写编程语言了,厉害
|
2
poorcai 2017-11-12 13:15:47 +08:00 via iPhone
666
|
3
jtsai 2017-11-12 13:25:37 +08:00 via Android
编程语言要火至少要解决一个问题
|
4
pynix 2017-11-12 14:04:17 +08:00
感觉是 python ruby javascript 的合体。。。
|
5
fuyufjh 2017-11-12 14:36:07 +08:00
支持一下,程序员三大浪漫
|
6
SuperMild 2017-11-12 15:20:35 +08:00
在 FAQ 里看到,Lemon 的最主要优势在于 1. 容易嵌入,2. “保护” 代码财产。
那么,什么情况下需要使用容易嵌入的语言?以及,它为什么能够保护代码财产,怎样保护的? |
7
wwqgtxx 2017-11-12 15:21:51 +08:00 via iPhone
有没有打算支持一下直接编译到 c 或者汇编。
|
8
zhicheng OP |
9
bilberry 2017-11-12 15:39:33 +08:00
厉害,支持大佬
|
10
clino 2017-11-12 15:39:48 +08:00 via Android
嵌入这块市场主要是不是被 lua 占据了呢
|
11
zhicheng OP @clino Lemon 首先还是一门编程语言,至于是不是嵌入到项目中,是取决于项目的,并不是说不嵌入到项目里就不可以用 Lemon 了,Lemon 也是一个支持面向对象和多重继承的现代编程语言,语法也很容易学习。
|
12
clino 2017-11-12 16:17:34 +08:00
嗯,还是挺厉害的,有借鉴其他语言吗?还是都从头自己写的?
有 gc 吗? 看 def 像 python 呢,另外还有所有都是对象,这个也有点像 python,这方面不会导致性能差吗? |
13
zhicheng OP @clino 现在开发一个新语言怎么可能不借鉴其它语言,不能闭门造车啊。def 是 define 的简写,也可以写成 define,同样也有 function 这个关键字,为了让匿名函数语义更合理。因为非常容易封装 C 函数,所以性能不是首要考虑目标。
|
14
Tunar 2017-11-12 16:26:03 +08:00
m 一下,持续关注~
|
15
ballshapesdsd 2017-11-12 16:29:06 +08:00
这个语言相对于其他的有什么优势
|
16
Reign 2017-11-12 16:40:40 +08:00
标题应该写成:lemon 是世界上最好的语言
|
17
wujunze 2017-11-12 17:17:53 +08:00
自己造编程语言 666 学习一下
|
18
jiqing 2017-11-12 17:43:47 +08:00 via Android
火钳留名
|
19
youEclipse 2017-11-12 17:48:08 +08:00
资兹
|
20
yanghaojy32 2017-11-12 18:00:18 +08:00
为何这么叼
|
21
littlewing 2017-11-12 18:04:09 +08:00
赞一个,大牛啊
|
22
voocel 2017-11-12 18:17:34 +08:00 via Android
厉害
|
23
acgnsstech 2017-11-12 18:31:39 +08:00
文档太简单了额。。。。
|
24
dobelee 2017-11-12 18:44:17 +08:00 via Android
目前有一些库吗?
|
25
hsuan 2017-11-12 18:48:09 +08:00 via Android
解释执行的?
|
26
glues 2017-11-12 18:57:03 +08:00
没看到任何亮点
|
28
RqPS6rhmP3Nyn3Tm 2017-11-12 19:04:37 +08:00 via iPad
@Norie 操作系统 编译器 还有一个忘了…
|
30
maomo 2017-11-12 19:19:04 +08:00
相比于 Lua 的优势在哪?
|
32
bjrjk 2017-11-12 21:16:42 +08:00
楼主能不能做个函数的文档啊,想知道怎么输入还要翻一翻 c 源代码……
|
33
wdlth 2017-11-12 21:55:04 +08:00 4
语法树叫 Lemon Tree 么?
|
34
qdwang 2017-11-12 22:08:48 +08:00 via iPhone
不错 虽然品味堪忧 但是找工作甩出这个项目 人家还是会给你加分不少
|
35
Cbdy 2017-11-13 01:18:00 +08:00 via Android
我也想问相比 lua 优势在哪。。
|
36
Technetiumer 2017-11-13 01:18:57 +08:00 via Android
@Cbdy 语法好看?
|
37
Technetiumer 2017-11-13 01:19:14 +08:00 via Android
@wdlth 😂😂😂
|
38
SlipStupig 2017-11-13 01:59:44 +08:00 2
我感觉是一个模仿 go 语言并可以运行 js 风格的 python 代码解释器
|
39
cs8425 2017-11-13 02:48:46 +08:00
還沒看 code...先弱弱的問一下...
coroutine 支援多核嗎? 還是說要自己包 thread 再處理? 如果能像 go 那樣搞會很實用啊 另外希望多一點 example code 尤其是網路跟 coroutine 的部份 |
40
zhicheng OP @cs8425 头回听说 coroutine 要支援多核,lemon 的 coroutine 就是标准的 coroutine,可以参考 wikipedia 的定义。lemon 里完全没有线程的概念,和标准 C 里面也没有线程一样。如果需要线程,可以自己开几个线程然后每个线程运行一个 VM。
@SlipStupig 请问哪里模仿 Go 语言了呢?我除了知道 Go 语言定义函数用 func 其它的就不知道了呢。 @qdwang 请问品味是指什么呢?我已经退出怪异语法俱乐部好多年了。我觉得我设计的语法很“标准”,正常人都能看得懂。计算机科学是实用科学,不是艺术科学。 |
41
adadada 2017-11-13 05:19:46 +08:00
有文档介绍完整的语法和语义吗?
|
42
ghostsf 2017-11-13 07:17:03 +08:00 via Android
我也用 lemon 取名了 😂
|
43
qdwang 2017-11-13 07:25:37 +08:00 via iPhone
@zhicheng 高安全性(精心设计的类型系统),简洁(尽量少的语法规则),高表达力(尽量多的语法组合可能性),高一致性(所有语法与语法组合都服务于同一个中心逻辑思维模型)
|
45
thinker3 2017-11-13 07:54:25 +08:00
好像是我要的,带大括号的 python
|
46
zhicheng OP |
47
thinker3 2017-11-13 08:05:25 +08:00
var 分号结尾的设计,我也喜欢
|
48
cs8425 2017-11-13 08:10:07 +08:00
@zhicheng #40
了解你意思了 抱歉 我表達的不是很清楚 我是指像 go 的 goroutine(+channel)用法 之前想嵌入 lua 遇到類似的問題 如果已知某些低階 api/操作會 block 住 要如何避開這個 block 我只想到 2 種解法 1 是全部徹底換成 event loop 的寫法(感覺就是重造一個 nodejs...) 2 是開多個線程&VM 再用 IPC 之類的溝通 但是很煩瑣...要顧慮的東西不少容易(人為)出錯... 不知道有沒有更好的解決方法? 例如別人寫好的拿來用之類的 XD |
49
zhicheng OP @cs8425 Lemon 里有 Scheme 语言里的 callcc 不知道是不是符合你的需求。
|
50
thinker3 2017-11-13 08:20:02 +08:00
有没有 from ... import ... as ... 这样的语法?
|
51
slince 2017-11-13 08:33:03 +08:00 via Android
下一步差文档,就是幼儿园老师式的文档,和学习案例,再者框架
|
52
araraloren 2017-11-13 08:39:29 +08:00
对于那些不喜欢 python 缩进的人会有吸引力,比如 我
|
53
szetrov 2017-11-13 08:42:02 +08:00 via Android
项目是楼主自己写的?先赞一个。不过你发错节点了
|
54
zhicheng OP @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 所以 “程序员” 结点可以讨论 “双拼使用体会” 和编程完全无关的内容,不可以讨论程序员使用的编程语言吗? |
57
fenglangjuxu 2017-11-13 09:46:38 +08:00
nb,lemon 这个名字我喜欢。
|
58
PythonAnswer 2017-11-13 09:51:31 +08:00
哎呀有分号。。。
|
59
guyskk0x0 2017-11-13 10:14:19 +08:00
Python + Javascript 杂交语法,感觉有点怪异
|
60
alber1986 2017-11-13 10:15:47 +08:00
这个暂时就不学了,脑子不够用了
|
62
vocalman 2017-11-13 11:00:49 +08:00
666
|
64
thinker3 2017-11-13 11:12:59 +08:00
@PythonAnswer 有分号才好分行写
|
65
faywong8888 2017-11-13 11:32:11 +08:00
@zhicheng 支持大佬!
|
66
yanzixuan 2017-11-13 11:42:12 +08:00
希望后续的库支持更好些吧。挺喜欢这样的咚咚的。
|
67
xsd3169 2017-11-13 11:50:17 +08:00
谢谢 dalao 的工作~!
另外有个问题,能不能同时支持通过 indent 来分句以及直接 import 包名不加引号?这样少打点字。。而且能够使用 pycharm 来开发这个编译 233 可能您会说要我直接写 python 得了,但是 python 性能差呀。。 弱弱泣求 |
68
cy97cool 2017-11-13 11:55:27 +08:00 via Android
要是能自动把其他语言的库代码翻译过来就精彩了
|
69
ftdejo 2017-11-13 12:02:56 +08:00
已 star··话说想问下 LZ 用了大概多久的时间··
|
71
zhicheng OP @ftdejo Lemon 的虚拟机大概用了一两个星期,解释器和编译器一个月,对象系统花的时间最长,光实现 callcc 这个函数就花了一个多星期,总共应该用了一个季度左右,其实 Lemon 三个月前就做完了,之所以现在发是因为 lemon-lang.org 的域名十月五号才过期可以注册。
|
72
cholerae 2017-11-13 12:09:23 +08:00
这语言跟别人比有没有什么优越之处?
|
74
zhicheng OP @cholerae 一个项目选择一个语言,不是因为一个语言比别的语言有什么优越之处,而是这个语言能不能符合项目的需求。
|
75
GeruzoniAnsasu 2017-11-13 12:16:55 +08:00 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 OP @qdwang 所以我不止 “品味差” 又成 “牛” 了?我觉得通过攻击别人获得优越感挺无聊的,你觉得呢?如果你要批评 Lemon,有理有据的,你说得对的地方,我可能会修改,如果我觉得你说得不对的地方,我可能会发表一下看法。如果你觉得我 “品味差” 那我建议你憋在心里不要说出来。
|
77
zhicheng OP @GeruzoniAnsasu 对不起,我无法理解你的评论。如果你是过来表达 “哇,作者在两万行代码的实现里提供了 Python JS 和 Lua 所有的功能” ,那么谢谢你地夸奖。
|
79
zhicheng OP @ftdejo https://www.textarea.com/zhicheng/ 不需要学汇编,你只要看一下 opcode.h 里的虚拟机指令就可以了,Lemon 是通过虚拟机解释执行的。
|
81
3dwelcome 2017-11-13 13:34:38 +08:00 1
楼主评论还是一如既往的犀利。
楼上那些 JJYY,挑三拣四的,talk is cheap, 有本事自己拿一个出来。 纯支持。 |
82
liqiazero 2017-11-13 13:56:37 +08:00
elm?
|
83
wxsm 2017-11-13 16:11:16 +08:00
|
85
clino 2017-11-13 17:42:39 +08:00
从 group 和 issues 来看,国际化方面做得不错
|
86
szetrov 2017-11-13 19:43:33 +08:00
|
87
sensui7 2017-11-13 23:59:52 +08:00
为什么要两个 null 呢, 楼主并没有在文档里详细解释设计的原因, sentinel 目测要成为最大的黑点
|
88
zhicheng OP @sensui7 正常的是 nil。sentinel 是用来停止 iterator 的,除此之外不应该使用 sentinel。在 Python 里没有这个值,用的是异常,我不喜欢 Python 的这个设计。很多语言都有多个 null 值,比如
Objective-C 有 nil 和 [NSNull null] JavaScript 有 null 和 undefined |
89
lzyroot 2017-11-14 11:51:20 +08:00
无论如何,都得赞一个
|
90
sensui7 2017-11-14 23:18:31 +08:00
@zhicheng JS 的 null 很多人并不提倡使用啊, typescript 压根就不用 null, 导致了虽然使用===用来判断, 可是要判断是否为空时, 却又使用 == undefined(因只有 null 和 undefined 会返回 true, 0 , ''都返回 false)
|
91
zhicheng OP @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 2017-11-15 18:08:28 +08:00
感谢楼主分享。
只是简单看了下程序语法,感觉命名很像 JS,语法结构体看似深得 Python 深传,但是好像很多语法糖还没有实现。 @cs8425 我觉得目前要把这些特性都集成进去,是一个非常大的工作量。 @GeruzoniAnsasu 我比较赞同部分你的观点。毕竟某门语言发明是要解决痛点的。lua 不仅在游戏行业如鱼得水,而且在某些嵌入式领域也是风风火火。 楼主的能力可以得到认可。但是语言发明,要解决痛点。如果没有亮点证明比其他的更好,用户为什么要用这门语言呢?我有朋友自己写的 lisp 方言,开发了自己的语言(语法各种难读),除了在自己网站使用了下,其他还没有怎么利用到。我觉得原因有很多。 做 App 产品 /游戏也是一个道理。 1、受众人群(谁是你的客户) 2、消费能力(是否愿意买单,这里就是是否有兴趣下载尝试) 3、产品优势(为什么比其他家强,痛点) 4、产品劣势(哪里不如他们) 5、机会(还有哪些潜力有待开发) 6、竞争风险(同类竞争产品带来的威胁) 只是个人的一些见解,希望楼主继续努力,比较欣赏楼主! |
93
sensui7 2017-11-15 23:15:54 +08:00
@zhicheng 先说明并不是黑, 我的水平哪里敢黑- -. 纯询问.
js 和 ts 很多人只是从实践的角度不用 null, 虽然语义上用 undefined 代表空置不合理, 但能省掉很多麻烦. |
94
noli 2017-11-30 13:28:15 +08:00
@zhicheng #91
“没明白你的意思,在一个不支持指针的静态类型语言里确实是可以不用 null ”。 Rust 支持指针,静态类型,不使用 NULL,通过用 Option 来封装掉 出现 null 的场合,强迫所有代码知道并且处理所有可能出现 null 的场合但又不需要显示地使用 null。 我觉得这是一种优秀的思想,“有物名无物”。 |
95
zhicheng OP @findex 你说的没实现的语法糖是 [x for x in a] ? 对不起这是故意没实现的,因为这个完全可以用 map 取代,这套语法除了让人看了头晕没有太大的实际价值。
你说的关于 selling point 都很有道理,但你犯了一个关键性的错误,Lemon 语言不是一个商业项目,我不会向使用这个语言的用户收钱。 另外关于你说的痛点,其实是 marketing,App 用户和编程语言的用户不是一个群体,如果工程师真的有痛点,那么他就会去直接创造一个编程语言了,所以你说的 “痛点” 其实大部分时候都是伪需求。 我之所以开发 Lemon,是因为我自己有需要,之所以开源,是觉得 Lemon 的代码写得还可以,如果有跟我相似需求的,可以和我一起改进。它的目标并不是要取代 Python Lua 之类的语言,换句话说,如果你用 Python 用得很好,为什么要换呢? |