Great code 독후감 : 1장
어셈러브 운영자들이 모여서 Great Code 스터디를 진행하게 되었습니다.
제가 읽은 부분에 대해서 독후감을 쓰면서
여러 선배님들의 의견도 듣고 싶어서
이렇게 블로그에 올립니다.
부디 어설픈 글이라도 눈감아 주시길 부탁드립니다. ;-)
1장
- 컴파일러 최적화 기능에 대한 오해
컴파일러는 최적화 기능을 이용하면 고급 언어를 가지고도 어셈블리로 만든 프로그램에 비해
90% 정도의 성능을 낼 수도 있다.
하지만 이렇게 최적화를 하기 위해서 조건이 있다!!
그정도의 성능을 내기 위해서는 그에 합당한 방법으로 고급언어 코드를 만들어야 한다.
고급 언어 문법을 충분히 이해하고, 내가 작성한 코드가 어떤 어셈블리 코드로 변환될지 예측하고 통찰할 수 있어야 컴파일러가 최적의 코드를 만들 수 있도록 고급언어 코드를 만들 수 있다.
- 어셈블리 언어의 필요성
예전 어셈블리 프로그래머들이 고급언어를 배우고 컴파일러를 개발할 때는
대다수의 프로그래머들이 어떻게 고급언어가 컴파일되고
그리고 어떻게 코딩하면 최적의 코드가 생성될지를 알고 있었다.
하지만 지금의 프로그래머들은 고급언어로 프로그래밍을 배우고
추상화된 개념만을 배웠기 때문에 컴파일러의 동작에 대해 이해하지 못하고 있고
컴파일러가 어떠한 조건에서 최적의 코드를 생성하는지 알지못한다.
(어셈블리 언어로 프로그래밍을 배운 - 물론 그 전에 C 언어 문법을 배웠지만 포인터를 이해하지 못해 좌절했었고 문법만 배웠을 뿐, 프로그래밍까지 해보지 못했었음 - 나는 자연스럽게 C/C++ 코드가 어떻게 어셈블리 코드로 변환될지를 예상할 수 있었다. 그래서 고급 언어를 배운 뒤에 어셈블리를 배웠을 때의 놀라움이나 어셈블리의 필요성에 대해 잘 모르고 있었다. 공기의 존재를 느끼기 전까지는 공기가 있다는 것을 모르는 것과 비슷하지 않을까?)
여기서 중요한 것은 고급 언어가 어떻게 컴파일되고 어셈블리 코드가 생성되는지를 이해하면 되는 것이지 처음부터 어셈블리로 코딩을 할 필요는 없다는 것이다.
어셈블리 문법의 기본을 알고, 어느정도 코드를 볼 수 있는 정도면 충분하다는 것이다!!
컴파일러가 만들어낸 코드가 전문 어셈블리 프로그래머가 만든 코드와 비슷하게 효율적일까?
이 말을 만든 컴파일러 회사들의 벤치 마킹 테스트 결과는 전적으로 신뢰할 수 없다. 컴파일러들은 자신이 가장 최적의 코드를 만들어 낼 수 있는 조건이 다르다. 또한 컴파일러 회사의 개발자들은 자신들의 컴파일러가 어떤 코드를 컴파일 할 때 최적의 코드를 만들 수 있는지 알고 있다.
물론 가장 좋은 최적화는 가장 좋은 알고리즘으로 코딩하는 것이다. 그것은 어느 컴파일러를 사용하나 어떤 언어를 사용하나 동일하게 좋은 방법이다. 그 다음으로 우리가 할 수 있는 최적화는 사용할 언어의 특성에 맞게 코딩하는 것이다. 컴파일러에 상관없이 같은 언어를 사용할 때는 항상 적용할 수 있다.
그 다음의 최적화는 특정 컴파일러에 맞게 최적화하는 것이다. 컴파일러가 제공하는 기능을 이용하여 메모리 정렬이나 최적화 단계 조절 등의 기능들을 사용할 수 있다. 가장 낮은 단계의 최적화는 최종 생성된 어셈블리 코드를 확인하면서 고급 언어 코드를 수정해보는 것이다.
이러한 단계를 모두 적용해보았다면 정말로 고급 언어를 이용해서도 어셈블리 프로그래머가 작성한 것과 유사한 코드를 만들 수 있다. 어셈블리와 고급 언어의 성능을 비교할 때마다 이러한 조건은 거론되지 않고 단지 컴파일러가 모든 것을 알아서 해줄 수 있다는 것처럼 사람들은 말을 한다.
(나는 실제로 이런 과정을 경험했다. 단지 몇백줄의 몇가지 기능만을 하는 프로그램이 아니라 어느정도 규모가 되는 유사한 기능의 프로그램이 어셈블리로 구현되었을 떄와 C로 구현되었을 때의 차이를 경험했다. 예전에 잠시 일했던 회사에서는 텍스트로 작성된 고객 주소 리스트를 가지고 있었다. 이 데이터는 수백만명의 주소를 가지고 있었고 크기는 기가 바이트 단위였다. 보통 경쟁사의 제품은 이 주소 데이터를 읽고 몇가지 처리를 하는데 24시간 이상의 필요했었지만, 어셈블리로 만든 자사 제품은 그 절반정도의 시간으로 같은 처리를 할 수 있었다. 어셈블리로 윈도우 프로그래밍을 해보면 알겠지만 윈도우 API를 사용하는 과정은 어셈블리나 C 언어나 동일하다. 따라서 순전히 사용자가 작성한 코드의 차이가 이런 성능 차이를 만들어내는 것이라고 생각한다.)
그럼 우리가 해야 할 일은?
고급 언어로 코딩하면서도 어셈블리 언어로 코딩하는 것과 같이 신경쓰고 주의를 해야한다. 고급 언어로 작성하는 것이 빠르게 개발할 수 있고, 가독성과 유지 보수가 높다고들 말한다. 그러면 이런 최적화를 고려한다면 고급 언어의 장점을 희생하게 되는 것일까?
이 책에서는 최적화를 고려하면서 코딩을 하다고 해도 여전히 읽기 좋고, 이식성과 유지 보수가 좋은 코드를 만들 수 있다고 말한다.
(내 경험에 비추어봐도 좀더 신경써서 만든 코드가 읽기 나뻐지거나 유지보수가 어려워지는 것 같지 않다. 리눅스 커널과 같이 최적화에 신경쓰는 오픈 소스 코드들을 보면 개발자의 성향이나 수준에 따라 코드가 달라지고, 코드를 읽는 사람이 이해를 못하는 것이 문제이지, 코드 자체는 간결하고 이해하기 좋게 되어있다.)
댓글 달기