전처리기
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
전처리기는 소스 코드가 인터프리터나 컴파일러로 전달되기 전에 수행되는 프로그램으로, 어휘 전처리기, 구문 전처리기, 범용 전처리기로 분류된다. 어휘 전처리기는 텍스트 치환을 수행하며, C 전처리기, m4, GEMA 등이 있다. 구문 전처리기는 구문 트리를 변환하며, Lisp 계열 언어에서 매크로를 통한 언어 확장, 구문 사용자 정의, DSL 내장 등에 활용된다. 범용 전처리기는 특정 언어에 국한되지 않고 텍스트 처리에 사용되며, M4가 대표적이다. 전처리기는 파일 읽기, 매크로 확장, 조건부 컴파일, 주석 제거 등을 처리하며, C 언어, FORTRAN, COBOL 등에서 사용된다. 전처리기는 매크로 정의로 인한 문제 발생 가능성이 있으므로 사용에 주의해야 한다.
더 읽어볼만한 페이지
- 프로그래밍 언어 구현 - 어셈블리어
어셈블리어는 사람이 이해하기 쉬운 니모닉 기호로 기계어 명령을 표현하는 저수준 프로그래밍 언어로서, 각 프로세서마다 사양이 다른 어셈블리어가 존재하며 하드웨어 직접 제어, 성능 최적화, 저수준 시스템 프로그래밍 등에 활용된다. - 프로그래밍 언어 구현 - 컴파일러
컴파일러는 고급 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 저급 언어로 변환하는 프로그램으로, 어휘 분석, 구문 분석, 의미 분석, 최적화, 코드 생성 등의 단계를 거쳐 목적 코드를 생성하며, 네이티브 컴파일러, 크로스 컴파일러 등으로 분류되어 다양한 분야에서 활용된다.
전처리기 | |
---|---|
컴퓨터 과학 및 프로그래밍 | |
개요 | |
종류 | 매크로 컴파일러 |
세부 사항 | |
기능 | 소스 코드 전처리 조건부 컴파일 헤더 파일 포함 매크로 확장 |
사용 예시 | C 언어의 `#include`, `#define` C++ 언어의 `#ifdef`, `#ifndef` |
관련 개념 | |
관련 항목 | 컴파일러 링커 어셈블러 메이크 빌드 자동화 |
언어별 전처리기 | |
C/C++ | C 전처리기 |
기타 | PHP 자바 (javac) 파이썬 어셈블리어 |
특징 | |
역할 | 다른 프로그램에 대한 입력을 처리하는 프로그램 |
다른 이름 | 프리컴파일러(precompiler) |
2. 어휘 전처리기 (Lexical Preprocessors)
어휘 분석만을 사용하여 소스 코드의 텍스트를 치환하는 가장 낮은 수준의 전처리기이다. 사용자가 정의한 규칙에 따라 토큰화된 문자 시퀀스를 다른 토큰화된 문자 시퀀스로 바꾸는 방식으로 작동한다. 일반적으로 매크로 대체, 다른 파일의 텍스트 포함, 조건부 컴파일 또는 포함을 수행한다.
다른 어휘 전처리기로는 autoconf와 같은 크로스 플랫폼 빌드 시스템에서 일반적으로 사용되는 범용 매크로 프로세서인 m4와 컨텍스트 패턴으로 작동하는 오픈 소스 매크로 프로세서인 GEMA 등이 있다.
2. 1. C 전처리기
C 전처리기는 '#'으로 시작하는 줄을 지시어로 취급한다.[1] C 전처리기는 C 언어의 구문을 사용한다고 예상하지 않는다.[1]C 전처리기는 일반적으로 매크로 대체, 다른 파일의 텍스트 포함, 조건부 컴파일 또는 포함을 수행한다.[1]
2. 2. 기타 어휘 전처리기
m4와 GEMA는 범용 매크로 프로세서로, autoconf와 같은 크로스 플랫폼 빌드 시스템에서 일반적으로 사용된다. 이들은 어휘 전처리기 범주에 포함된다.[1]3. 구문 전처리기 (Syntactic Preprocessors)
Lisp 계열 언어와 함께 도입된 구문 전처리기는 사용자가 정의한 규칙에 따라 구문 트리를 변환한다. Lisp와 OCaml처럼 일부 프로그래밍 언어에서는 규칙을 프로그램과 동일한 언어로 작성한다. 반면, XML용 XSLT 전처리기나 CDuce와 같이 변환 정의를 위해 완전히 외부적인 언어에 의존하는 경우도 있다.
구문 전처리기는 주로 다음 세 가지 목적으로 사용된다.
- 언어 구문 사용자 정의
- 새로운 기본 요소 추가를 통한 언어 확장
- 도메인 특화 프로그래밍 언어(DSL)를 범용 언어 내에 포함
3. 1. 구문 사용자 정의 (Customizing syntax)
OCaml 프로그래밍 언어는 "정상 구문"과 "수정된 구문" 두 가지 구문을 사용할 수 있으며, 필요에 따라 두 구문 중 하나로 보기 좋게 출력할 수 있다.[2]마찬가지로, OCaml로 작성된 많은 프로그램은 새로운 연산자를 추가하여 언어의 구문을 사용자 정의한다.
3. 2. 언어 확장 (Extending a language)
리스프 계열 언어는 매크로를 통해 언어 자체를 확장하는 대표적인 예시이다. 이 언어들은 기본적으로 단순한 동적 타입의 함수형 코어만을 가지고 있지만, Scheme 또는 Common Lisp과 같은 표준 배포판에서는 명령형, 객체 지향 프로그래밍뿐만 아니라 정적 타이핑도 지원한다. 이러한 기능 대부분은 구문 전처리기를 통해 구현된다. 다만, 컴파일 과정에서 "매크로 확장" 단계가 리스프 컴파일러에 의해 처리되는데, 이는 컴파일의 다른 단계보다 먼저 수행되므로 여전히 일종의 전처리로 볼 수 있다.3. 3. 언어 특화 (Specializing a language)
Lisp 프로그래밍 언어 계열 언어의 특이한 기능 중 하나는 매크로를 사용하여 내부 DSL(Domain-Specific Language)을 만들 수 있다는 점이다. 일반적으로 대규모 Lisp 프로그래밍 언어 기반 프로젝트에서는 모듈을 다양한 미니언어로 작성할 수 있다. 예를 들어, 하나는 Lisp 프로그래밍 언어의 SQL 기반 방언을 사용하고, 다른 하나는 GUI 또는 보기 좋게 인쇄하기 위해 특화된 방언으로 작성될 수 있다. Common Lisp의 표준 라이브러리에는 LOOP 매크로 형태의 이러한 수준의 구문 추상화 예시가 포함되어 있는데, 이는 Algol과 유사한 미니언어를 구현하여 복잡한 반복을 설명하는 동시에 표준 Lisp 연산자를 사용할 수 있게 해준다.MetaOCaml 전처리기/언어는 외부 DSL에 유사한 기능을 제공한다. 이 전처리기는 언어의 의미(즉, 인터프리터)에 대한 설명을 가져와 컴파일 시간 해석 및 코드 생성을 결합하여 해당 정의를 OCaml 프로그래밍 언어의 컴파일러로 바꾸고, 해당 언어에서 바이트 코드 또는 네이티브 코드로 변환한다.[1]
4. 범용 전처리기 (General purpose preprocessor)
대부분의 전처리기는 특정 데이터 처리 작업(예: C 언어 컴파일)에 특화되어 있다. 그러나 특정 용도나 프로그래밍 언어를 목표로 하지 않고 광범위한 텍스트 처리 작업에 사용하도록 설계된 전처리기를 ''범용'' 전처리기라고 한다.
m4는 autoconf와 같은 크로스 플랫폼 빌드 시스템에서 일반적으로 사용되는 범용 매크로 프로세서이고, GEMA는 컨텍스트 패턴으로 작동하는 오픈 소스 매크로 프로세서이다. M4는 이러한 범용 전처리기의 가장 잘 알려진 예시 중 하나이다.
4. 1. C 전처리기의 기타 용도
M4는 범용 전처리기의 대표적인 예시이다. 하지만 C 전처리기는 C가 아닌 다른 용도로도 사용된다. 예시는 다음과 같다.- JavaScript 전처리에 C 전처리기를 사용한다.[3][4]
- 리눅스 커널 내에서 devicetree 처리에 C 전처리기를 사용한다.[5]
- HTML 생성을 위해 C 전처리기를 템플릿 엔진으로 사용한다.[6]
- imake는 X 윈도우 시스템을 위해 작성된 C 전처리기를 사용하는 make 인터페이스이며, 현재는 automake로 대체되어 사용되지 않는다.
- grompp는 GROMACS(전산 화학의 일부 문제를 해결하는 빠르고 자유로운 오픈 소스 코드) 시뮬레이션 입력 파일용 전처리기이며, 시스템 C 전처리기를 호출하여(또는 시뮬레이션 입력 파일에 의해 결정된 다른 전처리기를 호출하여) #define 및 #include 메커니즘을 주로 사용하여 grompp 런타임 시 효과적인 토폴로지를 결정하여 토폴로지를 구문 분석한다.
5. 프로그래밍 언어의 전처리기 (일본어 문서 내용)
구문 전처리기는 Lisp 계열 언어와 함께 도입되었다. 사용자가 정의한 여러 규칙에 따라 구문 트리를 변환하는 역할을 한다. 일부 프로그래밍 언어의 경우, 규칙은 프로그램과 동일한 언어로 작성된다 (컴파일 시간 반사). Lisp와 OCaml이 이에 해당한다. XML용 XSLT 전처리기나 그 정적으로 형식화된 대응 언어인 CDuce와 같이, 변환을 정의하기 위해 완전히 외부적인 언어에 의존하는 경우도 있다.
구문 전처리기는 일반적으로 언어의 구문을 사용자 정의하거나, 새로운 기본 요소를 추가하여 언어를 확장하거나, 도메인 특화 프로그래밍 언어 (DSL)를 범용 언어 내에 포함시키는 데 사용된다.
5. 1. 처리 내용
렉시컬 전처리기는 전처리기 중 가장 낮은 수준으로, 구문 분석 전에 소스 텍스트에 대해 어휘 분석만을 필요로 한다. 이는 사용자가 정의한 규칙에 따라 토큰화된 문자 시퀀스를 다른 토큰화된 문자 시퀀스로 단순 치환하는 방식으로 작동한다. 일반적으로 매크로 대체, 다른 파일의 텍스트 포함, 조건부 컴파일 또는 포함을 수행한다.[1]프로그래밍 언어 처리계에서 소스 코드에 대해, 해당 코드가 인터프리터나 컴파일러 등의 본체로 전달되기 전에 전처리를 하는 프로그램을 프리프로세서라고 부른다.[1]
소스 코드 안에는 프리프로세서에 대한 지령 등이 포함되어 있으며, 이들은 "'''프리프로세서 지령'''"(프리프로세서 디렉티브) 등으로 불린다. 처리 자체는 "'''프리프로세스'''"(preprocess)라고 불린다.[1]
전처리기의 처리 내용은 다음과 같다 (실제로는 각 언어 또는 전처리기에 따라 다르며, 아래에 나열된 것은 모두 임의의 예시이다).[1]
5. 2. 환경
C 언어는 전처리기를 사용하는 언어의 한 예이다. GNU 프로젝트의 cpp 명령(C 전처리기)이 자주 사용된다. cpp 명령을 명시적으로 실행하지 않아도 C 언어 컴파일러의 cc 명령이나 gcc 명령은 그 내부에서 전처리기를 먼저 실행할 수 있다.언어 사양이 빈약한 언어를 구조적 프로그래밍이 가능하도록 만든 ratfor(FORTRAN의 전처리기)도 유명하다.
그 외에도 FORTRAN 및 COBOL의 전처리기가 상용 도구로 메인프레임용으로 판매되고 있다.
5. 3. 주의점
전처리기를 사용할 때는 주의가 필요하다. 전처리기는 컴파일러가 관여하지 않는 내용을 포함하게 되기 때문이다. 예를 들어, 매크로 정의와 동일한 문자열이 의도치 않게 모두 변환되거나, 상수의 자료형을 검사할 수 없는 등의 문제점이 있다.[7][8][9]이러한 이름 충돌 문제를 피하기 위해, 적어도 사용자 정의 매크로의 식별자는 대문자로만 작성하고, 그 외의 식별자는 소문자를 섞는 (예: NAME → name, Name) 관습이 있다. 매크로 외에는 전부 대문자로 쓰는 것은 지양해야 한다.[7][8][9]
C 언어 표준 자체는 매크로와 비매크로 식별자에 관해 대문자와 소문자의 사용을 규정하고 있지 않다. 그러나 위험성이 인지되기 전의 잔재로, 일부 소문자 매크로가 표준 사양으로 추가되기도 했다. 이들은 원래 키워드로 정의되어야 할 구성 요소를 호환성 유지를 위해 어쩔 수 없이 매크로로 정의한 것이다.[13][14] C99와 C11에서 새로 추가된 소문자 매크로는 C 언어의 차기 표준인 C2x에서 폐지하고 키워드로 하는 것을 검토하고 있다.[14]
C++(C++)와 같이, 언어 자체의 기능으로 상수나 인라인 함수 및 제네릭 함수 템플릿을 기술할 수 있는 언어에서는 가능한 언어 자체의 기능을 사용하고, 전처리기를 배제하고 기술해야 한다는 의견이 존재한다. 하지만, 호환성 및 관습 때문에 전처리기를 이용한 기술이 이루어지는 경우가 여전히 많다. Java에서는 전처리기가 채택되지 않았다. C#에서는 제한된 전처리기가 채택되었다.
전처리기를 적극적으로 활용하여 메타프로그래밍을 수행하는 것과 같은 고도의 용법도 있다.
참조
[1]
웹사이트
What is a precompiler?
https://www.ibm.com/[...]
[2]
웹사이트
The Revised syntax
http://caml.inria.fr[...]
[3]
웹사이트
JavaScript is Not Industrial Strength
https://web.archive.[...]
T. Snyder
[4]
웹사이트
The C Preprocessor in Javascript?
http://www.nongnu.or[...]
[5]
웹사이트
Kernel/Git/Stable/Linux.git - Linux kernel stable tree
https://git.kernel.o[...]
[6]
웹사이트
Using a C preprocessor as an HTML authoring tool
https://jkorpela.fi/[...]
J. Korpela
2000
[7]
웹사이트
C++の設計者Bjarne Stroustrupによる注意:「すべての文字を大文字にした名前は慣例的にマクロでの使用に予約されているので、絶対に使用しないでください」
http://www.libjingu.[...]
[8]
서적
Code Craft ~エクセレントなコードを書くための実践的技法~
[9]
문서
標準Cライブラリ
[10]
웹사이트
ブーリアン型サポートライブラリ - cppreference.com
https://ja.cpprefere[...]
[11]
문서
C99規格では、bool
を[[typedef]]ではなくマクロで実装することを規定している。
[12]
웹사이트
Type support - cppreference.com
https://en.cpprefere[...]
[13]
웹사이트
ISO/IEC JTC1/SC22/WG14 N609
http://www.open-std.[...]
[14]
웹사이트
Revise spelling of keywords and make them feature tests; proposal for C2x
http://www.open-std.[...]
[15]
웹인용
What is a precompiler?
https://www.ibm.com/[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com