我是 VBA 编程的新手。我想我曾经在某个地方见过它,但我完全忘记在哪里见过它了。也许是从别人那里听说过的。
我的问题:VBA 中的注释和空格的数量会影响代码的性能吗?
我猜想在 Excel 和 Access 中应该是相同的,但我不想假设,所以我将指定我使用的是 Access 2003。
答案1
编译器和解释器通常会忽略空格字符和注释。我找不到专门针对 VBA 的官方声明(类似于这对于 Visual Studio 中的 C 代码,VBA 的行为似乎是一样的。
关于代码在 VBA 中影响程序的性能,显然代码越多,程序完成执行所需的时间就越长。
答案2
还要记住,变量和常量名称在编译的程序中不存在。
module-body-physical-structure = *source-line [non-terminated-line] source-line = *non-line-termination-character line-terminator non-terminated-line = *non-line-termination-character line-terminator = (%x000D %x000A) / %x000D / %x000A / %x2028 / %x2029 non-line-termination-character = <any character other than %x000D / %x000A / %x2028 / %x2029>
实现可以限制物理行中允许的字符数。本规范未定义包含任何超过此类实现限制的物理行的模块的含义。如果 <module-body-physical-structure> 以 <non-terminated-line> 结尾,则实现可以将该模块视为 <non-terminated-line> 后紧跟 <line-terminator>。
为了解释为 VBA 程序文本,模块主体(第 4.2 节)被视为一组逻辑行,其中每行可能对应多条物理行。此结构由逻辑行语法描述。此语法的终端符号是 Unicode 字符代码点。
module-body-logical-structure = *extended-line extended-line = *(line-continuation / non-line-termination-character) line-terminator line-continuation = *WSC underscore *WSC line-terminator WSC = (tab-character / eom-character /space-character / DBCS-whitespace / most-Unicode-class-Zs) tab-character = %x0009 eom-character = %x0019 space-character = %x0020 underscore = %x005F DBCS-whitespace = %x3000 most-Unicode-class-Zs = <all members of Unicode class Zs which are not CP2-characters>
实现可以限制 <extended-line> 中的字符数。为了便于规范,可以方便地明确引用紧接在逻辑行开头之前的点和紧接在逻辑行的最后一个行终止符之前的点。这是通过使用 <LINE-START> 和 <LINE-END> 作为 VBA 语法的终止符号来实现的。<LINE-START> 定义为紧接在每个逻辑行之前,而 <LINE-END> 定义为替换每个逻辑行末尾的 <line-terminator>:
module-body-lines = *logical-line logical-line = LINE-START *extended-line LINE-END
当在 ABNF 规则定义中使用时,<LINE-START> 和 <LINE-END> 用于指示 <logical-line> 所需的开始或结束。
VBA 程序的语法最容易用词汇标记而不是单个 Unicode 字符来描述。尤其是,大多数句法元素之间的空白或行连续通常与句法语法无关。如果句法语法不必描述此类可能的空白出现,那么句法语法就会大大简化。这是通过使用词汇标记(也简称为标记)来实现的,词汇标记将空格抽象为句法语法的终止符号。词汇语法将 <module-body-lines> 的解释定义为一组这样的词汇标记。
词汇语法的终端元素是 Unicode 字符和 <LINE-START> 和 <LINE-END> 元素。通常,所有以大写字母书写的词汇语法规则名称也是 VBA 句法语法的词汇标记和终端元素。ABNF 引用文字规则也被视为句法语法的词汇标记。词汇标记包含紧接在它们前面的任何空格字符。请注意,在词汇语法中使用时,引用文字规则不被视为标记,因此任何前面的空格字符都很重要。
WS = 1*(WSC / line-continuation) special-token = "," / "." / "!" / "#" / "&" / "(" / ")" / "*" / "+" / "-" / "/" / ":" / ";" / "<" / "=" / ">" / "?" / "\" / "^" NO-WS = <no whitespace characters allowed here> NO-LINE-CONTINUATION = <a line-continuation is not allowed here> EOL = [WS] LINE-END / single-quote comment-body EOS = *(EOL / ":") ;End Of Statement single-quote = %x0027 ; ' comment-body = *(line-continuation / non-line-termination-character) LINE-END
<special-token> 用于标识 VBA 程序语法中具有特殊含义的单个字符。由于它们是词汇标记(第 3.3 节),因此这些字符前面可能有被忽略的空格字符。在句法语法中,任何引用的 <special-token> 元素作为语法元素出现都是对相应标记的引用(第 3.3 节)。
<NO-WS> 用作句法语法的终端元素,表示紧随其后的标记前面不能有任何空格字符。 <NO-LINE-CONTINUATION> 用作句法语法的终端元素,表示紧随其后的标记前面不能有任何包含 <linecontinuation> 序列的空格。
<WS> 用作句法语法的终端元素,表示紧随其后的标记必须以一个或多个空格字符开头。
<EOL> 用作句法语法的元素,以命名充当语句“语句结束”标记的标记,该语句必须是逻辑行上唯一或最后一个语句。
<EOS> 用作句法语法的终端元素,用于命名充当“语句结束”标记的标记。通常,语句结束由 <LINE-END> 或冒号字符标记。<single-quote> 和 <LINE-END> 之间的任何字符都是将被忽略的注释文本。
答案3
您可能会注意到,VBA 在编辑时被解析为可执行标记,而不是在运行时。
多个内联空格被编译为单个 n 空格标记,因此可以重新显示它们以进行编辑,但实际上它们只是编译代码中的单个标记。因此,在单词之间放置多少个空格并不重要。100 与 1 相同。
因此,当您完成编辑时(而不是运行时),此“通过构造纠正”会有效地删除所有空格。
自己尝试一下。在行尾添加一些额外的空格,移至下一行,然后移回,空格就消失了。还请注意,如果您尝试输入无效代码,它会发出抱怨,直到您更正它。这是早期解析和标记化的签名。
所以你的问题的答案是,代码运行时没有多余的空格,因为代码是预编译的,所以它不会影响速度。
我认为构造正确确实很酷。它集运行时解释器和快速编译器于一身!
Forth 计算机语言中的解析器在工作方式上做了类似的事情,但它当然没有正确的构造编辑器。我一直希望能给它添加一个。
答案4
VBA 是一种解释型语言,这意味着解释器每次运行时都必须解析所有人类可读的代码,而编译型语言则不同,在编译型语言中,人类可读的代码只需编译一次即可变成机器可读的代码。在这两种情况下,空格和注释都会在执行前被删除。
理论上,您可以在 VBA 代码中放入足够多的额外空白和/或注释,最终会减慢解释器的速度,但您可能必须在其中放入数千或数万行额外的垃圾才能注意到差异。
但这将是一个有趣的实验!