C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[19189] CPU->어셈블리어->고급언어 까지....(1)
한수동 [hsd1987] 4854 읽음    2011-02-23 20:17
이 글은 제가 배운것을 복습하고자 적은 것입니다.
틀린 부분이 있을 수 밖에 없고 지적해 주신다면 감사하겠습니다.

하나의 예를 들겠다.
땅을 파는 공사현장에 땅을파는 로봇, 로봇을 조종하는 조종사와 일을 시키는 사장이있다.
로봇은 리모콘으로 조종되고
리모콘에는 8가지 버튼이 달려있다.
상하좌우 네방향을 움직이게하는 4가지 버튼과
'땅을 파', '흙을 수레에 실어', '수레를 들어', '수레의 흙을 버려' 이런 4가지 버튼이 있다고 해보자.
이제 사장이 조종사에게 "A지점의 땅을 3m쯤 파고 흙은 저쪽 B지점에다가 버리게나" 라고 명령을 내린다고 가정해보자
그럼 조종사는 리모콘에 달려있는 8가지 버튼만을 이용해 로봇을 조종하여 사장의 명령을 완수 해야한다.

이 예에서 사장은 C++같은 고급언어이고 조종사는 컴파일러이다. 그리고 리모콘은 어셈블리어이고 로봇은 CPU이다.
즉 C++언어를 컴파일러가 어셈블리어로 번역하여 CPU에게 명령을 내리는 것이다.
이것이 CPU가 고급언어를 알아듣는 방법이다.
자 그럼 고급언어를 구사하는 사장이 로봇을 조종하는 법인 리모콘 사용법을 알아야 하는가? 라는 질문을 던져보자.
이 대답은 모호 할 수 밖에 없다.
조종사가 제대로 효율적으로 로봇을 조종하는지 알려면 리모콘 사용법을 알아야 하지만 굳이 조종사가 효율적으로 안하더라도 결과가 좋으면 사장으로서는 만족하기 때문이다.
바로 여기까지가 이제 막 프로그래밍을 배우는 사람의 입장이다 굳이 컴파일러의 역활을 몰라도 프로그래밍은 가능하기 때문이다.
마치 레스토랑에서 음식을 시켜서 먹을때 굳이 음식의 조리방법까지 알 필요가 없는 것과 같다. 조리는 요리사(저급 언어 사용자)가 하는 것이기 때문이다.

이 밑으로는 안 읽어도 프로그래밍 하는데 지장이 없다. (여기까지가 LV0)
하지만 만족 안 한다면 계속 글을 읽어 내려가자.



사장의 명령을 따라 조종사가 로봇에게 명령을 내린다. 조종사는 A지점과 B지점을 사장이 알려줬으니 알고있고 또 3m를 파야된다는 것 또한 알고있다 즉 사장은 조종사에게 필요한 정보를 모두 준 것 이다. 이것이 고급언어로 명령을 내리는 프로그래머의 할일이다 모든 정보의 제공과 조종사 능력에 맞는 작업지시이다.
그럼 조종사는 자신이 로봇에게 내릴 수있는 8가지 명령만으로 할 수있는 지시이므로 가능하다고 판단하여 8가지 명령을 조합하여 지시에 알맞는 결과를 내도록 한다. 이 명령의 조합을 하는 것이 바로 컴파일러가 하는 것이다.

로봇을 보자 로봇은 8가지 명령밖에 못알아 듣는다. 이것이 바로 CPU이다
실제로 CPU는 CISK와 RISK방식이 있는데 간단히 설명하자면 CISC는 여러가지 명령이 가능한 CPU이고 RISC는 최소한의 명령만 가능하게 만든 CPU이다. 즉 RISC는 로봇이 상하좌우로만 움직일 수 있지만 CISC는 로봇이 상하좌우 및 대각선 이동까지 가능하게 만든 차이라고 할 수 있다. (물론 엄밀히 말하면 RISC와 CISC의 차이는 이런 것이 아니다 그냥 넘어가자)하지만 상하좌우만 가지고도 충분히 대각선 이동이 가능하다 즉 여러번 명령해서 A의 결과를 내느냐 한번의 명령으로 A의 결과를 내느냐의 차이이다. 이렇든 저렇든 두 결과는 같다.
여하튼 CPU는 정해진 명령 유한개의 명령으로만 작동하는 그냥 전기회로 이다.

여기까지가 LV1 더 안읽어도 된다 하지만 더 궁금하다면 밑으로



8가지 버튼을 이야기 했었다 그럼 이 버튼을 뭐라고 하느냐 인스트럭션이라고한다. CPU는 이 인스트럭션만을 알아 들으며 인스트럭션의 종류는 위에서 얘기했듯이 제작사 맘이다. 실제로 CPU마다 인스트럭션이 다 다르다(인텔은 RISC, CISC 두 종류 복합 사용한다)

자그럼 도대체 어셈블리어는 무엇이냐 바로 조종사가 가지고있는 리모콘 버튼마다 적혀있는 버튼에 대한 설명이 어셈블리어에 해당한다. 즉 어셈블리어는 인스트럭션 그 자체라고 할 수있다. '一石二鳥'와 '일석이조' 이 둘의 차이와 같다. 서로 정확히 같은걸 말하지만 쓰는 언어는 다른 그런 것이다.(1:1 대칭)
여기서 어셈블리어랑 고급언어랑은 현저히 차이가 있다 왜냐하면 전혀 1:1대칭이 안되기 때문이다. 영어와 한글의 차이라고 할까...

컴파일러가 하는 일이 고급언어 번역 말고도 한가지 더 있다. 바로 효율적인 어셈블리어 생성이다. 즉 조종사가 버튼을 눌러 효울적으로 로봇을 조종하는 것이다. 로봇에게 다음과 같이 명령할 수있다
땅을 파 -> 흙을 수레에 실어 -> 수레를 잡아 -> 이동명령 -> 수레의 흙을 버려
하지만 수레에 흙을 두번 실을 수 있는 공간이 있다면 위 명령은 비효율적이다 효율적인 명령은 다음과 같다
땅을 파 -> 흙을 수레에 실어 -> 땅을 파 -> 흙을 수레에 실어 -> 수레를 잡아 -> 이동명령 -> 수레의 흙을 버려
위와 같이 효율적인 명령이 될 수있게 어셈블리어로 해석하는 것이 좋은 컴파일러가 되는 것이다. 즉 컴파일러가 비효율적이 될 수 있다는 것이다. 하지만 실제로 요즘 컴파일러는 사람이 하는 실수를 잡아 줄 정도로 잘 해석해 주기 때문에
오히려 직접 어셈블리어로 작성하는 것보다 나은 경우가 많다. 거기다가 CPU마다 어셈블리어가 다 다른데 어느 한 프로그램을 작성한 후에 CPU가 바뀌어 버리면 고급언어는 컴파일러만 바꾸면 되지만 어셈블리어로 작성한 프로그램은 효율적이지만 바뀐 CPU에서는 작동이 불가가 되어 버리는 경우가 생겨버린다.

여기까지가 LV2 더 높은 레벨은 다음에 올리겠습니다....

허접하지만 읽어주셔서 감사합니다....
남병철.레조 [lezo]   2011-02-24 06:50 X
프로그래머로서 목적 의식이 분명하다면 high-level, low-level, hardware spec 같은걸 파고들지 아닐지를 결정할 수 있습니다.
이미 프로그래밍 분야는 다양해져서 각자의 목적에 맞게 프로그래밍하는게 현실이며 그 자체의 실무적 혹은 학술적 깊이나 인간이 학습하는 시기(시간)의 한계 같은 것으로 인해 경험할 수 있는 범위가 생각보다 다양하기 힘들게 됩니다.

하지만 기본적인 이해를 위해 위에서 언급한 3가지를 어느정도? 경험하면서 자신의 목적에 맞는 부분을 이론적, 실무적으로 다양한 경험을 쌓으면 현실(밥벌이?)과 이상(학술적깊이)이 1차적으로 조합될 수 있습니다. 그 이후는 자신의 목적의식에 따라 결정될 것입니다.

오프모임에서 더 이야기 해보는건 어떨까요? ^^;
술안주 주제로도 재미있을것 같습니다. ㅎㅎ
한수동 [hsd1987]   2011-02-24 11:05 X
배우는 입장인 저로써는 뵌다면 왠지 듣기만 할 것 같은... ㅋㅋ
제가 이 글을 여기에 쓰는 이유는
가장 큰 목표는 제가 배운것의 복습 되씹기 입니다.
그리고 저 같이 더 깊은걸 알고 싶지만 막막하기만 한 사람을 위해 대충이라도 이해시켜 줄 수 있기를 바라면서 씁니다.
단계를 나눈 이유는 알고 싶은 곳 까지만 아시라는 그런 이유입니다.
물론 제가 아직 안배워서 덜 쓴 겁니다... ;
남병철.레조 [lezo]   2011-02-24 22:37 X
오프모임 나온다는 뜻으로 봐도 되는건가요? ㅎㅎ
Nibble [gameover]   2011-02-25 15:13 X
과다한 비유는 학습을 더디게 할 수 있습니다. ^^

+ -

관련 글 리스트
19189 CPU->어셈블리어->고급언어 까지....(1) 한수동 4854 2011/02/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.