본문 바로가기
Computer/Python

왜 파이썬인가?

by 방구석 과학자 2022. 7. 10.

 


오늘은 본격적으로 파이썬을 공부하기 전에 파이썬이란 무엇인가에 대해서 간략하게 짚고 넘어가겠습니다.

누가, 왜 만들었나?

파이썬(Python)은 1991년 귀도 반 로섬(Gudi Van Rossum) 이 발표한 '범용 프로그래밍 언어(General-purpose programming language, GPL)'입니다. GPL이란, 어떤 소프트웨어를 만들 때, 어느 한 영역에만 국한되지 않고, 다양하고 넓은 분야의 영역에서 사용할 수 있는 소프트웨어를 만들 수 있는 프로그래밍 언어라는 뜻입니다. 파이썬 말고도 C, C++, C#, Java, JavaScript, Kotlin, Scala,... 등등 수많은 GPL들이 존재합니다.
이와 반대로 '도메인 특화 언어(Domain-specific programming language, DSL)'가 있습니다. GPL과는 다르게 어떤 특정 영역에서만 사용이 국한되는 언어를 말합니다. 예를 들어, 오직 웹페이지를 만들고 편집하기 위한 'HTML', 오직 문서를 만들고 편집하기 위한 'Latex', 오직 서버 안의 data 조회 및 관리를 위한 'SQL'등을 예시로 들 수 있습니다.

귀도는 파이썬이라는 언어를 1989년 크리스마스 주에 할 일이 없어서 개발했다고 합니다. 농담이 아니라 진짜로.. 아래는 파이썬 공식 사이트에 있는 파이썬을 개발하게 된 경위에 대한 글입니다.

Over six years ago, in December 1989, I was looking for a "hobby" programming project that would keep me occupied during the week around Christmas. My office (a government-run research lab in Amsterdam) would be closed, but I had a home computer, and not much else on my hands. I decided to write an interpreter for the new scripting language I had been thinking about lately: a descendant of ABC that would appeal to Unix/C hackers. I chose Python as a working title for the project, being in a slightly irreverent mood (and a big fan of Monty Python's Flying Circus).
(출처 : https://www.python.org/doc/essays/foreword/)

대충 크리스마스 주에 심심해서 집에서 파이썬을 만들었다는 내용....


파이썬이라는 이름은 Monty Python's Flying Circus라는 귀도가 즐겨보던 코미디 시리즈에서 유래하였습니다. 파이썬의 한글 뜻은 비단구렁이입니다. 이 때문에 파이썬은 두 비단구렁이가 몸을 비비고 있는 상징을 가지게 되었습니다.

파이썬의 상징과 로고

 

파이썬의 특징

파이썬은

1. 플랫폼 독립적(Platform independent)
2. 인터프리터 언어(Interpreter)
3. 객체 지향(Object oriented)
4. 동적 타이핑 언어(Dynamically typed)

입니다. 각각의 의미를 하나씩 짚어보겠습니다.

 

1. 플랫폼 독립적(Platform independent)

여기서 플랫폼이란 윈도우, 리눅스, 안드로이드, 맥 OS, IOS 등 프로그램이 실행되는 운영 체제를 말합니다. 파이썬은 어떤 플랫폼인지에 관계없이 사용 가능한 프로그래밍 프로그래밍 언어라는 뜻입니다.

2. 인터프리터 언어(Interpreter)

인터프리터 언어는 쓰여진 코드를 실행함과 동시에 한 줄씩 바로 실행되는 언어를 말합니다. 컴파일러(Compiler)와 함께 아래 표와 같이 비교해볼 수 있습니다.

  컴파일러 인터프리터
작동방식 소스코드를 기계어로 먼저 번역
해당 플랫폼에 최적화되어 프로그램을 실행
별도의 번역과정 없이 소스코드를 실행시점에 해석하여 컴퓨터가 처리할 수 있도록 함
장점
단점
실행속도가 빠름
한번의 많은 기억장소 필요
간단히 작성, 메모리가 적게 필요
실행 속도가 느림
주요 언어 C, 자바, C++, C# 파이썬, 스칼라

컴파일러와 인터프리터에 대해서 공부하자면 한세월이기 때문에.. 최대한 기초부터 간단하게 설명해 보겠습니다.

컴퓨터는 오로지 기계어(Machine code)만 알아들을 수 있습니다. 말 그대로 0과 1로만 이루어진 자료인데, 이는 CPU의 구조마다 다를 수 있습니다. 예를 들면, 'MIPS'라는 구조를 가지는 CPU에서 레지스터 1과 레지스터 2에 있는 값을 더해 레지스터 6에 저장하라는 명령을 아래와 같이 쓸 수 있습니다. (레지스터(Resister)란, CPU안에 존재하는 극히 소량의 데이터 혹은 중간값들을 일시적으로 저장하기 위해 존재하는 저장 공간을 말합니다.)

 000000 00001 00010 00110 00000 100000


딱 봐도 무슨 소리인지 알아볼 수가 없습니다.. 이를 좀 더 알아보기 쉽게 바꾼 코드가 바로 '어셈블리어(Assembly language)'입니다. 위 기계어를 어셈블리어로 바꾸면 아래와 같습니다.

add $r6, $r1, $r2


이제는 어느정도 알아볼 수준은 됩니다. 기계어와 어셈블리어는 1:1 대응이므로, 어셈블리어를 배운다는 것은 사실 기계어를 배우는 것과 다름없습니다. 0,1을 계속 쳐다보고 있는 것보단 훨씬 덜 피곤할 겁니다. 충격적인 일화 중 하나로, 폰 노이만은 0과 1로만 프로그램을 코딩하셨고, 어셈블리어를 개발하는 제자들을 보며, 연구는 안 하고 쓸데없는 걸 개발하고 있다고 노발대발하셨다고 합니다.. 물론 초창기의 프로그램은 사용하는 데이터가 그리 많지 않았기 때문에 가능했었겠지만 정말 급이 다른 천재임은 확실한 것 같습니다...

하지만 이런 어셈블리어도 사용자가 코딩하기에는 불편한 점이 여전히 많았습니다. 예를 들어 1+2 라는 연산을 진행하더라도 1과 2가 저장되는 레지스터를 따로 지정하는 코드를 쓰고, 각 레지스터를 더하라는 코드를 또 써주어야 합니다. 정말 하나하나 말해주지 않으면 안 되는 귀찮은 상황이 되는데, 이렇게 컴퓨터가 알아볼 수 있도록 하나하나 지정하면서 써야 하는 언어를 '저급 프로그래밍 언어(Low-level programming  language)'라고 부릅니다. 어셈블리어와 기계어가 바로 저급 언어인 셈이죠.

이 문제를 해결하기 위해 컴파일러와 인터프리터가 등장했습니다. 무엇이든 정확히 하나하나 명시해주는 대신, 인간이 보기 편한 방식, 컴퓨터의 입장에서 애매하고 추상적인 형태로 쓰인 언어들, 즉, '고급 언어(High-level programming language)'를 컴퓨터가 알아볼 수 있는 어셈블리어 혹은 기계어로 적절히 번역해주는 역할을 합니다. 예를 들면, 위와 같이 레지스터를 하나하나 지정해 줄 필요 없이 스스로 알아서 레지스터를 할당하고 연산을 진행시킵니다. 1+2 라는 계산을 할 때도, 1과 2를 어느 레지스터에 저장할 것인지 굳이 쓰지 않아도 알아서 적당한 레지스터에 저장하고, 3이라는 값을 알아서 다른 적당한 레지스터에 저장하여 표시해줍니다.

이때, 컴파일러와 인터프리터의 가장 큰 차이점은 컴파일러는 쓰인 소스 코드 전체를 한 번에 어셈블리어, 혹은 기계어로 번역한다는 점이고, 인터프리터는 한 줄씩 번역하고 바로바로 실행한다는 점입니다. 따라서 인터프리터는 소스 코드로부터 프로그램을 실행할 때, 어떤 문구에서 잘못된 점을 발견하면 바로 에러를 띄우고 프로그램을 종료시켜버립니다. 이는 실행할 때마다 전체를 번역해버리는 컴파일러와 달리 디버깅(버그나 잘못된 점을 찾고 수정하는 행위)을 쉽고 간편하게 해 줍니다.

3. 객체 지향 프로그래밍(Object oriented programming, OOP)

객체 지향적이라는 말의 의미를 이해하기 위해선 초창기의 프로그래밍을 바라보는 시각을 먼저 이해할 필요가 있습니다. 초창기의 프로그래밍은 어떤 입력값이 있으면 알고리즘에 명시된 순서 그대로 절차를 진행하고 결과를 내는 것뿐이라는 생각이 지배적이었습니다. 따라서 잘 짜인 논리의 순서 자체가 프로그래밍의 전부였던 겁니다. 이를 '절차적 프로그래밍(Procedural programming)'이라고 부릅니다. 하지만 이런 식으로 짜여진 알고리즘은 크기가 조금만 커져도 순서도로 나타내는 것이 불가능할 정도로 복잡해집니다. (이렇게 프로그램의 흐름이 복잡하게 엉킨 코드를 '스파게티 코드'라고 부릅니다.) 이를 해결하기 위해 Edsgar W. Dijkstra(에드가 다익스트라)'GO to statement considered harmful(Go to 문의 해로움)'이라는 논문을 통해 프로그램을 Procedure(프로시저)와 함수 단위로 나누고 이들을 호출하여 프로그램을 구현하는 '구조적 프로그래밍(Structured Programming)'을 제안했습니다. 여기서 procedure란, 어떤 일을 수행하기 위해 호출되는 코드 블락을 의미합니다. (호출되고 값을 내놓는 함수와는 조금 다릅니다.) 다시 말하면, 큰 문제를 해결하기 위한 기존의 알고리즘 순서도의 논리 흐름 그 자체가 아닌, 각 분기에서 만나는 작은 문제를 하나씩 떼어내어 해결하겠다는 의미입니다. 이를 'Top-down' 방식이라고 부릅니다.

go to 논리 흐름을 제어하는 초록색 순서도를 파란색 procedure로 통합하여, 필요한 시점에 호출해서 프로그램을 제어하는 것이 구조적 프로그래밍입니다.

하지만 코드의 덩치가 커지면 커질수록 점점 많아지는 procedure와 함수의 양이 감당이 안되게 됩니다. 따라서 이를 해결하기 위해 같은 특징을 가지는 procedure들과, 함수들을 한 그룹으로 묶어 관리하게 되었는데, 이를 '객체 지향 프로그래밍(Object oriented programming)'이라고 부릅니다. 예를 들어 탄산수, 석회수, 지하수, 증류수라는 이름을 가지는 함수들이 있다고 하면, 이들을 묶어 '물'이라는 '객체'를 선언하고 관리하는 것을 말합니다. 독립적이고 유용한 객체들을 먼저 정의함으로써, 작은 문제들을 해결할 수 있는 기반을 사전에 만들 수 있고, 이를 통해 큰 문제를 해결할 수 있게 됩니다. 이를 'Bottom-up' 방식이라고 부릅니다.

4. 동적 타이핑 언어(Dynamically typed language)

동적 타이핑 언어란 프로그램이 실행하는 시점에 프로그램이 사용해야 할 데이터에 대한 타입을 결정하는 것을 말합니다. '정적 타이핑 언어(Statically typed language)'와 반대 개념으로 사용되며, 정수 1이라는 값을 가지는 변수 a를 선언하는 상황을 예를 들어 설명하자면 아래와 같습니다.
정적 타이핑 언어의 경우 코딩하는 과정에서 a가 정수(int)라는 사실을 명시해줍니다.

int a = 1; #코드를 쓰는 시점부터 타입을 명시해야 한다.


동적 타이핑 언어의 경우 코딩하는 시점에서 따로 정수라는 사실을 명시하지는 않으나, 이를 실행할 때 어떤 값이 변수에 저장되어 있는지를 컴퓨터가 확인하고 알아서 정수형 데이터 타입임을 결정합니다.

a = 1 #코드를 쓰는 시점에 타입을 명시할 필요가 없다.

 

그래서 왜 파이썬인가?

그래서 왜 하필 파이썬인가!?
파이썬은 쉽고 간단하며, 다양한 기능을 제공합니다. 문법 자체가 인간 지향적입니다. 다시 말하면 다른 프로그래밍 언어들보다 더 추상적인 개념을 포함하고 있습니다. 일일이 지정해 줄 필요 없이 적당히 써도 잘 알아듣는 편이며, 객체라는 한 마디로 말하기 어려운 개념을 포함한다는 말입니다.
또한 다양한 라이브러리(어떤 특정 목적을 가진 함수들의 집합을 말합니다.)가 존재하고 활용 범위가 넓습니다. 이게 있나?라고 생각할 필요 없이 찾아보면 누군가가 다~ 만들어놨습니다. 가져가서 복붙 해오면 됩니다.

자, 이제 본격적인 코딩 공부를 시작해봅시다.

Life is short. You need Python.

반응형

댓글