읽기전 주의!
이 글은 비전공자도 읽기 쉽도록 설명을 많이 단순화한 글입니다. 전공자의 눈높이에서 아주 엄밀한 설명은 아닐 수 있으니 주의를 바랍니다.
서론
오늘은 파이썬 코딩이 아닌, 컴퓨터가 어떻게 돌아가는 지 구조적 원리와 파이썬의 실행 원리에 대해 알아보는 시간입니다. 따라서 이번 시간에는 내용을 천천히 읽어보며 아 동작 원리가 이렇구나~ 정도만 이해하고 넘어가시면 됩니다. 원래는 다루지 않으려고 하였으나 이런 실행 원리를 알고 코딩하는 것과 모르고 코딩하는게 꽤나 차이가 많이 나므로 이번 글은 꼭 정독해보시길 바랍니다.
컴퓨팅 구조
우리는 기본적으로 바탕화면에 여러 아이콘 (프로그램) 을 두고, 이 아이콘을 더블클릭해 실행시켜 컴퓨터를 사용하게 됩니다. 그리고 이런 실행파일의 확장자는 무조건 *.exe 입니다. 윈도우에서 끝이 exe로 끝나는 파일은 모두 실행파일이며, 작성된 프로그램입니다.
물론 확장자가 없는 바로가기 아이콘도 존재하지만 오른쪽 클릭 - 파일 위치 열기를 해보면 결국 바로가기도 실행 파일(*.exe) 과 연결되어 있음을 알 수 있습니다.
이러한 exe로 된 실행 파일은 요즘 시대엔 전부 "프로그래밍 언어" 로 작성되며 우리 컴퓨터에서 가장 중요한 중추인 CPU가 실행시키게 됩니다.
더블클릭하면 프로그램이 실행되는 방식에 대해 조금만 더 자세히 알아보겠습니다.
1. 기본적으로 실행 파일은 우리 컴퓨터의 저장 장치(HDD / SSD) 에 저장되어 잠들어 있습니다. 여기서 잠들어 있다는 뜻은 아직 실행하지 않았다는 뜻입니다. 프로그램을 더블클릭 하여 실행시키기 이전엔 모든 프로그램은 HDD나 SSD 같은 저장장치에 잠들어 실행을 기다리고 있습니다.
2. 그러나 우리가 더블클릭하여 main.exe 라는 프로그램을 실행시키는 그 순간! 컴퓨터의 운영체제(OS)는 우리가 실행한 프로그램을 컴퓨터의 RAM 이라는 곳에 올려서 실행시키게 해줍니다.
그러면 main.exe 는 생명을 얻게 되고 RAM 위에서 실행되며 살아있는 프로그램이 됩니다! 이러한 살아있는 프로그램을 좀 있어보이는 말로 "프로세스" 라고 부릅니다.
3. RAM 위에서 실행된 main.exe는 CPU에 의해 읽히며, CPU는 RAM위에 올라온 프로그램 코드를 실행시키며 작동하게 됩니다.
결론적으로 모든 프로그램은 RAM위에서 실행되고, 실행시키는 주체는 CPU입니다. CPU는 RAM위로 올라온 프로세스를 실행합니다.
Ctrl + Shift + Esc 를 눌러보면 작업 관리자가 열리며 현재 컴퓨터에서 실행중인 프로그램(프로세스)이 어떤 것인지 알 수 있습니다.
좀 어렵죠? 그래도 관통하는 핵심주제를 다시 얘기해보자고 한다면 1. 모든 프로그램은 RAM위에서 실행된다. 2. CPU는 RAM에 올라온 프로그램 코드를 읽으며 한 줄 한 줄 실행시킨다. 가 되겠습니다.
추가적으로 CPU는 0, 1 밖에 알 지 못합니다. 인간의 언어는 전혀 이해하지 못하는 기계 그 자체입니다. CPU가 이해하는 건 오직 숫자 0과 1뿐이며 이러한 0과 1을 사용하는 체계를 "이진법" 이라고 합니다. 또 0과 1로 서술된 언어를 흔히 기계어라고도 합니다.
따라서 아까전에 저장장치에서 main.exe를 더블클릭하면 RAM위에 코드가 올라오고, CPU가 이걸 읽어 실행시킨다고 했는데 당연히 main.exe에 든건 CPU가 이해하기 위한 0과 1로 적힌 코드뿐입니다.
main.exe에 잔뜩 적힌 0과 1로 적힌 코드가 더블클릭하면 RAM으로 저장되게 되며, CPU는 이 0과 1 데이터를 RAM에서 읽으면서 실제로 실행시켜, 프로그램이 동작하게 되는 것 입니다.
프로그래밍 언어의 구분 (인터프리터 / 컴파일)
프로그램은 프로그래밍 언어로 만듭니다. 현재 2023년까지와서 사용되고 있는 프로그래밍 언어는 매우 많습니다. 제일 유명한 C언어부터 시작하여 Java, C++, C#, Go... 우리가 배우고 있는 Python 까지..
이렇게 다양한 프로그래밍 언어를 실제로 몇 가지 기준에 따라 나눌 수 있다는 사실. 알고 계신가요?
오늘은 번역 방식에 따라 프로그래밍 언어를 "컴파일 언어" 와 "인터프리터 언어" 로 나눠보도록 하겠습니다. 즉 오늘 배워볼 내용은 프로그래밍 언어에서 인터프리터 언어와 컴파일 언어의 차이에 대해 이해하는 것 입니다.
물론 현대에 와서는 컴파일과 인터프리터를 동시에 수행하는 언어도 존재하게 되면서, 프로그래밍 언어 자체를 딱 컴파일 언어다! 인터프리터 언어다! 라고 확실하게 나눌 수 없어지기도 했습니다. 그러나 일단은 일반적으로 사람들이 이 프로그래밍 언어는 컴파일 언어다~ 인터프리터 언어다~ 라고 부르기 때문에 인터넷에 많이 나오는 분류대로 프로그래밍 언어를 인터프리터와 컴파일 언어로 나눴습니다.
프로그래밍 언어는 크게 컴파일 언어와 인터프리터 언어로 구분됩니다.
기계어
앞에서 설명했다 싶이 컴퓨터는 바보라서 0과 1밖에 모릅니다. 그러므로 CPU에 무언가 일을 시키려면 기계어를 그대로 입력해줘야 합니다. 지금 입력한 기계어가 1+1을 하고 출력하라는 명령어라고 가정해본다면, CPU에 이걸 그대로 입력하면 한 줄씩 해석하면서 이해를 하게 됩니다.
그러니깐 프로그램을 만들려면 이 기계어를 알아야 된다 이말입니다.
하지만 사람의 입장에서 이 기계어는 외계어에 가깝습니다. 애초에 0과 1의 순서는 그냥 CPU를 만든 제조사에서 이렇게 이 순서대로 0과 1을 입력하면 CPU를 조작할 수 있다 라고 알려준거라서 의미가 전혀 없습니다.
의미도 없는 언어를 어떻게 알고 프로그래밍 할까요..? 물론 기계어를 공부하면 할 수 있지만 너무나 고통스러운 과정이며 효율성도 떨어지게 됩니다.
처음 배우는 사람한텐 파이썬도 어렵다고!!!
컴파일 언어
그래서 똑똑한 사람들이 "프로그래밍 언어"를 창시했습니다. 우리는 앞으로 기계어로 직접 프로그래밍 하는게 아니라 우리 인간의 언어와 닮아있는 프로그래밍 언어로 프로그래밍을 하게 됩니다.
물론 이렇게 프로그래밍 언어로만 작성하면 여전히 CPU 입장에선 이해하지 못합니다. 왜냐면 0과 1이 아니기 때문이죠. 그래서 똑똑한 사람들은 "프로그래밍 언어" 뿐만이 아니라 컴파일러 까지 만들어놨습니다. 이 컴파일러는 프로그래밍 언어와 기계어를 모두 알고 있는 똑똑한 프로그램입니다.
따라서 우리는 프로그래밍 언어로 프로그래밍을 열심히 하고, 컴파일러를 켜서 우리가 작성한 코드를 제공해주면 이 컴파일러가 알아서 우리가 작성한 프로그래밍 언어를 exe 파일 (==기계어 실행 파일) 로 변환해줍니다.
이제 이걸 실행하면 CPU는 우리가 작성한 코드가 기계어로 번역되어 이해할 수 있게되는 것 입니다.
이런식으로 컴파일러가 중개하여, 우리가 프로그래밍 언어로 작성한 코드를 기계어로 바꿔 실행 파일로 만드는 과정을 "컴파일 한다" 라고 표현하고, 이렇게 컴파일러를 사용하는 프로그래밍 언어를 "컴파일 언어" 라고 합니다.
대표적으로 C언어, Java, C# 등이 컴파일 언어에 해당합니다.
컴파일 언어는 전부 컴파일 과정(번역 과정)을 거쳐서, 우리의 코드를 기계어 실행 파일로 바꿔주기 때문에, exe 파일이 필연적으로 생성되게 됩니다.
우리가 열심히 프로그래밍 언어로 코드를 작성했다면, 실행을 위해 컴파일을 해야 되니깐요.
컴파일을 하게 되면 필연적으로 exe 파일 (==기계어 파일) 이 생성됩니다.
어.. 그런데 우리가 앞서 파이썬으로 프로그래밍 하면서 실행시킬 때 exe 파일이 생성이 됐나요? 그렇지 않습니다.
파이썬은 인터프리터 언어기 때문에 이렇게 컴파일 과정을 거치지 않습니다.
물론 정확히는 파이썬도 구현체에 따라 먼저 바이트 코드로 컴파일하고, 나중에 인터프리팅 하는 방식을 사용하기도 합니다. C#, Java 역시 코드를 먼저 바이트코드(중간 언어)로 1차 컴파일 이후 가상 머신으로 실행하는 방식을 따르기도 하죠. 추가로 컴파일이라는 용어 자체도 좁은 의미에서는 프로그래밍 언어를 기계어로 바꾸는 뜻이지만, 크게 봤을땐 특정 언어를 다른 프로그래밍 언어로 바꾸면 컴파일입니다. 따라서 타입스크립트를 자바스크립트로 바꾸는 것 역시 컴파일이라고 표현합니다.
다만 본 글에선 아까도 설명했듯이 이렇게 깊은 설명 대신에 범용적으로 사람들이 부르는 용어대로 설명합니다. ex) 자바스크립트는 인터프리터 언어다, C언어는 컴파일 언어다 / 또한 여기서 컴파일은 프로그래밍 언어를 기계어로 바꾸는 겁니다.
* 머리가 아프시면 이 설명은 그냥 무시하고 넘어가주세요.
인터프리터 언어
그러면 인터프리터 언어가 어떤 언어인지 알아야겠죠? 컴파일 언어와 다르게 인터프리터는 조금 다르게 프로그램을 번역합니다.
앞에서 설명한 컴파일 언어(C 등등)는 우리가 작성한 코드를 컴파일러를 통해 전부 기계어로 바꿔서, 실행 파일로 만들어줍니다. 여기서 중요한 점은 코드를 처음부터 끝까지 전부 읽고 exe 파일로 전부 기계어로 번역해준다는 점입니다.
이러한 컴파일 언어의 방식의 장점으로는 실행이 빠르다는 점입니다. 이미 우리가 작성한 코드가 0과 1로 전부 번역되어 있어서 CPU 입장에선 한 줄씩 읽기만 하면 되니깐요. CPU는 실제로 엄청난 속도로 기계어를 실행시킬 수 있습니다.
우리가 영어로 된 책을 읽을때, 영어로 된 원문을 한 줄씩 스스로 해석해서 읽는것보단, 그냥 누가 통짜로 한국어로 번역해둔 번역본을 읽는게 훨씬 빠를겁니다.
단점으로는 컴파일을 기다려야 된다는 점입니다. 지금 우리는 파이썬을 배우고 있고 컴파일 언어를 사용해보지 않아서 모르겠지만 회사에 들어가서 아주 큰 규모의 프로그램을 컴파일 언어로 개발하게 되면 컴파일을 기다리는 시간이 상당히 소요됩니다. 좀 극단적으로 실행을 시키기 위해 컴파일이 분 단위로 걸리는 경우도 있습니다. 한 번 실행하려면 3분을 기다려야 하는 상황. 상상이 되시나요?
컴파일을 기다리는 것도 싫고 빨리 빨리 실행하고 싶은 요구가 생겼습니다. 인터프리터 언어를 사용하면 컴파일 시간을 전혀 기다리지 않고 바로 실행할 수 있습니다.
인터프리터 언어는 컴파일 언어와 유사하게 프로그래밍 언어를 기계어로 바꾸는 과정을 거칩니다.
하지만 그 바꾸는 과정이 조금 다른데요. 컴파일러는 소스 코드를 위에서부터 끝까지 읽고 전부다 기계어로 번역했다면, 인터프리터 언어는 코드를 실시간으로 한 줄 한 줄씩 읽으면서 그 코드를 그에 맞는 기계어로 번역해 CPU에서 바로 실행시키도록 합니다.
코드를 한 줄 한 줄씩 읽으면서 기계어로 바꾸는 놈을 "인터프리터" 라고 하고 인터프리터를 활용하여 코드를 실행시키는 프로그래밍 언어들을 "인터프리터 언어" 라고 합니다.
파이썬 역시 인터프리터 언어입니다.
인터프리터 언어는 소스코드를 실시간으로 한 줄 한 줄씩 번역하는 특성때문에 exe 파일이 나오지 않습니다.
파이썬으로 지금까지 코딩할 때 왜 exe 파일이 한 번도 생기지 않았는지 이유를 아시겠죠?
실제로 파이썬 코드를 실행시키면 파이썬 인터프리터가 실행되어서 우리가 작성한 코드를 한 줄 한 줄 기계어로 번역해 실시간으로 실행시킵니다.
이러한 인터프리터 언어의 장점으로는 컴파일 시간을 기다릴 필요가 없다는 겁니다. 애초에 컴파일 과정이 없으니깐요.
코드가 아무리 길어져도 실행시간은 항상 동일합니다. 어짜피 한 줄씩 실행시키는 방식이기 때문이죠.
따라서 인터프리터 언어로는 뭔가 빨리 빨리 실행시키면서 프로그램을 만들어야 하는 상황에서 유용합니다.
컴퓨터 프로그래밍을 처음 배울때에도 인터프리터 언어로 많이 배웁니다. 한 줄 한 줄씩 대화하듯이 실행할 수 있어서 코드의 원리를 이해하기 쉽기 때문이죠.
인터프리터 언어의 단점으로는 일단 실행이 느리다는 점입니다. 당연히 실시간으로 한 줄씩 읽으면서 번역해야 하니 이미 통짜로 다 번역해두고 실행시키는 컴파일 언어에 비해 훨씬 느립니다.
아까 영어로 된 책을 읽을때 한 줄 한 줄 직접 번역하는거보다 번역본을 읽는게 훨씬 빠르다고 했는데 (컴파일 언어)
인터프리터 언어의 경우 실제로 한 줄 한 줄 직접 번역하면서 읽는거랑 같은겁니다.
당연히 훨씬 느리죠..
또한 실행 파일(exe) 이 안만들어져서 인터프리터 언어로 exe 파일을 만드는건 매우 어렵습니다. * 물론 가능은 하나, 쉽지 않고 성능도 떨어집니다.
+ 추가로 오류 검출이 늦게 됩니다. 컴파일 언어의 경우 하나라도 문법에 오류가 있으면 기계어 번역이 안되는 반면 인터프리터는 실시간으로 번역해 한줄씩 실행하기 때문에 일단은 먼저 한 줄 씩 실행시키다가 나중에 오류가 난 부분에서 프로그램이 딱 종료하게 됩니다. 일단은 실행은 문제 없이 무조건 된다는 거죠. 실행하기 전에 오류를 잡으면 좋겠지만 인터프리터 방식으론 불가합니다.
뭐 이렇게 쓰고보니 인터프리터 언어는 장점보다 단점이 더 많은거같은데;; 현대 컴퓨터 성능이 워낙 올라가서 인터프리터 언어를 써도 사람이 느끼기엔 충분히 빠른 프로그램을 만들 수 있습니다. 저도 실제로 프로그램 개발 시 대부분 파이썬을 사용하고 있구요. 성능이 떨어지는 부분만 C언어 같은 컴파일 언어로 때워버리면 끝입니다.
어쨌던 오늘 이해할만한 내용은 일단 파이썬은 인터프리터 언어고, 컴파일 언어랑 비교했을때 이러 이러한 차이를 가진다~ 정도만 이해하시면 되겠습니다. 그리고 이해하셨다 싶이 인터프리터 언어에서 코드를 번역해주는건 인터프리터기 때문에 앞으로 파이썬 코드를 실행시키는 주체는 "컴퓨터" 라는 표현 이외에 "(파이썬) 인터프리터" 라고도 표현하도록 하겠습니다.
파이썬 코드를 실제 CPU가 이해하는 기계어로 실시간으로 번역해주는건 파이썬 인터프리터 입니다.
참고
http://www.tcpschool.com/python2018/python_intro_feature
'프로그래밍 강좌 > Python [리뉴얼중]' 카테고리의 다른 글
[파이썬 강좌] #6 input() 으로 입력 받기, 주석(Comment), 세미콜론 (0) | 2023.09.23 |
---|---|
[파이썬 강좌] #5 실행 중 데이터를 메모리에 저장하자! 변수(Variable) (0) | 2023.08.19 |
[파이썬 강좌] #3-2 파이썬 훑어보기 (0) | 2023.08.03 |
[파이썬 강좌] #3-1 파이썬 훑어보기 (0) | 2023.08.01 |
[파이썬 강좌] #2 파이썬 개발환경 구축 (0) | 2023.05.06 |