Директива (програмування)
У комп'ютерному програмуванні директива або прагма (від англ. pragmatic) — це мовна конструкція, яка вказує, як компілятор (або інший транслятор) має обробляти вхідні дані. Директиви не є частиною граматики мови програмування і можуть відрізнятися від компілятора до компілятора. Вони можуть оброблятися препроцесором для визначення поведінки компілятора або діяти як форма внутрішньосмугової[en] параметризації.
У деяких випадках директиви визначають глобальну поведінку, тоді як в інших вони впливають лише на локальний розділ, наприклад на блок програмного коду. Іноді, наприклад у деяких програмах на C, директиви є необов'язковими підказками для компілятора, і їх можна нехтувати, але зазвичай вони є наказовими, і їх потрібно дотримуватися. Однак директива не виконує жодної дії в самій мові, а лише змінює поведінку компілятора.
Цей термін може використовуватися для позначення власних тегів і команд (чи розмітки) сторонніх розробників, вбудованих у код, які призводять до додаткового опрацювання виконуваних файлів, що розширює конструкції компілятора, асемблера та мови, наявні в середовищі розробки. Термін «директива» також застосовують подібно до терміна команда.
Мови C і C++ підтримують простий препроцесор макросів. Вхідні рядки, які має опрацьовувати препроцесор, такі як #define
і #include
, називаються директивами препроцесора.
Інша конструкція C, директива #pragma
, використовується для вказання компілятору використовувати прагматичні або залежні від реалізації функції. До відомих застосувань цієї директиви належать OpenMP і OpenACC.
Синтаксичні конструкції, подібні до директив препроцесора C, такі як #if
у C#, також зазвичай називаються «директивами», хоча в цих випадках може не бути реальної фази попередньої обробки.
Усі команди препроцесора починаються з символу ґратки (#).
Директиви відомі з часів ALGOL 68, де вони відомі як прагмати (від англ. pragmatic) і позначаються pragmat або pr; у новіших мовах, зокрема C, назву і позначення скорочено до «pragma» (без «t»).
Звичним у ALGOL 68 є використання прагматів для визначення режиму стропінгу[en], тобто «як вказуються ключові слова». Далі йдуть різні директиви, які визначають режими POINT, UPPER, RES (зарезервовано) або котирування. Зверніть увагу на використання стропінгу для самого ключового слова pragmat (скорочено pr), а також на режими з крапками або в лапках:
. PR POINT . PR . PR UPPER . PR . PR RES . PR 'pr' цитата 'pr'
Нині директиви, найвідоміші в мові C від початку 1970-х років, є в поточному стандарті C99, де вони є або інструкціями для препроцесора C, або, у формі #pragma
, директивами для самого компілятора. Вони також певною мірою використовуються в сучасніших мовах (див. нижче).
- В Ada директиви компілятора називають прагмами (pragma; скорочено від «прагматична інформація»).
- У Common Lisp директиви називають деклараціями і вказують за допомогою конструкції
declare
(такожproclaim
абоdeclaim
). [1] За одним винятком, декларації є необов'язковими і не впливають на семантику програми. Єдиним винятком єspecial
, який необхідно вказати, де це необхідно. - У Turbo Pascal директиви називають значущими коментарями, оскільки в граматиці мови їх синтаксис такий самий, як у коментарів. У Turbo Pascal значущим коментарем є коментар, перший символ якого — це знак долара ($), а другий — буква; наприклад, еквівалентом директиви C
#include "file"
є значущий коментар{$I "file"}
. - У Perl ключове слово «
use
», яке імпортує модулі, також може використовуватися для визначення директив, наприкладuse strict;
абоuse utf8;
. - Прагми Haskell визначаються за допомогою спеціального синтаксису коментарів, наприклад
{-# INLINE foo #-}
[2]. - Python має дві директиви —
from __future__ import feature
(визначено в PEP 236[3]), яка змінює мовні функції (і використовує синтаксис імпорту модуля, як у Perl), і директивуcoding
(у коментарі) для зазначення кодування сирцевого файлу (визначено в PEP 263[4]). Дещо загальніший синтаксис для директив запропоновано та відхилено в PEP 244[5]. Все це датується 2001 роком. - ECMAScript також використовує для директив синтаксис
use
, з тією різницею, що прагми оголошуються як рядкові літерали (наприклад,"use strict";
, або"use asm";
), а не як виклик функції. - У Visual Basic для директив використовують ключове слово «
Option
»:Option Explicit On|Off
— коли ввімкнено (On), забороняє неявне оголошення змінних під час першого використання, що вимагає попереднього явного оголошення.Option Compare Binary
— вмикає порівняння рядків на основі порядку сортування, отриманого зі внутрішніх двійкових подань символів — наприклад, для англійської/європейської кодової сторінки (ANSI 1252) A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø. Впливає на внутрішні оператори (наприклад, =, <>, <, >), блокSelect Case
та рядкові функції бібліотеки часу виконання VB (наприкладInStr
).Option Compare Text
— вмикає порівняння рядків на основі порядку сортування тексту без урахування регістру, визначеного локаллю системи — наприклад, для англійської/європейської кодової сторінки (ANSI 1252) (A=a) < (À = à) < (B= b) < (E=e) < (Ê = ê) < (Z=z) < (Ø = ø). Впливає на внутрішні оператори (наприклад, =, <>, <, >), блокSelect Case
та рядкові функції бібліотеки часу виконання VB (наприкладInStr
).Option Strict On|Off
— коли увімкнено, забороняє:- безтипове програмування — де оголошення, які не мають явного типу, неявно вводяться як
Object
. - пізнє зв'язування (тобто динамічна відправка до об'єктів CLR, DLR і COM) для значень, статично введених як Object.
- неявні перетворення звуження — вимагають, щоб усі перетворення у вужчі типи (наприклад, від
Long
доInteger
,Object
доString
,Control
доTextBox
) були в коді явними, тобто, з використанням операторів перетворення (наприкладCInt
,DirectCast
,CType
).
- безтипове програмування — де оголошення, які не мають явного типу, неявно вводяться як
Option Infer On|Off
— коли увімкнено (On
), компілятор може визначати тип локальних змінних за їх ініціалізаторами.
- У Ruby директиви інтерпретатора називаються прагмами і визначаються коментарями у верхній частині файлу у форматі
ключ: значення
. Наприклад,coding: UTF-8
вказує, що у файлі використано кодування символів UTF-8. - У C# директиви компілятора називають директивами попередньої обробки. Існують різні директиви компілятора, зокрема #pragma, яка використовується для керування попередженнями компілятора та контрольними сумами налагоджувача[6][7].
- СУБД SQLite містить директиву PRAGMA, за допомогою якої вводять команди, які не сумісні з іншими СУБД[8].
- У мові асемблера директиви, які також називають псевдоопераціями, зазвичай вказують таку інформацію, як цільова машина, відокремлюють розділи коду, викликають макроси, визначають зарезервовані ділянки пам'яті тощо. Щоб відрізнити псевдооперації від мнемоніки інструкцій, асемблери використовують специфічний синтаксис, наприклад, перед псевдооперацією ставиться крапка (наприклад, псевдооперація
.
END
наказує асемблеру припинити збирання коду).
- Процедурна мова PL/SQL корпорації Oracle включає набір директив компілятора, відомих як «прагми»[9].
- #pragma once – директива препроцесора в Сі та C++
- ↑ Steele, 1990, Chapter 9: Declarations, p. 215–237.
- ↑ 7.20. Pragmas. GHC 7.8.3 Documentation. Архів оригіналу за 26 липня 2014. Процитовано 18 липня 2014.
- ↑ PEP 236 – Back to the __future__ | peps.python.org. peps.python.org. Архів оригіналу за 7 квітня 2022. Процитовано 4 квітня 2022.
- ↑ PEP 263 – Defining Python Source Code Encodings | peps.python.org. peps.python.org. Архів оригіналу за 4 квітня 2022. Процитовано 4 квітня 2022.
- ↑ PEP 244 – The directive statement | peps.python.org. peps.python.org. Архів оригіналу за 4 квітня 2022. Процитовано 4 квітня 2022.
- ↑ dotnet-bot. Lexical structure - C# language specification. docs.microsoft.com (амер.). Архів оригіналу за 4 квітня 2022. Процитовано 1 листопада 2019.
- ↑ BillWagner. #pragma - C# Reference. docs.microsoft.com (амер.). Архів оригіналу за 28 січня 2021. Процитовано 1 листопада 2019.
- ↑ Pragma statements supported by SQLite. www.sqlite.org. Архів оригіналу за 8 квітня 2022. Процитовано 4 квітня 2022.
- ↑ Feuerstein, Steven; Pribyl, Bill. Oracle PL/SQL Programming (вид. 6). O'Reilly Media, Inc. ISBN 9781449324414. Архів оригіналу за 4 квітня 2022. Процитовано 16 червня 2016.
PL/SQL has a PRAGMA keyword with the following syntax: PRAGMA instruction_to_compiler; [...] PL/SQL offers several pragmas [...]
- Вебсайт OpenMP [Архівовано 20 липня 2008 у Wayback Machine.]
- Вебсайт OpenACC [Архівовано 15 червня 2012 у Wayback Machine.]
- Вебсайт OpenHMPP