'Compiler'에 해당되는 글 3건

  1. LLVM on AOSABOOK
  2. 다양한 Python들! (2)
  3. 인터프리터와 바이트코드

LLVM on AOSABOOK

컴파일러 수업 과제로 아티클을 읽으라고 해서, 이참에 번역이나 해 볼까 하고 신나게 번역하고 있었는데 이미 누가 해 놨더라 -_-

해서 기록해 둔다. 꽤나 잘 번역되어 있는 것 같다.

원문: http://www.aosabook.org/en/llvm.html

번역문: http://wiki.tuestudy.org/aosabook/materials/llvm


'그 외/Tech' 카테고리의 다른 글

git tracking list에서 파일 제거하기  (0) 2015.07.08
LLVM on AOSABOOK  (0) 2015.04.26
github: ssh key 등록  (0) 2014.10.07
Git!  (0) 2014.10.03
cURL!  (0) 2014.09.22
검색엔진 (2) - 라이브러리: Lucene, Solr, Elasticsearch  (1) 2014.08.26

다양한 Python들!

다양한 Python들!

전부터 컴파일러 수업을 듣고 싶었는데 학교에서는 시간표가 겹쳐서 못 듣고, 콜세라에서 하길래 들어야지 했는데 영 잘 안 듣게 된다. 올해의 목표로 삼아야 겠다.

Pythons

파이썬은 귀도 반 로썸(Guido van Rossum)에 의해서 1991년 만들어졌다. 이 귀도가 만든게 바로 CPython.
공식 홈페이지는 python.org.

  • CPython
  • Cython
  • PyPy
    • RPython
  • Stackless Python
  • JPython
  • Jython
  • IronPython
  • IPython

참고로 루비 또한 JRuby, IronRuby, MacRuby, Rubinius, Cardinal 등등 다양한 구현체가 존재한다.

CPython

C로 짜여진 파이썬. 우리가 쓰는 파이썬 인터프리터가 바로 이 CPython이다. 바꿔 말하면 파이썬은 C로 짜여졌다 라고 할 수도.

GIL1 때문에 멀티쓰레딩 이슈가 있으나 일반적으로 파이썬은 prototyping용으로 사용하기 때문에 실질적으로 이게 문제가 되는 경우는 거의 없다고 한다. 이브온라인 같이 파이썬을 좀 더 적극적으로 사용하게 되면 Stackless Python등 다양한 시도를 하게 되는 듯.

Cython

4세대 컴퓨팅 언어, 싸이쎤(Cython)
싸이썬은 파이썬의 수퍼셋(superset)이다. 파이썬이 동적으로 결정되는 부분(변수의 타입이라던가)이 있어서 인터프리팅을 해야 하고, 그래서 느리다면, 그걸 정적으로 결정하고 컴파일을 하면 되지 않는가? 라는 게 바로 싸이썬이다.

파이썬 컴파일러 ‘Cython’ 기본 원리 소개
인터프리팅이 느리다, 그래서 컴파일이 필요하다. 근데 생각해 보면 그렇다고 전부 다 컴파일 해야 할 필요는 없다. 속도에 치명적인 영향을 주는 부분만 컴파일 하면 되는 것이다. 이 아이디어로부터 나온 것이 C-API이며, Cython이다. 이 외에 MIT의 Julia, 구글의 Go, 자바의 Scala도 이러한 하이브리드 방법을 적용한 언어에 해당한다.

PyPy

PyPy와 함께 인터프리터 작성하기
PyPy가 CPython보다 빠를 수 있는 이유, 홍민희

메아리 : meta-tracing JIT에 대해 좀더 자세한 글, 강성훈

파이파이는 파이썬으로 작성된 파이썬 인터프리터다. 그리고 거기에 JIT2이라는 기술을 도입하여 CPython보다 빠르게 만들었다.

현재 파이썬 구현체중 가장 각광받고 있으며 Stackless Python도 파이파이가 거의 잡아먹은 듯.

RPython

이 PyPy를 구현하기 위해 나온것이 바로 RPython. Restricted Python이란 의미인데 정적 컴파일이 가능하도록 Python에 제약을 가한 서브셋(subset) 언어다. 컴파일하는 데에 장애가 되는 동적인 기능을 제거한 것.

Stackless Python

CPython을 구현할 때 파이썬의 함수 호출 스택을 C의 스택에 그대로 얹어버렸기 때문에 파이썬에서 얼마나 메모리를 쓸 수 있느냐와 관련없이 C 스택을 꽉 채우면 그대로 스택 오버플로 에러가 뜨게 된다. 뿐만 아니라 파이썬 프로그램의 호출 스택, 즉 프로그램의 실행 흐름을 CPython 스스로 제어할 수 없게 되어 코루틴 등 실행 흐름을 제어하는 언어 기능을 쓸 수 없다.

이 문제를 해결하기 위해서 CPython 소스를 수정해서 C스택을 쓰는 부분을 전부 들어내고 새로 호출 스택을 짜 넣은것이 Stackless Python이다.

현재는 PyPy에 밀려 사향길에 접어든 것으로 보인다. 자세히는 위 링크 참조.

JPython, Jython, IronPython

자이썬(Jython) 완벽 안내서
JPython은 Jython의 조상으로 10년 전 문서들에서나 찾아볼 수 있는 단어다. Jython은 자바, IronPython은 닷넷 위에서 돌아간다.
파이썬은 GIL1때문에 쓰레드를 쓰기 힘든데, Jython과 IronPython은 그런 문제가 없다.

IPython

IPython은 지금까지 살펴본 파이썬들과는 달리 새로운 파이썬 인터프리터 혹은 컴파일러가 아니다. IPython은 강력한 추가 기능들을 제공하는 interactive shell이다. 즉, 파이썬 기본 인터프리터의 업그레이드 버전이라고 보면 된다.

IPython Notebook

IPython의 강력한 기능 중 하나로, 웹 기반 쉘 환경을 제공한다. 파이썬 코드, 텍스트, 수학식, 그래프 그리고 다양한 미디어들을 하나의 도큐먼트로 만들 수 있다.

wakari.io : 웹에 IPython Notebook을 올리고 공유할 수 있다.

결론

Python Compatibility Table
기본적으론 CPython
퍼포먼스가 필요할 때는 PyPy
호환성이 필요할 때는 Jython이나 IronPython


  1. Global Interpreter Lock. coarse-grained-lock중에서도 극단적인 개념이 GIL이다. 즉, 어떤 시점에서든 단 한개의 바이트코드만이 실행된다. Python에서 thread를 사용하지 마세요? 참조.

  2. Just-In-Time 컴파일러. 파이썬 바이트코드를 인터프리팅 하다가, 자주 사용되는 부분은 컴파일한다. 즉, 처음에는 느리지만 코드가 돌아갈수록 점점 빨라진다.

'Python' 카테고리의 다른 글

decorator와 closure  (2) 2014.10.04
String option - u와 r  (0) 2014.09.21
한글 in the dictionary (feat. pretty)  (0) 2014.09.17
Python 2.x 한글 인코딩  (0) 2014.09.10
다양한 Python들!  (2) 2014.08.19
pyenv와 virtualenv를 통한 파이썬 개발 환경 구축  (0) 2014.08.13

인터프리터와 바이트코드

인터프리터와 바이트코드

컴파일 과정
C 언어 컴파일 과정
C나 C++은 컴파일 언어다. 즉, 코딩을 하고 실행을 하면 컴파일러가 소스코드를 컴파일해서 어셈블리로 변환하고 어셈블러가 이걸 기계어로 변환한다. 자세히는 위 링크를 참조.

반면 스크립트 언어, 즉 인터프리터 언어1는 변수의 타입 등이 동적으로 결정되기 때문에 한줄한줄 실행한다. 따라서 컴파일 언어에 비해 속도가 느리다.

여기까지가 기본적인 상식일텐데, 여기서 애매하게 중간에 들어있는게 있으니 바로 바이트코드다. 자바를 다루는 사람이라면 익숙한 개념일 테고, 요즘엔 자바가 C를 넘어서 국민 랭귀지에 가까우니 다들 잘 알겠지만 나는 자바를 잘 몰라서 이참에 정리해 보기로 했다.

바이트코드

어셈블리는 하드웨어 종속적이다. CPU마다 기계어가 다르고, 따라서 기계어에 대응하는 어셈블리도 CPU마다 달라진다. 즉, 컴파일러를 만든다는 것은 CPU 종류별로 대응해야 한다는 것을 의미한다2. 당연히 이건 매우 귀찮고 오랜 시간이 필요한 일이다. 그래서 등장한 것이 어셈블리와 소스코드의 중간 코드인 바이트코드다.

자바 바이트코드의 이해
바이트코드는 인터프리터 언어다. 그리고 소스코드에서 바이트코드로 변환하는 과정은 컴파일이다. 자바를 말할 때 컴파일 언어다 인터프리터 언어다 왔다갔다 하는 것은 이 때문이다. 바이트코드로 한번 변환하기 때문에 인터프리터 언어보다 퍼포먼스가 우수하면서도 인터프리터 언어의 특징을 그대로 가져갈 수 있다.

여기에 퍼포먼스 향상을 위해 한 발짝 더 나아간 개념이 JIT 컴파일러다. Just-In-Time의 줄임말로 인터프리터의 실행 과정에서 반복적으로 실행되는 부분을 컴파일하여 퍼포먼스를 향상시킨다.

이러한 일련의 과정들을 통해 최근 비약적으로 향상되어 C보다 빠르다는 소리도 나오는 자바 퍼포먼스의 형태를 어렴풋이 알 수 있겠다.

파이썬과 루비

파이썬도 바이트코드를 생성한다. pyc파일이 바로 파이썬 바이트코드 파일이다. 맥 파일 종류에도 Python Bytecode Document라고 되어 있다.

루비도 마찬가지. 루비 1.9.0버전에 YARV(Yet Another Ruby VM)이 포함되어 있다. 기존 루비의 퍼포먼스 개선을 위해 만들어진 바이트코드 인터프리터.


  1. 컴파일 언어와 스크립트 언어, 인터프리터 언어라는 명칭은 좀 애매하다. 컴파일러 언어라고 하지 않고 컴파일 언어라고 하는데 인터프리트 언어라고 하지 않고 인터프리터 언어라고 한다. 스크립트와 컴파일도 대비되는 개념이 아니며 스크립트와 인터프리터도 상등하는 개념이 아니다. 하지만 우리나라에서는 대부분 컴파일 언어 / 스크립트 언어, 인터프리터 언어로 구분하는 듯 하며 이 포스팅에서도 그렇게 사용하기로 한다.

  2. 사실 잘 모른다 -_-. 아마 그럴 거다. gcc를 다운받을 때 cpu마다 종류가 다르다고 한다.

'그 외/Tech' 카테고리의 다른 글

Git!  (0) 2014.10.03
cURL!  (0) 2014.09.22
검색엔진 (2) - 라이브러리: Lucene, Solr, Elasticsearch  (1) 2014.08.26
검색엔진 (1) - 검색엔진의 이해  (2) 2014.08.26
인터프리터와 바이트코드  (0) 2014.08.19
공인 IP와 사설 IP 그리고 고정/유동 IP  (0) 2014.08.13