类别:编程语言
项目后续更新计划: 语法设计已经稳定( 1.0-alpha ),后续主要精力将放在编译器实现改进迭代,扩展到更多场景。
项目描述: Lite 是一个专注于工程化的开源通用编程语言。
这门语言的设计目标是简单性、可读性、可理解性。
通过去除关键字,减少语法特性,统一表达规范,这门语言可以有效降低读写负担,让使用者能够把真正的注意力放在解决问题上。
目前支持输出到 C#/Go/TypeScript,借助它们的资源,已经可以在非常广泛的场景下使用这门语言。
推荐理由:精心设计的语法,易于编写和阅读。可能是目前世界上语法最精简的静态编程语言。
示例代码:
Main(->) {
print("Hello, world!")
greetings = get_greetings("love lite!")
greetings @ [index]value {
? index == 0 {
print(value)
} index == 1 {
print(value + ", 世界!")
} _ {
print(value + ", world!")
}
}
}
get_greetings(first str -> result []str) {
<- first + {"你好", "Hola", "Bonjour",
"Ciao", "こんにちは", "안녕하세요",
"Cześć", "Olá", "Здравствуйте",
"Chào bạn"}
}
1
anonymous256 2019-07-21 09:39:00 +08:00 via Android 10
欣赏不来这种优雅
|
2
gavindexu 2019-07-21 09:41:48 +08:00 via iPhone
Ciao ……次奥🤣我出戏了
|
3
NewDraw 2019-07-21 09:59:55 +08:00 via Android
还不错,缺点是没有关键字就无法高亮了,代码结构会不太明显。
|
4
tabris17 2019-07-21 10:05:13 +08:00 5
不要用符号来代替英文语句,不直观。
我宁愿写成 if then else 也不要 ? _ |
5
SuperMild 2019-07-21 10:06:59 +08:00 3
与 Go 相比,看不出来有什么优势啊。
|
6
zeroDev 2019-07-21 10:11:41 +08:00 via Android
以上观点中,开发者所需解决的主要问题是,代码高亮,代码提示等生态问题
|
7
Abbeyok 2019-07-21 10:12:16 +08:00 via Android
写惯 Python 表示无法接收那么多<>
|
8
whoami9894 2019-07-21 10:15:30 +08:00
```
greetings @ [index]value { ? index == 0 { print(value) } index == 1 { print(value + ", 世界!") } _ { print(value + ", world!") } } ``` 不太能欣赏这样的语法 |
9
nvioue 2019-07-21 10:16:11 +08:00 1
这是哪门子的易于阅读....
哪天能直接用人类语言 中 /日 /英 直接写文章=编程 才是低门槛了 不再需要专门训练程序员 |
10
VDimos 2019-07-21 10:16:53 +08:00 via Android
哪儿有可读性了。。。
|
11
lxrmido 2019-07-21 10:17:17 +08:00
挺好的,就是 shift 摁得有点多……
|
12
jamesliu96 2019-07-21 10:27:43 +08:00 via Android
没必要,真没必要
|
13
way2create 2019-07-21 10:33:24 +08:00
看的头大
|
16
Kulics OP @SuperMild 如果 Go 25 个关键字对于其它语言算是优势的话,Lite 语法更短也是优势。当然了,不抬杠,我也是个 Go 开发者,Lite 实际上也是我从 Go 的语法基础演变出来的,很多地方保留了 Go 的设计思想,仔细看看文档就会发现。
|
17
surewen 2019-07-21 10:56:55 +08:00 1
1. 敲 return 的速度肯定比<-快
2. 关键词不是越少越好,运算符的理解成本远高于关键词 3. 没看到任何工程化的特性。工程化的定义是整个提效项目开发周期如 脚手架、静态检查、灰度、发布体系等。 |
18
Kulics OP @nvioue 能写文章=编程就不需要关注这些旧时代编程语言了,我也期待有那么一天。但 Lite 的设计目标不是低门槛,实际上学习成本还是挺高的,我只做了优化语法设计的工作。
|
19
murmur 2019-07-21 10:58:24 +08:00
这种滥用拉姆达表达式的简化的除了 geek 谁会喜欢
|
20
janxin 2019-07-21 11:01:13 +08:00
欣赏不来。。。
|
21
chinvo 2019-07-21 11:02:02 +08:00 via iPhone
真这么喜欢 lambda 表达式,可以试试 lisp 和 haskell
|
22
lscho 2019-07-21 11:02:10 +08:00 via Android 1
神烦各种符号。看上去代码精简了很多,但是输入中太慢太影响节奏,比如 php 的$和->。结果你这个比 php 的符号还多。
|
23
cnxobo 2019-07-21 11:04:41 +08:00
这个算是一种 DSL
|
24
Kulics OP @surewen
1. 没有追求过敲键盘的速度,编程追求这个价值很低吧。 2. 能表达清楚逻辑的前提下,关键词应该是越少越好,不然每个编程语言加新功能都可以玩命加关键词了。Lite 设计目标不面向低门槛,肯定得学过文档才能理解语法,学过之后的理解成本会低很多。 3. 项目的工程化和编程语言的工程化不完全等同,脚手架之类的慢慢做都可以做出来,得依赖社区力量。 |
25
surewen 2019-07-21 11:24:59 +08:00
@Kulics
1. 对于写代码的人来说,typing 的效率很关键,不然为什么有所有软件都有 shortcuts 和 vim ? 2. 首先关键词不是越少越好 不等于 越多越好。其实现代编程语言的关键词集合都差不多,在这个基础上如果盲目减少,只会徒增复杂性。再次,“学过之后的理解成本会低很多” 哪个语言不这样? 3. 参考 2,这个语言引入了众多不必要的复杂性,还是没明白到底工程化在哪儿 |
26
mamahaha 2019-07-21 11:28:49 +08:00
受中美贸易战影响,从战略意义上值得推广,不过渠道要把握好,亲美喷子和大厂水军的力量不容小觑,很多舆论导向都能被他们带动,希望你能挺住。
|
27
vscode 2019-07-21 11:42:13 +08:00
说真的,用各种符号来代表关键逻辑,这种真的是代码简单的代表吗?
所谓可读性好,当我读到某些英文词汇的时候,就知道啥意思,但是读到符号,我脑子内部还需要再转换一下,说真的,不觉得.要是真的符号就代表简洁的话,那我们日常交流以后岂不是也会进化成为:,./;'[';.]..-=[!@#$#^&*...]啥意思呢? |
28
mokeyjay 2019-07-21 12:01:04 +08:00 2
能开发自己的语言很了不起,但不认同这种偏激的精简
|
29
yvanst 2019-07-21 12:05:49 +08:00 via Android
patern match ? 感觉不如 scala 的设计好看
|
30
Vegetable 2019-07-21 12:19:12 +08:00
我个人理解没有一个关键词,应该也没有对应的功能才对。比如没有 if,这语言就不支持 if 判断,而不是用?去代替关键词吧。
|
31
loading 2019-07-21 12:23:52 +08:00 via Android
箭头……输入是真的麻烦
|
32
ihciah 2019-07-21 12:24:19 +08:00 via iPhone
比较好奇怎么做的。。
编译器只有 binary 吗? source code 有没有公开的计划? |
33
way2create 2019-07-21 12:33:39 +08:00
@lscho $输入很随意 ->是有点烦 有些 ide 补全还行
|
34
pisc 2019-07-21 12:37:01 +08:00 via Android
> 推荐理由:精心设计的语法,易于编写和阅读。可能是目前世界上语法最精简的静态编程语言。
Haskell: hmmmmm.... 代码也没开源,这是要干啥。。。 |
35
secondwtq 2019-07-21 12:40:06 +08:00 via iPad
这个好像没比那撮搞中文编程的高到哪里去…
|
36
luozic 2019-07-21 12:40:52 +08:00 via iPhone
haskell lisp 变种有话说。
|
37
liuxey 2019-07-21 12:46:18 +08:00
右手小拇指和你有仇吗?
|
38
qdwang 2019-07-21 12:51:37 +08:00 via iPhone 1
别怪我太直白,只在语法上最创新的语言,就是垃圾
|
39
mengzhuo 2019-07-21 12:53:12 +08:00 via iPhone
没有 spec 么...
|
40
Justin13 2019-07-21 12:55:32 +08:00 via Android
这。。。Go 语言就足够丑陋了,你这丑上天啊
|
41
no1xsyzy 2019-07-21 13:08:27 +08:00
问题是关键词没少啊,如果你能明白 pascal.h 就知道为什么说关键词没变少了
#define begin { #define end } #define if if( #define then ) …… 私以为,简洁的核心是 “匹配”,就像 erlang / elixir 做的那样。 那一段循环,我觉得设计成这样更好: foreach(greetings) { 0:value { print(value) } 1:value { print(value + ", 世界!") } _:value { print(value + ", world!") } } |
42
secondwtq 2019-07-21 13:11:20 +08:00 via iPad
@no1xsyzy 为什么 foreach 要带 pattern matching 的功能? do one thing and do it well 就不是简洁了?
|
43
chenjau 2019-07-21 13:20:39 +08:00
关键词多寡从来不是真正的痛点. 且关键词比符号更易读, 直观. 使用符号代替关键词是南辕北辙.
减少语言表达力的后果是代码繁琐, 增加读写负担. 极端的例子是 brainfuck. |
44
no1xsyzy 2019-07-21 13:23:14 +08:00
|
45
no1xsyzy 2019-07-21 13:36:29 +08:00
@secondwtq 不如说 foreach 只有 pattern match,整个语言基本围绕 pattern match 发挥,连赋值都实质是 pattern match 的特形,函数调用也是 pattern match (函数定义是那个 pattern )。
new_dict = {**dict, 'add_key': new_value} {**newer_dict, 'remove_key': extracted_value} = new_dict {**newest_dict, 'remove_key': extracted_value} = newer_dict // throws func({'what_i_need':the_value, **other_params_that_can_passthrough}){doSomething(the_value, other_params_that_can_passthrough)} 这样反而不违背 do one thing,不是吗? 不过 pattern match 的一个重要核心是有 atom 或者 symbol,不存在的话只能用字符串脏一下。 |
47
dandycheung 2019-07-21 13:41:46 +08:00 via iPhone
我觉得挺好,不算难看,不用管别人,自己喜欢就好,不好再改
|
49
no1xsyzy 2019-07-21 13:46:46 +08:00
另外,看 spec 的结论是和 go 一样强制 “{” 在前一行行尾不得新行
还有,你说这是静态语言?为什么会有判断类型的语法? https://github.com/kulics/lite/blob/master/book-zh/document.md#%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D |
50
no1xsyzy 2019-07-21 14:06:55 +08:00
@secondwtq 其实如果区分左值和右值的话最新 ES 就已经基本符合了,甚至 'a':a 可以被糖成 a。
不区分左右就必然是函数式或者类函数式,不然的话 a,b,c = b,c,a 有歧义。 区分的话不能 {'type':'addValue', 'content':value_to_add, 'received':true} = msg 这样做双向传递了 if(msg['type']=='addValue'){value_to_add=msg['content'];msg['received']=true} 不过可以 [{'type':'addValue', 'content':value_to_add}|msgq] = msgq // 如果第一个消息类型是 addValue 就会被提取并移除。 各有好坏吧。 |
51
pisc 2019-07-21 14:07:33 +08:00 via Android
|
52
Kulics OP |
54
Kulics OP @Vegetable 关键词跟功能没有意义上的相等,看怎么理解,有人觉得是操作符,有人觉得是关键字,我只想精简,怎么定义都行。
|
58
Kulics OP |
59
hwdef 2019-07-21 14:49:16 +08:00
@pisc 因为支持输出到 C#/Go/TypeScript,无法放在一个仓库里,所以分开放在其他仓库了,在文档里有说明,有兴趣可以了解一下
|
62
Kulics OP @dandycheung 谢谢,反正自己爽是第一的。
|
63
imNull 2019-07-21 14:54:04 +08:00 via Android
支持楼主
|
65
inhzus 2019-07-21 14:55:13 +08:00 via Android
看不起左撇子程序员?为什么要一直用右手小指!涉嫌歧视左撇子,建议击毙(滑稽
|
66
love 2019-07-21 17:13:09 +08:00 1
为啥要追求取消一切关键字?那不是更不可读了?
比如你这个循环: @ { ...... # 永远不会跳出 # } 太不显眼了 至于跳出循环用 <-@ 这是什么鬼,简直是为符号而符号吧,用个 break 会死吗 @ { <- @ # 什么都没执行就跳出了 # } |
67
wi 2019-07-21 18:41:22 +08:00
想法和有一致,也有不同,留个联系方式,我们交流一下
|
68
datou 2019-07-21 18:45:40 +08:00
符号太多能劝退不少新手
比如 c++和 rust 这样的 |
69
v2nika 2019-07-21 19:14:39 +08:00
用符号换关键字有啥意义?
|
71
Kulics OP @wi 邮箱呗 [email protected]
|
76
tanszhe 2019-07-21 20:55:10 +08:00 1
手动点赞 赞!!
有些建议 现在语言已经非常多了,一个新的语言还能流行起来,必然有自己非常明显的优势,正好解决程序员一些痛点。 go,rust 算是新贵 都符合这个特征。 |
77
no1xsyzy 2019-07-21 21:49:04 +08:00
@Kulics 本来 Variant / Union 类型就是处于动态和静态中间的。
要觉得 Variant 也能算静态类型,你怎么不说 Python 就是个类型是 any/c 的静态类型?它也能 annotation 写类型标记,有了这类型标记也能写个 linter。 |
78
luopengfei14 2019-07-21 22:10:48 +08:00 via iPhone
虽然楼上很多人说不太好,但是我觉得敢写语言的都很牛逼,摩拜一下👍
|
79
no1xsyzy 2019-07-21 22:19:12 +08:00
@Kulics #58 我指的是你原文的 “通过去除关键字”,实际上你并没有去掉哪怕一个。
何况问号 “?” 本身完全可以被设定为可用于标识符的字符。是问号、叹号还是 if 并没有什么区别。 函数名 equal? null? bool? str? (defmacro ? c `(case ,@c)) 这样的语法糖我一分钟能写 26 个。 不过如果要写 26 个我会先写个语法糖 (defmacro sweet (orig new) (let ((c (gensym))) `(defmacro ? ,c `(case ,@,c)))) |
80
no1xsyzy 2019-07-21 22:25:37 +08:00
另外一个,<-@ 对我来说更像是 continue
(function @() { doSomething(); if(sometimes()){ return @() } doRest(); return @() })() @ 是一个函数名,并且调用函数不需要括号(像 ruby 或者很多 shell )的话,return @() 就是在 call 自己,符合尾调死循环的 continue 等价物。 |
81
no1xsyzy 2019-07-21 22:36:09 +08:00
@luopengfei14 写语言没什么牛逼的,任何一个复杂、通用的项目就是设计一个新语言,只不过不一定是图灵完备的,可能不过是写出一种配置语言的实际用途。
你可以说 grep 正是写一种语言,其词法语法符合正则表达式,同时其作用是向某个文件寻找所有符合该正则表达式的行。 正如格林斯潘第十定律:任何 C 或 Fortran 程序复杂到一定程度之后,都会包含一个临时开发的、不合规范的、充满程序错误的、运行速度很慢的、只有一半功能的 Common Lisp 实现。 |
82
jaynos 2019-07-21 22:44:38 +08:00
我如果要写这个语言, 是需要买一把自动按 Shift 的键盘, 还是买一把普通键盘然后买一堆的 Shift 键呢(滑稽
|
83
Kulics OP @tanszhe 谢谢你的建议,现在 Lite 依赖目标语言的实现,除了语言之外很难有自己独特的特性,我自知不是明显的优势。真正语言自己的优势恐怕得之后输出到 llvm 的时候才能有更创新的设计。
|
84
Kulics OP @no1xsyzy 我假设同学你已经读过 Lite 的文档,至少没忽略声明和自动推导部分。
Lite 的类型大量用了自动推导,根本不是 Variant 那回事。 这是用 Lite 写的一个 demo 项目,简单的 xamarin。 建议可以看看 Lite 是怎么输出到 c# 的,这是一个静态语言,纯正的。 https://github.com/kulics/lite-demo/tree/master/LiteDemo/LiteDemo |
85
Kulics OP @no1xsyzy 我前面也回答过,实际上关键词相关的语法都在,只是没有沿用用英语单词形式的关键词。但是关键词指的就是那些词,符号被称作操作符,任何一个语言都是这么称呼,这么描述应该没有什么问题。
btw,同学你对关键词的执念很深,即使把操作符换回关键词,Lite 的语法结构依然非常精简。 设计目标不是去掉关键词,那是结果不是目的,纠着这个眼镜不放,好的地方怕是看出来了。 |
86
Kulics OP @no1xsyzy 当然用宏可以把 @ 这么玩。没有 Lite 之前我也是这么玩。
那么这些呢 ``` @ true { ... } @ { ... } [0 < 10] @ i { ... } ``` 任何一个图灵等价的语言都可以完成差不多的功能, 但是原生的和非原生的就是有差别,不然我们只学 lisp 就够了。 建议至少看完文档。 |
87
Kulics OP @luopengfei14 谢谢,写语言不牛逼,这个差不多还只是毕业设计水平,我不是大神。我是闲着想做些新东西(滑稽)
|
89
no1xsyzy 2019-07-22 00:39:34 +08:00
@Kulics #84 如果说推导就能解决的话就根本不需要判断类型,因为编译期就能明确该变量是什么类型。C# 或者 go 的大致是用于接口、泛型、Variant、Union、继承或者 C++ 模版,这时常常已经无法编译期判断数据类型了。在我看来,C++ 因为虚函数和多态的存在也是介于静态和动态之间的东西。因为个人对 M$ 的偏见,没用过 C#,随便搜了一下,不知真假: https://www.runoob.com/csharp/csharp-polymorphism.html#override
#85 所以说那只是表象,你还是没理解 pascal.h 的意义,我亲眼见过写惯了 Pascal 的去写 C 先引入几个 define 把 begin end 给变成花括号对的。对 C 来说花括号对 “{” 和 “}” 是不是关键字呢?至少在用 pascal.h 的人看来绝对是。 操作符和关键字也不冲突,比如 Pascal 和 Python 的 and 以及 or。 lexer 和 syntax 并不会区分拉丁字母作关键字或者符号作关键字,都是关键字,对它来说还是字节流或者字符流,看你的 lexer 好像用的现成的轮子,也难怪。 还有,你说没说错和是目的还是结果没什么联系。 #86 我是说直观上的,你这样把 <-@ 当作 break 是真的非常奇怪的结构。虽然确实应该按大嘴法,<-@ 是一个整体,但这一形式上的一致不可避免地让我感觉到这是 continue ……另一方面,看到 @ 的话总会觉得至少行为应该和 @ 所在的位置有所关联,而不是隔了十万八千里的对应 } 处。 另外,确实只需要 “学” lisp 就够了(指 SICP ),其他的不过稍微练习就行。连 Erlang 的消息驱动和微服务架构我都看 SICP 的时候重新发明了一遍。遗憾的是因为老爷子去世我才仔细了解到 Erlang 的消息驱动 Actor 式异步。连快速失败进程重启都发明了半遍(做得不完整,完全就是因为我做成消息拉动代码执行外加异常处理也是将异常作为消息抛到另一个信道上)。 |
90
xujinkai 2019-07-22 00:50:07 +08:00
主要是看不懂,Java,C#,python 直接看就能大概知道要干嘛,你这猜都不好猜。语法之外的疑问就一个:这是用来解决什么具体的问题的?
|
92
no1xsyzy 2019-07-22 00:59:32 +08:00
@Kulics #24 对了说起敲键盘的速度,我就是因为全拼太慢所以换的双拼。
如果说敲键盘不能和脑子同步并形成肌肉记忆的话就是拖脑子后退,打乱思路。 所以用 begin 比 { 好,end 比 } 好。 |
93
Kulics OP @xujinkai 为什么要猜,难道学门语言是靠关键词猜怎么用的吗,你是的话真强我佩服,我只会规规矩矩学文档。
语法之外的疑问好解答:这个主要是用来解决程序员这个问题的(滑稽 |
94
Kulics OP @no1xsyzy
1. 总之现在你确认 Lite 是静态语言了,any 类型肯定是需要的,推导不能解决一切问题,很多地方还得靠反射和类型判断,Lite 肯定也得支持。 2. 我只说我去除了关键词,没说去掉了 token,不管字母还是符号到编译器都是 token,我喜欢操作符,不喜欢可以自行 fork 改成字母,这不影响 Lite 本身语法精简。 3. lexer 和 parser 用的都是 antlr,用轮子难道有什么问题?敢情现在写个项目还要从汇编开始写吗。开源大轮子比自己写的要好千万倍吧,后端我还准备用 llvm。 4. 老爷子去世我难过了好一阵,刚开始设计 Lite 看了好久 Erlang 的设计,里面的思想的确精辟,我也借鉴了一些。 5. <- 是返回语义,我通过后面的内容判断返回的目标,<- value 是退出函数,<- @ 用来退出循环,这样符合这个语言自己的设计,统一表达规范是我很着重的部分, |
95
Kulics OP @no1xsyzy 编译器实现了自动推导,输出到 C# 也得用 var 吧,为什么不用啊,写 C# 不用 var 吗? 233333
|
96
Kulics OP @no1xsyzy 双拼的确是非常快的,以前我在少数派工作的时候他们就大力推过,不过那时没有一个跨平台好用的双拼输入法,最终还是没坚持下去。
现在我年纪大了,脑子转的很慢,写个代码要思前想后考虑很多,码字速度已经没拖脑子后腿了,追求不来速度(滑稽 说真,要不你 fork 一份把操作符改成关键词试试玩玩,或者你觉得可以用什么关键词,发一份给我,我改个双模式,不影响编译。 |
97
Niphor 2019-07-22 09:08:45 +08:00
难得一篇技术讨论的帖子快翻页了,参考的 go,我也就能理解为啥看的这么辛苦了...
|
98
scalaer 2019-07-22 09:14:56 +08:00
基于 antlr 生成的,感觉像 dsl
|
99
Kulics OP @Niphor 对啊,难得讨论了回技术。一开始是以 go 为基础,现在差别挺大的,Lite 的语法需要看过文档学习后才能感觉到舒畅。
|