Dyrektywa (programowanie)
W programowaniu komputerowym dyrektywa lub pragma (od „pragmatic”) jest konstrukcją językową , która określa, w jaki sposób kompilator ( lub inny tłumacz ) powinien przetwarzać dane wejściowe. Dyrektywy nie są [ kwestionowane ] część gramatyki języka programowania i mogą różnić się w zależności od kompilatora. Mogą być przetwarzane przez preprocesor aby określić zachowanie kompilatora lub działać jako forma parametryzacji w paśmie.
W niektórych przypadkach dyrektywy określają globalne zachowanie, podczas gdy w innych wpływają tylko na sekcję lokalną, taką jak blok kodu programowania. W niektórych przypadkach, takich jak niektóre programy C, dyrektywy są opcjonalnymi wskazówkami kompilatora i można je zignorować, ale zwykle mają charakter nakazowy i należy ich przestrzegać. Jednak dyrektywa nie wykonuje żadnej akcji w samym języku, a jedynie zmianę zachowania kompilatora.
Termin ten może odnosić się do zastrzeżonych znaczników i poleceń (lub znaczników) stron trzecich osadzonych w kodzie, które skutkują dodatkowym przetwarzaniem wykonywalnym, rozszerzającym istniejący kompilator, asembler i konstrukcje językowe obecne w środowisku programistycznym. Termin „dyrektywa” jest również stosowany na różne sposoby, które są podobne do terminu „ polecenie” .
Preprocesor C
W językach C i C++ język obsługuje prosty preprocesor makr . Wiersze źródłowe, które powinny być obsługiwane przez preprocesor, takie jak #define
i #include
, nazywane są dyrektywami preprocesora .
Inna konstrukcja C, dyrektywa #pragma
, służy do instruowania kompilatora, aby używał funkcji pragmatycznych lub zależnych od implementacji. Dwoma godnymi uwagi użytkownikami tej dyrektywy są OpenMP i OpenACC .
Konstrukcje składniowe podobne do dyrektyw preprocesora C, takie jak C# #if ,
są również zwykle nazywane „dyrektywami”, chociaż w takich przypadkach może nie być żadnej rzeczywistej fazy przetwarzania wstępnego.
Wszystkie polecenia preprocesora zaczynają się od znaku krzyżyka (#).
Historia
Dyrektywy pochodzą z ALGOL 68 , gdzie są znane jako pragmaty (od „pragmatyczny”) i oznaczane jako pragmat lub pr ; w nowszych językach, zwłaszcza C, zostało to skrócone do „pragma” (bez „t”).
Powszechnym zastosowaniem pragmatów w ALGOL 68 jest określanie reżimu stropowania , co oznacza „sposób wskazywania słów kluczowych”. Następują różne takie dyrektywy, określające systemy POINT, UPPER, RES (zarezerwowane) lub kwotowania. Zwróć uwagę na użycie stropowania dla pragmat (w skrócie pr ), albo w systemach POINT, albo cudzysłowach:
.PR PUNKT .PR .PR UPPER .PR .PR RES .PR 'pr' cytat 'pr'
Obecnie dyrektywy są najlepiej znane w języku C, pochodzącym z wczesnych lat 70. i były kontynuowane w obecnym standardzie C99 , gdzie są albo instrukcjami dla preprocesora C , albo w formie #pragma
dyrektywami dla samego kompilatora. Są również używane do pewnego stopnia w bardziej nowoczesnych językach; patrz poniżej.
Inne języki
- W Adzie dyrektywy kompilatora nazywane są pragmas (skrót od „informacje pragmatyczne”).
- W Common Lisp dyrektywy nazywane są deklaracjami i są określane za pomocą konstrukcji
deklarowania
(równieżproklamuj
lubdeklamuj
). Z jednym wyjątkiem deklaracje są opcjonalne i nie wpływają na semantykę programu. Jedynym wyjątkiem jestspecial
, który musi być określony w stosownych przypadkach. - W Turbo Pascalu dyrektywy nazywane są znaczącymi komentarzami , ponieważ w gramatyce języka mają taką samą składnię jak komentarze . W Turbo Pascalu znaczącym komentarzem jest komentarz, którego pierwszym znakiem jest znak dolara , a drugim znakiem jest litera; na przykład odpowiednikiem dyrektywy C
#include "file"
jest znaczący komentarz{$I "file"}
. - W Perlu słowo kluczowe „
use
”, które importuje moduły, może być również używane do określania dyrektyw, takich jakuse strict;
lubużyj utf8;
. -
Haskella są określane przy użyciu specjalistycznej składni komentarzy, np.
{-# INLINE foo #-}
. -
Python ma dwie dyrektywy –
from __future__ import feature
(zdefiniowana w PEP 236 -- Back to the __future__ ), która zmienia funkcje języka (i wykorzystuje istniejącą składnię importu modułu, jak w Perlu) oraz dyrektywęcoding
(w komentarzu) do określić kodowanie pliku kodu źródłowego (zdefiniowane w PEP 263 — Defining Python Source Code Encodings ). Bardziej ogólna dyrektywa została zaproponowana i odrzucona w PEP 244 – The `directive' statement ; wszystkie pochodzą z 2001 roku. -
ECMAScript przyjmuje również składnię
use
dla dyrektyw, z tą różnicą, że pragma są deklarowane jako literały łańcuchowe (np."use strict";
lub"use asm";
), a nie jako wywołanie funkcji. - W języku Visual Basic słowo kluczowe „
Option
” jest używane dla dyrektyw:-
Option Explicit On|Off
— Gdy opcja jest włączona, uniemożliwia niejawną deklarację zmiennych przy pierwszym użyciu, wymagając wcześniejszej jawnej deklaracji. -
Option Compare Binary
— wyniki w porównaniu ciągów znaków w oparciu o kolejność sortowania wynikającą z wewnętrznych binarnych reprezentacji znaków — np. dla angielskiej/europejskiej strony kodowej (ANSI 1252) A < B < E < Z < a < b < e < z < À < Ę < Ř < à < ê < ø. Wpływa na operatory wewnętrzne (np. =, <>, <, >), blok Select Case i funkcje łańcuchowe biblioteki uruchomieniowej VB (np. InStr). -
Option Compare Text
— wyniki w porównaniu ciągów w oparciu o porządek sortowania tekstu bez uwzględniania wielkości liter, określony przez ustawienia regionalne systemu — np. dla angielskiej/europejskiej strony kodowej (ANSI 1252) (A=a) < (À = à) < (B= b) < (E=e) < (Ę = ê) < (Z=z) < (Ø = ø). Wpływa na operatory wewnętrzne (np. =, <>, <, >), blok Select Case i funkcje łańcuchowe biblioteki uruchomieniowej VB (np. InStr). -
Opcja Strict Wł.|Wył.
— gdy jest włączona, uniemożliwia:- programowanie bez typów - gdzie deklaracje, które nie mają jawnego typu, są domyślnie wpisywane jako Object.
- późne wiązanie (tj. dynamiczna wysyłka do obiektów CLR, DLR i COM) na wartościach wpisywanych statycznie jako Object.
- niejawne konwersje zawężające - wymaganie, aby wszystkie konwersje do węższych typów (np. z Long na Integer, Object na String, Control na TextBox) były jawne w kodzie przy użyciu operatorów konwersji (np. CInt, DirectCast, CType).
-
Option Infer On|Off
— włączenie umożliwia kompilatorowi wnioskowanie o typie zmiennych lokalnych na podstawie ich inicjatorów.
-
- W języku Ruby dyrektywy interpretera są określane jako pragmy i są określane przez komentarze na górze pliku, które następują po notacji
klucza: wartość
. Na przykładkodowanie: UTF-8
wskazuje, że plik jest zakodowany przy użyciu kodowania znaków UTF-8 . - W języku C# dyrektywy kompilatora nazywane są dyrektywami przetwarzania wstępnego. Istnieje wiele różnych dyrektyw kompilatora, w tym #pragma, która jest specjalnie używana do kontrolowania ostrzeżeń kompilatora i sum kontrolnych debugera.
- SQLite DBMS zawiera dyrektywę PRAGMA, która służy do wprowadzania poleceń, które nie są kompatybilne z innymi DBMS .
- W Solidity dyrektywy kompilatora nazywane są pragmas.
język programowania
- W języku asemblera dyrektywy, określane również jako pseudooperacje lub „pseudooperacje”, generalnie określają takie informacje, jak maszyna docelowa, zaznaczają separacje między sekcjami kodu, definiują i zmieniają zmienne czasu asemblera, definiują makra, wyznaczają warunkowe i powtarzane kodu, zdefiniuj zarezerwowane obszary pamięci i tak dalej. Niektóre asemblery, ale nie wszystkie, używają określonej składni do odróżnienia pseudooperacji od mnemoników instrukcji, na przykład poprzedzając pseudoopcję kropką, taką jak pseudo-op .END , która może nakazać asemblerowi zatrzymanie asemblowania
kodu
.
PL/SQL
- PL/SQL firmy Oracle Corporation zawiera zestaw dyrektyw kompilatora, znanych jako „pragmy”.
Zobacz też
- #pragma Once – dyrektywa preprocesora w C i C++
przypisy
- Steele, Guy L. (1990). Wspólny język Lisp . Prasa cyfrowa. s. 215–237. ISBN 1-55558-041-6 .