템플릿 메타프로그래밍(template metaprogramming)은 템플릿을 사용하는 프로그래밍 기법으로, 컴파일러에게 프로그램 코드를 생성하도록 하는 방식이다. 이러한 기법은 컴파일 시점에 많은 것을 결정하도록 하여, 실행 시점의 계산을 줄여준다. 이 기법은 C++ 프로그래밍 언어에서 주로 사용된다1.
TMP는 버그를 찾기 쉽지도 않고 구현도 어렵지만, 사용하는 이유는 많은 C++ 라이브러리들이 TMP 를 이용해서 구현되었고, TMP 를 통해서 컴파일 타임에 여러 오류들을 잡아낼 수도 있으며 속도가 매우 중요한 프로그램의 경우 TMP 를 통해서 런타임 속도도 향상2 시킬 수 있기 때문이다.
TMP에 대한 살펴볼 만한 실제 사례는 C++Builder의 template 버그 문제로 볼랜드포럼의 글 <아래 컴파일 에러는 엠바에서 템플릿코드를 엉터리로 구현해 놨기 때문>3에서 볼 수 있다.
아래의 예제는 콜라츠 추측(Collatz)을 C#과 C++ 언어로 각각 구현한 예제4를 보여주고 TMP를 사용한 C++의 소스가 컴파일 타임에서 C#과 어떠한 차이가 있는지 보여준다.
마이크로소프트(MS)가 Rust에서 영감을 받은 신규 프로그래밍 언어 개발(Verona Project)에 매진하고 있다. 프로젝트 베로나는 메모리 관리, 구획화 및 보안 샌드박스를 통해 안전한 시스템을 구축하기 위한 프로젝트다1. Rust는 최근에 스택오버플로우에서 좋아하는 개발언어 순위 1위에 오르기도 하였다2. Rust는 C++의 성능과 더불어 메모리 안정성을 확보한 언어이다.
Rust 컴파일러는 변수의 소유권을 컴파일 단계에서 모두 추적할 수 있다. 이를 이용해 메모리 할당과 해제를 오버헤드 없이 암묵적으로(Implicit) 수행함으로써, Rust는 런타임 오버헤드가 없는 안전한 메모리 관리를 이루어낸다3.
Microsoft 공식 웹사이트에서는 Project Verona를 ‘a programming language for the modern cloud’로 소개하고 있다4.
Rust는 기본적으로 UTF-8 중심으로 문자열을 처리한다1. 그러나 MS-Windows는 euc-kr을 확장한 CP949(MS949)와 Unicode로 한글을 처리하므로2 MS-Windows에서는 영문, 숫자와 별개로 한글을 byte 단위로 처리할 때 2byte 또는 3byte의 문자가 혼재할 수 있다. 아래의 예제는 2byte (AnsiString) 한글만으로 Hex를 encode, decode 필요가 있을 때 참고할 만한 소스이다.
[dependencies]
encoding = "0.2.33"
hex = "0.4.2"
use encoding::{label::encoding_from_whatwg_label, EncoderTrap, DecoderTrap};
use hex;
fn main() {
let kor_eng_num = String::from("가나다 ABC 123");
println!("{}", kor_eng_num);
println!("---------------------");
let mut vec = Vec::new();
let string_list = kor_eng_num.split_whitespace();
for s in string_list {
println!("UTF8: {} / MS949: {}", hex::encode(s).to_uppercase(), split_hex(s.into()));
vec.push(split_hex(s.into())); // s.into() -> &s
}
println!("---------------------");
for hex_str in vec.iter() {
println!("{} : {}", hex_str, hex2str(hex_str));
}
}