지시자

**지시자**, **디렉티브**(directive) 또는 **프라그마**(pargma, "실용적인"에서 유래)는 컴퓨터 프로그래밍에서 컴파일러(또는 다른 트랜슬레이터)가 입력을 처리하는 방법을 지정하는 언어 구성 요소이다. 프로그래밍 언어에 따라 지시자는 언어의 형식 문법의 일부일 수도 있고 아닐 수도 있으며 컴파일러마다 다를 수 있다. 이는 전처리기에 의해 처리되어 컴파일러 동작을 지정하거나 대역 내 매개변수화의 한 형태로 기능할 수 있다.

어떤 경우에는 지시자가 전역적인 동작을 지정하는 반면, 다른 경우에는 프로그래밍 코드 블록과 같은 로컬 섹션에만 영향을 미친다. 일부 C 프로그램과 같은 몇몇 경우에는 지시자가 선택적인 컴파일러 힌트이며 무시될 수 있지만, 일반적으로는 규범적이며 따라야 한다. 그러나 지시자는 언어 자체에서 어떤 동작도 수행하지 않으며, 단지 컴파일러의 동작에만 변경을 가한다.

이 용어는 기존 컴파일러, 어셈블러 및 개발 환경에 존재하는 언어 구성 요소를 확장하는 추가 실행 가능한 처리를 초래하는 코드에 포함된 독점적인 타사 태그 및 명령(또는 마크업)을 지칭하는 데 사용될 수 있다. "지시자"라는 용어는 "명령"이라는 용어와 유사한 다양한 방식으로도 적용된다.

## C 전처리기

C 및 C++에서 이 언어는 단순한 매크로 전처리기를 지원한다. `#define` 및 `#include`와 같이 전처리기가 처리해야 하는 소스 라인을 전처리기 지시자라고 한다.

C 샤프의 `#if`와 같이 C의 전처리기 지시자와 유사한 구문 구성 요소도 일반적으로 "지시자"라고 불리지만, 이러한 경우에는 실제 전처리 단계가 포함되지 않을 수도 있다.

`defined`(조건부 지시자 다음에 올 때)를 제외한 모든 전처리기 명령은 해시 기호(#)로 시작한다. C++26까지는 `export`, `import`, `module` 키워드가 부분적으로 전처리기에 의해 처리되었다.

## 역사
지시자는 JOVIAL에서부터 시작된다.

코볼에는 COPY 지시자가 있다.

ALGOL 68에서는 지시자를 프라그마트("실용적인"에서 유래)라고 부르며, **pragmat** 또는 **pr**로 표기한다. C와 같은 최신 언어에서는 이를 "pragma"로 줄여 쓴다('t' 없음).

ALGOL 68에서 프라그마트의 일반적인 용도는 "키워드가 어떻게 표시되는지"를 의미하는 스트로핑 체계를 지정하는 것이다. POINT, UPPER, RES(예약어) 또는 따옴표 체계를 지정하는 다양한 지시자가 뒤따른다. **pragmat** 키워드 자체(약어 **pr**)에 대한 스트로핑 사용에 주목하라. 이는 POINT 또는 따옴표 체계 중 하나에서 사용된다.

오늘날 지시자는 1970년대 초부터 시작되어 현재 C99 표준까지 이어진 C 언어에서 가장 잘 알려져 있으며, 여기서는 C 전처리기에 대한 명령이거나, `#pragma` 형식으로 컴파일러 자체에 대한 지시자이다. 아래를 참조하면 알 수 있듯이 최신 언어에서도 어느 정도 사용된다.

## 다른 언어
* 에이다에서 컴파일러 지시자를 **프라그마**("실용적인 정보"의 줄임말)라고 부른다.
* 커먼 리스프에서 지시자를 **선언**이라고 부르며, `declare` 구성(또한 `proclaim` 또는 `declaim`)을 사용하여 지정한다. 한 가지 예외를 제외하고, 선언은 선택 사항이며 프로그램의 의미에 영향을 미치지 않는다. 유일한 예외는 적절한 경우 지정해야 하는 `special`이다.
* 터보 파스칼에서 지시자를 **중요한 주석**이라고 부르는데, 이는 언어 문법에서 주석과 동일한 구문을 따르기 때문이다. 터보 파스칼에서 중요한 주석은 첫 문자가 $이고 두 번째 문자가 글자인 주석이다. 예를 들어, C의 `#include "file"` 지시자에 해당하는 것은 중요한 주석 `{$I "file"}`이다.
* 펄에서는 모듈을 가져오는 키워드 "`[http://perldoc.perl.org/functions/use.html use]`"도 `use strict;` 또는 `use utf8;`와 같은 지시자를 지정하는 데 사용할 수 있다.
* 하스켈 프라그마는 특수 주석 구문을 사용하여 지정한다. 예를 들어, `{-# INLINE foo #-}`. 
```haskell
{-# LANGUAGE CPP #-}
```
를 작성하여 하스켈에서 C 전처리기를 사용하는 것도 가능하다.
* PHP는 `declare(strict_types=1)` 지시자를 사용한다.
* PL/I에서 지시자는 백분율 기호(`%`)로 시작하여 세미콜론(`;`)으로 끝난다. 예: `%INCLUDE foo;`, `%NOPRINT;`, `%PAGE;`, `%POP;`, `%SKIP;`. 이는 전처리기 문과 동일하다.
* 파이썬에는 두 가지 지시자가 있다. 하나는 언어 기능을 변경하는 `from __future__ import feature`(PEP 236 -- Back to the __future__에 정의되어 있으며, 펄처럼 기존 모듈 가져오기 구문을 사용한다)이고, 다른 하나는 소스 코드 파일의 문자 인코딩을 지정하는 `coding` 지시자(주석 내)이다(PEP 263 -- Defining Python Source Code Encodings에 정의되어 있다). 더 일반적인 지시자 문이 PEP 244 -- The `directive' statement에서 제안되었으나 거부되었다. 이 모든 것은 2001년으로 거슬러 올라간다.
* ECMA스크립트도 지시자에 `use` 구문을 채택하며, 프라그마가 함수 호출이 아닌 문자열 리터럴(예: `"use strict";` 또는 `"use asm";`)로 선언된다는 차이점이 있다.
* 비주얼 베이직에서는 "`Option`" 키워드를 지시자에 사용한다.
** `Option Explicit On|Off` - On일 때 변수의 암시적 선언을 허용하지 않고 미리 명시적인 선언을 요구한다.
** `Option Compare Binary` - 문자의 내부 이진 표현에서 파생된 정렬 순서에 기반한 문자열 비교를 수행한다. 예를 들어, 영어/유럽어 코드 페이지(ANSI 1252)에서는 A , ), Select Case 블록 및 VB 런타임 라이브러리 문자열 함수(예: InStr)에 영향을 미친다.
** `Option Compare Text` - 시스템 로케일에 의해 결정되는 대소문자를 구분하지 않는 텍스트 정렬 순서에 기반한 문자열 비교를 수행한다. 예를 들어, 영어/유럽어 코드 페이지(ANSI 1252)에서는 (A=a) , ), Select Case 블록 및 VB 런타임 라이브러리 문자열 함수(예: InStr)에 영향을 미친다.
** `Option Strict On|Off` - On일 때 다음을 허용하지 않는다.
*** 형식 없는 프로그래밍 - 명시적 형식이 없는 선언이 암시적으로 Object로 형 지정된다.
*** Object로 정적으로 형 지정된 값에 대한 늦은 바인딩(즉, CLR, DLR 및 COM 객체에 대한 동적 디스패치).
*** 암시적 축소 변환 - 좁은 형식(예: Long에서 Integer로, Object에서 String으로, Control에서 TextBox로)으로의 모든 변환이 변환 연산자(예: CInt, DirectCast, CType)를 사용하여 코드에서 명시적이어야 한다.
** `Option Infer On|Off` - On일 때 컴파일러가 로컬 변수의 초기화자에서 해당 형식을 추론할 수 있도록 한다.
* 루비에서 인터프리터 지시자는 **프라그마**라고 불리며, `key: value` 표기법을 따르는 파일 상단 주석으로 지정된다. 예를 들어, `coding: UTF-8`은 파일이 UTF-8 문자 인코딩으로 인코딩되었음을 나타낸다.
* C 샤프에서 컴파일러 지시자는 전처리 지시자라고 불린다. C#은 기술적으로 전처리기를 사용하여 이러한 지시자를 처리하지 않고, 코드에서 직접 처리한다. C 및 C++의 지시자와 대부분 일치하는 여러 가지 컴파일러 지시자가 있으며, 특히 컴파일러 경고 및 디버거 체크섬을 제어하는 데 사용되는 `#pragma`가 포함된다. C#은 또한 `#nullable` 및 `#region`을 포함하여 C 또는 C++에서 사용되지 않는 일부 지시자도 제공한다. C#은 함수와 같은 매크로는 허용하지 않지만, 조건부 컴파일과 같은 목적을 위해 일반 매크로는 허용한다.
* SQLite DBMS에는 다른 DBMS와 호환되지 않는 명령을 도입하는 데 사용되는 PRAGMA 지시자가 포함되어 있다.
* 솔리디티에서 컴파일러 지시자는 프라그마라고 불리며, `pragma` 키워드를 사용하여 지정된다.

### 어셈블리어
* 어셈블리어에서 지시자(가상 연산 또는 "가상 오피"라고도 함)는 일반적으로 대상 머신과 같은 정보를 지정하고, 코드 섹션 간의 구분을 표시하며, 어셈블리 시간 변수를 정의하고 변경하고, 매크로를 정의하고, 조건부 및 반복 코드를 지정하고, 예약된 메모리 영역을 정의하는 등의 작업을 수행한다. 일부 어셈블러는 가상 오피를 지시어 니모닉과 구별하기 위해 특정 구문을 사용하지만, 모든 어셈블러가 그런 것은 아니다. 예를 들어, 가상 오피 앞에 마침표를 붙여 `.END`와 같은 가상 오피를 사용하여 어셈블러가 코드 어셈블을 중지하도록 지시할 수 있다.

### PL/SQL
* 오라클 코퍼레이션의 PL/SQL 절차적 언어에는 "프라그마"라고 불리는 컴파일러 지시자 집합이 포함되어 있다.

## 같이 보기
* 

## 내용주

## 각주

* 

## 외부 링크
* OpenMP 웹사이트
* OpenACC 웹사이트
* OpenHMPP 웹사이트

분류:컴퓨터 프로그래밍