Directive (programming): Difference between revisions

Content deleted Content added
m Reverted edits by 27.77.108.97 (talk) to last version by 45.250.44.224
 
(43 intermediate revisions by 31 users not shown)
Line 1:
{{short description|Language construct that specifies how a compiler should process its input}}
{{Refimprove|date=December 2013}}
In [[computer programming]], a '''directive''' or '''pragma''' (from "pragmatic") is a [[language construct]] that specifies how a [[compiler]] (or other [[Translator (computing)|translator]]) should process its input. DirectivesDepending areon the [[programming language]], directives may or may not be part of the [[Formal grammar|grammar]] of a [[programmingthe language]], and may vary from compiler to compiler. They can be processed by a [[preprocessor]] to specify compiler behavior, or function as a form of [[In-band signaling|in-band]] parameterization.
 
In some cases directives specify global behavior, while in other cases they only affect a local section, such as a block of programming code. In some cases, such as some C programs, directives are optional compiler hints, and may be ignored, but normally they are prescriptive, and must be followed. However, a directive does not perform any action in the language itself, but rather only a change in the behavior of the compiler.
 
This term could be used to refer to proprietary third -party tags and commands (or markup) embedded in code that result in additional executable processing that extend the existing compiler, assembler and language constructs present in the development environment. The term "directive" is also applied in a variety of ways that are similar to the term ''command''.
 
==The C preprocessor==
Line 9 ⟶ 11:
 
In [[C (programming language)|C]] and [[C++]], the language supports a simple [[Macro (computer science)|macro]] [[preprocessor]]. Source lines that should be handled by the preprocessor, such as <code>#define</code> and <code>#include</code> are referred to as ''preprocessor directives''.
 
Another C construct, the <code>#pragma</code> directive, is used to instruct the compiler to use pragmatic or implementation-dependent features. Two notable users of this directive are [[OpenMP]] and [[OpenACC]].
 
Syntactic constructs similar to C's preprocessor directives, such as [[C Sharp (programming language)|C#]]'s <code>#if</code>, are also typically called "directives", although in these cases there may not be any real preprocessing phase involved.
 
All preprocessor commands, except for <code>defined</code> (when following a conditional directive), begin with a hash symbol (#). Until [[C++26]], the keywords <code>export</code>, <code>import</code> and <code>module</code> were partially handled by the preprocessor.<ref>{{cite web|url=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1857r1.html|title=P1857R1 - Modules Dependency Discovery}}</ref>
All preprocessor commands begin with a hash symbol (#).
 
==History==
Directives date to [[JOVIAL]].<ref>{{cite tech report
Directives date to [[ALGOL 68]], where they are known as [[ALGOL 68#pr .26 co: Pragmats and Comments|pragmats]] (from "pragmatic"), and denoted '''pragmat''' or '''pr'''; in newer languages, notably C, this has been abbreviated to "pragma" (no 't').
| title = Computer Programming Manual for JOVIAL (J73) Language
| id = RADC-TR-81-143
| date = June 1981
| section = Chapter 17 - Directives
| section-url = https://apps.dtic.mil/sti/pdfs/ADA101061.pdf#page=248
| pages = 243-263
| url = https://apps.dtic.mil/sti/pdfs/ADA101061.pdf
| access-date = May 28, 2023
}}
</ref>
<!-- Replace with an older online version if not behind a paywall -->
 
[[COBOL]] has a COPY directive.
A common use of pragmats in ALGOL 68 is in specifying a [[Stropping (syntax)|stropping]] regime, meaning "how keywords are indicated". Various such directives follow, specifying the POINT, UPPER, RES (reserved), or quote regimes. Note the use of stropping for the '''pragmat''' keyword itself (abbreviated '''pr'''), either in the POINT or quote regimes:
.PR POINT .PR
.PR UPPER .PR
.PR RES .PR
'pr' quote 'pr'
 
DirectivesIn date to [[ALGOL 68]], where theydirectives are known as [[ALGOL 68#pr .26 co: Pragmats and Comments|pragmats]] (from "pragmatic"), and denoted '''pragmat''' or '''pr'''; in newer languages, notably C, this has been abbreviated to "pragma" (no 't').
 
A common use of pragmats in ALGOL 68 is in specifying a [[Stropping (syntax)|stropping]] regime, meaning "how keywords are indicated". Various such directives follow, specifying the POINT, UPPER, RES (reserved), or quote regimes. Note the use of stropping for the '''pragmat''' keyword itself (abbreviated '''pr'''), either in the POINT or quote regimes:
{{sxhl|2=man|1=
.PR POINT .PR
.PR UPPER .PR
.PR RES .PR
'pr' quote 'pr'
}}
Today directives are best known in the C language, of early 1970s vintage, and continued through the current [[C99]] standard, where they are either instructions to the [[C preprocessor]], or, in the form of <code>#pragma</code>, directives to the compiler itself. They are also used to some degree in more modern languages; see below.
 
==Other languages==
* In [[Ada (programming language)|Ada]], compiler directives are called '''pragmas''' (short for "pragmatic information").
* In [[Common Lisp]], directives are called '''declarations''', and are specified using the <code>declare</code> construct (also <code>proclaim</code> or <code>declaim</code>).{{sfn|Steele|1990|loc=[httphttps://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node103.html Chapter 9: Declarations], p. 215–237}} With one exception, declarations are optional, and do not affect the semantics of the program. The one exception is <code>special</code>, which must be specified where appropriate.
* In [[Turbo Pascal]], directives are called '''significant comments''', because in the language [[grammar]] they follow the same syntax as [[comment (computer programming)|comment]]s. In Turbo Pascal, a significant comment is a comment whose first character is a [[dollar sign]] and whose second character is a letter; for example, the equivalent of C's <code>#include "file"</code> directive is the significant comment <code>{$I "file"}</code>.
* In [[Perl]], the [[keyword (computer programming)|keyword]] "<code>[http://perldoc.perl.org/functions/use.html use]</code>", which imports modules, can also be used to specify directives, such as <code>use strict;</code> or <code>use utf8;</code>.
* The [[Glasgow Haskell Compiler]], the most commonly used [[Haskell (programming language)|Haskell]] compiler,pragmas supportsare pragmasspecified suchusing asa specialized comment syntax, e.g. <code>{-# INLINE foo #-}</code>.<ref>{{cite web|title=7.20. Pragmas|url=http://www.haskell.org/ghc/docs/7.8.3/html/users_guide/pragmas.html|website=GHC 7.8.3 Documentation|accessdateaccess-date=18 July 2014}}</ref> It is also possible to use the C preprocessor in Haskell, by writing <syntaxhighlight lang="Haskell" inline>{-# LANGUAGE CPP #-}</syntaxhighlight>.
* [[PHP]] uses the directive <code>declare(strict_types=1)</code>.
* In [[PL/I]], directives begin with a [[Percent sign]] (<code>%</code>) and end with a semicolon (<code>;</code>), e.g., <code>%INCLUDE ''foo'';</code>, <code>%NOPRINT;</code>, <code>%PAGE;</code>, <code>%POP;</code>, <code>%SKIP;</code>, the same as with preprocessor statements.
* [[Python (programming language)|Python]] has two directives – <code>from __future__ import feature</code> (defined in [https://www.python.org/dev/peps/pep-0236/ PEP 236 -- Back to the __future__]), which changes language features (and uses the existing module import syntax, as in Perl), and the <code>coding</code> directive (in a comment) to specify the encoding of a source code file (defined in [https://www.python.org/dev/peps/pep-0263/ PEP 263 -- Defining Python Source Code Encodings]). A more general directive statement was proposed and rejected in [https://www.python.org/dev/peps/pep-0244/ PEP 244 -- The `directive' statement]; these all date to 2001.
* [[ECMAScript]] also adopts the <code>use</code> syntax for directives, with the difference that pragmas are declared as string literals (e.g. <code>"use strict";</code>, or <code>"use asm";</code>), rather than a function call.
Line 45 ⟶ 63:
** <code>Option Infer On|Off</code> - When on enables the compiler to infer the type of local variables from their initializers.
* In [[Ruby (programming language)|Ruby]], interpreter directives are referred to as '''pragmas''' and are specified by top-of-file comments that follow a <code>key: value</code> notation. For example, <code>coding: UTF-8</code> indicates that the file is encoded via the [[UTF-8]] [[character encoding]].
* In [[C Sharp (programming language)|C#]], compiler directives are called pre-processing directives. C# does not technically handle these using a preprocessor, but rather directly in the code. There are a number of different compiler directives, which mostly align with those from C and C++, including <code>#pragma</code>, which is specifically used to control compiler warnings and debugger checksums.<ref>{{Cite web|url=https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure|title=Lexical structure - C# language specification|last=dotnet-bot|website=docs.microsoft.com|language=en-us|access-date=2019-11-01}}</ref><ref>{{Cite web|url=https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-pragma|title=#pragma - C# Reference|last=BillWagner|website=docs.microsoft.com|language=en-us|access-date=2019-11-01}}</ref> C# also features some directives not used in C or C++, including <code>#nullable</code> and <code>#region</code>. C# also does not allow function-like macros, but does allow regular macros, for purposes such as conditional compilation.
* The [[SQLite]] [[DBMS]] includes a PRAGMA directive that is used to introduce commands that are not compatible with other DBMS.<ref>{{cite web |title=Pragma statements supported by SQLite |url=https://www.sqlite.org/pragma.html |website=www.sqlite.org}}</ref>
* In [[Solidity]], compiler directives are called pragmas, and are specified using the `pragma` keyword.<ref>{{Cite web |title=Layout of a Solidity Source File — Solidity 0.8.27 documentation |url=https://docs.soliditylang.org/en/latest/layout-of-source-files.html#pragmas |access-date=2024-06-03 |website=docs.soliditylang.org}}</ref>
 
===Assembly language===
* In [[assembly language]], directives, also referred to as pseudo-operations or "pseudo-ops", generally specify such information as the target machine, mark separations between code sections, invokedefine and change assembly-time variables, define macros, designate conditional and repeated code, define reserved memory areas, and so on. AssemblersSome, but not all, assemblers use a specific syntax to differentiate pseudo-ops from instruction mnemonics, such as prefacing the pseudo-op with a period, such as the pseudo-op <code>.END</code>, which might direct the assembler to stop assembling code.
<!-- Should there be examples? -->
 
===PL/SQL===
Line 58 ⟶ 80:
| first2 = Bill
| title = Oracle PL/SQL Programming
| date = 23 January 2014
| url = https://books.google.com/books?id=vQaoAgAAQBAJ
| edition = 6
Line 63 ⟶ 86:
| publication-date = 2014
| isbn = 9781449324414
| accessdateaccess-date = 2016-06-16
| quote = PL/SQL has a PRAGMA keyword with the following syntax: PRAGMA ''instruction_to_compiler''; [...] PL/SQL offers several pragmas [...]
}}
Line 69 ⟶ 92:
 
==See also==
* <code>[[{{annotated link|pragma once|#pragma once]]</code>}}
 
==ReferencesFootnotes==
{{Refimprove|date=December 2013}}
{{reflist}}
 
==References==
{{refbegin}}
* {{cite book | isbn = 1-55558-041-6 | title = [[Common Lisp the Language]] | last = Steele | first = Guy L. | authorlinkauthor-link = Guy L. Steele | year = 1990 | publisher = Digital Press | pages = 215–237 }}
{{refend}}
 
Line 81 ⟶ 105:
* [http://www.openmp.org OpenMP Website]
* [http://www.openacc.org OpenACC Website]
* [httphttps://wwwweb.archive.org/web/20130616205308/http://openhmpp.org/ OpenHMPP Website]
 
{{DEFAULTSORT:Directive (Programming)}}