메아리 저널

옛날 지식을 가르치기

뭐 다른 곳에서도 안 그런 건 아니지만 전산학이나 컴퓨터 관련 분야는 워낙 관련 내용이 빠르게 변화하는 터라 지금은 학계에서도 산업계에서도 사용되지 않는 쓸모 없는 내용이 꾸준히 가르쳐지는 경우가 흔하다. (사실 이건 비슷해 보이는 모든 것을 뭉뚱그려 "컴퓨터 개론" 식으로 가르치는 것도 한 원인이긴 하다. 나도 여기선 컴퓨터 관련 분야라고 쓰긴 했는데...) 그 중 너무 자주 보이는 내용을 기억나는 대로 써 보겠다.

프로그래밍 언어는 인터프리팅되는 것과 컴파일되는 것으로 구분된다

너무 황당해서 말도 나오지 않는 주장이다. 정확한 표현은 "프로그래밍 언어는 '보통' 인터프리팅되는 언어와 '보통' 컴파일되는 언어로 나뉜다" 정도가 될 것이다. 보통 컴파일되는 언어가 인터프리팅되는 사례는 CINT를 들 수 있겠고, 반대로 보통 인터프리팅되는 언어가 컴파일되는 사례는 Shedskin을 들 수 있겠다. Ocaml 같은 류의 언어에서도 볼 수 있듯이 인터프리팅도 잘 되고 컴파일도 많이 하는 언어도 꽤 존재하고, JIT 컴파일 같은 것들을 생각하면 도저히 분류가 안 될 지경이다.

프로그래밍 언어를 인터프리팅되는 것과 컴파일되는 것으로 나누려는 시도는 아주 먼 옛날, 그러니까 20~30년 전에 프로그래밍 언어가 그닥 많이 발달하지 않았을 때에나 통용되는 것이다. (하긴 이 때는 지금 프로그래밍 언어의 문법을 규정하는데 흔히 쓰는 BNF 같은 것도 없던 시절이었다. BNF 자체는 ALGOL의 문법을 좀 더 엄밀하게 규정하기 위해 탄생했다.) 프로그래밍 언어가 매년 수백개씩 새로 생기는 지금에서는 너무 낡은 얘기다.

IP 주소는 class A, B, C로 구성되어 있다

아무리 IP에 대해서 아주 기본적인 지식만 가지고 있더라도, 약간의 계산만으로 이런 아이디어가 그닥 좋지 않은 것임은 알 수 있다. 클래스를 나누는 기준이 너무 커서(각각의 클래스는 그 다음 단계보다 256배 큼) 애매한 크기를 가진, 예를 들어서 4000개 정도의 서브네트워크가 있다면 잘라 넣기가 더 힘들 것이다. 특히 class A는 너무 커서 한 기업이나 단체에서 혼자 쓸 수 있을만한 크기가 아닌데, 그렇다고 class B 여러개로 나누기에는 class B의 갯수도 한정(65536개)되어 있다. 하긴 IPv4 자체가 그닥 큰 것도 아니다만.

물론 지금 내가 말한 걸 IETF 등에서 모르고 지나칠 리는 없다. 지금의 라우팅 프로토콜(RIP-2가 시작이었던 것 같다. 이건 1994년에 나왔다.)은 이걸 완벽하게 해결해서, class A, B, C의 구분은 더 이상 아무 의미도 가지지 않는다. 대신 IP 주소에서 임의 길이의 prefix를 네트워크 식별자로 사용할 수 있게 되었는데, 이를테면 IP 주소 32비트 중 앞의 10비트가 01111011 00으로 시작하면 A 네트워크이고, 처음 15비트가 01111011 0110001로 시작하면 B 네트워크고 이런 식이다. 흔히 이걸 비트 마스크로 나타내서 123.0.0.0/10이나 123.98.0.0/15 식으로 나타내는데, 기존의 class A, B, C는 /8, /16, /24로 표현할 수 있겠다.

이런 개념이 좀 생소할 수는 있다. 네트워크를 나타내는데 비트 마스크를 쓴다니 헷갈릴 수는 있겠다. 하지만 비트 마스크를 설명할 필요 없이 "옛날에는 케이크를 나눌 때 작은 것 아니면 큰 것 두 종류로 나눠야 했는데, 지금은 자기가 필요한 만큼 크기를 조정해서 나눌 수 있다"라고 하면 그만이다. (좀 더 많이 설명하고 싶다면, "케이크를 몇 사람의 대표가 크게 나눠다가 다른 사람들에게 다시 나눠 주기도 한다"라고 말하면 되겠다. ARIN 등의 RIR들이 지금 하는 짓이 바로 이것이다.) 솔직히, 이게 더 그럴듯한 방법론이 아닐까?


두 문제만으로 이렇게 글을 길게(?) 써 버렸으니 다른 주제는 어떻게 써야 할지 모르겠다... 다루고 싶은 문제가 있으면 댓글로 알려 주시면 후속 글에 넣어 보도록 하겠다.

이 글은 본래 http://arachneng.egloos.com/1446322에 썼던 것을 옮겨 온 것입니다.


(rev 71b35f804c1e)