소프트웨어라는 말 많이 들어보셨죠? 소프트웨어는 CPU, 메모리, 입출력 장치 등 컴퓨터의 몸체를 칭하는 하드웨어와 반대 개념으로 알고 있습니다. 정확히는 컴퓨터 프로그램과 그와 관련된 문서들을 소프트웨어라고 하는데요. 오늘은 프로그래밍의 핵심 개념 중 하나인 소프트웨어에 대해 알아 봅시다.

📱 애플리케이션 개요

세상에는 다양한 프로그램이 존재합니다. 그 중에서도 우리가 가장 많이 사용하는 프로그램은 애플리케이션입니다. 앱이나 어플이라고 줄여 부르기도 하죠.

주로 스마트폰에서 자주 사용하는 단어이지만 사실 컴퓨터에서 사용하는 프로그램도 애플리케이션에 포함됩니다. 애플리케이션의 정의가 사용자가 직접 사용하는 프로그램을 말하니까요. 참고로 가장 마지막으로 사용하는 유저라고 하여 소비자를 엔드 유저(End User)라고도 합니다.

우리가 컴퓨터에서 사용하는 포토샵, 스카이프, 온라인 게임들(오버워치, 롤), 크롬 등은 모두 애플리케이션이라고 할 수 있습니다. 하지만 이외에도 에어컨, 블루투스 스피커, TV 등에도 애플리케이션이 있습니다. 이런 가전들은 대부분 리모컨이나 버튼으로 조작을 할 수 있기 때문이죠. 이러한 맥락에서 계산기, 심지어 키오스크도 애플리케이션이라 할 수 있습니다.

그렇다면 애플리케이션은 어떤 과정을 통해 만들어질까요? 애플리케이션도 프로그램의 한 종류이기 때문에 코딩을 통해 만들어집니다. 그런데 영어와 숫자로만 이루어진 코드에서 어떻게 우리가 사용하는 애플리케이션이 구현될 수 있을지 궁금하지 않으신가요?

이 물음에 대한 답은 어떤 소프트웨어에 있습니다. 바로 컴파일러와 인터프리터 말이죠. 컴파일러와 인터프리터가 프로그래밍 코드를 실제로 동작할 수 있는 프로그램으로 구현시켜 줍니다. 두 소프트웨어는 활용 방식이 다른데요. 이에 대해 자세히 알아봅시다.

📱 컴파일러(Compiler)

지난 시간에 컴퓨터가 이해할 수 있는 프로그래밍 언어는 머신코드(기계어)라고 배웠었는데요. 따라서, 컴퓨터가 코드를 실행하기 위해서는 고수준 언어를 기계어로 번역하는 과정이 필요합니다. 한 언어의 코드를 다른 언어의 코드로 바꿔주는 과정컴파일러라고 합니다. 쉽게 말해 컴파일러는 프로그래밍 언어의 번역기인 셈이죠.

그렇다면 컴파일러가 없던 시절에는 어떻게 컴파일 과정을 거쳐 프로그램을 실행할 수 있었을까요? 정답은 바로 '번역을 하지 않고 사람이 직접 기계어로 작성했다.'입니다.

지난 시간에 머신코드와 함께 어셈블리어를 소개해 드렸었는데요. 사람이 직접 이 어셈블리어를 가지고 첫번째 컴파일러를 만들어낸 것입니다. 컴파일러가 나온 이후에야 사람들은 직접 기계어를 작성하는 어려움에서 벗어날 수 있었죠.

이처럼 하나의 코드를 다른 언어의 코드로 바꾸는 것은 매우 어려운 과정입니다. 하지만 뛰어난 개발자들의 노력으로 우리는 그 혜택을 누리기만 하면 되었죠. 감사합니다 ㅠㅠ

컴파일러의 실행 방식은 이렇습니다. 개발자의 컴퓨터에서 컴파일러를 거쳐 생성된 머신코드를 사용자의 컴퓨터로 보내주면 사용자의 컴퓨터가 머신코드를 실행해서 프로그램이 동작합니다.

이렇게 유용한 컴파일러에도 불편한 점이 있는데요. 일부분만 수정하고 싶어도 고급 언어부터 수정해서 다시 컴파일러를 거쳐야 하는 문제가 있습니다. 머신코드를 사람이 이해할 수 없기 때문이죠.

대부분의 개발자들은 코드를 한번에 작성하지 않고 한 줄씩 작성한 뒤 실행하는 방식을 선호하는데요. 따라서, 실행할 때마다 매번 컴파일을 거쳐야 하는 이 방식은 개발자들에게 무척 번거롭게 느껴집니다.

게다가 컴파일 과정에 소요되는 시간도 상당하죠. 한 줄의 코드만 수정할 뿐인데 매번 몇 분씩 기다려야 하니까요. 한 마디로 컴파일러는 빠르게 개발할 수 없다는 단점이 있습니다.

📱 인터프리터(Interpreter)

컴파일러가 지니는 번거로움을 극복하기 위해 개발자들은 새로운 방식을 고안해냈습니다. 바로 인터프리터입니다. 인터프리터는 한꺼번에 번역을 진행하는 컴파일러와 달리 코드를 한 줄씩 실시간으로 실행합니다. 코드 번역기가 아니라 코드 실행기인 셈이죠.

코드를 즉시 실행하기 때문에 바로 결과를 확인할 수 있습니다. 결과적으로 개발 속도가 더 빨라지는 것이죠.

인터프리터의 실행 방식은 어떤 식으로 이루어질까요? 이미 번역된 머신코드를 사용자 컴퓨터에 전송하는 컴파일러와 달리 인터프리터는 프로그래밍 코드 자체를 사용자 컴퓨터로 전송합니다. 즉, 사용자의 컴퓨터에서 코드를 기계어로 바꾸는 것이죠. 따라서, 사용자의 컴퓨터는 실시간으로 코드를 실행시키는 인터프리터를 가지고 있어야 합니다.

이러한 방식의 문제점실행 속도가 떨어진다는 것과 코드가 유출될 위험성이 있다는 것입니다. 사용자의 컴퓨터가 코드를 해석해야 하기 때문에 실행 속도가 떨어지고 코드 자체를 넘겨 받기 때문에 유출 가능성이 있는 것이죠.

그러나 용량면에서는 인터프리터가 컴파일러보다 뛰어납니다. 고수준 언어에서 저수준 언어로 번역될수록 코드의 길이가 길어지는데 인터프리터는 고수준 언어인 코드 자체를 전달하기 때문에 프로그램 용량이 더 작기 때문이죠.

📱 컴파일러 vs. 인터프리터

컴파일러와 인터프리터의 장단점을 비교하면 위와 같습니다.

한마디로 컴파일러는 개발은 불편하지만 실행 속도는 빠르고 인터프리터는 개발은 편하지만 실행 속도가 느립니다.

그런데 이러한 표현이 낯설지 않습니다. 사실 코드의 실행 방식은 프로그래밍 언어의 특징과도 연결되기 때문이죠. 컴파일러의 특징은 저수준 언어의 특징과 닮았고 인터프리터의 특징은 고수준 언어의 특징과 닮았습니다. 그래서 언어마다 주로 쓰이는 실행 방식이 다릅니다.

고수준 언어편리한 개발을 지향하기 때문에 매번 컴파일을 거치는 컴파일러는 적절하지 않습니다. 따라서, Python과 Ruby 같은 고수준 언어의 경우 인터프리터 방식을 더 선호합니다.

반면에 저수준 언어는 개발은 힘들더라도 최고의 성능과 효율, 속도를 추구하기 때문에 실행 속도가 느린 인터프리터는 적합하지 않겠죠? 따라서, C와 C++처럼 저수준 언어에 가까운 언어들은 컴파일러를 더 선호합니다.


이번 시간에는 우리가 흔히 사용하고 있는 애플리케이션의 정의와 하나의 코드가 애플리케이션으로 구현될 수 있도록 도와주는 프로그램인 컴파일러와 인터프리터에 대해 알아 봤습니다. 다음 시간에는 소프트웨어와 하드웨어를 연결을 도와주는 운영체제에 대해 알아보겠습니다.

* 이 자료는 CODEIT의 컴퓨터 개론 강의를 기반으로 작성되었습니다.
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글