Директива (програмування)

У комп'ютерному програмуванні директива або прагма (від англ. pragmatic) — це мовна конструкція, яка вказує, як компілятор (або інший транслятор) має обробляти вхідні дані. Директиви не є частиною граматики мови програмування і можуть відрізнятися від компілятора до компілятора. Вони можуть оброблятися препроцесором для визначення поведінки компілятора або діяти як форма внутрішньосмугової[en] параметризації.

У деяких випадках директиви визначають глобальну поведінку, тоді як в інших вони впливають лише на локальний розділ, наприклад на блок програмного коду. Іноді, наприклад у деяких програмах на C, директиви є необов'язковими підказками для компілятора, і їх можна нехтувати, але зазвичай вони є наказовими, і їх потрібно дотримуватися. Однак директива не виконує жодної дії в самій мові, а лише змінює поведінку компілятора.

Цей термін може використовуватися для позначення власних тегів і команд (чи розмітки) сторонніх розробників, вбудованих у код, які призводять до додаткового опрацювання виконуваних файлів, що розширює конструкції компілятора, асемблера та мови, наявні в середовищі розробки. Термін «директива» також застосовують подібно до терміна команда.

Препроцесор 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 наказує асемблеру припинити збирання коду).

Див. також

[ред. | ред. код]
  • #pragma once – директива препроцесора в Сі та C++

Примітки

[ред. | ред. код]
  1. Steele, 1990, Chapter 9: Declarations, p. 215–237.
  2. 7.20. Pragmas. GHC 7.8.3 Documentation. Архів оригіналу за 26 липня 2014. Процитовано 18 липня 2014.
  3. PEP 236 – Back to the __future__ | peps.python.org. peps.python.org. Архів оригіналу за 7 квітня 2022. Процитовано 4 квітня 2022.
  4. PEP 263 – Defining Python Source Code Encodings | peps.python.org. peps.python.org. Архів оригіналу за 4 квітня 2022. Процитовано 4 квітня 2022.
  5. PEP 244 – The directive statement | peps.python.org. peps.python.org. Архів оригіналу за 4 квітня 2022. Процитовано 4 квітня 2022.
  6. dotnet-bot. Lexical structure - C# language specification. docs.microsoft.com (амер.). Архів оригіналу за 4 квітня 2022. Процитовано 1 листопада 2019.
  7. BillWagner. #pragma - C# Reference. docs.microsoft.com (амер.). Архів оригіналу за 28 січня 2021. Процитовано 1 листопада 2019.
  8. Pragma statements supported by SQLite. www.sqlite.org. Архів оригіналу за 8 квітня 2022. Процитовано 4 квітня 2022.
  9. 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 [...]

Посилання

[ред. | ред. код]