프로그램에 대한 이해, 그 필요성에 대해서

컴퓨터는 끊임없이 동작하고 움직인다. 부팅을 한 순간부터 사용자의 눈에 보이는 행위부터 눈에 보이지않는 행위까지 이런저런 무언가를 쉴 새 없이 행하고 있다. 물론 지멋대로 움직이는 것은 아니다. 프로그래머가 컴퓨터에게 던진 임무들을 받아서 행하고 있는 것이다.

컴퓨터가 행하고 있는 임무 및 작업은 크게 2가지로 세분화할 수 있다.

하드웨어적인 부분과 소프트웨어적인 부분.

프로그래머는 컴퓨터라는 기계가 가지고 있는 하드웨어적인 재료들을 이용해 특정작업을 행하도록 컴퓨터에게 소프트웨어적으로 명령을 내린다.

그리고 프로그램은 프로그래머가 컴퓨터에게 시킨 명령 및 작업들의 집합체이다
== 프로그램은 프로그래머가 작성한 코드들의 집합체이다

프로그램의 설계는 즉 완벽하게 프로그래머의 영역이다. 프로그램의 개념을 이해한다는 것은 결국 프로그래머의 영역범위를 이해하는 것이고, 이말은 컴퓨터에게 내가 시킬 수 있는 일과 없는 일을 구분할 수 있고 이해할 수 있는 것과 같다.

예를들어 현존하는 컴퓨터의 마우스 시스템을 내가 직접 만든다고 생각해보자. 마우스의 움직임을 실시간으로 받아들여 컴퓨터와 통신시키고, 마우스에게서 전해받은 데이터를 컴퓨터가 받아들여 특정행위를 행할 수 있도록하는 설계가 필요하다. 그럼 프로그래머로서 내가 할 수 있는 설계와 할 수 없는 설계는 무엇일까.

마우스도 일종의 자그만한 컴퓨터이다.(마우스 안에는 dps 프로세서라고 사용자가 마우스에 가하는 여러 물리적 신호를 디지털신호로 알맞게 변환해주는 cpu가 장착되어 있다). 이때 마우스에서 컴퓨터로 넘어가는 신호 그 자체를 만들어내고, 신호를 주고 받는 경로자체를 설정하는 것은 프로그래머가 하는 일이 아니다. (물론 데이터를 올바르게 받아오기위해서 통신경로를 찾아야 하기는 한다)

프로그래머는 마우스에서 컴퓨터로 넘어온 데이터 그 자체를 구체적으로 분류하고, 분류에 맞게 각종 기능을 설계한다. 각 마우스 제조사별로 날아오는 데이터의 체계 (인코딩)도 다를 것이기때문에 플랫폼에대한 분류 또한 필요하다. 이러한 부분을 설계하고 완료해서 프로그램을 만들고 컴퓨터 시스템에 등록한다. 이것이 마우스 장치드라이버라는 프로그램을 만드는 과정이다.

장치디바이스-컴퓨터의 통신 구조도

12312321.png

1 dBWVevOPmf22lMGcaPNmSw.png

프로그래머로서 내가 무언가를 만들때 컴퓨터에게 내릴 수 있는 명령과 내릴 수 없는 명령을 파악하는 것은 가장 기본적인 것이다. 이를 파악하기위해선 프로그래머가 직접 다루는 소프트웨어적인 지식(프로그래밍 언어)뿐만 아니라 컴퓨터구조에대한 하드웨어적인 지식까지도 총괄적으로 필요하다.

해당 문서시리즈에서는

(1)프로그램에서부터 시작해,

(2)프로세스에 관한 내용 : 프로그래머가 컴퓨터에게 내린 명령집합(프로그램)을 컴퓨터가 받아들였을때 컴퓨터 내부에서 어떠한 동작들이 일어나는지, 컴퓨터의 하드웨어적인 영역을 이해하기 위함

(3)쓰레드에 관한 내용 : 프로세스의 더 구체적 이해를 위함

까지를 다룰 것이다.

프로그램의 뜻 - (구현부, 프로그래머의 영역)

qwe.png

위키백과에 따르면 프로그램이란 프로그래밍된 결과물을 뜻한다고 한다.

이런 인문학적인 정의말고 개발자입장에서 조금 더 개발자스러운 정의를 내려보자면,
프로그램이란 컴퓨터에 저장되어 실행이 가능한 완성된 코드들의 집합체라고 말할 수 있을 것 같다.

즉, 윈도우컴퓨터를 이용하면서 흔히 접할 수 있는 exe확장자(윈도우)를 가진 파일들이 바로 프로그램이다.(리눅스의 경우 확장자의 개념이 모호하기때문에 실행권한을 가진 파일들이라고 할 수 있겠음)

프로그램은 실행파일(exe)이다. 사실 이 정의 역시도 모호하고 부족한 느낌을 버릴 수 없다. 뜻과 정의를 통한 이해는 결국 얕은수준의 이해가 될수 밖에 없다. 뜻과 정의에서 벗어나 프로그램의 개념에 대해서 한번 생각해보자.

프로그램의 개념 - (실행부, 컴퓨터의 영역)

프로그램은 실행파일이다. 컴퓨터에 저장된 모든파일들은 결국 2가지로 나뉘어진다.

실행이 가능한 파일과 (명령어가 들어가있는 소스파일을 기반으로 만들어진 파일) ,

단순한 문자열의 나열로만 되어있는 파일 (명령어가 존재하지않은 파일 - txt파일,html파일,오디오-이미지-영상파일등)

그 밖의 분류는 존재하지않는다.

그렇다면 컴퓨터가 실행파일을 실행한다는 것은 무엇을 뜻하는 것일까? 프로그래머가 작성한 명령체계(코드)를 읽어들이고, 명령의 처리를 위해 자원을 할당받고(ex.운영체제에게서 메모리를 할당받음), 해당 명령을 완료할때까지 자원을 소모하며 따라가는 컴퓨터의 행위라고 말할 수 있을 것 같다.

프로그램 구현과 실행에대한 순서도를 대략적으로 적어보자면,

프로그램의 구현

(1) 프로그래머가 컴퓨터에게 내릴 명령들의 로직도를 작성한다 (프로그래머가 코딩을한다)

(2) 해당 명령들을 컴퓨터가 올바르게 읽을 수 있게 번역과정을 거치고 실행에 필요한 추가적인 파일을 연동시켜준다 (프로그램 빌드과정 => 컴파일과 링킹, 컴파일러의 번역과 링커의 파일연동)

(3) 해당 명령들을 컴퓨터가 오류없이 읽어들이고 한번의 실행과정을 정상적으로 수행하게되면 실행파일로 배포한다 (프로그램 빌드 완료)

프로그램의 실행

(1) 사용자가 실행파일을 실행시킨다 (명령을 실행)

(2) 컴퓨터는 명령에 대한 동작을 행하기위해 메모리를 할당받는다 (프로세스 생성)

--> 메모리는 데이터의 등록과 삭제가 프로그램 실행중에 동적으로 일어나는 동적주소공간과(스택과 힙 영역), 프로그램이 종료될때까지 고정된 주소에 데이터가 박혀서 변화하지않고 유지되는 정적주소공간(Data-Text Segment 영역)으로 나뉜다

--> 프로그램이 할당받은 메모리 영역을 프로세스 주소 공간 이라고 한다

--> 프로세스는 실제로 프로그램이 동작하도록 명령문들을 읽어들여 해당 명령을 컴퓨터에 전해주며, 명령에 따른 파생데이터들을 부여받은 저장공간에 저장한다.

(3) 프로그램이 종료될때까지 프로세스가 계속하여 명령을 수행한다

프로그램은 실행파일이다. 실행파일은 컴퓨터에게 특정명령집합을 던져주어 로직대로 동작하게끔 만든 일종의 지시문이다.

그렇다면 프로그램의 궁극적 개념은 컴퓨터가 명령을 처리하기위해 동작하는 (위에서 서술한) 모든 일련의 과정들을 이해하고있는 프로그래머가, 알맞게 명령들을 설계해 내려놓은 것 이라고 말할 수 있지 않을까.