【发布时间】:2011-05-20 18:34:22
【问题描述】:
在我所知道的解释语言(Python、Perl、R、bash)中,多行 cmets 似乎通常涉及对该语言的另一个特性(例如多行字符串)的一些误用。
解释器执行的解析类型是否有一些固有的东西使得多行 cmets 变得困难?它似乎与多行字符串没有显着差异。
【问题讨论】:
标签: parsing programming-languages comments interpreted-language
在我所知道的解释语言(Python、Perl、R、bash)中,多行 cmets 似乎通常涉及对该语言的另一个特性(例如多行字符串)的一些误用。
解释器执行的解析类型是否有一些固有的东西使得多行 cmets 变得困难?它似乎与多行字符串没有显着差异。
【问题讨论】:
标签: parsing programming-languages comments interpreted-language
不,脚本语言没有理由不支持多行 cmets。 JavaScript、Groovy、Lua、PHP、REXX、Smalltalk 和 Dart 都支持多行 cmets。
【讨论】:
事实上,我确信在实现任何形式的多行 cmets 时没有任何意义(基于大多数解析器用来读取/执行脚本的方法)。在我个人看来,由于分发和解释,脚本最需要多行 cmets(大多数高级语言通常是编译的,而且只有一部分是开源的)。我知道 Lua 这种脚本语言确实提供了多行 cmets:
--[==[
COMMENT
]==]--
我敢肯定,许多语言不支持这一点只是侥幸。仅使用单行 cmets 创建多行注释通常是可以接受的。
//*****************************************\\
//** **\\
//** JOHN SMITH **\\
//** COPYRIGHT 2008-2011 **\\
//** **\\
//*****************************************\\
很多人还会使用单行 cmets 创建一个很酷的图像 (ASCII ART),使用注释字符开始图像(类似于上面显示的内容,其中 // 是注释字符/短语)。
【讨论】:
在 Python 中,我们只是使用多行字符串作为注释。
为什么会有两种语法?
【讨论】:
并非所有解释语言都缺少多行 cmets。例如,Ruby 就有。
我怀疑这主要是语言设计者的偏好。有些人只是不认为多线 cmets 是必要的功能。 (现在许多代码编辑器都提供了使用单行 cmets 注释/取消注释大块代码的快捷方式。)
此外,多行 cmets 会增加解析器的复杂性。例如,它必须处理嵌套 cmets 的可能性。如果不需要,为什么还要增加复杂性?
【讨论】:
# 表示一行注释的开始。这很简单。在解析器中实现简单,程序员容易记住,非程序员也容易记住。简单地在 cmets 中使用 grep 或者如果您不在 cmets 中使用 grep 则省略)。无需增加复杂性而收效甚微。
我怀疑这只是有点语言偏见。 C 风格的多行 cmets 往往出现在 c-esque 语言中,但大多数其他语言没有等价物。
至于解析器本身。我没有理由认为解析器不实现多行 cmets,除了 lang 设计者不想这样做。大多数解析器生成器都可以轻松处理该构造。
【讨论】:
(* .. *),Haskell 有 {- .. -}...
您的问题中有两个错误的假设。
第一个错误假设是“解释/脚本语言很少有多行 cmets”。你正遭受确认偏见的困扰。有带有单行 cmets 的编译语言(例如 Fortran、许多 Lisp 方言)和带有多行 cmets 的解释语言(例如 Perl、Python)。
第二个错误假设是涉及“滥用另一个功能”。语言作为一个整体设计得更好,如果存在的某些功能可以解决问题,则无需为多行 cmets 引入额外的功能。例如,在 Python 中,存在多行字符串,并且仅由字符串组成的指令是无操作的,因此多行字符串可以构成很好的 cmets。在 Perl 中,拥有多行 cmets 的一种方法是通过 Pod,一种文档格式; cmets 是一种文档,所以对于多行 cmets 使用=pod … =cut 是很自然的(多行字符串,通过here documents <<'EOF'; … EOF,是另一种方法)。
【讨论】: