Директива (программирование)
Эта статья нуждается в дополнительных цитатах для проверки . ( декабрь 2013 г. ) |
В компьютерном программировании директива компилятор или прагма (от слова «прагматика») — это языковая конструкция , которая определяет, как ( или другой транслятор ) должен обрабатывать вводимые данные. В зависимости от языка программирования директивы могут быть или не быть частью грамматики языка и могут различаться от компилятора к компилятору. Они могут обрабатываться препроцессором для указания поведения компилятора или функционировать как форма внутриполосной параметризации.
В некоторых случаях директивы определяют глобальное поведение, тогда как в других случаях они влияют только на локальный раздел, например блок программного кода. В некоторых случаях, например в некоторых программах на языке C, директивы являются необязательными подсказками компилятора и могут игнорироваться, но обычно они носят предписывающий характер и должны соблюдаться. Однако директива не выполняет никаких действий в самом языке, а лишь изменяет поведение компилятора.
Этот термин может использоваться для обозначения проприетарных сторонних тегов и команд (или разметки), встроенных в код, которые приводят к дополнительной обработке исполняемого файла, расширяющей существующие конструкции компилятора, ассемблера и языка, присутствующие в среде разработки. Термин «директива» также применяется различными способами, похожими на термин «команда» .
Препроцессор C
[ редактировать ]В C и C++ язык поддерживает простой макросов препроцессор . Исходные строки, которые должны обрабатываться препроцессором, например: #define
и #include
называются директивами препроцессора .
Другая конструкция C, #pragma
Директива используется, чтобы указать компилятору использовать прагматические или зависящие от реализации функции. Двумя известными пользователями этой директивы являются OpenMP и OpenACC .
Синтаксические конструкции, аналогичные директивам препроцессора C, такие как C # #if
, также обычно называются «директивами», хотя в этих случаях может не быть никакой реальной фазы предварительной обработки.
Все команды препроцессора начинаются с символа решетки (#), за исключением директив импорта и модуля в C++ . [1]
История
[ редактировать ]Директивы датируются JOVIAL . [2]
COBOL Имел директиву COPY.
В АЛГОЛе 68 директивы известны как прагматы (от «прагматический») и обозначаются прагматами или pr ; в новых языках, особенно в C, это слово сокращается до «прагма» (без «т»).
Обычное использование прагматов в АЛГОЛе 68 заключается в указании режима ограничения , что означает «как обозначаются ключевые слова». Далее следуют различные подобные директивы, определяющие режимы POINT, UPPER, RES (зарезервировано) или котировки. Обратите внимание на использование ограничения для самого ключевого слова pragmat (сокращенно pr ) либо в режиме POINT, либо в режиме кавычки:
.PR POINT .PR .PR UPPER .PR .PR RES .PR 'pr' quote 'pr'
Сегодня директивы наиболее известны на языке C начала 1970-х годов и продолжаются до текущего стандарта C99 , где они либо представляют собой инструкции для препроцессора C , либо в форме #pragma
, директивы самому компилятору. Они также в некоторой степени используются в более современных языках; см. ниже.
Другие языки
[ редактировать ]- В Ada директивы компилятора называются прагмами (сокращение от «прагматическая информация»).
- В Common Lisp директивы называются объявлениями и задаются с помощью
declare
построить (такжеproclaim
илиdeclaim
). [3] За одним исключением, объявления не являются обязательными и не влияют на семантику программы. Единственным исключением являетсяspecial
, который необходимо указать там, где это необходимо. - В Turbo Pascal директивы называются значимыми комментариями языка , поскольку в грамматике они следуют тому же синтаксису, что и комментарии . В Turbo Pascal важным комментарием является комментарий, первый символ которого — знак доллара , а второй символ — буква; например, эквивалент C
#include "file"
директива является важным комментарием{$I "file"}
. - В Perl ключевое слово "
use
", который импортирует модули, также можно использовать для указания директив, таких какuse strict;
илиuse utf8;
. - Прагмы Haskell указываются с использованием специального синтаксиса комментариев, например
{-# INLINE foo #-}
. [4] - PHP использует директиву
declare(strict_types=1)
. - В Python есть две директивы –
from __future__ import feature
(определено в PEP 236 — Назад в __future__ ), которое изменяет возможности языка (и использует существующий синтаксис импорта модулей, как в Perl), иcoding
директива (в комментарии) для указания кодировки файла исходного кода (определена в PEP 263 — Определение кодировок исходного кода Python ). Более общее заявление о директиве было предложено и отклонено в PEP 244 — «Директива» ; все они датируются 2001 годом. - ECMAScript также принимает
use
синтаксис директив с той разницей, что прагмы объявляются как строковые литералы (например,"use strict";
, или"use asm";
), а не вызов функции. - В Visual Basic ключевое слово «
Option
" используется для директив:Option Explicit On|Off
- При включении запрещается неявное объявление переменных при первом использовании, требующем явного объявления заранее.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
- Когда включено, компилятор определяет тип локальных переменных на основе их инициализаторов.
- В Ruby директивы интерпретатора называются прагмами и задаются комментариями в начале файла, которые следуют за
key: value
обозначения. Например,coding: UTF-8
указывает, что файл закодирован с помощью UTF-8 кодировки символов . - В C# директивы компилятора называются директивами предварительной обработки. Существует ряд различных директив компилятора, включая #pragma, которая специально используется для управления предупреждениями компилятора и контрольными суммами отладчика. [5] [6]
- SQLite В состав СУБД входит директива PRAGMA, которая используется для введения команд, несовместимых с другими СУБД. [7]
- В Solidity директивы компилятора называются прагмами и задаются с помощью ключевого слова `pragma`. [8]
Язык ассемблера
[ редактировать ]- На языке ассемблера директивы, также называемые псевдооперациями или «псевдооперациями», обычно определяют такую информацию, как целевая машина, отмечают разделение между разделами кода, определяют и изменяют переменные времени сборки, определяют макросы, обозначают условные и повторяющиеся операции. код, определение зарезервированных областей памяти и т. д. Некоторые, но не все, ассемблеры используют особый синтаксис, чтобы отличать псевдооперации от мнемоники инструкций, например, предваряя псевдооперацию точкой, например псевдооперацию.
.END
, что может заставить ассемблер прекратить сборку кода.
ПЛ/SQL
[ редактировать ]- Oracle корпорации Процедурный язык PL/SQL включает набор директив компилятора, известных как «прагмы». [9]
См. также
[ редактировать ]- #pragma Once — директива препроцессора в C и C++.
Сноски
[ редактировать ]- ^ «P1857R1 — Обнаружение зависимостей модулей» .
- ^ «Глава 17 – Директивы» (PDF) . Руководство по компьютерному программированию для языка JOVIAL (J73) (PDF) (Технический отчет). Июнь 1981. стр. 243–263. RADC-TR-81-143 . Проверено 28 мая 2023 г.
- ^ Стил 1990 , Глава 9: Декларации , с. 215–237.
- ^ «7.20. Прагмы» . GHC 7.8.3 Документация . Проверено 18 июля 2014 г.
- ^ дотнет-бот. «Лексическая структура — спецификация языка C#» . docs.microsoft.com . Проверено 1 ноября 2019 г.
- ^ БиллВагнер. «#pragma — Справочник по C#» . docs.microsoft.com . Проверено 1 ноября 2019 г.
- ^ «Операторы Pragma, поддерживаемые SQLite» . www.sqlite.org .
- ^ «Макет исходного файла Solidity — документация Solidity 0.8.27» . docs.soliditylang.org . Проверено 3 июня 2024 г.
- ^
Фейерштейн, Стивен ; Прибыл, Билл (23 января 2014 г.). Программирование Oracle PL/SQL (6-е изд.). O'Reilly Media, Inc. (опубликовано в 2014 г.). ISBN 9781449324414 . Проверено 16 июня 2016 г.
В PL/SQL есть ключевое слово PRAGMA со следующим синтаксисом: PRAGMA Instruction_to_compiler ; [...] PL/SQL предлагает несколько прагм [...]
Ссылки
[ редактировать ]- Стил, Гай Л. (1990). Общий язык Lisp . Цифровая пресса. стр. 215–237. ISBN 1-55558-041-6 .