Programming languages 灵活性如何影响语言';什么语法?
我目前正在编写我自己的语言(),它以灵活性为中心。我试图使语言语法的几乎任何部分都可以通过扩展/插件之类的东西进行交换。在写这整件事的时候,它让我思考。我想知道这种灵活性如何影响语言 我知道Lisp由于其广泛的宏系统而经常被称为最具可扩展性的语言之一。我确实理解宏的概念,但我还没有找到一种允许人们改变其解析方式的语言。据我所知,几乎每种语言都有一个由一些长规范定义的非常具体的语法 我的问题是灵活的语法如何影响语言的直观性和可用性?我知道基本的“当语法改变时人们可能会感到困惑”和“语义分析会很困难”。这些都是我已经开始补偿的事情。我正在寻找一个关于灵活语法的利弊的更具概念性的答案 语言设计这个话题对我来说还是相当陌生的,所以如果我问了一个明显或愚蠢的问题,我道歉 编辑:Programming languages 灵活性如何影响语言';什么语法?,programming-languages,language-design,usability,flexibility,Programming Languages,Language Design,Usability,Flexibility,我目前正在编写我自己的语言(),它以灵活性为中心。我试图使语言语法的几乎任何部分都可以通过扩展/插件之类的东西进行交换。在写这整件事的时候,它让我思考。我想知道这种灵活性如何影响语言 我知道Lisp由于其广泛的宏系统而经常被称为最具可扩展性的语言之一。我确实理解宏的概念,但我还没有找到一种允许人们改变其解析方式的语言。据我所知,几乎每种语言都有一个由一些长规范定义的非常具体的语法 我的问题是灵活的语法如何影响语言的直观性和可用性?我知道基本的“当语法改变时人们可能会感到困惑”和“语义分析会很困难
我只是想澄清我所问的问题。从语言理论的角度来看,语言语法的灵活性究竟在哪里?我并不真正需要具有灵活性的示例或项目/语言,我想了解它如何影响语言的可读性、功能以及其他类似的东西。Perl是我所知道的最灵活的语言。这是Perl5的后现代对象系统。它的语法与Perl非常不同,但仍然非常类似Perl
在我看来,灵活性的最大问题是中缀符号的优先级。但据我所知,没有一个允许数据类型有自己的中缀语法。例如,以集合为例。使用
⊂代码>和⊇代码>在其语法中。但编译器不仅必须识别这些符号,还必须告知它们的优先顺序。Common Lisp允许更改其解析方式-请参阅reader宏。Racket允许修改其解析器,请参阅Racket语言
当然,如果使用正确的解析技术(例如,PEG),您可以拥有灵活、动态可扩展的解析以及强大的宏。请看一看此处的语法-主要是C语法,但可通过语法和语义宏进行扩展
至于优先权,佩格和普拉特相处得很好
为了回答您最新的问题,令人惊讶的是,关于编程语言可读性的研究很少。你可能想看看Blackwell博士的研究小组是怎么做的,但这还远没有定论
因此,我只能和大家分享我的轶事——灵活的语法语言有助于eDSL的构建,而且,在我看来,eDSL是消除代码中不必要的复杂性的唯一方法,从而使代码实际上可以长期维护。我认为非灵活语言是这个行业犯下的最大错误之一,必须不惜一切代价尽快纠正。灵活允许您操纵语言的语法。例如,Lisp宏可以使您编写程序,在编译时编写程序并将语法操作为有效的Lisp表达式。例如,循环宏:
(loop for x from 1 to 5
do(format t "~A~%" x))
1
2
3
4
5
NIL
我们可以看到代码是如何用macroexpand-1翻译的:
(pprint(macroexpand-1 '(loop for x from 1 to 5
do (format t "~a~%" x))))
然后我们可以看到如何转换对该宏的调用:
(LET ((X 1))
(DECLARE (TYPE (AND REAL NUMBER) X))
(TAGBODY
SB-LOOP::NEXT-LOOP
(WHEN (> X '5) (GO SB-LOOP::END-LOOP))
(FORMAT T "~a~%" X)
(SB-LOOP::LOOP-DESETQ X (1+ X))
(GO SB-LOOP::NEXT-LOOP)
SB-LOOP::END-LOOP)))
语言灵活性只允许您在一种语言中创建自己的嵌入式语言,并根据使用的字符减少程序的长度。所以从理论上讲,这会使语言变得非常不可读,因为我们可以操纵语法。例如,我们可以创建转换为有效代码的无效代码:
(defmacro backwards (expr)
(reverse expr))
BACKWARDS
CL-USER> (backwards ("hello world" nil format))
"hello world"
CL-USER>
显然,上述代码可能变得复杂,因为:
("hello world" nil format)
不是有效的Lisp表达式 谢谢你的回答,为我指明了艾伦·布莱克威尔的方向。我给他发了一封电子邮件,询问他对此事的立场,他给出了一个非常精彩的解释。这是:
那么回答你问题的人说
这种灵活的语法可能对DSL有用,这当然是正确的。
实际上,使用C预处理器来
创建替代语法(在
初始编译阶段)。许多早期的伊索朗王朝都是在今年建成的
对
实际上,我想我们不得不说很多DSL都是
在常规编程语言中实现为库,以及
库设计远比语法更重要。那里
视觉语言的多样性可能更有意义,但
用于任意图形语法的可自定义通用编译器
这真的很难-比更改文本语法功能更糟糕
您的设计可能会实现一些有趣的功能,所以
我不会阻止实验。然而,我认为有一个原因
可自定义语法并不常见。这与著名的
程序员编辑器EMACS。在EMACS中,一切都是可定制的-所有
键绑定和所有编辑器函数。玩起来很有趣,而且
回到过去,我们中的许多人都制作了自己的个性化版本
只有我们知道如何操作。但事实证明这是一场真正的战争
每个人的编辑工作方式都完全不同。你可以
切勿在他人的会议上俯身并提出建议,以及
团队必须知道谁被记录,才能知道
编辑会工作的。结果证明,这些年来,我们都只是
开始使用默认分发和密钥绑定,这使得
事情对每个人来说都比较容易
在这个时候,这已经足够了