Medium - How does Python work?

원문 - Dhruvil Karani

Trend 파악을 위한 Medium 기고문 포스팅 - 파이썬 동작 원리; 옛날 프로그래밍 언어와 비교하여 파이썬의 코드가 어떻게 동작하는지 간단히 설명하겠습니다.

image credits — https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQAQ5hOZAjAWsKwFbOXNONYWW-Mg4dxL7cWc-1gufkYvviTnvH8SA&s

저는 머신러닝 엔지니어로서 몇년간 파이썬을 사용하고 있습니다. 최근에는 재미로 C++을 배우기 시작했습니다. 그래서 제가 알게된 것은 파이썬이 정말 쉽고 직관적이라는 것이죠. 저는 파이썬이 다른 언어들과 비교해서 어떻게 다르게 동작하는지 궁금해졌습니다. 이 포스트에서는 파이썬의 내부 동작원리에 대해서 설명드리겠습니다.

파이썬은 Guido Van Rossum이 시작한 하비 프로젝트로 출발해서 1991년에 처음 출시되었습니다. 범용적으로 쓰이는 파이썬은 넷플릭스나 인스타그램 같은 회사에서 상요하고 있죠. Guido는 인터뷰에서 파이썬을 자바/스위프트와 같은 언어와 비교하면서 직업을 구하려는 개발자라면 자바/스위프트를 배우는 것이 좋을 것이라고 했습니다. 파이썬은 소프트웨어 개발자들은 거의 사용하지 않고 데이터를 처리하는 사람들이 씁니다.

파이썬에 대한 기사를 읽으면 꽤나 자주 컴파일 vs 인터프리트, bytecode vs machine code, dynamic typing vs tatic typinvg, 가비지 컬렉션과 같은 용어를 듣게 될 것입니다. 위키피디아에선 파이썬을 인터프리티드, 하이레벨 범용 프로그래밍 언어라고 정의하고 있습니다. 동적 타입과 가비지 컬렉션을 가지고 있죠.

Interpreted Languages

C/C++로 프로그램을 작성하면 여러분은 그것을 컴파일 해야 합니다. 컴파일 과정은 사람이 일을 수 있는 코드를 기계가 이해할 수 있는 코드 (머신코드)로 변환하는 것을 포함합니다. 머신 코드는 CPU가 바로 실행할 수 있는 명령어로 이뤄져 있습니다. 컴파일이 끝나면 여러분의 코드는 실행가능한 파일을 만듭니다. 실행파일은 코드의 명령을 순서대로 실행하게 됩니다.

가장 먼저 파이썬은 인터프리터 언어이며 전혀 컴파일 되지 않습니다. .py파일에 씌여진 파이썬 코드는 처음에 바이트코드로 컴파일되어 .pyc / .pyo 포맷으로 저장됩니다. C++처럼 머신코드로 변환하는 것 대신에 파이썬 코드는 바이트 코드로 변환됩니다. 바이트 코드는 저수준 명령의 집합으로 인터프리터가 실행할 수 있는 명령입니다. 많은 PC에서 파이썬 인터프리터는 /usr/local/bin/python3.8.에 설치되어 CPU 대신에 명령을 실행합니다. 바이트 코드는 가상머신에서 실행되는 명령입니다.

Why Interpreted?

인터프리트 언어의 가장 큰 장점은 플랫폼에 독립적이라는 것입니다. 파이썬 바이트 코드와 가상머신이 같은 버전이라면 파이썬의 바이트코드는 모든 플랫폼에서 동작합니다. 동적 타입 또한 장점입니다. C++과 같은 정적 타입 언어에서는 변수의 타입을 선언해야 합니다. 컴파일 타임에 타입들이 일치하는지 체크하기 위해서죠. 파이썬과 같이 강력한 타입의 언어에서는 그런 작업을 인터프리터가 대신 수행합니다. 변수의 타입과 오퍼레이션 수행의 유효성을 검사하는 것이죠.

Disadvantages of Interpreted languages

동적 타입은 많은 자유를 제공하지만 동시에 코드가 위험해지고 디버깅하기 힘들게 만듭니다. 파이썬은 느리다고들 많이 포현합니다. 많은 논쟁이 있어왔지만 느려지는 주된 이유는 인터프리터가 바이트코드를 기계에서 실행다능한 형태로 변환하는 추가적인 작업을 해야하기 때문입니다.

What exactly is Garbage Collection?

예전 프로그래밍 언어들에서 메모리 할당은 꽤나 수동적이었습니다. 여러분이 변수를 더이상 사용하지 않거나 다른 프로그램에서 전혀 참조하지 않는 다면 걔네들은 메모리에서 지워줄 필요가 있습니다. 가비지 컬렉터는 이러한 작업을 대신해주죠. 자동적으로 아무것도 안하는 것들을 지워줍니다. 메모리 관리 작업은 두가지 방식으로 이뤄집니다.

간단한 버전은 참조하는 객체의 숫자를 계속 트래킹하면서 0이 되면 객체를 지우는 것입니다. 이것은 레퍼런스 카운팅이라고 하며 파이썬에서 기본적으로 사용합니다.그러나 두개의 객체가 서로 참조하는 경우 가비지 컬렉션 생성자가 도움이 됩니다. 카운팅 레퍼런스로 처리할 수 없는 것을 관리합니다.

What is __pychache__?

깃허브나 개인적은 프로젝트에서 여러분은 __pycache__ 라는 폴더가 자동 생성되는 것을 보셨을 겁니다.

/forder
  - __pycache__
      - preprocess.cpython-36.pyc
    - preprocess.py

여러분이 보시다시피 파일의 이름은 __pycache__외부의 것과 동일합니다. .pyc 확장자는 파일이 preprocess.py를 위한 바이트코드를 담고있음을 말해줍니다. cpython은 인터프리터의 타입을 가리킵니다. CPython은 인터프리터가 C언어로 만들어졌다는 것을 의미합니다. JPython은 자바로 만들어진 파이썬 인터프리터입니다.

그러나 왜 처음에 이런 폴더가 만들어지는 것일까요? 그것은 아주 조금 파이썬 프로그램의 속도를 향상시킵니다. 파이썬 코드를 변경하지 않으면 바이트코드를 재컴파일하는 것을 막기 위한 것이죠.

Summary

  • 파이썬의 동작원리
  • 인터프리터 방식, 파이썬 인터프리터가 실행하는 바이트코드를 만들어낸다.
  • 개발자들이 쓰기보다는 데이터 사이언티스트들이 많이 사용한다.
  • 느리지만 그만큼 얻는 장점들이 많다. 쉽고 직관적이니까,

© 2019. All rights reserved.

Powered by Hydejack v8.1.1