본문으로 바로가기

C++20) Modules ( 모듈 ) - 1

category C++/Modern 2021. 3. 14. 04:31

시작하며 (약간의 역사...)

 

C++20 에서 C++ 라이브러리와 프로그램을 구성 요소화 하는 Module이 등장하였습니다.

Module은 기존의 #include 방식인 Translation Unit 방식과는 다른, 별개와 컴파일되는 소스 코드 파일의 집합입니다.

Header파일을 사용하면서 생겨나는 많은 문제를 제거하거나 줄이고, 컴파일 시간을 단축하기도 합니다.

선언된 모든 매크로, 전처리 지시문과 export 하지 않는 이름(names)들은 표시되지 않으며, 컴파일 할 때 영향을 주지 않습니다.

또한 순서에 관계 없이 가져올 수 있습니다. (include, import)

Module을 한 번 컴파일한 후에는 export된 모든 형식(Type), 함수 및 템플릿을 이진파일에 저장합니다.

이 파일은 이전의 헤더 파일들보다 훨씬 빠르게 처리될 수 있습니다.

 

즉, 이전엔 #include 전처리문을 통해서 Header 파일을 참조하고,

Header파일에선 #ifndef, #define, #pragma once 와 같은 전처리문을 통해서

헤더파일이 여러번 선언되는 것을 방지합니다.

 

이에 대해 C++ 개발자들은 보다 나은 방안을 내놓았습니다.

Header파일은 더 이상 존재하지 않고, cpp 파일만이 존재하며 module 키워드의 선언으로 원하는 코드들을 하나로 묶을 수 있으며

import 키워드를 통해 원하는 모듈의 코드를 사용할 수 있습니다.

물론 얼마든지 import 하여도 반드시 단 한번만 참조합니다. (즉, 전처리문을 사용해서 중복을 방지할 필요가 없습니다.)

 

C++ module은 java 의 package나 php의 namespace, C#의 namespace와 동일한 역할을 합니다.

 

기존의 #include는 단순히 문자열의 복사 붙여넣기 과정을 거칩니다.

  • 컴파일러는 같은 정보들을 여러번 작성합니다.

  • 링커들은 이 정보들을 모두 엮어줘야 합니다.

-> 이로인해 빌드 처리량이 심하게 증가합니다.

 

또한 일관성이 보장되지 않습니다.

  • 버그를 추적하기가 힘듭니다. (ODR 위반)

  • 구성요소간의 구분이 없고, 적용이 깨지기 쉽습니다.

C의 전처리기 기술은 구성요소를 분석/해석 하는데 정확할 수가 없습니다. 

-> 모든 매크로들에 대해서 알아야만 합니다.

 

module을 지원하면서 원하는 목표는 다음과 같습니다.

  • 구성요소화

  • 매크로들로부터의 격리화

  • 빌드처리량 증가 (Build throughput)

  • 현대식 표현방식을 아는 개발자툴을 지원하기

그래서, ODR이 무엇? : '하나의 정의 규칙', '원본 텍스트의 정확히 한 부분만 존재하는 것'

 

module은 Header파일과 함께 사용될 수 있습니다. module을 가져올 수 있으며, Header파일을 #include 할 수도 있습니다.

경우에 따라선, module로 Header파일을 가져올 수도 있습니다.

 

Bjarne StrouStrup : module은 단지 꿈이였지만 언급이 되었고, 전처리기들을 없앨 수 있다는 날을 꿈꿔왔습니다.

 

아직 모듈에 대해 다룰 이야기가 많습니다. 

모듈을 이용한 Hello-World 프로그램부터, export, import, visible, reachable, link와 fragments까지 모든 것을 설명하겠습니다.

 

1장의 레퍼런스 : 

Gabriel Dos Reis : Large Scale C++ With Modules : What You Should Know

'C++ > Modern' 카테고리의 다른 글

C++20) Ranges - 1  (0) 2021.06.15
C++20) Modules ( 모듈 ) - 2  (5) 2021.03.14
C++20) Concepts ( 콘셉트, 개념 ) - 4  (0) 2020.11.29
C++20) Concepts ( 콘셉트, 개념 ) - 3  (0) 2020.11.28
C++20) Concepts ( 콘셉트, 개념 ) - 2  (0) 2020.11.27