파이썬 인터프리터 사용 – 파이썬 컴플리트 3

파이썬 인터프리터

이번 포스팅에서는 파이썬 인터프리터에 대해서 알아보겠습니다.

인터프리터란? – 컴파일?

영어로 interpreter 는 해석, 번역의 뜻입니다. 프로그래밍 언어에서 인터프리터는 명령어를 한번에 한 줄씩 읽고 실행하는 프로그램을 말합니다. 프로그램은 한 줄씩 읽는게 맞는데 이게 무슨 차이가 있을까요?

예를 들어 소스코드가 100줄인 프로그램이 있다고 하면 100줄을 모두 읽은 후에 전체를 한번에 기계어로 번역해서 실행하는 프로그램이 있습니다. 이것을 컴파일이라고 하며 C나 자바에 해당합니다. (컴파일과 링킹) 파이썬 같은 스크립트 프로그래밍 언어는 명령어를 한 줄 씩 실행합니다. 100줄이 있건 1만줄이 있건 한줄씩 차근차근 진행하는 것 입니다.

책 한권을 통째로 번역해 놓고 보는 것과 필요할 때 마다 한 문장씩 번역하는 차이와 비슷합니다. 처음부터 모든 것을 번역해 두면 시간이 충분하기 때문에 여러가지 논리적 의미적 오류들을 잡아내기 쉽습니다. 한권을 번역하는데는 시간이 걸리겠지만 나중에는 번역할 필요가 없으니까 빨리 빨리 볼 수 있습니다.

반면 한줄씩 번역하면 번역할 시간을 절약할 수 있습니다. 필요한 문장들을 한번에 한 문장씩 번역하면 됩니다. 하지만 매번 번역에 시간이 더 걸리게 됩니다.

비유적으로 설명을 했는데 컴퓨터의 컴파일(compile) 언어와 인터프리터(interpreter) 언어는 더 복잡한 내부적 차이가 있습니다.

컴퓨터의 효율성만을 따졌을 때는 컴파일 언어의 장점이 있습니다. 미리 기계어 코드가 준비되어 있다는 것은 다음 명령이 기계어로 해석되도록 기다릴 필요가 없다는 것으로 입력 대기 시간이 필요없습니다. 인터프리터 언어는 소스 코드를 한줄씩 가져와서 기계코드로 번역해야 하므로 입력 대기 시간이 아주 길어집니다.

그러나 최근에는 파이썬이나 자바스크립트 등 인터프리터 언어들이 앱개발에서 각광을 받고 있습니다. 여러가지 이유가 있지만 사람이 이해하기 쉬운 고급언어(high level language) 환경으로 컴파일 언어보다 유연성이 뛰어나기 때문입니다. 인터프리터 언어는 가상머신이 코드를 읽고 알아서 처리하기 때문에 인공지능의 성격도 가지고 있습니다. 해서 파이썬 인터프리터를 대화형 모드, 인터렉티브 모드라고도 합니다. 뭐 다 비슷한 개념인데 프로그래머 입장에서는 어떤 코드 한줄만으로 파이썬으로부터 주요한 피드백을 받을 수 있기 때문에 여러가지로 편합니다.

컴파일 언어를 오래 사용하던 숙련자들도(고인물) 나중에 파이썬을 경험한 후 굉장히 쉽게 원하는 작업을 할 수 있다는 점이 매력이라는 의견이 있습니다. 컴파일 언어와 인터프리터 언어를 정적인 타입(static typing)과 동적인 타입(dynamic typing) 의 특성으로 비교하기도 하는데 꼭 그런 것은 아닙니다.

인터프리터 언어는 프로그램의 실행 정보에 대해서 사전에 검토를 완료한 컴파일러 언어와 달리 대부분의 정보가 실행시간(runtime)에 주어집니다. 즉 많은 것이 컴파일 타임(compile time) 아니라 런타임(run time)에 결정됩니다. 파이썬도 컴파일을 하지만 이것도 런타임에서 바로 실행됩니다.

그래서 파이썬은 개발환경과 실행환경의 차이가 없습니다. 빌드 단계없이 그냥 코드를 작성하여 실행하면 됩니다.

인터프리터 환경은 비유하자면 통역사가 영어와 한국어를 듣고 즉각적으로 통역을 해주는 것과 같습니다. (interpreter – 통역사) 이쪽에서 소스코드(한국어)를 보내면 파이썬 통역사가 위에서 부터 한줄씩 읽어서 기계어(영어)로 전달합니다. 좀더 창의적인 비유가 있으면 좋겠지만 우선 이 정도로 하고 별도 포스팅에서 상세하게 다루겠습니다.

파이썬 컴파일

파이썬이 다른 인터프리터 언어들과 다른 점은 바이트코드(bytecode)로 컴파일을 한다는 점입니다. 바이트 코드는 파이썬 가상머신(PVM)이 사용하기 위해 컴파일한 파일로 실행시 생성됩니다. 확장자가 pyc로 __pycache__ 폴더에 있는 것들이 파이썬 바이트코드입니다. 자바에도 바이트 코드가 있는데 비슷합니다. 기계어는 아니지만 소스코드를 한줄씩 실행하는 것 보다 빠르게 실행할 수 있습니다.

프로그래머는 파이썬 가상머신의 동작 원리까지는 몰라도 됩니다. 내부적인 원리는 복잡하기 마련입니다. 단지 pyc란 파일은 PVM이 사용하는 바이트 코드이다. 바이트코드는 소스코드와 기계어의 중간 정도로 생각하면 됩니다. (자바를 배웠다면 비슷한 개념을 배웠을 것 입니다)

바이트코드는 크로스플랫폼의 실행을 위한 중간단계 코드라고 할 수 있는데 시작 단계에서는 그런 것 까지 이해하지 않아도 괜찮습니다. 이에 대해서는 추가적인 설명이 필요한 부분입니다.

*******

파이썬 인터프리터 예제

그럼 파이썬 인터프리터를 사용해보겠습니다.

명령프롬프트에서 python 을 실행시킵니다. >>> 의 프롬프트가 나오면 코드를 번역할 준비가 되었다는 표시입니다. 이는 파이썬의 대화형 프롬프트입니다.

파이썬 인터프리터

약간은 식상하지만 그래도 예를 갖추어 고전적인 hello world 한번 가겠습니다.

>>> print("hello world!")
hello world!

사칙연산을 해보겠습니다. + – * / 플러스, 마이너스, 곱하기, 나누기 입니다.

** 는 제곱 연산자입니다. 이런 수식들은 문법적으로 표현식이라고 합니다.

>>> 3+2
5
>>> (10-2)*2
16
>>> 10/3.0
3.3333333333333335
>>> 2*10
20
>>> 2**10
1024
>>> 10%9
1
>>>

표현식을 문자열로 입력받아서 계산해보겠습니다. input 함수로 키보드 입력을 맏고 eval 함수로 표현식을 평가할 수 있습니다.

>>> exp1 = input("수식을 입력하시오: \n")
수식을 입력하시오:
5+2-7
>>> exp1
'5+2-7'
>>> eval(exp1)
0

이번에는 시스템에 관련한 모듈을 import 해보겠습니다.

sys 모듈에서는 파이썬 시스템 버전과 플랫폼 정보 등을 확인할 수 있습니다. 파이썬 버전과 사용자 시스템에 따라 다른 결과가 출력됩니다.

>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=9, micro=7, releaselevel='final', serial=0)
>>> sys.version
'3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)]'
>>> sys.thread_info
sys.thread_info(name='nt', lock=None, version=None)
>>> sys.platform
'win32'

import this – 파이썬의 신념

일종의 이스터에그로 파이썬이 지향하는 철학에 대한 내용입니다. 인터프리터에서 import this를 하면 출력합니다. The Zen of Python (파이썬의 선) 일종의 시구 입니다. 파이썬은 무엇을 추구하는가? 파이썬은 어디서 와서 어디로 가는가? 같은 추상적인 내용인데 심각하게 봐도 이해하기 어려우니까 한번 재미로 봐둡니다. 주로 코드설계에 대한 원칙입니다. 예를 들어 Simple is better than complex -> 복잡한 것 보다 단순한 것이 더 낫다 – 그렇게 코드를 만들어야 한다는 말이죠.

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

대화형 셸 종료하기

python 대화형 셸을 종료하려면 >>> 프롬프트 상에서 exit() 나 Ctrl + z 입력하고 엔터키를 누릅니다. (윈도우 기준) 리눅스는 exit() 나 Ctrl + D 로 종료할 수 있습니다.

요약

파이썬 인터프리터에 대한 대략적인 설명과 대화형 프롬프트(인터렉티브 셸)을 실행해봤습니다. 한 줄씩 실행하는 명령어니까 부담없이 이것 저것 해보면 자연스럽게 익숙해질 수 있을 겁니다. 파이썬은 데이터 타입의 제한이 없어서 큰 숫자를 사용할 수 있습니다. 그냥 계산기 처럼 사용할 수도 있습니다.

파이썬 뿐만 아니라 이런 셸을 사용하는 언어들이 많아서 파이썬에 익숙해지면 다른 언어를 배우는데도 도움이 됩니다.

외부 참고 문서

2. 파이썬 인터프리터 사용하기 — Python 3.10.0 문서

Leave a Comment