
연구실 후배가 무슨 책을 보고 있길래 재미있을꺼 같아서(-ㅅ-) 옆에 가서 살펴보았다.
1권은 하드웨어에 대한 설명이고 2권은 로우레벨을 고려한 프로그램최적화라는 제목인데..
후배가 어셈 스터디를 하는데 사용되고 있는 책이라고 한다.
잠깐 내용을 살펴 보았더니, 생각보다 볼만 하더라.
몇페이지 정도 본 뒤, 나중에 좀 빌려본다는 말과 함께 프로젝트 마무리때문에 잊고 있었는데..
몇일 후 책을 반납해버렸다고 한다 ;ㅅ;
덕분에 도서관에 가서 다시 빌려왔는데.. 자 그럼 한번 책을 펼쳐보실까?
책 내용은 어셈블리어에 관한 것이다.
말그대로 로우 레벨(= 기계어정도?)를 고려한 프로그램 최적화를 하는건데..
로우 레벨에서 어떻게 컴파일 되고 컴파일러가 최적화 하는지에 대해 살펴보고,
효율적인 코드를 짜자 요런 개념이다.
그 동안 우리는 코딩을 하면서 소스 코드 길이 혹은 연산자가 적다면 그만큼 더 깔금한 코드라고 믿었다.
하지만 그게 아닐수도 있다.
연산자 순서 내지는 if, switch와 같은 구문에 따라 컴파일러가 인식하는 flow는 얼마든지 달라질 수 있다는 것이다.
물론 그에 따라서 최적화 과정도 천차만별이 되버린다.
이론적으로 완벽한 최적화를 위해서는 엄청난 시간이 소요된다고 한다.
최적화 과정에서 사용되는 복잡도 이론은 NP-Complete인데, 이 복잡도 이론에는 문제가 있다고 한다. 난해(intractable)라는 문제인데, 경우의 수를 모두 연산해야만 최적의 해를 보장할 수 있다는 것이다.
몇줄 되지도 않는 소스코드에서는 최적화가 비교적 짧은 시간 내에 수행될지 몰라도,
몇백줄 내지는 몇천줄의 소스코드에서는 시간이 기하급수적으로 늘어날 수 있다는 것이다.
책에서 예를든 바로는 n줄짜리 코드를 컴파일 하는데 100년이 걸린다고 한다면, 여기에 40줄의 코드가 추가되면 컴파일 시간이 일조년에 이를 것이라고 한다. 소스 코드에 몇 라인만 추가해도 컴파일을 절대 끝낼 수 없다고 하는데 아마도 컴파일 할 때 기하급수적으로 오버헤드가 증가하면서 메모리 부족 현상이 일어나지 않을까 한다.
그렇다면 지금 우리가 보고 있는 최적화 과정은 무엇일까?
성능과 시간을 고려하여, 우리가 "기다릴 수 있는 시간"내에서 최적의 해를 구한다는 것이다.
하지만 우리가 발로짠(;;) 소스를 컴파일러가 최적화 해줄 수는 없으며 최소한 컴파일러에게 '우리는 이 소스를 발로짠게 아니다'라는 성의를 보여주어야 한다는 것이 이 책의 목적이다.
(위에서 설명했던 최적화 시간은 이 책의 내용의 일부일 뿐, 기타 실행파일 구조면에서 보았을때의 성능 등을 다루고 있다.)
나는 어셈블리어를 공부하기 시작하였을때 어셈블리어를 통채로 공부하는 것이 아닌, 교양 수준에서의 지식을 원했다.
복잡한(?) 어셈블리어는 싫다! 라고 말을 하고 있었는데, 이 책은 그런 점을 잘 커버해주고 있다.
(목적 자체가 컴파일러에서 최적화가 잘되는 소스코드를 생성하자 라는것 이기 때문일지도 모른다.)
어셈블리어라는게 처음에 보면 굉장히 난해하다. 명령 하나하나는 복잡할 것이 전혀 없다.
하지만 시스템 아키텍쳐 자체를 이해해야 명령어들이 비로소 연결되어 전체 흐름을 알 수 있게 해주는 언어가 어셈블리어다. 이런 이유로 처음 어셈블리어를 접근하면 굉장히 어렵게 & 복잡하게 느껴진다고 생각한다.
이런 사람들에게 추천해줄 수 있는 책이라고 생각한다.
Posted by 장현준


