본문 바로가기
TIL

[운영체제 1~2장] 파이썬과 자바가 속도차이가 나는 이유

by qbinee 2022. 9. 15.

인터프리터 언어 vs 컴파일 언어

인터프리터 언어: 한줄씩 해석되어 구현된다.

컴파일 언어: 전체를 해석하여 Object 코드로 변환하여 실행한다.

 

파이썬은 과연 인터프리터 언어일까?

파이썬은 인터프리터 언어의 특징을 가졌다. 이는 언어의 특징을 가진것이지 이를 분류할수는 없다. 책에서도 말했듯, 특정언어가 딱 컴파일언어! 인터프리터 언어! 로 나눠져있지는 않다고 말한다.

 

다들 알듯 파이썬은 한줄치면 바로 대답해준다. 그래서 인터프리터 언어의 특징을 가지고 있다고 한다.

 

그렇다면 파이썬 동작은 어떻게 이루어지나?

 

위 설명의  인터프리터 언어처럼 파이썬이 동작한다면 너무 많은 리소스를 낭비하게 된다

왜냐하면 소스코드 -> 기계어 로 변환 (해석)하는 것이 가장 비용이 많이 들기 때문이다.

 

따라서 파이썬은 

1. 소스코드 -> 바이트 로 컴파일 ( .pyc 확장자를 가짐 ) ( 바이트 코드는 완벽한 기계어가 아니다. 무조건 PVM(python virtual machine)을 이용해야 해석 가능 )
2. 이후에 해당 바이트 코드를 인터프리터가 해석한다.

 

그래서 파이썬은 고전적 의미로써 컴파일언어 , 인터프리터 언어 두개 다로 이해할 수 있다.


자바와 파이썬이 속도 차이가 나는 이유 =>  동적 타이핑 vs 정적 타이핑

동적 타이핑은 파이썬의 장점이자 단점이다.

이는 속도 차이를 명확하게 나게하는 이유인데 이는 

정적언어 ( 변수 타입을 지정하는 경우 ) 인 경우에는 변수를 설정해 놓고 컴파일을 하면 컴파일러가 연산과 메모리 엑세스를 최적화 하고 실행을 시키기 때문이다.

 

반대로 파이썬은 동적언어 ( 변수 타입을 지정하지 않아서  인터프리터가 해당 코드에 도달하지 않으면 런타임은 변수 값을 알지 못한다 ) 

이기 떄문에 위의 미리 알고 미리 최적화하는 장점을 가져갈 수 없다. 

 

PVM vs JVM

결국 둘다 소스코드 -> 컴파일 -> 바이트 코드 변환 -> *VM을 통한 코드 읽기 인데 왜 차이가 날까?

JVM 에서 메모리 관리

- 힙과 스택의 메모리 사용

실행 과정

  1. 프로그램이 실행되면, JVM은 OS로부터 이 프로그램이 필요로하는 메모리를 할당받음. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리함
  2. 자바 컴파일러(JAVAC)가 자바 소스코드를 읽고, 자바 바이트코드(.class)로 변환시킴
  3. 변경된 class 파일들을 클래스 로더를 통해 JVM 메모리 영역으로 로딩함
  4. 로딩된 class파일들은 Execution engine을 통해 해석됨
  5. 해석된 바이트 코드는 메모리 영역에 배치되어 실질적인 수행이 이루어짐. 이러한 실행 과정 속 JVM은 필요에 따라 스레드 동기화나 가비지 컬렉션 같은 메모리 관리 작업을 수행함

runtime data areas 위주로 확인하자

 

자바는 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

 

 

 

 

출처

https://soooprmx.com/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%80-%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%EC%96%B8%EC%96%B4%EC%9E%85%EB%8B%88%EA%B9%8C/

 

파이썬은 인터프리터언어입니까? · Wireframe

최근에 많이 보게 되는 질문 중 하나가 ‘파이썬은 인터프리터 언어입니까? 컴파일언어입니까?’라는 것이다. 개인적으로 이 질문은 사람을 참 난감하게 하는데, 어떻게 답해야하나에 앞서 아

soooprmx.com

https://kimwooseok.com/python/2021/06/29/python-compile/

 

Python compile · 김우석

Python compile 29 Jun 2021 개요 : 파이썬 언어의 특징에 대한 글 파이썬은 인터프리터 언어이며, 고레벨, 범용적 프로그래밍 언어이다. 동적 타이핑과 가비지 컬렉션을 사용한다. 동적 타이핑 파이썬

kimwooseok.com