g++ 11에서 C++20 헤더 단위 사용하기

류광, 2021/09/18 19:31
g++ 11도 C++20 헤더 단위 기능을 지원합니다.

이전 글 Visual Studio 2019에서 C++20 헤더 단위 사용하기의 GCC 버전입니다. 헤더 단위(header unit)에 관한 설명은 이전 글에 있으니 생략합니다.

예제 역시 이전 글과 동일하지만, 편의를 위해 다시 제시합니다. 목표는 다음과 같은 C++ 프로그램을 g++ 11로 성공적으로 빌드해서 실행하는 것입니다.

main.cpp

#include <iostream>
import <vector>;      // (1)
import "myheader.h";  // (2)

int main() {
    std::vector vec{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    std::cout << "get_size(vec): " << get_size(vec) << "\n";
}

myheader.h

#pragma once
auto get_size(auto obj) { return obj.size(); }

g++ 11 버전 현재, 헤더 단위를 사용하려면 메인 프로그램을 컴파일하기 전에 먼저 import되는 헤더들을 일일이 컴파일해 주어야 합니다. 이번 예제는 사용자 정의 헤더 하나와 표준 헤더 하나를 사용합니다. 우선, 사용자 정의 헤더를 헤더 단위를 위해 컴파일하려면 모듈 기능을 위한 -fmodules-ts와 옵션과 링크 없이 컴파일만 하기 위한(메인 프로그램이 아니므로) -c 옵션, 그리고 C++20 기능을 위한 -std=c++20 옵션1이 필요합니다.

$ g++ -std=c++20 -fmodules-ts -c myheader.h

표준 헤더를 컴파일하려면 앞의 옵션에 -x c++-system-header 옵션을 추가해야 합니다.

$ g++ -std=c++20 -fmodules-ts -c -x c++-system-header vector  

이제 소스 코드를 컴파일하는 데 필요한 재료가 모두 준비되었습니다.2 이제 -c 없이 소스 코드를 컴파일하면 됩니다. 필요합니다.

$ g++ -std=c++20 -fmodules-ts main.cpp -o main

이렇게 하면 main(또는 main.exe)이라는 실행 파일이 만들어집니다.

참고로, 이 표준 헤더의 헤더 단위는 표준 라이브러리 모듈이 아닙니다. 표준 라이브러리 모듈은 C++23 또는 그 이후에 추가될 예정인데요. 관련 제안서 P0581r0에 따르면 표준 라이브러리 모듈은 import <헤더>;가 아니라 import std.???; 형태로 사용하는데, 표준 헤더마다 std.헤더가 있는 것이 아니라 이를테면 <new>, <exception> 등을 std.fundamental로 묶고, <iostream>, <locale> 등을 std.io로 묶는 등 기능별, 성격별로 좀 더 큰 모듈을 두는 방식입니다.


  1. 헤더 단위 자체는 -fmodules-ts만 있으면 되는 것으로 보입니다. 그러나 헤더 단위를 사용하는 코드는 다른 C++20 기능도 사용할 가능성이 크므로, 그냥 -std=c++20를 기본으로 붙이는 게 현실적일 것입니다. 실제로 myheader.h는 C++20의 기능 중 하나인 함수 매개변수에 대한 auto를 사용하기 때문에 -std=c++20이 필요합니다. 

  2. 참고로, 컴파일된 헤더들은 현재 디렉터리의 gcm.cache 디렉터리 어딘가에 존재합니다. 

top
의견 # + 0

번역서 "인공지능: 현대적 접근방식 제4판" 나왔습니다

류광, 2021/08/28 18:06
번역서 "인공지능: 현대적 접근방식 제4판"이 드디어 출간되었습니다.

Russell과 Norvig의 Artificial Intelligence: A Modern Approach, 4th를 옮긴 번역서 인공지능: 현대적 접근방식 제4판이 며칠 전 출간되었습니다.

인공지능: 현대적 접근방식 제4판 1권 표지 인공지능: 현대적 접근방식 제4판 2권 표지

2016년 나온 제3판(원서는 2015년)의 개정판인데, 당연하게도 기계학습(특히 심층학습) 관련 내용이 크게 보강되었습니다. 단지 요즘 추세를 반영한 것만은 아니고, 인공지능이 불확실한 환경에서 불확실한 인간의 요구를 충족하는 데 꼭 필요한 요소로서의 학습이 강화된 것으로 봐야 할 것입니다. 저자 서문에는 다음과 같은 문구가 있습니다.

이전에는 인공지능의 목표를 사람이 구체적인 효용 정보(목적함수)를 제공한다는 가정하에서 기대 효용을 최대화하려는 시스템을 만드는 것이라고 정의했다. 그러나 이번 판에서는 목적함수가 고정되어 있으며 인공지능 시스템이 목적함수를 알고 있다고 가정하지 않는다. 대신, 시스템은 자신이 봉사하는 인간의 진짜 목적이 무엇인지 확실하게 알지 못할 수 있다고 가정한다. 시스템은 반드시 자신이 무엇을 최대화할 것인지를 배워야 하며, 목적에 관해 불확실성이 존재하더라도 적절히 작동해야 한다

참고로 현재 이 번역서는 연습문제를 제공하지 않습니다. 애초에 원서 연습문제도 제대로 제공이 안 되있는 상황입니다. 제3판에는 각 장 끝에 연습문제들이 있었는데요. 제4판에서 원서 출판사는 연습문제들을 웹으로 제공하기로 했는데, 원서가 나온 지 1년이 지난 지금도 연습문제 사이트가 제대로 작동하지 않습니다.1 원서 출판사가 빨리 해결을 하길 기다릴 수밖에 없는 상황인데요. 이후 변동 사항이 있으면 이 블로그를 통해 알려 드리겠습니다.

질문, 오역&오탈자 보고, 기타 의견 등은 위의 표지 이미지를 클릭해서 들어가는 페이지에서 해 주세요. 단축 URL은 https://bit.ly/AI4th입니다.


  1. 예를 들어 본문에 "연습문제 2.vacr은 이런 경우들을 위한 에이전트의 설계를 요구한다"라는 문구가 있지만, 연습문제 사이트에서 2.vacr를 검색해도 아무것도 나오지 않습니다. Table of Contents 아래 챕터들은 제4판이 아니라 제3판의 것들이고, 클릭해서 들어가도 제3판 연습문제들이 그대로 나옵니다. 

top
TAG 번역서
의견 # + 0

Visual Studio 2019에서 C++20 헤더 단위 사용하기

류광, 2021/08/21 19:21
모듈 기능과 함께 C++20에 추가된 '헤더 단위' 기능을 Visual Studio 2019에서 사용하는 방법.

C++20의 헤더 단위(header unit)는 통상적인 C++ 헤더를 모듈처럼 사용하는 기능입니다. #include 기반 소스 코드 조직화에서 모듈 기반 소스 코드 조직화로 넘어가는 과도기적인 단계를 위한 기능이라고 생각하면 되겠습니다.

이 글에서는 간단한 예제 프로젝트를 통해서, Visual Studio 2019에서 헤더 단위 기능을 사용하는 방법을 살펴봅니다. 목표는 다음과 같은 C++ 프로그램을 성공적으로 빌드해서 실행하는 것입니다.

// main.cpp
#include <iostream>
import <vector>;      // (1)
import "myheader.h";  // (2)

int main() {
    std::vector vec{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    std::cout << "get_size(vec): " << get_size(vec) << "\n";
}

이 프로그램이 포함시키는 myheader.h는 함수 템플릿 하나를 담은 평범한 C++ 헤더입니다.

// myheader.h
#pragma once
auto get_size(auto obj) { return obj.size(); }

main.cpp로 돌아가서, (1)에서는 표준 헤더 <vector>import를 이용해서1 현재 범위에 도입(import)합니다( #include를 이용해서 현재 범위에 '포함'시키는 것이 아니라). 이처럼 표준 헤더를 import를 이용해서 모듈로서 도입하는 것은 헤더 단위의 두 가지 용법 중 하나입니다.

(2)에서는 사용자 정의 "myheader.h"를 역시 import를 이용해서 도입합니다. 이것이 헤더 단위의 또 다른 용법입니다.

그럼 VS 2019에서 이 프로그램을 빌드하는 데 필요한 설정들을 살펴봅시다. VS 2019에서 콘솔 앱 프로젝트를 만들고 이 두 파일을 프로젝트에 추가했다고 가정합니다.

주의: 아래 내용은 Microsoft Visual Studio Community 2019 버전 16.10.4를 기준으로 합니다. 이후 버전에서는 옵션 이름이나 적용 방식이 달라질 수 있습니다.

1. C++ 언어 표준 설정

우선, C++20의 기능들을 사용하려면 프로젝트 속성 페이지에서 구성 속성 > C/C++ > 언어C++ 언어 표준 항목을 "미리보기 - 최신 C++ 초안의 기능(/std:c++latest)"로 선택해야 합니다.

C++ 언어 표준 설정

2. 모듈 기능 활성화

그리고 헤더 단위는 모듈 기능의 일부이므로, 헤더 단위를 사용하려면 모듈 기능을 활성화해야 합니다.2 프로젝트 속성 페이지에서 구성 속성 > C/C++ > 언어실험용 C++ 표준 라이브러리 모듈 사용을 "예(/experimental:module)"로 선택하면 됩니다.

모듈 기능 활성화

3. 헤더 단위 기능 활성화

마지막으로, 헤더 단위 기능 자체도 따로 활성화해 주어야 합니다. 프로젝트 속성 페이지에서 구성 속성 > C/C++ > 언어 > 고급컴파일 옵션을 "C++ 헤더 단위로 컴파일(/exportHeader)"로 선택하면 됩니다.

헤더 단위 활성화

이것으로 끝입니다. 이제 프로젝트를 빌드하면 별문제 없이 실행 파일이 만들어질 것입니다.


  1. #include <vector>는 C++ 문장이 아니라 전처리기 지시문이라서 세미콜론이 붙이지 않지만, import <vector>는 C++ 문장이라서 반드시 세미콜론을 붙여야 합니다. 

  2. 모듈은 아직 실험적인 단계라서 현재는 개별적으로 활성화해 주어야 하는데, 나중에는 C++ 언어 표준 설정에 따라 자동으로 적용되는 쪽으로 바뀔 것입니다. 3번 헤더 단위 활성화도 마찬가지고요. 

top
의견 # + 0

번역서 "실무 예제로 배우는 데이터 공학" 출간 소식 및 근황

류광, 2021/07/31 13:45
저번 주에 번역서 "실무 예제로 배우는 데이터 공학"이 출간되었습니다. Packt의 "Data Engineering with Python"을 옮긴 책입니다.

본문 열기

top
의견 # + 0

근황 - 2021-04-03

류광, 2021/04/03 19:51

간단히 근황 알립니다.

3월 하순에 Data Engineering with Python이라는 데이터 공학 책의 번역 원고를 탈고했습니다. 실습 예제들이 아주 많습니다. 왕초보용 따라 하기 식 책은 아니고, 어느 정도 응용 & 문제 해결 능력이 필요합니다. NiFi, Airflow, Elasticsearch, Spark 등 다양한 도구들이 등장합니다.

Data Engineering with Python cover

지금은 Wiely의 Hands on Hacking을 번역하고 있습니다. 7월 탈고 예정이고요. 역시 실습에 무게가 실린 실용서이고, 해킹 작업용 컴퓨터와 해킹 대상 서버를 모두 VirtualBox의 VM들로 돌리는 덕에 추가 비용&위험 부담 없이 침투 테스트(모의 해킹) 실무를 체험해 볼 수 있습니다.

Hands on Hacking cover

인공지능: 현대적 접근방식 제4판은 아직 교정 작업 중인데, 낙관적으로는 상반기에 출간되길 기대하고 있습니다.

틈틈이(틈틈히 X) 진행하던 개인 프로젝트들은 몇 개월 동안 진척이 없어서 아쉽습니다 - 흔적, 먼 흔적. 새 봄을 맞아 힘차게 다시 시작해 보렵니다, 라고 쓰고 보니 이미 초여름 날씨.

top
TAG 근황
의견 # + 0

◀ PREV : [1] : [2] : [3] : [4] : [5] : ... [70] : NEXT ▶