Octal Escape Sequences

object님이 적으시며 좌절하신 코드 문제.

int a = strlen("123");
int b = strlen("123");
int c = strlen("12312");
int d = strlen("123123");
int e = strlen("123123ABC");
int f = strlen("123ABC");

C/C++ 프로그래밍 언어 표준을 뒤지며 나름대로 language lawyer로서의 자부심을 가지고 있었는데, 한 순간에 그러한 생각을 깨뜨린 문제네요. 물론 농담이고요. 이런 것을 프로그래밍 실력과 직접적으로 연결해서 생각하지는 않지만, 프로그래머 만이 가질 수 있는 일종의 취미 정도로 생각해주시면 좋을 것 같습니다.

NoSyu님이 컴파일 결과에 따른 답과 나름대로의 해석을 하셨기에 정답은 나온 셈이지만, 이런 문제는 역시 컴파일러의 구현 뿐만 아니라, 표준 문서를 뒤져보아야 하는 문제겠죠.

제가 가지고 있는 C 표준 문서는 ISO/IEC 9899:1999, 소위 C99라고 불리는 문서입니다.

Character constants에 관한 항목은 6.4.4.4인데요. backslash를 이용한 escape sequence는 크게 4가지로 나뉘고, 그 중의 하나가 octal escape sequence입니다. 논의의 간소함을 위해 여기서는 octal escape sequence와 hexadecimal escape sequence만 보도록 하죠.

octal-digit:
0 1 2 3 4 5 6 7
octal-escape-sequence:
 octal-digit
 octal-digit octal-digit
 octal-digit octal-digit octal-digit
hexadecimal-digit:
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
hexadecimal-escape-sequence:
x hexadecimal-digit
hexadecimal-escape-sequence hexadecimal-digit

이러한 문법에 따르면 다음과 같은 사실들을 알 수 있습니다.

1. octal escape sequence에는 각각 8진수를 표현하는데 사용할 수 없는 문자는 파싱 단계에서부터 octal escape sequence의 고려에서 제외됩니다. 즉, 위의 문제에서, "ABC"의 경우, ‘A’, ‘B’, ‘C’는 octal-digit가 아니므로, ""만이 octal-escape-sequence로 파싱되고 결과적으로 { ‘’, ‘A’, ‘B’, ‘C’, ‘’ }로 해석되는 것입니다.

이러한 행동은 C89에서 변화된 것으로 보이는데요. 마찬가지 이유로 “78”의 해석은 { ‘7’, ‘8’ }로 되지만, 예전에는 0 prefix에 따르는 2개의 digit를 해석하는 구현의 책임 (implementation-defined)이었고, “78”은 “100”(078 = 0100)으로 해석되기도 한 모양입니다. C89 이전의 머나먼 옛날의 이야기이니, 현 시대의 컴파일러에서 이러한 동작은 신경 쓰지 않아도 될 것 같습니다.

2. octal-escape-sequence에서는 3개까지의 octal-digit를 허용합니다.

예를 들어, “123”는 어떨까요? octal-digit 3개 까지만 허용하므로 일단 ‘3’은 배제하고 “12” “3”으로 해석되겠네요. 그러면 “12”는?

다시 C99 문서로 돌아가보면,

Each octal or hexadecimal escape sequence is the longest sequence of characters that can constitute the escape sequence.

라는 얘기가 있습니다.

즉, “12”는 { ‘’, ‘1’, ‘2’, ‘’ }나, { ‘1’, ‘2’, ‘’ }로 해석되는 것이 아니라, 가장 긴 매치에 해당하는 { ‘12’, ‘’ }로 해석된다는 것입니다. 사실 octal escape sequence에 대해서 알고 나면, 상식적인 이야기라고 볼 수 있겠습니다.

한편, { ‘1’, ‘2’, ‘’ }을 표현하고 싶다면 어떻게 해야할까요? 이것은 C/C++의 편리한 String Concatenation 문법을 사용하면 됩니다. 즉, “1” “2”라고 하면 되겠죠.

3. octal-escape-sequence에서 ‘’ prefix가 요구되지 않습니다. 이것은 그 동안 제가 몰랐던 중요한 사항 중 하나네요. 즉, ‘12’나 ‘12’나 동등한 의미를 가진다는 것입니다. 아마 그 동안 코드를 보면서 그러한 경우를 봐왔을 텐데 조금 더 세심하게 보지 않았던 것 같네요.

재미있는 문제를 제공해주신 object님, 그리고 assembly까지 확인해주신 NoSyu님께 감사드립니다. 🙂

Head First Javascript

Head First Javascript by Michael Morrison

Head First 시리즈는 따로 언급하지 않아도 너무나 유명한 입문서 시리즈다.

그동안 여러 간단한 웹 애플리케이션을 개발하면서, 불편하지 않을 정도로는 Javascript를 익히고 사용해왔기 때문에, 내게 적합한 책이라고 생각한 것은 아니었지만, Head First 시리즈의 유명세를 직접 경험해보고 싶은 마음이 강했다.

이 책을 읽고 나서, 과연 이 책에 대한 소문이 헛소문이 아님을 확인할 수 있었을 뿐만 아니라, 입문서로서의 본보기를 볼 수 있었다.

일반적인 프로그래밍 서적들은 흔히 커다란 분류 체계를 세워놓고 각각의 분류에서 세부사항을 하나씩 설명하는 방식을 취한다. 분류 체계는 물론 중요하다. 분류 체계를 이해하는 것은 그 분야 전체를 이해하는 것을 의미한다. 하지만, 어떤 분야 (이를테면, 프로그래밍 언어)에 익숙하지 않은 입문자에게는, 그러한 분류 체계(이를테면, 변수(variable), 자료형(type), 연산자(operator), 표현식(expression), 클래스(class) 등과 같은 분류)는 이해하기 어려울 뿐만 아니라 학습에 방해가 될 수도 있다.

이 책은, 먼저 목적 또는 필요를 제시하고, 그것을 충족시키기 위한 방법 (이를테면, Javascript의 문법, 라이브러리 요소)을 설명하는 방식을 취하고 있다. 이러한 방식은 입문서로 추천한 적이 있는 Essential C++과 같은 책에서도 보인 적이 있다.

또다른 중요한 요소는 방법을 설명한 후에는 이를 실제로 연습해볼 수 있도록 하는 것이다. 이 책에서는 ‘연습’이라는 중요한 단계를 건너뛰지 않도록 책에 직접 프로그램을 작성할 수 있도록 해두고 있다.

마지막 단계는, 여러가지 방식을 통해서 학습자가 학습한 내용을 여러 번 정리할 수 있도록 하여 마음 속에 새기는 과정이다.

이러한 Head First의 학습 방식 자체는 특별한 것은 아니지만, 기술 입문서에서만은 독특하다고 할 수 있을 것 같다. 그것이 바로 Head First 시리즈가 유명해진 비결일 것이다.

그리고, 한가지 언급하고 넘어가야할 점은, 상당히 낮은 선행 지식을 요구한다는 점이다. 설명 자체가 선행 지식을 거의 필요로 하지 않을 정도로 쉽게 되어있다. 적절한 비유를 사용해 이해를 도와주는 것도 인상 깊다.

한편, 이러한 입문서는 반대로, 입문자가 아닌 학습자에게는 오히려 좋지 않다. 분류 체계가 없는 것은 입문자에게는 이점이지만, 익숙한 분류 체계에 끼워맞추기만 하면 되는 학습자에게 분류 체계가 제시되지 않는 것은 오히려 학습 효율을 떨어뜨리는 것이다. 반복적인 내용도 마찬가지다. 물론, 입문자가 아닌 학습자가 Head First 시리즈를 고르는 것은 잘못된 일이다.

현재 번역되어 있는 Head First 시리즈는, 국내 출간일 순으로, Java, EJB, Servlets & JSP, Design Patterns, HTML with CSS & XHTML, Object Oriented Analysis & Design, PMP, SQL, Javascript (서명에서 Head First 생략) 로 총 9권이다. Moviemaking, Algebra, C#, Physics, Statistics이 아직 번역되지 않았고, Ajax, PHP & MySQL, Rails, Web Design등과 같은 주제로도 출간될 예정이다. C#, Statistics 같은 경우에는 아직 번역되어 나오지 않은 것이 아쉽다.

앞으로 입문서 추천을 누군가가 부탁한다면, Head First 시리즈를 강력하게 추천할 생각이다.