Great Code 독후감 : 2장

gurugio의 이미지

근데 이렇게 독후감쓸때 원저에 있는 문장을 그대로 인용하면 불법인가요?
요즘 검열이 워낙 무서워서..

제 의견은 따로 이탤릭으로 쓸까 했는데 읽기가 더 어려운 것 같아사 그냥 ()로 씁니다.

2장

최고의 고급언어 프로그래머들이 최고의 코드를 작성하는 중요한 이유 중 하나는 그들이 어셈블리 언어를 완벽히 이해하고 있기 때문이라고 2장의 서문에서 말하고 있다.

(정말일까? 내가 생각하는 최고의 고급언어 프로그래머들의 코드라면 리눅스 커널정도? 사실 내가 일일이 분석하면서 읽어본 코드는 몇가지 소규모 오픈 소스 프로젝트의 코드들과 리눅스 커널, XEN 코드 정도이다. 작은 프로젝트의 개발자의 배경에 대해서는 모르지만 확실히 리눅스 커널을 만드는 개발자들은 어셈블리 언어를 나보다 더 잘 이해하고 있고, 하드웨어가 어떻게 동작하는지 그리고 고급 언어가 어떻게 어셈블리로 변환되서 프로세서 상에서 동작하는지를 완벽히 이해하고 있는 것 같다. 그들의 코드는 분명히 최고의 고급언어 코드이라고 믿는다.
하지만 C/C++이 아닌 스크립트 언어 - 파이선, 펄 등 - 이나 웹 개발, 리스프 등은 완전히 다른 이야기인것 같다. 그정도로 추상화된 고급언어라면 그 언어가 가지는 핵심 개념에 대한 이해가 중요하지 어셈블리 언어를 이해하는 것은 중요하지 않을 것 같다. 오히려 더 추상적으로 생각할 수록 좋은 것 아닐까?
따라서 나는 이 책에서 말하는 고급언어를 C/C++로만 한정짓겠다!!)

- 어셈블리 배우는 것이 어려움

어셈블리 언어 프로그래밍의 패러다임은 고급언어 프로그래밍과 매우 다르다. 완전히 밑바닥부터 새로 시작하는 기분을 느끼게 된다. 자기가 아는 고급언어로 해결할 수 있는 일을 어셈블리로 어떻게 해결해야 할지 파악하지 못한다는 괴로운 경험을 하게 된다.

전통적인 어셈블리 학습법 - 아마도 mov 부터 시작해서 프로세서 레지스터를 다루는 법을 배우고 명령어 하나씩 사용법을 배우는 것을 말하는 것 같음 - 은 고급 언어 프로그래머들이 알고 있는 것들을 써먹지 못하고 오히려 잊도록 강요한다.

(사실 어셈블리 프로그래밍은 고급 언어 프로그래밍과 너무나 달라서 내가 프로그래밍을 배우는 것인지 뭘 하고 있는 것인지도 모를 정도로 정신이 없다. 나는 2~3달동안 어셈블리를 배운 후에도 몇 글자 문자열을 입력받고 출력하는게 너무나 어려웠었다. 몇달이 더 지난 후에야 내가 날 위한 입출력 라이브러리를 몇개 만들 수 있었고 그 이후에야 결과값을 출력해보면서 프로그래밍을 할 수 있었다. 마치 태초의 프로그래머가 하던 불의 발견을 다시 하는 것 같은 기분이었다.)

- 이 책을 읽으면 어셈블리를 쉽게 배울 수 있고 고급언어 프로그래밍도 잘하게 될 것임

어셈블리 언어를 자주 읽게 되고, 배우기 위한 동기가 생길 것이다. 컴파일러가 생성한 어셈블리 코드와 고급언어를 비교하면서 자신이 고급언어로 만들 수 있는 코드를 어셈블리로 만들 수 있게 된다.

(사실 루프나 프로시저 호출 등 단순 반복적인 코드를 어셈블리로 작성하지 못해서 애를 먹은 적이 많다. 몇번 반복해서 익숙해지면 별로 고민할 것이 없는 코드이다. 특히 for 루프나 while 루프, 함수를 호출할 때 인자 전달이나 지역 변수 생성 등에 대해 C 언어와 어셈블리 언어를 비교하면서 배우면 쉽게 어셈블리의 관용적인 표현들을 배울 수 있다. 이 책에서도 MASM에서 제공하는 매크로를 설명하고 있는데 이런 루프나 함수 호출의 관용적인 표현을 일일이 코딩하지 않게 해주는 기능이 MASM이나 TASM에서 제공하고 있다.)

- MASM과 같은 기능이 많은 어셈블러와 HLA (High Level Assembly)

MASM에서는 .if, .while 같은 매크로를 제공해서 반복적이고 관용적인 표현들을 자동으로 생성해준다. 그리고 데이터 선언도 고급 언어와 유사하게 할 수 있도록 매크로를 제공한다. 이 책의 저자는 The Art Of Assembly 라는 책을 집필할 때부터 HLA라는 가상 어셈블리를 만들어서 사용하고 있다.

(사실 HLA가 뭐가 좋은지는 아직 잘 모르겠다. AOA 책에서도 그냥 MASM만 사용하면서 읽었다. The art of computer programming 책에서도 어셈블리와 유사한 언어로 알고리즘을 설명하던데 이 책은 아직 감히 읽어볼 생각도 못했다.)

저자가 주장하는 어셈블리 학습 방법은 어셈블리 코딩을 하지만 처음부터 모든 것을 어셈블리로 코딩하지 않고 고급 언어와 유사한 가상 어셈블리 언어나 매크로 등을 이용해서 조금씩 어셈블리에 익숙해지도록 하는 것이다. 이것을 하이레벨로 생각하면서 로우레벨로 작성하는 방식이라고 말한다.

- 로우레벨 프로그래밍의 패러다임

어셈블리 언어 프로그래밍 패러다임의 가장 근본적인 개념은 수행하고자 하는 일을 컴퓨터가 처리할 수 있는 어떤 작은 단위로 쪼개는 것이다. 프로세서는 한번에 하나의 연산만을 처리한다. 고급언어는 profits = sales - cost - overhead - commisions 라고 계산하지만 실제 컴퓨터는 이것을 아주 작은 연산으로 쪼개서 처리하게 된다. 최소 3개의 뺄셈을 하고 하드웨어 레지스터와 메모리 간의 데이터 전달이 필요하다.

HLA로 표현하면 다음과 같다.

mov (sales, eax);
sub (cost, eax);
sub(overhead, eax);
sub(commisions, eax);
mov(eax, profits);

MASM으로 표현하면 다음과 같다.

mov eax, sales
sub eax, cost
sub eax, overhead
sub eax, commisions
mov profits, eax

이렇게 고급언어 코드 한 줄을 프로세서가 실제로 처리하는 최소 단위의 연산으로 바꿔서 생각할 수 있어야 어셈블리 프로그래밍을 할 수 있다.

(어떻게 보면 프로세서가 실제로 처리하는 최소 단위의 연산이 무엇인지 알아가는 것이 어셈블리 프로그래밍이기도 하다. 어셈블리 프로그래밍이 결국 하드웨어를 직접 다루는 것이므로 당연한 이야기이다. 물론 이렇게 생각하는 사고방식은 장단점이 있다. 너무 하드웨어에 얽매이면 추상화된 개발을 못하므로 사고의 폭이 좁아진다. 나는 이걸 구두쇠가 된다고 표현한다.)

- 참고 자료

어셈블리 프로그래밍을 배우는 좋은 책이 뭐냐고 물어보면 잘 모르겠다. 예전 - 십년이상 이전 - 에 좋은 책이라고 팔리던 것들은 이제 너무 오래되서 XP같은데서는 실행조차 않되는 예제들 뿐이다. 그리고 현재 팔리는 책들은 솔직히 말하면 거의 안읽어봐서 모르겠다.

하지만 절대적으로 추천하는 문서가 2개 있다. 어셈블리를 배우고 싶다면 다음 문서들을 모두 읽어보고 자신이 어셈블리에 정말 흥미를 가지고 있는지 확인하고 그 다음에 본격적으로 어셈블리를 배웠으면 한다. 이 문서들은 거의 C의 기본 개념을 하드웨어적으로 설명한다고도 생각할 수 있고, 또 영어 문장이 쉬우므로 짧은 시간에 어셈블리 언어가 할만한 - 만만한 - 것인지 판단할 수 있게 해준다. 결국 삽질할 시간을 줄여주면서도 고급언어 코딩에 도움도 되니까 좋은 것 같다.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Assembly/Documents/ProgrammingGroundUp/index.html
http://www.drpaulcarter.com/pcasm/

댓글

OpenSnake의 이미지

근데요....
1장,2장 왜 이렇게 나눈거죠?? 1장이 1권이라는 뜻인가요?

--------------------------------------------
혼자있고 싶습니다. 모두 지구밖으로 나가주세요.

--------------------------------------------
혼자있고 싶습니다. 모두 지구밖으로 나가주세요.

gurugio의 이미지

Great Code 라는 책의 1장을 읽고 쓴 독후감이라는 뜻입니다
하긴 독후감은 책을 다 읽고 쓰는 거지요?
제가 잘못 썼네요.. ;-)

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.
http://www.asmlove.co.kr
http://blog.naver.com/gurugio

OpenSnake의 이미지

한꺼번에 올리면 너무길어질거같은데요...

하긴 독후감은 책을 다 읽고 쓰는 거지요?
제가 잘못 썼네요.. ;-)

이 말 들으니깐...엄마한테 사과받는 기분이네요....-_-;;

--------------------------------------------
혼자있고 싶습니다. 모두 지구밖으로 나가주세요.

--------------------------------------------
혼자있고 싶습니다. 모두 지구밖으로 나가주세요.

gurugio의 이미지


간만에 글을 올렸는데 잘보고 계시다고 답글을 써주시니
매우매우 기분이 좋습니다.
감사합니다~~

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.
http://www.asmlove.co.kr

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.