编译程序指令
目录
编译程序指令
在计算机编程中,指令或 pragma是一种语言结构,指定编译器(或其他翻译器)应如何处理其输入。 指令不是编程语言语法的一部分,并且可能因编译器而异。 它们可以由预处理器处理以指定编译器行为,或作为带内参数化的一种形式。
在某些情况下,指令指定全局行为,而在其他情况下,它们只影响局部部分,例如一段编程代码。 在某些情况下,例如某些 C 程序,指令是可选的编译器提示,可以忽略,但通常它们是规定性的,必须遵守。 但是,指令不执行语言本身的任何操作,而只是编译器行为的更改。
该术语可用于指代嵌入代码中的专有第三方标签和命令(或标记),这些标签和命令会导致额外的可执行处理,从而扩展开发环境中存在的现有编译器、汇编器和语言结构。
C 预处理器
在 C 和 C++ 中,该语言支持简单的宏预处理器。 应该由预处理器处理的源代码行,例如#define 和#include 被称为预处理器指令。
另一个 C 构造,#pragma 指令,用于指示编译器使用实用或依赖于实现的功能。 该指令的两个著名用户是 OpenMP 和 OpenACC。
类似于 C# 的预处理指令的句法结构,例如 C# 的 #if,通常也称为指令,尽管在这些情况下可能不涉及任何真正的预处理阶段。
历史
指令可追溯到 ALGOL 68,在那里它们被称为 pragmats(来自 pragmatic),表示为 pragmat 或 pr; 在较新的语言中,特别是 C,这已缩写为 pragma(没有’t’)。
ALGOL 68 中 pragmats 的一个常见用途是指定一个 stropping 规则,即如何指示关键字。 各种此类指令如下,指定 POINT、UPPER、RES(保留)或报价制度。
今天,指令在 1970 年代早期的 C 语言中最为人所知,并一直延续到当前的 C99 标准,它们要么是对 C 预处理器的指令,要么以#pragma 的形式是对编译器本身的指令。 它们也在某种程度上用于更现代的语言;
其他语言
- 在 Ada 中,编译器指令称为 pragmas(实用信息的缩写)。
- 在 Common Lisp 中,指令称为声明,并使用 declare 构造(也称为 proclaim 或 declaim)指定。 除了一个例外,声明是可选的,并且不会影响程序的语义。 一个例外是特殊的,必须在适当的地方指定。
- 在 Turbo Pascal 中,指令被称为重要注释,因为在语言语法中它们遵循与注释相同的句法。 在 Turbo Pascal 中,重要注释是xxx个字符是美元符号,第二个字符是字母的注释; 例如,与 C 的 #include 文件指令等效的是重要注释 {$I file}。
- 在Perl中,关键字use,导入模块,也可以用来指定指令,例如use strict; 或使用 utf8;.
- Haskell 编译指示使用专门的注释语法指定,例如 {-# 内联 foo #-}。

- Python 有两个指令——from __future__ import feature(在 PEP 236 中定义——回到 __future__),它改变了语言特性(并使用现有的模块导入语法,就像在 Perl 中一样),以及 coding 指令(在一个 comment) 来指定源代码文件的编码(在 PEP 263 — Defining Python Source Code Encodings 中定义)。 在 PEP 244 中提出并拒绝了一个更通用的指令声明——“指令”声明; 这些都可以追溯到 2001 年。
- ECMAScript 也对指令采用 use 语法,不同之处在于 pragma 被声明为字符串文字(例如 use strict; 或 use asm;),而不是函数调用。