Parsing 为什么解释/脚本语言很少有多行注释?

Parsing 为什么解释/脚本语言很少有多行注释?,parsing,programming-languages,comments,interpreted-language,Parsing,Programming Languages,Comments,Interpreted Language,在我所知道的解释语言(Python、Perl、R、bash)中,多行注释似乎通常涉及对语言另一个特性(例如多行字符串)的一些误用 解释器所做的解析类型是否有一些固有的东西使得多行注释变得困难?它似乎不应该与多行字符串有很大区别。在Python中,我们只是使用多行字符串作为注释 为什么一种语法有两种呢?事实上,我相信在实现任何形式的多行注释(基于大多数解析器用来读取/执行脚本的方法)时都没有意义。在我个人看来,由于分布和解释的原因,脚本最需要多行注释(大多数高级语言通常是编译的,并且只有一部分是开

在我所知道的解释语言(Python、Perl、R、bash)中,多行注释似乎通常涉及对语言另一个特性(例如多行字符串)的一些误用


解释器所做的解析类型是否有一些固有的东西使得多行注释变得困难?它似乎不应该与多行字符串有很大区别。

在Python中,我们只是使用多行字符串作为注释


为什么一种语法有两种呢?

事实上,我相信在实现任何形式的多行注释(基于大多数解析器用来读取/执行脚本的方法)时都没有意义。在我个人看来,由于分布和解释的原因,脚本最需要多行注释(大多数高级语言通常是编译的,并且只有一部分是开源的)。我知道Lua,一种脚本语言,确实提供了多行注释:

--[==[
COMMENT
]==]--
我相信很多语言都不支持这一点只是侥幸。通常可以只使用单行注释来创建多行注释

//*****************************************\\
//**                                     **\\
//**            JOHN SMITH               **\\
//**        COPYRIGHT 2008-2011          **\\
//**                                     **\\
//*****************************************\\

很多人也会利用单行注释创建一个很酷的图像(ASCII艺术),使用注释字符开始图像(类似于上面显示的,其中
/
是注释字符/短语)。

并非所有解释语言都缺少多行注释。例如,Ruby就拥有它们

我怀疑这主要是语言设计师的偏好。有些人并不认为多行注释是必要的功能。(现在许多代码编辑器提供快捷方式,使用单行注释注释/取消注释大块代码。)


此外,多行注释增加了解析器的复杂性。例如,它必须处理嵌套注释的可能性。如果没有必要,为什么还要增加复杂性呢?

我怀疑这只是一点语言偏见。C风格的多行注释往往出现在C风格的语言中,但大多数其他语言没有相应的注释


至于解析器本身。我没有理由认为解析器不实现多行注释,除了lang设计器不想实现之外。大多数解析器生成器都可以轻松处理该构造。

在您的问题中有两个错误的假设

第一个错误的假设是“解释/脚本语言很少有多行注释”。你有确认偏见。有带单行注释的编译语言(例如Fortran、许多Lisp方言)和带多行注释的解释语言(例如Perl、Python)


第二个错误的假设是涉及“滥用另一个特性”。语言作为一个整体设计得更好,如果存在的一些特性能够起作用,那么就不需要为多行注释引入额外的特性。例如,在Python中,存在多行字符串,而仅由字符串组成的指令是no-op,因此多行字符串可以产生很好的注释。在Perl中,获得多行注释的一种方法是通过文档格式;注释是一种文档,因此对多行注释使用
=pod…=cut
(多行字符串,通过
不,脚本语言没有理由不支持多行注释。JavaScript、Groovy、Lua、PHP、REXX、Smalltalk和Dart都支持多行注释

“如果没有必要,为什么还要增加复杂性"…但这就是多行注释的全部要点,以消除处理多行单行注释的复杂性。最好让编译器/解释器来处理它,而不是让开发人员来处理。我不认为多行注释对任何人来说都更简单。脚本语言通常只有一个字符,例如
#
,这意味着一个开始这很简单。在解析器中实现很简单,程序员记住很简单,非程序员记住很简单。在注释中使用grep很简单,如果不使用grep,则省略)。不需要增加复杂性,但收获甚微。@nos,@vocaro:带有多行注释的语言通常不允许嵌套它们。因此,多行注释是规则的,因此等同于单行注释(即CFG中的终端)。我不认为这会使解析器变得更加复杂。如果解析器没有能力进行多行注释,那么它就写得不好(对于解析器而言)。解析器的工作方式(不管怎样,大多数情况下)将使添加多行注释变得非常容易(合理)。除非多行注释嵌套,否则解析器甚至不会看到它们,只会看到lexer。有鉴于此,对多行注释进行lex处理并不比单行注释更难,也许这对Python是有效的,但Perl通常的理念是两种方法都比一种好。即使是Python通常也允许您以两种不同的方式来做相同的事情,如果这能提高清晰度的话。(至少对我来说,将字符串赋值为nothing并等同于注释并不明显。)@Xodarap:我没有回答其他语言的问题。我是为Python负责的。您的问题可能过于宽泛,无法给出任何可能的答案,因为每种语言的答案可能不同。不过,非C风格的语言也有多行注释:OCaml有
(*..*)
,Haskell有
{-..-}
…足够正确,我相信有人提到Ruby也有。但我几乎不认为OcAML或Haskell是主流,我从来没有听说过它们被嵌入在任何情况下。但是,完全有可能我从来没有遇到过这样的项目。你是不是打算坐在那里直截了当地告诉我拉里·沃尔拒绝多行评论,因为那样的话?@Xodarap:当然。作为通用电气的冠军,拉里·沃尔(Larry Wall)并没有为通用电气增加额外的功能