과학

[핵노잼 SW] 프로그램과 실행

선 요약
0. 이글은 전문성을 요하지 않는 잡글임. 말그대로 읽판용. 봐도그만 안봐도 그만

1. 프로그램(혹은 앱)을 실행하면 어떤식으로 작동되는걸까 ?
2. 프로그램 == 코드의 집합체 / 프로세스 == 프로그램이 메모리에 적재되어 CPU에서 실행되는 상태
3. 가상 메모리에 적재된 각 코드들이 CPU(혹은 AP) 에서 순차적으로 실행된다.
4. CPU에서 코드들이 실행되며, 각종 외부장치(memory, gpu, mouse, keyboard 등등)을 이용하여
   사용자의 입력을 받아 -> 연산을 하고 -> 출력장치를 통해 출력한다.



안녕 게이들, 학생들은 열공하고 직딩들은 열일 하고 있나 ?

요즘 읽판에 소프트웨어 글들이 종종 보이길래 한사람의 개발자로서 너무 반갑다 ㅎ



많은 사람들이 컴퓨터를 배우려면 당장 C언어 #include부터 배우려고 하는 경향이 있는것 같아.

물론 언어를 배우는것도 중요하지만, 좀더 근본적인 과정 부터 접근하는게 난 더 좋다고 생각해.

지극히 주관적이지만... 당장 프로그램 구현하겠다고 언어만 배우는건,

"나는 엔지니어가 아니라 코더입니다. 나를 코딩 노예로 써주세요" 라는거랑 똑같은거 같아.

어찌됐든 내실있는 개발자가 되고, 만약 이쪽 진로에 꿈이 있다면 과정을 차근차근 밟았으면 좋겠어서

해본 말이고, 본 글은 그냥 컴터 쓰는사람이면 알아두면 좋을법한 글이야



탐색기를 켜서 c:\windows 에 가면 notepad.exe 라는 응용 프로그램이 있을거야.

이 exe 응용 프로그램이 바로 프로그램이야(윈도우에서는)

우선 메모장을 하나 켜놓구, 이 c:\windows에 있는 notepad.exe를 드래그 해서 메모장에 올려두면

제목 없음.png


뭐 요런것들이 주르륵 나오는데 이것들이 코드들이다. 다시말해 프로그램은 코드(텍스트)들을 모아둔 파일이야.



위처럼 푀\z푀\튁 등 알아볼수 없는 글자로 나오는 이유는 코드에는 두가지 종류가 있기 때문이야.

1. 컴퓨터가 이해하는 코드 -> 프로그램  -> 2진수
2. 사람이 작성하는 코드 -> C언어, 자바등  -> 알파벳, 숫자 등

즉 다시 말하면

1. 사람이 알파벳이나 숫자로 구성된 C언어를 코딩해서 (사람이 작성하는 코드)

2. 일정 과정을 거지면(사람이 이해하는 언어 -> 컴퓨터가 이해하는 언어)

3. 컴퓨터가 이해하는 코드( == 프로그램) 로 만들어 지는거야. (컴퓨터가 이해하는 코드)



자 그럼 이제 프로그램이 만들어 지는 과정과, 프로그램이 뭔지는 알았네.

프로그램이 만들어지는 과정 ?
- C언어가 됬든, 자바가 됬든, 뭐가 됬든지간에
- 사람이 이해할수 있는 코드로 논리적인 과정을 기술한 후에
- 일정 과정을 거쳐( == 사람이 이해하는 언어를 컴퓨터가 이해하는 언어로 변환)
- 컴퓨터가 이해하는 언어를 텍스트 파일로 모아놓는다(사람의 언어든, 컴퓨터의 언어든 여튼 적어놔야 하니까)

프로그램 ?
- 사람이 이해하는 언어로 기술 된 논리적인 코드를 컴퓨터가 이해할수 있는 언어로 변환해 모아둔 파일

이거네(물론 프로그램의 정의는 다양하지만 단편적으로 이 글에 한해서).

이제 프로그램이 뭐냐 라고 누가 물어볼때 모르면, 우선 프로그램은 컴퓨터가 이해하는 논리적인 코드다! 라고 해.



자 그럼 이제 프로그램이 뭔지 알았으니까 이게 컴퓨터에서 어떻게 실행되는지 보면 끝이네. 아쉽당ㅋ

우선 보기 전에 프로그램 VS 프로세스를 알아보자.

프로그램 == 코드
프로세스 == 프로그램(코드) 가 실행 되고 있는상태


이거야. 우리 모니터 좌하단에 시작 "프로그램" 이 있고,

CTRL + SHIFT + ESC 를 누르면 프로세스 관리가 나오잖어 ?

다시 말하면 프로그램을 더블클릭 해서 실행 되면 

1. 윈도우(커널) 에서 가상 메모리를 할당 한다.(우리가 흔히 말하는 가상메모리 4G, 64bit 는 8G)
2. 프로그램(코드) 를 할당된 가상 메모리에 적재한다.
3. CPU는 가상메모리에 적재 된 코드를 논리적 순서에 따라 CPU에서 연산 한다.

간단히 말해 위 세과정을 거치는 거야.



그럼 아까 c:\windows 에 있는 notead.exe 를 그냥 까봤는데, 이번에는 헥사(16진수) 에디터로 열어보자.

헥사에디터는 여러가지가 있겠지만, 난 윈도우에서 가장 접근하기 쉬운 notepad++ 를 사용했어.

사용법은 http://dsct1472.tistory.com/338 요기에 이분이 친절하게 정리 해주셨네.



notepad.exe 를 헥사 에디터로 까보면

(좌측)       (우측)
0002F270 10 a0 18 a0 20 a0 28 a0 30 a0 38 a0 40 a0 48 a0 -> 첫번째 줄
0002F280 50 a0 58 a0 60 a0 68 a0 70 a0 78 a0 80 a0 88 a0 -> 두번째 줄
0002F290 90 a0 98 a0 a0 a0 a8 a0 b0 a0 b8 a0 c0 a0 c8 a0 -> 세번째 줄

이제 요런식으로 나오게 되는데 이것들이 결국 컴퓨터가 이해할수 있는 언어로 쓰여진 코드들이야.

좌측에 보이는게 메모리 주소이고, 우측에 보이는게 해당 메모리 주소의 값 인데
(좌측꺼는 보기 좋아라고 써진거고, 실제 프로그램에는 우측 값들만 적혀있음)

프로그램이라면 : 프로세스가 될때 가상메모리의 좌측의 메모리 주소에, 우측에 보이는 값을 적재하라
프로세스 라면  : 가상메모리의 좌측의 메모리 주소에는, 우측 값이 저장되어 있다.

라는걸 나타내는거지.

정리하면

10 a0 18 a0 20 a0 28 a0 30 a0 38 a0 40 a0 48 a0 요런것들이 코드들이고
0002F280 요런것들이 코드들이 저장될 가상 메모리의 주소인거야.



* 32bit 컴퓨터는 메모리 -> cpu로 데이터(코드, 이외의 값) 들을 가져갈때 BUS를 통해 32bit씩 가져가고
  마찬가지로 cpu에서도 32bit씩 처리할수 있어. 그래서 32bit 컴퓨터라고 하는거야
  그럼 64bit컴퓨터는 64bit 씩 처리하니까 성능이 아무래도 나아지겠지 ?

다시 보면 0002F280 10 a0 18 a0 20 a0 28 a0 30 a0 38 a0 40 a0 48 a0 은

가상 메모리 0002F280 에 10 a0 18 a0 / 20 a0 28 a0 / 30 a0 38 a0 / 40 a0 48 a0 
각 32bit * 4 ( ==  128bit) 가 적혀있고, 이것들이 각각 코드이다.
(물론 모든 하나의 코드가 32bit는 아냐. 32bit보다 작을수도 있고 32bit보다 클수도 있어
 작으면 한번에 가져올수 있는 크기 이내니까 걍 가져오면 되고,
 크면 여러번 가져와서 합쳐야겠지)
이 각각의 코드들이 가상 메모리에서 CPU로 와서 실행된다.



막판에 집중이 안되서 조금 설명이 허접하지만 마지막으로 정리하면

1. 엔지니어가 사람이 이해할수 있는 언어(C, JAVA 등등)로 코드를 짬
2. 이 코드를 컴퓨터가 이해할수 있는 언어로 만듬(컴파일/빌드/링크 -> 어셈)
3. 이 컴퓨터가 이해할수 있는 언어가 프로그램이고, exe파일이고, 결국 이 exe파일은 코드의 집합이다.
4. 이 프로그램(exe)를 실행하면 프로세스가 되어 가상메모리에 프로그램(코드) 들이 적제된다.
5. cpu에서는 이 코드들을 하나씩 가져가서 논리에 따라 실행한다.

결국 이게 아주 러프한 프로그램 실행 과정이야.

쓰고보니 핵노잼인거 같지만, 관심있는사람은 재밌게 봐주길 바래 ㅎ



* 윈도우라서 exe로 제한.
* 32bit, 64bit 의 구분은 위 두가지 말고도 범용 레지스터 크기로 구분하기도함. 결국은 같은 맥락
* 가상 메모리도 결국 물리 메모리(우리가 컴터 본체 열고 끼는 그거)에 매핑되어있음
* cpu에서는 pc레지스터를 가지고 다음번에 실행할 명령어를 가져옴
* 보통 C는 C언어 -> 전처리 -> 컴파일 -> 링킹 과정을 거치고 이것들을 합쳐서 빌드라고 하기도 함.

* 이 기계어는 각 회사마다, 혹은 같은 회사여도 칩셋마다 다름.
* 그래서 각 회사마다 어셈은 달라도, 모든 프로그래머가 동일한 코딩을 하기위해 추상화 시켜놓은게
  C언어임. 요즘은 더 편한 언어들이 많지만 데니스리치가 만들었을때는 쩌는 하이레벨 언어였음

* 즉 다시말하면 어떠한 언어든지 기계어가 되어 실행되야함.


25개의 댓글

2015.03.09
이쪽 까막눈이 봐도 알아먹기 쉽게 설명 잘 했네 ㅊㅊ
0
2015.03.09
개발자라 ==라고 쓰는건가 ㅋㅋ
0
CP7
2015.03.09
재미있는데...?
0
CP7
2015.03.09
혹시 시간 나실때마다 이런글좀 써주시면... ㅎ
0
2015.03.10
가상 메모리 보단 주메모리에 올린다 해야 사람들 헷갈리지 않을듯 싶은데..

주메모리에서 가상메모리에 매핑을 시켜놔도 결국은 데이터가 주메모리에서 캐시로 넘어가줘야 하는거 아님?
0
2015.03.10
@노농
네 그럴것 같네요. 맞습니다
0
2015.03.10
첫번째 그림파일 첨부한게 저게 어떻게 소스코드냐

프로그래밍의 기초도 모르는놈이네
어디 교과서 배껴가지고 타이핑질이야...

그리고 레지스터 명령어 용량이 얼마나되는지는 알고서 레지스터로 컴파일한다고 자신있게말하는거냐?
그 상위(우선순위 아래)계층에 있는 cache는 뭐라고설명할래?

객체지향의 언어의 특성이 인간이 이해하기 가장 쉽지만 컴파일속도가 제일느린건 아냐?
지금은 모르겠다만 몇년전만해도 어셈블러 몸값이 억대였다

그리고 노트패드,워드패드는 에디터로 절대부적절한 프로그램이며
VS나 이클립스로 디컴파일시도해도 소스코드는 안나온다

왜냐고?

내가만든,회사가만든 상업적 소스코드가 공개되면 회사매출에 타격이생기니까
악의적이지만 어쩔수없이 숨기고자 소스코드를 숨기는 프로그래밍 기법이 생긴거다

이 현상으로 인해서 컴파일시 파일용량은 약70%가 더 늘어나게됬다.
소스코드를 암호화하기위해서
0
2015.03.10
@여자가열매냐
아무도 저 이미지가 소스코드라고 안함 .. 난독이냐 ㅂㅅ이냐 저렇게 열어서 나온 글씨들을 hex화시키는게 코드자체고 틀린말 아닌데 니야말로 글 제대로읽고 댓글달어라.
뜬금없이 객체지향이 느리네 빠르네 하지말고 자바같은건 디컴파일 되기도 하고 일반 C로짠건 디엇
0
2015.03.10
@기보눈
디어셈블링해서 코드유추하기도한다
0
2015.03.10
@여자가열매냐
요즘은 Context switch를 고려해서 여분의 레지스터 풀을 둔다.

특히 레지스터 갯수가 턱없이 부족한 x86_64에서는 꼭 있어야함..

아 근데 컴파일은 그냥 번역후에 대충 obj만들기전에 중간 언어 거치지 않나?
0
2015.03.10
@잉텔
네 맞습니다.

아 글구 컴파일러가 그냥 번역 후 대충 obj 만들기 전에 중간 언어를 거치는건

gcc를 예로 들어서 해보면 gcc code.c -E -o code 하면

code.c -(1)-> code.i -(2)- code.a -(3)- code.o -(4)-> code 로 되는데 이때

1. 전처리기 cpp0
2. 컴파일러 cc1
3. 어셈블러 as
4. 링커 ld

순으로 처리됩니다. 그러니까 말씀하신 "대충 obj 만들기 전에 중간언어" 라는거는

전처리->컴파일 된 거겠죠~
0
2015.03.10
@Gongdori
으.. 아직 컴파일러 수업을 듣기 전이라...

그냥 만들때 대충 트리로 해서 만든다고만 알고있었지..

크.. 좋은 정보 ㄳ
0
2015.03.10
@여자가열매냐
ㄴ여자가 열매냐

거침없는 비판을 해놓으셨네요 ㅎ

우선 레지스터로 컴파일 한다고 말한적은 없구
아마 PC레지스터에서 다음번 실행할 명령어를 가져올 주소를 가지고 있다는걸 보고 착각 하신거 같은데, 다시한번 읽어 보세요

객체지향언어가 컴파일 속도가 느리다 빠르다에 대해서는 언급 한적이 없구요

어디서 일하시는지 모르겠지만, 어셈 몸값이 억대다. 이거 참 흥미롭네요. 저도 어셈 많이 했으니까 몸값좀 올려보고 싶네요
알려주세요 그 회사 어딘지. 어셈이 중요한건 맞지만 OOL이랑 어셈일 비교해서 뜬금없이 어셈이 몸값이 억대다라는 이야기를
왜하시는지 궁금 하네요.
저도 나름 제일 로우단에서 일하고 있는데 여기도 어셈만 하시는분 안계시거든요, 작년 제 업무가 부트로더 였는데도 최초 BSP
에서만 어셈 고치고 그 이후로는 없거든요? 그래서 아쉬웠어요 저는 어셈이 좋거든요. 알려주세요 억대로 받는 그 회사 어딘지
이직 해야겠네요

노트패드 워드패드를 에디터로 써라고 한게 아니라, 일반인들이 전문적인 에디터를 쓸 필요가 없으니까 그냥 쉽게 쓸수있는것들로
열어보라구 한거구요

그리고 "악의적이지만 어쩔수 없이 숨기고자 소스코드를 숨기는 프로그래밍 기법" 에 대해 언급하셨는데
reverse 많이 아시나? 많이 아시면 댓글 달아 주세요. 심도 깊은 이야기 한번 나눠보죠 저랑 ㅋ

어줍짢은 지식으로 세상 삐뚫게 보지 마시구, 여기가 읽판이란거를 생각해 주세요 ^^
여튼 댓글 감사 드립니다
0
2015.03.11
@Gongdori
허허 vs가 컴파일과정에서 소스코드를 암호화해준다는 말은 정말 ㅋㅋ
0
2015.03.10
엊그제 정보처리기사 시험본 비전공자로서 쏙쏙 와닫는 내용이라 재밌네
궁금한게
1. 모든 프로그램이(혹은 어떤 프로그램들은) 종국에는 동등한 어셈블리어를 사용하는지?
2. 위의 질문이 Y라면, 다른 종류의 고급언어은 결국 같은 방식으로 (컴퓨터의 입장에서)해석되서 사용될 수 있는건지?
3. 아직 코딩 쪼랩이 보기엔 절차지향형 프로그램(vb)에서 부프로그램을 일종의 메소드개념으로, 매크로를 클래스 개념으로 충분히 활용가능하다고 보이는데(아니면 그에 준하는 방법으로 확장시켜서라도) 왜 안되는지(메모리 로드방식이 다르다거나, 알고리즘상의 근본적인 개념이 다르다거나 하는) 명쾌한 이유가 있는지?

코딩 쌩초본데 취미로 독학하려니까 뭔가 잘 모르겠는데, 뭘 모르는지 모르는 상태라 노답이다.
사실 질문도 말이 되는 질문인지 잘 모르겠어, 적당히 이해하는대로 답해주면 고맙겠다
0
2015.03.10
@알룡맨
작성자 아니지만 전공자라서 답변함.
1. 아니다
작동되는 아키텍쳐에 따라 다른 어셈블리어를 사용한다.

2. 맞다
1번에서 말한바를 기억하자. 하나의 컴퓨터의 하나의 아키텍쳐에서 작동하는 어셈블리는 하나이다. 어떤 과정을 겪어서 나온 어셈블리든 컴퓨터는 자기가 가지고 있는 아키텍쳐로 그 어셈블리를 동작시킬 것이다. 고급언어는 해당 아키텍쳐에서 작동하는 단 하나의 어셈블리에 맞춰 자기가 가진 코드를 컴파일한다.

3. 있다
질문자가 언급한 메모리 관리에서의 차이점이나 알고리즘에 작동 방식이 다른 경우도 있지만, 언어의 목표가 다르다. c에서 메크로와 함수포인터와 자료구조로 c++방식 프로그램과 매우 유사하게 코딩할수 있지만 그냥 c++로 코딩하는 것보다 불편하다. 2번 질문을 생각해보면 사실상 어떤 언어를 쓰던간에 같은 아키텍쳐에서 같은 어셈블리가 나오니, 하나의 언어만 써서 다른 모든 언어를 대신할수 있다. 하지만 코딩과 작동방식과 작업효율과 비용에 대단히 비효율적이겠지. 안되는게 아니라, 안하는 거다.

(설명은 비전공자에 맞춰서 직관적으로 정리했다. 엄밀하고 정확한 이론적 입장에서 몇몇 설명은 오류를 포함한다)
0
2015.03.10
@비상
완전 정답이네요
0
2015.03.11
@비상
답변해준것도 고맙지만
병신같이 질문했음에도 의도를 잘 파악해줘서 고마워~
0
2015.03.10
Win32에서 사용하는 EXE 구조를 보면 여러개의 섹션을 나누어져 있음...

맨처음 MZ로 시작하는 부분은 DOS Stub라고 16비트 DOS환경에서 PE 파일 포맷을 실행할때 오류를 뜨워주는 부분임.

DOS Stub에는 또 PE 헤더의 위치를 알림. 이걸 이용해서 16비트 환경과 32/64비트 환경에서 작동하는 바이너리 작성가능.

또한 EXE를 바로 메모리에 올려서 쓰는게아니라 OS가 섹션에 있는 정보를 사용해서

메모리에 올릴때 먼저 함수의 주소나 변수의 주소를 결정하기 위해 바인딩부터 시작함.

바인딩 할때 DLL에서 함수를 가져온다고 하면 가상메모리 할당 받고 DLL로부터 코드를 읽어온다.

그리고 그 함수의 주소를 가져오는거임.

아니면 섹션중에 text섹션이 존재 하는데 여기는 소위 말하는 기계어로 작성된 순수 명령어 코드들이 들어가 있지.

이 text섹션을 메모리에 적재후 주소를 결정 하고..

근데 여기서 가상 메모리를 말하면 애들이 스왑 메모리로 알아들을듯...?

여기서 말하는 가상메모리는 CPU를 속이기 위한 논리 메모리 주소를 말하는거임..

실제로 물리 메모리를 외부단편화를 방지하기 위해 4K단위의 페이지로 운영되기 때문에

가상 주소를 사용해야됨 물론 가상 주소가 실제 물리 메모리 주소로 변환되는 장치가 CPU내 멤컨에 존재함..

하.. ㅅㅂ 저 기계어 코드들을 보면 가끔 몇몇 코드는 직접 어셈블리 코드로 읽힌다...;;
0
2015.03.10
@잉텔
정확히 지적 해주셨네요.

사실 잉텔님 댓글처럼 글을 써야 맞는거긴 하지만

최대한 단순화 시켜서 흐름위주로 써보려 했더니 전문적인게 많이 빠졌네요

님 덧글 덕에 다행히 좀 보완이 될수 있겠네요. 감사합니당
0
2015.03.10
크 공대감성 폰트색상 ㅋㅋㅋㅋ

추천!
0
2015.03.10
c언어를 공부하려고 c언어를 공부하면 안된다.
0
2015.03.11
ㅋㅋ 핵노잼 이지만 깨알같은 == 에 불알을 탁치고 갑니다
0
2015.03.11
@밥아저씨
ㄹㅇ ㅋㅋ 프로그래머 종특
0
2015.03.12
프로그래머 하면 중소기업드가면 돈얼마버냐 대기업가면 얼마벌고
0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜
563 [과학] 경계선 지능이 700만 있다는 기사들에 대해 34 LinkedList 12 20 일 전
562 [과학] 번역)새들은 왜 알을 많이 낳는가? - 후투티의 형제살해 습성... 7 리보솜 3 2024.03.23
561 [과학] 학계와 AI, 그리고 Bitter Lesson (쓰라린 교훈) 26 elomn 35 2024.02.17
560 [과학] 지구의 속삭임, 골든 레코드의 우주 9 Archaea 10 2024.02.16
559 [과학] 잔혹한 과학실험 이야기 <1> 절망의 구덩이 19 개드립하면안됨 37 2024.02.15
558 [과학] 스트레스를 받으면 술이 땡기는 이유 12 동식 16 2024.02.10
557 [과학] 지능은 모계유전이 아니다. 40 울릉특별자치도 35 2024.01.26
556 [과학] 진화를 생각할 때 고려할 것들 23 날씨가나쁘잖아 12 2024.01.17
555 [과학] 학문적(과학적) 접근과 유사 진화심리"학" 26 날씨가나쁘잖아 19 2024.01.15
554 [과학] 호모 사피엔스의 야릇한 은폐된 배란에 대한 남녀 학자의 다... 14 개드립하면안됨 15 2023.12.29
553 [과학] 김영하의 작별인사를 읽고 느낀 점 (스포있음) 21 장문주의 2 2023.11.28
552 [과학] 제4회 포스텍 SF 어워드 공모전 ( SF 단편소설 / SF 미니픽션 ) 2 따스땅 1 2023.11.25
551 [과학] 펌) CRISPR 유전자 가위 치료제 "최초" 승인 12 리보솜 7 2023.11.25
550 [과학] 러시아는 기술산업을 어떻게 파괴시켰는가(펌) 9 세기노비는역사비... 15 2023.11.18
549 [과학] 고양이에 의한 섬생태계 교란과 생물 종의 절멸 (펌) 2 힘들힘들고 6 2023.11.16
548 [과학] 번역) 알츠하이머병 유전자는 어떻게 살아남았는가? 12 리보솜 10 2023.11.15
547 [과학] 『우영우』의 자폐 스펙트럼 장애 개념이 왜곡인 이유 (펌) 47 힘들힘들고 10 2023.11.12
546 [과학] 흑수저 문과충 출신 구글 취직하는 파이썬 특강 -1 14 지방흡입기 11 2023.09.27
545 [과학] 국가별 당뇨 유병율 이거 뭐가 바뀐건지 아는사람? 8 LAMBDA 1 2023.09.27
544 [과학] 물샤워 ㅇㅈㄹ 하는 놈들 봐라 171 철동이 48 2023.09.23