Programming languages 灵活性如何影响语言';什么语法?

Programming languages 灵活性如何影响语言';什么语法?,programming-languages,language-design,usability,flexibility,Programming Languages,Language Design,Usability,Flexibility,我目前正在编写我自己的语言(),它以灵活性为中心。我试图使语言语法的几乎任何部分都可以通过扩展/插件之类的东西进行交换。在写这整件事的时候,它让我思考。我想知道这种灵活性如何影响语言 我知道Lisp由于其广泛的宏系统而经常被称为最具可扩展性的语言之一。我确实理解宏的概念,但我还没有找到一种允许人们改变其解析方式的语言。据我所知,几乎每种语言都有一个由一些长规范定义的非常具体的语法 我的问题是灵活的语法如何影响语言的直观性和可用性?我知道基本的“当语法改变时人们可能会感到困惑”和“语义分析会很困难

我目前正在编写我自己的语言(),它以灵活性为中心。我试图使语言语法的几乎任何部分都可以通过扩展/插件之类的东西进行交换。在写这整件事的时候,它让我思考。我想知道这种灵活性如何影响语言

我知道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中,一切都是可定制的-所有 键绑定和所有编辑器函数。玩起来很有趣,而且 回到过去,我们中的许多人都制作了自己的个性化版本 只有我们知道如何操作。但事实证明这是一场真正的战争 每个人的编辑工作方式都完全不同。你可以 切勿在他人的会议上俯身并提出建议,以及 团队必须知道谁被记录,才能知道 编辑会工作的。结果证明,这些年来,我们都只是 开始使用默认分发和密钥绑定,这使得 事情对每个人来说都比较容易

在这个时候,这已经足够了