brunch

You can make anything
by writing

C.S.Lewis

by Younggi Seo Dec 11. 2019

C를 배우기 전에 반드시 알아야 할 것

개발자가 H/W 구조를 알아야 하는 까닭


레지스터 -> Stack memory <-- Calling functions, Save a reference addresses and Local variables
메인 메모리 -> Heap memory




CPU는 프로그램으로부터 지시받은 명령을 수행하는 주체가 아니다. 단지 지시받은 명령들의 연산이나 제어를 수행하기 위한 매개체일 뿐이다. 인간으로 치면 손과 발에 의해 행위가 실행되는데 그것이 일어나기 위해 거쳐야 하는 두뇌에 해당한다.



이것이 정확한 비유가 되겠는지는 모르겠으나, 두뇌는 사용해야지 발달하지, 사용하지 않으면 무용지물이듯이 인간도 두뇌를 이용해서 신체의 움직임(근골격의 활동)을 지속적으로 개선시킬 수 있다. 즉 두뇌를 통해 자신의 동작을 보고(정확하게 말하면 ‘인식’, 그러나 인간은 자신이 아는 것만 볼 수 있는 존재이므로 두뇌의 인지과정을 통해서만 곧 자신이 볼 수 있는 모든 것을 인식할 수 있다.) 무엇을 고쳐야 하는지 피드백을 받음으로써 차차 이루려는 동작이 개선되듯이 컴퓨터의 S/W도 CPU를 통해 지속적인 연산과 제어를 함으로써 나오는 결과를 통해(피드백) 원하는 값을 얻기 위한 지속적인 개발 및 디버깅(통틀어 Test Based Development, 테스트 주도 개발)을 할 수 있다.



소프트웨어 공학자의 소양으로 컴퓨터 하드웨어의 구조를 익혀야 한다. 기본적인 컴퓨터 하드웨어 구조를 공부하지 않으면 소프트웨어 알고리즘의 최적화를 구현하기 힘들다고 한다. 예를 들어 변수의 개념을 공부한다고 하면, 변수라는 것이 메모리의 어떤 영역을 주소값 대신 프로그래머가 정한 이름으로 참조할 수 있도록 정의한 개념(일종의 Alias, 별칭)이라는 것을 이해한다면, 함수의 매개변수 전달에서 값에 의한 전달(Call by value)과 참조에 의한 전달(Call by reference)을 명확히 구분할 수 있다.



뿐만 아니라, CPU가 메모리에 있는 데이터에 접근하는 것에 비해 하드디스크에 저장된 내용을 읽어오는 것이 얼마나 느리며 시간이 걸리는지를 이해한다면, 프로그램에서 파일 I/O를 왜 최소화해야 하는지 자연스럽게 알 수 있다. 컴퓨터 구조를 자세하게 배우라는 의미가 아니며, 다만 소프트웨어는 하드웨어라는 물리적 공간에서 실행되는 것이기 때문에 하드웨어의 성능에 영향을 받을 수밖에 없고, 프로그램에서 복잡하다고 여겨지던 개념들이 사실 하드웨어를   효율적으로 다루기 위한 것이기에, 하드웨어 구조를 이해하는 것이 프로그래밍 실력 향상에 도움이   있음을 설명한 것이다(개발자 관련 서적, 2019).



CPU의 내부는 주로 제어 장치, 연산 장치(ALU), 레지스터 군으로 구성돼있는데 각 버스로 연결되어 있다. 일단 프로그램이 실행되기까지 CPU는 버스를 통해 메인 메모리와 통신을 해야 한다. 그중 레지스터는 명령 및 데이터를 일시적으로 기억하는 장치로 바로 메모리에 저장되어 있는 명령 및 데이터를 여기에 복사한 후 그 값을 이용해서 해석 및 연산을 한다(무랴야마 유키오, 2015).



register  n. 기록 등록부, 명부, (상점의) 레지, (악기의) 음역   --> '기록하라! 무엇을? 프로그램이 지시한 것을!'



CPU의 내부에는 많은 종류의 레지스터가 있는데 C 프로그래밍을 할 때 반드시 기억해야 하는 것이 범용 레지스터이다. 범용 레지스터는 여러 개 존재하는 것이 일반적이다. 그리고 레지스터 버퍼라는 것도 있다. 이는 일시적으로 값을 기억하기 위한 레지스터로 레지스터의 구동성을 위한 기능을 한다. 이에 대해서는 나중에 다루겠다.



그럼 왜 레지스터를 사용해야 프로그램에서 지시한 것을 처리할 수 있을까? 그것은 레지스터와 레지스터 사이에서만 연산을 할 수 있는 시스템(H/W) 구조(Stored Program Concept, 폰 노이만의 저장식 프로그램 아키텍처) 때문이다. 이 개념에 의한 프로그램 동작 구조를 다음 섹션에서 상세히 다루기로 하고 결론은 프로그램을 구현하는 주체는 CPU라기보다는 그 프로그램을 실행시키는 오퍼레이팅 시스템(OS, 운영체제)에게 실행 명령어를 내리는 사용자이며, 운영체제가 CPU를 제어하면서 프로그램을 실행한다.



인공지능 시대에 강 AI니 약 AI니 인공지능이 인간의 지능을 넘어설 날이 곧 올 것처럼 선전하는 책들이 서점의 미래 트렌드 코너에 진열되어 있지만, 그러한 기술력은 레이 커즈와일이 예측한 기술의 최전선이 인간의 예측 범위를 벗어나는 ‘특이점’이 오는 시기의 2030년은 지나서야 가늠해볼 수 있겠다.



프로그램의 종류는 소형 임베디드 시스템 등을 제외하고 1개의 프로그램만으로 움직이는 컴퓨터는 존재하지 않는다. 대개의 경우, 여러 개의 프로그램이 협력해서 움직이게 된다. 복잡한 대규모의 시스템일수록 많은 프로그램이 작동하고 있다. 프로그램의 종류에 대해 정리해 보면 3가지로 분류할 수 있고 이 프로그램들은 모두 C 만들 수가 있으며, 실제로 수많은 프로그램이 C 만들어져 있다.



다음 편에서 앞서 말한 버퍼 레지스터 등의 레지스터의 종류와 그리고 레지스터와 레지스터 사이에서의 연산과정 3가지(CPU가 할 수 있는 모든 것)에 대해 자세히 살펴보고, 왜 앞으로 더욱 C를 배워야만 하는지에 대해서 얘기해보겠다.





참조

- 무라야마 유키오. 이해란 역. (2015). C를 배우기 전에 반드시 알아야 할 것들, 서울: 루비 페이퍼

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari