🐍 How Python works?

DoonDoonΒ·2019λ…„ 3μ›” 10일
6
post-thumbnail

A thumbnail was created from banner.godori.dev

파이썬이 μ–΄λ–»κ²Œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.
μ™œλƒλ©΄ λ©΄μ ‘λ•Œ μ§ˆλ¬Έμ„ λ°›μ•˜κΈ° λ•Œλ¬Έμ΄μ£  πŸ‘»

μ œλŒ€λ‘œ λŒ€λ‹΅ν•œ 것 같지 μ•Šμ€ 찝찝함을 μ”»μ–΄ λ‚΄κ³ μž
μΆ”κ°€λ‘œ 더 κ³΅λΆ€ν•˜μ—¬ 정리해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

λ‚΄μš©μ˜ λ§Žμ€ 뢀뢄은 μ•„λž˜μ˜ 것듀을 μ°Έκ³  ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ“š References


  1. λŸ¬λ‹ 파이썬 - 마크 루츠
  2. How Python runs?

πŸƒβ€β™‚οΈ ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰


파이썬 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ λ‹Ήμ—°ν•˜μ§€λ§Œ, 파이썬 인터프리터가 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
파이썬 μΈν„°ν”„λ¦¬ν„°λŠ” ν™ˆνŽ˜μ΄μ§€μ—μ„œ λ‹€μš΄λ‘œλ“œ λ°›κ±°λ‚˜
OS λ³„λ‘œ μ œκ³΅λ˜λŠ” νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €λ₯Ό ν†΅ν•΄μ„œ μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νŒŒμ΄μ¬μ„ μ„€μΉ˜ν•˜λ©΄, 인터프리터와 λ‚΄μž₯ 지원 라이브러리 등이 μ„€μΉ˜λ©λ‹ˆλ‹€.
μ—¬κΈ°μ„œ 인터프리터 λž€, 파이썬 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ μž…λ‹ˆλ‹€.

μΈν„°ν”„λ¦¬ν„°λŠ” μ–΄λ–€ μ–Έμ–΄λ‘œλ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νŒŒμ΄μ¬μ„ μ‹€ν–‰ν•˜λŠ” 인터프리터 μ€‘μ—λŠ” 심지어
파이썬으둜 μž‘μ„±ν•œ PyPy λΌλŠ” 인터프리터가 μžˆλŠ” 것 처럼 말이죠.
(PyPy 의 λ‘œκ³ λŠ” κ·Έλž˜μ„œ 인지 뱀이 뱀을 λ¬Όκ³  μžˆμŠ΅λ‹ˆλ‹€ 크앙)

μ•„λ¬΄νŠΌ μ›Œλ“œ νŒŒμΌμ„ μ—΄λ €λ©΄ MS Word κ°€ μžˆμ–΄μ•Ό ν•˜λŠ” μ΄μΉ˜μΈκ°€ λ΄…λ‹ˆλ‹€ ν•˜κ³  일단은 λ„˜μ–΄κ°‘μ‹œλ‹€.

🐢 개발자인 λ‚΄κ°€ ν•  일


.py ν™•μž₯자둜 μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό λ§Œλ“€λ©΄ λ©λ‹ˆλ‹€.
μ˜€νƒ€λ₯Ό 내지 μ•Šκ³ , 문법을 잘 μ§€μΌœ python app.py 둜 μ‹€ν–‰ν–ˆμ„λ•Œ 문제 없이 λ™μž‘ν•˜λŠ” μ½”λ“œ 말이죠!

🐍 파이썬이 ν•΄μ£ΌλŠ” 것


λ‹Ήμ‹ μ˜ 파이썬 μ½”λ“œ, λ°”μ΄νŠΈμ½”λ“œλ‘œ λŒ€μ²΄λ˜μ—ˆλ‹€

python app.py λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ 같은 일이 μΌμ–΄λ‚©λ‹ˆλ‹€.

  1. .py νŒŒμΌμ„ λ°”μ΄νŠΈ μ½”λ“œ μƒνƒœλ‘œ 컴파일 ν•©λ‹ˆλ‹€.
  2. PVM (Python Virtual Machine) 이라 ν•˜λŠ” 파이썬 μ‹€ν–‰ ν™˜κ²½μ— λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.

πŸ“£ Compile to byte code


λ°”μ΄νŠΈ μ½”λ“œλ‘œ μ†ŒμŠ€ μ½”λ“œλ₯Ό 컴파일 ν•˜λŠ” 과정은 κ·Έ μ •ν™•ν•œ λ™μž‘μ„ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

μ»΄νŒŒμΌν•œλ‹€λŠ” 것은, μ†ŒμŠ€ μ½”λ“œλ₯Ό ν•΄μ„ν•˜μ—¬ μ›ν•˜λŠ” μƒνƒœλ‘œ λ³€ν™˜ ν•˜λŠ” 것을 μ˜λ―Έν•˜κ³ 
νŒŒμ΄μ¬μ—μ„œ μ»΄νŒŒμΌμ€ μ†ŒμŠ€ μ½”λ“œλ₯Ό μ €μˆ˜μ€€μ˜, ν”Œλž«νΌ 독립적인(!) μ½”λ“œλ‘œ λ³€ν™˜ ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

파이썬의 컴파일 과정은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€. (μ •ν™•ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€)

  1. μ†ŒμŠ€ μ½”λ“œλ₯Ό Parse Tree 둜 λ³€ν™˜ν•©λ‹ˆλ‹€
  2. Parse Tree λ₯Ό AST(Abstract Syntax Tree) 둜 λ‹€μ‹œ ν•œ 번 λ³€ν™˜ ν•©λ‹ˆλ‹€
  3. ASTλ₯Ό μ œμ–΄ 흐름 κ·Έλž˜ν”„(Control FlowGraph)둜 λ³€ν™˜ ν•©λ‹ˆλ‹€
  4. μ œμ–΄ 흐름 κ·Έλž˜ν”„λ₯Ό Byte code 둜 λ³€ν™˜ ν•©λ‹ˆλ‹€.

이 과정을 거치고 λ‚˜λ©΄, .pyc 파일이 생성 λ©λ‹ˆλ‹€.
.pyc νŒŒμΌμ€ 파이썬 3.2 버전 μ΄μ „μ—λŠ” .py 파일과 같은 κ²½λ‘œμ— μƒμ„±λ˜κ³ 
3.2 이후 λ²„μ „μ—μ„œλŠ” __pycache__ 디렉터리 μ•„λž˜μ— 생성 λ©λ‹ˆλ‹€.

.pyc νŒŒμΌμ€ λ‹€μŒκ³Ό 같은 κ²½μš°μ— μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€

  1. AWS Lambda 에 배포할 λ•Œ μš©λŸ‰ μ œν•œμ„ ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    (μ—¬λŸ¬ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” .pyc 파일둜 컴파일된 κ²ƒλ§Œ 배포)
  2. 파이썬 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ—¬ 판맀 ν•˜λŠ” 경우

μΆ”κ°€

.pyc νŒŒμΌμ„ python app.py 와 같은 λͺ…λ Ήμ–΄λ‘œ μ‹€ν–‰ ν•œλ‹€κ³  λ°˜λ“œμ‹œ 생성 λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.
.py 파일이 λ‹€λ₯Έ μŠ€ν¬λ¦½νŠΈμ— μ˜ν•΄ import λ˜μ—ˆμ„ κ²½μš°μ—λ§Œ 생성 λ©λ‹ˆλ‹€.

import 문이 ν˜ΈμΆœλ˜μ—ˆμ„ λ•ŒλŠ” μ•„λž˜μ™€ 같은 확인을 ν•©λ‹ˆλ‹€

  1. νŒŒμ΄μ¬μ€ import λ˜λŠ” 슀크립트의 컴파일 된 파일이 쑴재 ν•˜λŠ”μ§€ 확인 ν•©λ‹ˆλ‹€
  2. μ—†λ‹€λ©΄, .pyc νŒŒμΌμ„ μƒμ„±ν•˜κ³  뢈러 μ˜΅λ‹ˆλ‹€.
  3. μžˆλ‹€λ©΄, λ‚΄λΆ€ timestamp μ—μ„œ .py 파일 보닀 .pyc 파일이 더 였래 λ˜μ—ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€

β†’ ν•œ λ§ˆλ””λ‘œ, μ†ŒμŠ€ μ½”λ“œκ°€ λ³€κ²½ 되면 μžλ™μœΌλ‘œ μƒˆ .pyc 둜 κ°±μ‹ ν•©λ‹ˆλ‹€
β†’ λŒ€ν™”ν˜• ν”„λ‘¬ν”„νŠΈ(REPL) ν™˜κ²½μ—μ„œ μž…λ ₯ν•œ μ½”λ“œμ— λŒ€ν•΄μ„œλŠ” .pyc νŒŒμΌμ„ μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€

πŸ‘Ύ 파이썬 가상 λ¨Έμ‹  PVM


PVM 은 파이썬의 λŸ°νƒ€μž„ 엔진 μž…λ‹ˆλ‹€.
파이썬 μ‹œμŠ€ν…œμ˜ 일뢀이기 λ•Œλ¬Έμ— λ³„λ„μ˜ μ„€μΉ˜κ°€ ν•„μš”ν•˜μ§€ μ•Šκ³ , 항상 쑴재 ν•©λ‹ˆλ‹€.

μ†ŒμŠ€ μ½”λ“œλ₯Ό .pyc 와 같은 λ°”μ΄νŠΈ μ½”λ“œ ν˜•νƒœλ‘œ λ³€ν™˜ν•œ λ’€ PVM 으둜 μ „λ‹¬ν•˜λ©΄
파이썬 가상 머신은 이것을 μ‹€ν–‰ν•΄ μ€λ‹ˆλ‹€.

μΆ”κ°€λ‘œ, ν”„λ‘œμ¦Œ λ°”μ΄λ„ˆλ¦¬λŠ” λ‚΄κ°€ μž‘μ„±ν•œ 파이썬 ν”„λ‘œκ·Έλž¨μ„ μš°λ¦¬κ°€ μ•„λŠ” μ‹€ν–‰ 파일둜(.exe)
λ³€ν™˜ ν•˜λŠ” 것 λ˜ν•œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

이λ₯Όν…Œλ©΄, PyInstaller, py2exe, py2app 등을 ν†΅ν•΄μ„œ μ‹€ν–‰ κ°€λŠ₯ν•œ λ°”μ΄λ„ˆλ¦¬λ‘œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ¦Œ λ°”μ΄λ„ˆλ¦¬λ₯Ό λ§Œλ“€ λ•Œμ—λŠ” λ°”μ΄νŠΈ μ½”λ“œμ™€, μ‹€ν–‰ ν™˜κ²½(PVM)
그리고 μ˜μ‘΄μ„± λͺ¨λ“ˆμ„ 단일 νŒ¨ν‚€μ§€λ‘œ λ§Œλ“­λ‹ˆλ‹€.
그리고 κ·Έ 결과물은 μ‹€ν–‰ κ°€λŠ₯ν•œ ν˜•νƒœ (.exe λ“±) κ°€ λ©λ‹ˆλ‹€

πŸ”‘ 인터프리터 κ΅¬ν˜„μ˜ μ’…λ₯˜


μœ„ λ‚΄μš© μ€‘μ—μ„œ, μΈν„°ν”„λ¦¬ν„°λŠ” μ–΄λ–€ μ–Έμ–΄λ‘œλ„ κ΅¬ν˜„ν•  수 μžˆλ‹€κ³  말씀 λ“œλ ΈλŠ”λ°μš”
μ’€ 더 μ‰½κ²Œ λ‚˜λˆ  보자면 μ΄λ ‡μŠ΅λ‹ˆλ‹€.

  • Python: κ·Έλƒ₯ μ–Έμ–΄. 인터프리터(파이썬 μ½”λ“œλ₯Ό 해석할 수 μžˆλŠ”)에 전달할 ν‘œν˜„μ˜ 방법 μž…λ‹ˆλ‹€.
  • κ΅¬ν˜„(Implementation): μ–΄λ–€ μ–Έμ–΄λ₯Ό μ–΄λ–»κ²Œ μ‹€ν–‰ν•  것인가에 λŒ€ν•œ κ΅¬ν˜„ μž…λ‹ˆλ‹€.

ν‘œμ€€ 파이썬 κ΅¬ν˜„μ€ ν˜„μž¬ CPython μž…λ‹ˆλ‹€. (Cython 이 μ•„λ‹™λ‹ˆλ‹Ή)
파이썬 μ½”λ“œλ₯Ό 읽고, λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ§Œλ“€κ³  μ‹€ν–‰ν•˜κ³  ν•˜λŠ” 행동을
ANSI C μ–Έμ–΄λ‘œ κ΅¬ν˜„ν•œ ν”„λ‘œκ·Έλž¨ μž…λ‹ˆλ‹€.

그리고 λ‹€μ–‘ν•œ μš”κ΅¬ 사항과 λͺ©μ μ— 따라 μ•„λž˜μ™€ 같은 κ΅¬ν˜„μ΄ 쑴재 ν•©λ‹ˆλ‹€

  • Jython, IronPython, PyPy...

각각을 μžμ„Ένžˆ λ‹€λ£¨κΈ°μ—λŠ” λ‚΄μš©μ΄ λ§ŽμœΌλ―€λ‘œ λ„˜μ–΄κ°€κ² λ‹€λƒ₯!

πŸ™„ Cython vs CPython


μ•„λ‹ˆ 그게 κ·Έκ±° μ•„λ‹Œκ°€? 라고 μƒκ°ν–ˆμ—ˆλŠ”λ° μ•„λ‹ˆμ—ˆμŠ΅λ‹ˆλ‹€.
Cython 은 "μ–Έμ–΄" μ˜€μŠ΅λ‹ˆλ‹€... (두λ‘₯)
νŒŒμ΄μ¬μ„ 2λ…„μ΄λ‚˜ κ³΅λΆ€ν–ˆλŠ”λ°, 뭐 ν•˜λ‚˜ μ œλŒ€λ‘œ μ•„λŠ”κ²Œ μ—†λ„€μš”.

이λ₯Ό ν…Œλ©΄ Cython 은 파이썬의 Superset κ³Ό 같은 κ°œλ…μž…λ‹ˆλ‹€.
Python의 λŒ€λΆ€λΆ„μ˜ 문법을 μ§€μ›ν•˜κ³  (쑰금 λ‹€λ¦…λ‹ˆλ‹€) Cython 만의 문법을 μ‚¬μš©ν•˜μ—¬ μž‘μ„±ν•˜λ©΄
이 μ†ŒμŠ€ μ½”λ“œλ₯Ό C 파일둜 컴파일 ν•©λ‹ˆλ‹€.

파이썬 문법 κ·ΈλŒ€λ‘œλ₯Ό μž‘μ„±ν•˜μ—¬ Cython 컴파일러둜 μ‹€ν–‰ν•˜λŠ” 것도 λ¬Έμ œκ°€ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
λ‹€λ§Œ Cython 을 μ‚¬μš©ν–ˆμ„λ•Œμ˜ μž‡μ μΈ C λ„€μ΄ν‹°λΈŒ 가속이 μ μš©λ˜μ§€ μ•Šμ„ λΏμž…λ‹ˆλ‹€.

이λ₯Ό ν…Œλ©΄ 곡식 λ¬Έμ„œμ—λŠ” μ΄λ ‡κ²Œ μ„€λͺ… λ˜μ–΄ 있죠

(μ–΄λ–€ λ™μž‘μ„ ν•˜λŠ” μ½”λ“œμΈμ§€ ꡳ이 μ΄ν•΄ν•˜μ§€ μ•ŠμœΌμ…”λ„ λ©λ‹ˆλ‹€)

def f(x): return x ** 2 - x

def integrate_f(a, b, N):
    s = 0
    dx = (b - a)/N
    for i in range(N):
        s += f(a + i * dx)
    return s * dx

μ΄λŒ€λ‘œ Cython 으둜 컴파일 해도 λ¬Έμ œλŠ” μ—†μ§€λ§Œ,
μ•„λž˜μ™€ 같이 ν•œλ‹€λ©΄ μ„±λŠ₯μƒμ˜ κ°œμ„ μ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

cdef double f(double x):
    return x ** 2 - x
  
def integrate_f(double a, double b, int N):
    cdef int i
    cdef double s, x, dx
    s = 0
    dx = (b - a)/N
    for i in range(N):
        s += f(a + i * dx)
    return s * dx

λ³€ν•œκ±΄ cdef λΌλŠ” ν‚€μ›Œλ“œκ°€ μ‚¬μš©λœ 것과, ν•¨μˆ˜μΈμž 및 λ³€μˆ˜μ— νƒ€μž…μ΄ μ§€μ •λ˜μ—ˆλ‹€λŠ” 점 μž…λ‹ˆλ‹€.
이λ₯Ό C μ–Έμ–΄λ‘œ 컴파일 ν•  수 있기 λ•Œλ¬Έμ— μ„±λŠ₯μƒμœΌλ‘œ μž‡μ μ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€

Cython 에 λŒ€ν•œ μ’€ 더 μžμ„Έν•œ μ„€λͺ…은 μ—¬κΈ°λ₯Ό μ°Έκ³  ν•΄μ£Όμ„Έμš”

🐢 마치며


μ½”λ“œλ§Œ 잘 짜면 λœλ‹€λŠ” μƒκ°μœΌλ‘œ μ‚΄μ•„μ™”λŠ”λ°, μ½”λ“œκ°€ μ–΄λ–»κ²Œ μ‹€ν–‰λ˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ”
크게 κΆκΈˆν•΄ ν•˜μ§€ μ•Šμ•˜λ˜ 것 κ°™μ•„ λ°˜μ„±μ΄ λ©λ‹ˆλ‹€.

잘 λ™μž‘ν•˜λŠ” ν”„λ‘œκ·Έλž¨λ„ μ€‘μš”ν•˜μ§€λ§Œ, 이 ν”„λ‘œκ·Έλž¨μ΄ μ–΄λ–»κ²Œ 잘 λ™μž‘ν•˜κ²Œ 된 것인가에 λŒ€ν•΄
ν˜ΈκΈ°μ‹¬μ„ κ°–λŠ” 것 λ˜ν•œ ν•œ λͺ…μ˜ ν”„λ‘œκ·Έλž˜λ¨Έλ‘œμ„œμ˜ 의무라고 μƒκ°ν•©λ‹ˆλ‹€.

μ‹œκ°„μ€ λΆ€μ‘±ν•˜κ³ , 곡뢀할 것은 끝이 μ—†λ‹€λŠ”κ±Έ λ‹€μ‹œ ν•œ 번 느끼며 글을 λ§ˆμΉ©λ‹ˆλ‹€ 😭
κΈ΄ κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

profile
Espresso Cream Cat DD

1개의 λŒ“κΈ€

comment-user-thumbnail
2020λ…„ 4μ›” 27일

μ•„μœ  κ°„κ²°ν•˜κ²Œ 잘 써주셨닀

λ‹΅κΈ€ 달기