CS/운영체제

[운영체제] 프로그램이 만들어지고 실행되기까지

pythaac 2021. 10. 1. 18:26

  고전적인 방식으로 프로그래밍 언어의 종류는 '컴파일 언어'와 '인터프리터 언어'로 나눕니다. 컴파일 언어는 한 번에 기계어로 바꾸어 실행파일을 만드는 방식이고, 인터프리터 언어는 한 줄씩 읽어 기계어로 바꾸고 실행하는 방식으로, 실행파일을 따로 만들지 않습니다. 따라서, 두 방식은 프로그램을 만들고 실행하는 과정이 다릅니다. 이제는 이와 같은 방식으로 언어를 분류하지 않는 듯 하지만, 먼저 두 방식을 비교해보았습니다.

 

컴파일 언어의 프로그램 생성과정

  컴파일 언어인 C언어를 기준으로, 컴파일 언어의 프로그램 생성은 다음 과정을 거칩니다.

전처리기는 컴파일 전에 #include나 Macro와 같은 내용을 처리합니다. 컴파일러는 어셈블리어로, 어셈블러는 바이너리코드인 기계어로 번역합니다. 링커는 하나 이상의 오브젝트 파일과 프로그램이 참조하는 라이브러리를 병합하여 하나의 실행파일로 만드는 역할입니다.

 

컴파일 언어의 실행과정

  컴파일과 링크가 끝나 생성된 프로그램은 실행 전까지 저장장치에 저장되어있습니다. 프로그램을 실행시키면 로더(Loader)가 메인 메모리에 프로그램을 로드하고, CPU가 메모리에서 명령어를 읽어 실행합니다.

 

인터프리터 언어의 실행과정

  인터프리터 언어는 코드 전체가 아닌 일부를 기계어로 번역하여 바로 실행하고, 바로 결과를 얻는 방식입니다. 

 

구현체에 따른 프로그래밍 실행과정

  최근 프로그램이 실행되는 과정을 보면, 위에서 봤던 컴파일 과정에서의 어셈블리어처럼 중간 언어로 번역하고, 이를 인터프리터로 번역하여 실행하는 방식으로 이루어져 있습니다. 이러한 혼합 방식으로 인해, 컴파일 언어와 인터프리터 언어로 분류하기 어려워졌습니다. 그러나 아래 과정을 인터프리터 방식으로 보는 시각이 많은 듯 합니다.

  추가적으로, 현재 가장 많이 사용되는 방식이 JIT(Just-In-Time) 컴파일 방식입니다. JIT 컴파일 방식을 사용하는 구현체는 JAVA의 JVM, Python의 PyPy, 그리고 Javascript의 V8이 이에 해당합니다. JIT에 대하여 간략하게 아래 글에 정리했습니다.

2021.10.01 - [[개발] 공부하기/JAVA, Python, 그리고 Node.js] - [Python] Pypy와 CPython (구현체)

 

[Python] Pypy와 CPython (구현체)

프로그래밍 언어의 구현체 (Implementation) 우리는 파이썬을 이야기할 때 종종 언어 뿐만 아니라 구현체를 포함하여 말한다. 파이썬은 다양하게 구현될 수 있는 언어의 스펙일 뿐이다. When we speak of

pythaac.tistory.com

 

마치며

  프로세스의 정의를 정리하다가 메모리에 적재되는 과정이 궁금해졌고, 컴파일/인터프리터 이야기를 하다보니 JIT 컴파일러와 Python 구현체까지 가게 되었네요... 궁금한 이야기가 너무 많은데...

  • 인터프리터가 해석한 기계어가 실행되는 과정? (메모리 적재 등등...)
  • JIT 컴파일러의 상세한 동작과정
  • 로더가 메모리를 적재하는 정책

우선 이 글에 적어두고, 공부할 내용이 많아서 다음에 찾아봐야겠습니다 ㅠㅠ

 

참조

[1] 블로그 - 컴파일러와 인터프리터의 차이

https://velog.io/@zihs0822/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC%EC%99%80-%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4

[2] 블로그 - JAVA는 인터프리터(interpreter) 방식과 컴파일(compile) 방식이 혼합된 언어이다.

https://jaeseongdev.github.io/development/2021/03/08/JAVA%EB%8A%94_%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0_%EB%B0%A9%EC%8B%9D%EA%B3%BC_%EC%BB%B4%ED%8C%8C%EC%9D%BC_%EB%B0%A9%EC%8B%9D%EC%9D%B4_%ED%98%BC%ED%95%A9%EB%90%9C_%EC%96%B8%EC%96%B4%EC%9D%B4%EB%8B%A4/

[3] 블로그 - 컴파일러와 인터프리터의 차이점을 알아보자

https://cbw1030.tistory.com/276

[4] 블로그 - Java - JIT 컴파일러

https://medium.com/@ahn428/java-jit-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-c7d068e29f45

[5] 블로그 - A Deeper Inspection Into Compilation And Interpretation

https://medium.com/basecs/a-deeper-inspection-into-compilation-and-interpretation-d98952ebc842

[6] 블로그 - what is program

https://burningrizen.tistory.com/219

[7] 스택오버플로우 - How does an interpreter/compiler work

https://stackoverflow.com/questions/2377273/how-does-an-interpreter-compiler-work