우리는 한다, 개발을.

프로그램 실행 과정

⌛ 3 mins

목차


  1. 개요
  2. 프로그램 컴파일 과정
  3. CPU와 CPU 동작 원리



개요

컴퓨터는(정확히는 CPU) 0과1로 이루어진 2진수만 계산할 수 있습니다.(전기신호 on/off)

그런데 우리가 작성한 프로그램이 컴퓨터에서 어떻게 실행될까요?

컴퓨터가 우리가 작성한 코드를 해석하는 과정과 프로그램을 실행하는 과정을 초보자 관점으로 아주 간단하게 알아 보았습니다.
(기준은 응용프로그램입니다)


※ 웹프로그래밍과는 상관 없을 수도 있지만 v8엔진도 C++로 작성된 엔진이며 웹브라우저도 응용프로그램이고 결국 명령어를 처리하는것은 컴퓨터이기 때문에 알아서 안좋을건 없을 것 같다고 생각해 주제로 삼았습니다.



프로그램 컴파일 과정

과정

실제로 우리가 작성한 코드는 cpu가 바로 이해하지 못하고 컴파일 과정을 통해 기계어로 변환하고 프로그램을 실행하면 기계어를 읽어들여 처리합니다.

고급언어

  • 사람이 이해하고 작성하기 쉬운 코드
  const num = 10;
  const add = num + 20;
  console.log(add);

바이트 코드(Byte Code) or 어셈블리어(Assembly Language)

  • 사람이 작성한 고급언어(Javascript, java, C)를 cpu에게 직접 명령할 수 있을 정도로의 수준으로 변환한 코드(저급언어)
Add r0, [6] LdaSmi [1]

기계어(Machine Code)

  • CPU가 바로 읽어서 실행할 수 있는 비트 단위의 이진 코드(0, 1 off / on)
10110000 01100001 ......

과정

javascript (고급언어)

function add(x, y) {
 return x + y;
}
add(101, 201);

바이트 코드 (저급언어)

d8 --print-bytecode app.js

0xfde0821004e LdaConstant [0]
0xfde08210050 Star r1
0xfde08210052 Mov <closure>, r2
0xfde08210055 CallRuntime [DeclareGlobals], r1-r2
0xfde0821005a LdaGlobal [1], [0]
0xfde0821005d Star r1
0xfde0821005f LdaSmi [101]
0xfde08210061 Star r2
0xfde08210063 LdaSmi.Wide [201]
0xfde08210067 Star r3
0xfde08210069 CallUndefinedReceiver2 r1, r2, r3, [2]
0xfde0821006e Star r0
0xfde08210070 Return

CPU와 CPU 동작 원리

CPU는 컴퓨터에서 가장 핵심적인 연산 역할을 수행하는 부분. ‘인간의 두뇌’에 해당합니다

크게 연산장치(ALU), 제어장치(CU), 레지스터 3가지로 구성됩니다.

cpu 구조

CPU 구성요소

  • 연산 장치(ALU) : 덧셈, 뺄셈, 곱셈, 나눗셈 등의 산술연산과 논리곱, 논리합, 부정 등의 논리연산을 수행

  • 제어 장치(CU) : 명령어를 순서대로 실행할 수 있도록 제어하는 장치 주기억장치에서 프로그램 명령어를 꺼내 해독한 다음,
    해독한 결과에 따라 명령어 실행에 필요한 제어 신호를 기억장치, 연산장치, 입출력장치로 보냅니다.

  • 레지스터 : 고속의 기억장치입니다. 명령어 주소, 명령어 코드, 연산에 필요한 데이터, 연산 결과 등을 임시로 저장합니다.
    용도에 따라 범용 레지스터와 특수 목적 레지스터로 구분됩니다.

    ※범용 레지스터란 ‘연산에 필요한 데이터나 연산 결과를 임시로 저장’하는 레지스터
    ※특수 목적 레지스터란 ‘특별한 용도로 사용하는 레지스터

처리속도

레지스터 <- 주기억장치(RAM) <- 보조기억장치

중요 특수 목적 레지스터

PC (Program Counter) : 다음 인출될 명령어의 주소를 가지고 있는 레지스터

AC (Accumulator) : 연산 결과 데이터를 일시적으로 저장하는 레지스터

IR (Instruction Register) : 가장 최근에 인출된 명령어(현재 실행 중인 명령어)가 저장되어 있는 레지스터

MAR (Memory Address Register) : PC 에 저장된 명령어 주소가 사용되기 전에 일시적으로 저장되는 주소 레지스터

MBR (Memory Buffer Register) : 기억장치에 저장될 데이터 혹은 읽혀진 데이터가 일시적으로 저장되는 버퍼 레지스터

CPU 동작 원리

cpu 동작원리

cpu 동작원리

T0 : MAR ← PC
T1 : MBR ← MAR, PC ← PC+1
T2 : IR ← MBR

cpu 동작원리

T0 : MAR ← IR(Addr)
T1 : MBR ← MAR
T2 : AC ← AC + MBR

결론

프로그램 실행 과정을 크게 분류 해보면

  1. 고급언어로 프로그램 코드 작성
  2. 컴파일 또는 인터프리터로 컴파일 하여 기계어로 변환(실행파일)하여 보조기억장치에 저장
  3. 보조기억장치에서 실행할 프로그램을 RAM에 올림
  4. CPU가 처리가 필요한 명령어들을 RAM에서 가져와 처리함
  5. CPU가 처리한 명령어를 RAM에 저장함
  6. 운영체제와 기타 출력장치(모니터,스피커, 프린터…)로 인해 결과를 보여줌

이번 내용으로 컴퓨터와 조금이라도 더 친해지는 계기가 되었으면 좋겠습니다.


참고 사이트

https://gyoogle.dev/blog/computer-science/computer-architecture/%EC%A4%91%EC%95%99%EC%B2%98%EB%A6%AC%EC%9E%A5%EC%B9%98%20%EC%9E%91%EB%8F%99%20%EC%9B%90%EB%A6%AC.html

https://ndb796.tistory.com/7

https://curryyou.tistory.com/237

https://pks2974.medium.com/v8-%EC%97%90%EC%84%9C-javascript-%EC%BD%94%EB%93%9C%EB%A5%BC-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%A0%95%EB%A6%AC%ED%95%B4%EB%B3%B4%EA%B8%B0-25837f61f551

https://velog.io/@baedollee/%ED%95%98%EC%9D%B4%EB%A0%88%EB%B2%A8-%EC%96%B8%EC%96%B4%EC%97%90%EC%84%9C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%8B%A4%ED%96%89%EA%B9%8C%EC%A7%80