Python 코드는 미리 기계어로 변환하지 않고 실행 시점에 한 줄씩 번역하면서 실행한다.
내부적으로 .py → .pyc(바이트코드)로 변환하긴 하지만, Java처럼 미리 컴파일해서 실행하지는 않는다.
: CPython(기본이자 가장 널리 쓰임), PyPy(JIT 지원, 속도 빠름), Jython(JVM 위에서 동작하는 Python)
파이썬의 경우,
source1.py -- 인터프리터 → 실행 (즉시 해석)
자바의 경우,
source1.java -- javac 컴파일러 → bytecode.class -- JVM → JIT 컴파일 후 실행
Python은 유연성과 실행 편의성, Java는 성능과 이식성에 초점을 둔 언어이다.
바이트코드는 CPU가 직접 실행할 수 없고, 가상머신(VM)이 해석해야만 실행된다.
다시 말해, 바이트코드는 CPU용이 아니라 직접 실행할 수 없고, 그 언어의 런타임(e.g. JVM, CPython)이 필요하다.
| Bytecode | 기계어 (Machine Code) | |
|---|---|---|
| 실행 주체 | VM (JVM, Python VM 등) | CPU (물리 하드웨어) |
| 플랫폼 의존성 | 독립적 (OS / CPU 상관없음) | 의존적 (CPU 아키텍쳐마다 다름) |
| 사람이 읽기 | 조금 가능(명령이 단순함) | 거의 불가능.(이진수 수준) cf. 기계어를 사람이 읽기 쉽게 바꾼 건 어셈블리어. 기계어와 1:1 대응되는 저수준 언어. |
| 목적 | 이식성과 안전성 | 성능 극대화 |
| 예시 | Java의 .class, Python의 .pyc | .exe, ELF, ARM binary 등 |
Java는 객체 지향으로 코드를 짜라는 색깔이 아주 강했다. (클래스 안에 넣어라, 메서드로 정의하라, 전역 함수 만들지 마라)
요즘 Java는 람다, 스트림이 들어오며 함수형 요소가 꽤 생겼지만, 기본 디자인 철학은 OOP 중심이다.
반면, Python은 한 가지 방식에 묶어두지 않고, 절차적(스크립트처럼 위에서부터 순서대로 실행되는 코드), 객체 지향 등 여러 패러다임을 모두 허용하는 언어다.
"일급함수"를 지원하는 함수형 프로그래밍 스타일도 사용한다.
함수를 값처럼 다룰 수 있다. 파이썬에서 함수나 객체(Object), 클래스, 숫자, 리스트 등 1급 객체이다.
1급 객체의 조건
: 1. 변수에 할당할 수 있어야 한다. 2. 다른 함수의 인수로 전달 가능해야 한다. 3. 함수가 그걸 반환할 수 있어야 한다.
1. 함수를 변수에 넣을 수 있음
def add(x, y):
return x + y
f = add # 함수 자체를 변수에 담음
print(f(3, 4)) # 7
2. 함수를 다른 함수의 인수로 넘길 수 있음
def apply(func, x, y):
return func(x, y)
print(apply(add, 2, 3)) # 5
3. 함수를 리턴값으로 돌려줄 수 있음
def make_adder(n):
def inner(x):
return x + n
return inner
add5 = make_adder(5)
print(add5(10)) # 15