인터프리터 언어 vs 컴파일 언어
인터프리터 언어: 한줄씩 해석되어 구현된다.
컴파일 언어: 전체를 해석하여 Object 코드로 변환하여 실행한다.
파이썬은 과연 인터프리터 언어일까?
파이썬은 인터프리터 언어의 특징을 가졌다. 이는 언어의 특징을 가진것이지 이를 분류할수는 없다. 책에서도 말했듯, 특정언어가 딱 컴파일언어! 인터프리터 언어! 로 나눠져있지는 않다고 말한다.
다들 알듯 파이썬은 한줄치면 바로 대답해준다. 그래서 인터프리터 언어의 특징을 가지고 있다고 한다.
그렇다면 파이썬 동작은 어떻게 이루어지나?
위 설명의 인터프리터 언어처럼 파이썬이 동작한다면 너무 많은 리소스를 낭비하게 된다
왜냐하면 소스코드 -> 기계어 로 변환 (해석)하는 것이 가장 비용이 많이 들기 때문이다.
따라서 파이썬은
1. 소스코드 -> 바이트 로 컴파일 ( .pyc 확장자를 가짐 ) ( 바이트 코드는 완벽한 기계어가 아니다. 무조건 PVM(python virtual machine)을 이용해야 해석 가능 )
2. 이후에 해당 바이트 코드를 인터프리터가 해석한다.
그래서 파이썬은 고전적 의미로써 컴파일언어 , 인터프리터 언어 두개 다로 이해할 수 있다.
자바와 파이썬이 속도 차이가 나는 이유 => 동적 타이핑 vs 정적 타이핑
동적 타이핑은 파이썬의 장점이자 단점이다.
이는 속도 차이를 명확하게 나게하는 이유인데 이는
정적언어 ( 변수 타입을 지정하는 경우 ) 인 경우에는 변수를 설정해 놓고 컴파일을 하면 컴파일러가 연산과 메모리 엑세스를 최적화 하고 실행을 시키기 때문이다.
반대로 파이썬은 동적언어 ( 변수 타입을 지정하지 않아서 인터프리터가 해당 코드에 도달하지 않으면 런타임은 변수 값을 알지 못한다 )
이기 떄문에 위의 미리 알고 미리 최적화하는 장점을 가져갈 수 없다.
PVM vs JVM
결국 둘다 소스코드 -> 컴파일 -> 바이트 코드 변환 -> *VM을 통한 코드 읽기 인데 왜 차이가 날까?
JVM 에서 메모리 관리
- 힙과 스택의 메모리 사용
실행 과정
- 프로그램이 실행되면, JVM은 OS로부터 이 프로그램이 필요로하는 메모리를 할당받음. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리함
- 자바 컴파일러(JAVAC)가 자바 소스코드를 읽고, 자바 바이트코드(.class)로 변환시킴
- 변경된 class 파일들을 클래스 로더를 통해 JVM 메모리 영역으로 로딩함
- 로딩된 class파일들은 Execution engine을 통해 해석됨
- 해석된 바이트 코드는 메모리 영역에 배치되어 실질적인 수행이 이루어짐. 이러한 실행 과정 속 JVM은 필요에 따라 스레드 동기화나 가비지 컬렉션 같은 메모리 관리 작업을 수행함
자바는 JVM이 메모리 관리를 한다.
더 많은 내용은
https://gyoogle.dev/blog/computer-language/Java/Java%20Virtual%20Machine.html
[Java] 자바 가상 머신(Java Virtual Machine) | 👨🏻💻 Tech Interview
[Java] 자바 가상 머신(Java Virtual Machine) 시스템 메모리를 관리하면서, 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공함 JVM은, 다른 프로그램을 실행시키는 것이 목적이다. 갖춘 기
gyoogle.dev
그렇다면 PVM은 어째서 이러한 미리 정적할당 정보를 갖지 않는 것일까?
파이썬 가상 머신은 인터프리터에 가상머신이 있다고 생각하면 된다.
자바는 정적 타이핑에의해 컴파일 이후에 컴파일에서 더 많은 정보 ( 변수 할당 ) 를 제공한다.
그러나 파이썬은 이를 포기하고 데이터 구조 및 유형을 결정하는것을 멈추고 해석하는 과정을 거친다.
이 이유는 연산의 자유도를 높이기 위해서이다
따라서 자바도 인터프리터 언어처럼 짤수있지만 할 이유가 없다. 자유도가 낮기 때문이다.
https://stackoverflow.com/questions/441824/java-virtual-machine-vs-python-interpreter-parlance
Java "Virtual Machine" vs. Python "Interpreter" parlance?
It seems rare to read of a Python "virtual machine" while in Java "virtual machine" is used all the time. Both interpret byte codes; why call one a virtual machine and the other an interpreter?
stackoverflow.com
출처
파이썬은 인터프리터언어입니까? · Wireframe
최근에 많이 보게 되는 질문 중 하나가 ‘파이썬은 인터프리터 언어입니까? 컴파일언어입니까?’라는 것이다. 개인적으로 이 질문은 사람을 참 난감하게 하는데, 어떻게 답해야하나에 앞서 아
soooprmx.com
https://kimwooseok.com/python/2021/06/29/python-compile/
Python compile · 김우석
Python compile 29 Jun 2021 개요 : 파이썬 언어의 특징에 대한 글 파이썬은 인터프리터 언어이며, 고레벨, 범용적 프로그래밍 언어이다. 동적 타이핑과 가비지 컬렉션을 사용한다. 동적 타이핑 파이썬
kimwooseok.com
'TIL' 카테고리의 다른 글
[운영체제 11장] CPU 스케쥴링 (0) | 2022.09.18 |
---|---|
[운영체제 10장] 프로세스 메모리 구조 그리고 스레드 (0) | 2022.09.16 |
[Docker] 개발중인 Django Postgresql 프로젝트에 Dockerfile 생성 및 docker-compose 적용하기 (0) | 2022.08.25 |
[Docker] 실습 :: 이미지 생성 (0) | 2022.08.19 |
[Docker] 기초내용 (1) - 이미지, 컨테이너, 구성 (0) | 2022.08.15 |