programing

Python은 해석됩니까, 컴파일됩니까, 아니면 둘 다입니까?

goodjava 2023. 1. 15. 16:54

Python은 해석됩니까, 컴파일됩니까, 아니면 둘 다입니까?

제가 알기로는:

통역 언어는 이동 중에 인터프리터에 의해 실행 및 실행되는 고급 언어(고급 언어를 기계어로 변환한 후 실행하는 프로그램)로, 프로그램을 한 번에 조금씩 처리합니다.

컴파일된 언어는 우선 컴파일러(고급 언어를 기계어로 변환하는 프로그램)에 의해 코드가 기계어로 변환된 후 실행자(코드를 실행하기 위한 다른 프로그램)에 의해 실행되는 고급 언어입니다.

제 정의가 틀렸다면 정정해 주세요.

Python으로 돌아와서 좀 헷갈리네요.어디에서나 Python은 해석된 언어이지만 기계 코드가 아닌 중간 코드(바이트 코드나 IL 등)로 해석됩니다.그러면 어떤 프로그램이 IM 코드를 실행합니까?Python 스크립트의 처리와 실행을 가르쳐 주세요.

우선, 해석/컴파일은 언어의 속성이 아니라 구현의 속성입니다.대부분의 언어에서는 모든 구현이 하나의 카테고리에 속하지는 않기 때문에 언어도 해석/컴파일되어 있다고 몇 마디 생략할 수 있습니다.다만, 이해에 도움이 되는 언어도 많고, 양쪽 모두(대부분의 기능 영역) 사용할 수 있는 언어도 많기 때문에, 여전히 중요한 구별입니다.Haskell 및 ML 참조).또한 Python의 서브셋을 C 또는 C++ 코드로 컴파일하는 C 인터프리터와 프로젝트도 있습니다.

둘째, 컴파일은 네이티브 머신 코드에 대한 사전 컴파일로 제한되지 않습니다.컴파일러는 일반적으로 한 프로그래밍 언어의 프로그램을 다른 프로그래밍 언어의 프로그램으로 변환하는 프로그램입니다(중요한 변환이 적용되면 같은 입력 및 출력 언어를 가진 컴파일러도 가능합니다).또한 JIT 컴파일러는 런타임에 네이티브 머신 코드로 컴파일하기 때문에 (벤치마크와 구현의 품질에 따라) 미리 컴파일하기 전에 컴파일하기 매우 빠를 수 있습니다.

그러나 트집을 잡는 것을 멈추고 질문하고자 하는 질문에 답하기 위해 Python이 컴파일되었습니다.머신 코드에 미리 컴파일되지 않고(즉, 제한되고 잘못된, 그러나 유감스럽게도 공통의 정의에 의해 컴파일됨), 바이트 코드에 컴파일되었을 뿐이지만, 적어도 몇 가지 이점이 있는 컴파일입니다.예를 들어, 스테이트먼트a = b.c()는 바이트 이 스트림은 "때 "분해"된 것처럼 .네, '아주머니'는요,load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)이것은 심플화입니다.실제로 읽기 어렵고, 레벨도 낮습니다.표준 라이브러리 모듈을 사용해 실제의 상황을 시험해 볼 수 있습니다.이를 해석하는 것이 더 높은 수준의 표현에서 해석하는 것보다 더 빠릅니다.

이 바이트 코드는 참조 구현(CPython)과 같이 해석되거나(이론적으로나 실제 성능 면에서나) 실행 시 최적화된 머신 코드로 해석되어 컴파일됩니다(Py와 같이).파이.

CPU는 기계 코드만 제대로 인식할 수 있습니다.인터프리터 프로그램의 경우 인터프리터의 최종 목표는 프로그램 코드를 기계 코드로 "해석"하는 것입니다.하지만, 일반적으로 현대 통역 언어는 인간의 코드를 너무 비효율적이기 때문에 직접적으로 해석하지 않는다.

Python 인터프리터는 먼저 인간 코드를 읽고 기계 코드로 변환하기 전에 중간 코드로 최적화합니다.이것이 바로 코드의 컴파일된 실행 파일을 직접 실행할 수 있는 C++와는 달리 Python 스크립트를 실행하기 위해 항상 다른 프로그램이 필요한 이유입니다.를 들어, 「」라고 하는 것은,c:\Python27\python.exe ★★★★★★★★★★★★★★★★★」/usr/bin/python.

답은 사용되는 python의 구현에 따라 달라집니다.예를 들어 CPython(Python의 Standard 구현) 또는 Jython(Java 프로그래밍 언어와의 통합을 위해 대상)을 사용하는 경우 먼저 바이트 코드로 변환되며, 사용 중인 python의 구현에 따라 이 바이코드는 해당 가상 머신으로 전송되어 해석됩니다.CPython용 PVM(Python Virtual Machine)과 Jython용 JVM(Java Virtual Machine)입니다.

그러나 또 다른 표준 CPython 구현인 PyPy를 사용한다고 가정해 보겠습니다.Just-In-Time 컴파일러를 사용합니다.

Python 공식 사이트에 따르면, 그것은 해석되었습니다.

https://www.python.org/doc/essays/blurb/

Python은 해석된 객체 지향 고급 프로그래밍 언어입니다.

...

컴파일 단계가 없기 때문에...

...

Python 인터프리터와 광범위한 표준 라이브러리를 사용할 수 있습니다.

...

대신 인터프리터는 오류를 검출하면 예외를 발생시킵니다.프로그램이 예외를 검출하지 않으면 인터프리터는 스택 트레이스를 인쇄합니다.

네, 컴파일 언어이기도 하고 통역 언어이기도 합니다. 그럼 왜 우리는 그것을 통역사적 언어라고 부를까요?

컴파일도 해석도 가능합니까?

우선 자바에서 온 사람이라면 내 답변이 더 마음에 들 것이라고 말하고 싶다.

Java에서 소스 코드는 먼저 javac 컴파일러를 통해 바이트 코드로 변환된 후 JVM(실행을 위한 네이티브 코드 생성을 담당)으로 전송됩니다.이제 Java를 컴파일 언어라고 부릅니다.이것은 Java가 실제로 소스 코드를 컴파일하여 .class 파일(바이트 코드만)을 제공한다는 것을 알 수 있기 때문입니다.

javac Hello.java -----------------------------------------------

java hello ---------------------------------------------------------------------

python에서도 같은 일이 발생합니다.즉, 먼저 소스 코드가 컴파일러를 통해 바이트 코드로 변환된 후 PVM으로 전송됩니다(실행 목적으로 네이티브 코드를 생성하는 담당).이제 Python을 인터프리터 언어라고 부르는 것을 보여드리고 싶습니다. 컴파일은 뒤에서 이루어지며 Python 코드를 실행할 때 다음과 같이 처리되기 때문입니다.

python Hello.py -----------------------------------------------------------------------------------------------

@ python Hello.py 이것은 직접 실행되는 것처럼 보이지만 실제로는 먼저 인터프리터에 의해 해석된 바이트 코드를 생성하여 실행을 위한 네이티브 코드를 생성합니다.

CPython - 컴파일 및 해석을 모두 담당합니다.

상세한 것에 대하여는, 다음의 행을 참조해 주세요.

CPython은 소스 코드를 컴파일하지만 실제 컴파일은 Cython의 도움으로 이루어지며 해석은 CPython의 도움으로 이루어집니다.

이제 Java와 Python에서 Just-In-Time 컴파일러의 역할에 대해 조금 설명하겠습니다.

JVM에는 바이트 코드를 한 줄씩 해석하여 네이티브 머신 코드를 취득하는 Java Interpreter가 존재하지만 Java 바이트 코드가 인터프리터에 의해 실행되면 실행 속도가 항상 느려집니다.그렇다면 해결책은 무엇일까요?솔루션은 Just-In-Time 컴파일러로 해석할 수 있는 것보다 훨씬 더 빨리 실행될 수 있는 네이티브 코드를 생성합니다.일부 JVM 벤더는 Java Interpreter를 사용하고 일부는 Just-In-Time 컴파일러를 사용합니다.레퍼런스: 여기를 클릭

python에서는 인터프리터를 우회하여 빠른 실행을 실현하기 위해 CPython 대신 다른 python 구현(PyPy)을 사용합니다.PyPy를 포함한 python의 다른 구현에 대해서는 여기를 클릭해 주세요.

Python을 시작한 지 얼마 되지 않은 분들에게는 큰 혼란이며, 이 답변은 조금 이해하기 어렵기 때문에 쉽게 해드리겠습니다.

Python에게 스크립트를 실행하도록 지시할 때 Python이 실제로 코드를 크런치하기 전에 실행하는 몇 가지 단계가 있습니다.

  • 바이트 코드로 컴파일 됩니다.
  • 그런 다음 가상 시스템으로 라우팅됩니다.

소스 코드를 실행하면 Python이 바이트 코드로 컴파일합니다.컴파일은 변환 단계이며 바이트 코드는 플랫폼에 의존하지 않는 낮은 수준의 소스 코드 표현입니다.

Python 바이트 코드는 바이너리 머신 코드가 아닙니다(예를 들어 Intel 칩용 명령).

실제로 Python은 소스 코드의 각 문장을 개별 단계로 분해하여 바이트 코드 명령으로 변환합니다.바이트 코드 변환은 실행 속도를 높이기 위해 수행됩니다.바이트 코드는 원래 소스 코드 문보다 훨씬 빠르게 실행할 수 있습니다.그것은 has.pyc 확장자이며, 우리 기계에 쓸 수 있다면 쓸 것입니다.

따라서 다음에 같은 프로그램을 실행하면 Python은 .pyc 파일을 로드하고 변경되지 않는 한 컴파일 단계를 건너뜁니다.Python은 소스 및 바이트 코드 파일의 타임스탬프를 자동으로 확인하여 재컴파일해야 하는 시기를 파악합니다.소스 코드를 다시 저장하면 다음 프로그램 실행 시 바이트 코드가 자동으로 다시 생성됩니다.

Python이 우리 기계에 바이트 코드 파일을 쓸 수 없는 경우에도 우리의 프로그램은 여전히 작동합니다.바이트 코드는 메모리에서 생성되며 프로그램 종료 시 간단히 폐기됩니다.그러나 .pyc 파일은 부팅 시간을 단축하므로 더 큰 프로그램용으로 작성되었는지 확인하는 것이 좋습니다.

뒤에서 벌어지는 일들을 요약해 봅시다.Python이 프로그램을 실행할 때 Pyon은 .py를 메모리로 읽고 바이트 코드를 얻기 위해 해석한 후 실행을 계속합니다.프로그램에 의해 Import된 각 모듈에 대해 Python은 먼저 .py 파일에 대응하는 타임스탬프가 있는 .py 또는 .pyc에 미리 컴파일된 바이트 코드 버전이 있는지 확인합니다.Python은 바이트 코드 버전이 있는 경우 사용합니다.그렇지 않으면 모듈의 .py 파일을 해석하여 .pyc 파일에 저장하고 작성한 바이트 코드를 사용합니다.

바이트 코드 파일도 Python 코드를 발송하는 방법 중 하나입니다.Python은 원본 .py 소스 파일이 없는 경우에도 .pyc 파일만 찾을 수 있으면 프로그램을 실행할 수 있습니다.

Python 가상 머신(PVM)

프로그램이 바이트 코드로 컴파일되면 실행을 위해 Python Virtual Machine(PVM)으로 발송됩니다.PVM은 별도의 프로그램이 아닙니다.단독으로 인스톨 할 필요는 없습니다.실제로 PVM은 바이트 코드 명령을 하나씩 반복하여 작업을 수행하는 큰 루프에 불과합니다.PVM은 Python의 런타임 엔진입니다.Python 시스템의 일부로 항상 존재합니다.스크립트를 실제로 실행하는 컴포넌트입니다.엄밀히 말하면 이것은 파이썬 인터프리터라고 불리는 것의 마지막 단계일 뿐이다.

있다){(Java)}의 경우

파이썬 자바
이 바이트코드는 접근을 시도할 때마다 다시 실행됩니다.

}other {} 기 { {

Python 코드는 처음에 바이트 코드라고 불리는 것으로 번역됩니다.
.
실행됩니다.

}

실제로 사용되는 언어의 구현에 달려 있습니다!다만, 어느 실장에도 공통의 순서가 있습니다.즉, 코드는 처음에 중간 코드로 컴파일(변환)되어 바이트 코드(.pyc 파일에 저장)라고 불리는 코드와 머신(바이너리) 코드 사이에 있습니다.이것은 코드를 수정하지 않는 한 반복되지 않는 일회성 절차입니다.

그리고 그 바이트코드는 프로그램을 실행할 때마다 실행됩니다. 어떻게요?프로그램을 실행하면 이 바이트 코드(.pyc 파일 내)가 가상 머신(VM)1에 입력으로 전달되어 프로그램이 실행될 수 있게 됩니다.

언어 구현에 따라 VM은 바이트 코드를 해석하거나(CPython2 구현의 경우) JIT 컴파일합니다3(PyPy4 구현의 경우).

주의:

1 컴퓨터 시스템의 에뮬레이션

2 바이트 코드 인터프리터; C와 Python으로 작성된 언어의 참조 구현 - 가장 널리 사용되는

3 프로그램 실행 중(실행 시) 실행되는 컴파일

4 바이트 코드 JIT 컴파일러: CPython 대체 구현으로, RPython(제한된 Python)으로 작성됨 - 많은 경우 CPython보다 빠르게 실행됨

거의 Python은 통역 언어라고 할 수 있습니다.그러나 python의 1회 컴파일 프로세스의 일부를 사용하여 완전한 소스 코드를 자바 언어와 같은 바이트 코드로 변환하고 있습니다.

신입사원용

Python은 스크립트를 실행하기 전에 자동으로 컴파일된 코드(바이트 코드)로 컴파일합니다.

스크립트 실행은 Import로 간주되지 않으며 .pyc는 생성되지 않습니다.

예를 들어 다른 모듈 xyz.py을 Import하는 스크립트파일 abc.py이 있는 경우 abc.py을 실행하면 xyz가 Import되기 때문에 xyz.pyc는 작성되지만 abc.py은 Import되지 않기 때문에 abc.pyc 파일은 작성되지 않습니다.

Python(인터프리터)이 컴파일 됩니다.

증명: 구문 오류가 있는 경우 코드가 컴파일되지 않습니다.

예 1:

print("This should print") 
a = 9/0 

출력:

This should print
Traceback (most recent call last):
  File "p.py", line 2, in <module>
    a = 9/0
ZeroDivisionError: integer division or modulo by zero

이치노 번째 된다( 「 」 「 」print두이 느려집니다.ZeroDivisionError. ('실행시간 오류')

예 2:

print("This should not print")
/0         

출력:

  File "p.py", line 2
    /0
    ^
SyntaxError: invalid syntax

결론:코드 파일에 아무것도 포함되어 있지 않으면 컴파일이 실패하여 실행됩니다.

작성한 python 코드는 python 바이트 코드로 컴파일되어 확장자가 .pyc인 파일이 생성됩니다.컴파일이 있다면, 다시 한 번 질문은 왜 컴파일된 언어를 사용하지 않는가 하는 것입니다.

이것은 전통적인 의미의 컴파일이 아닙니다.일반적으로 컴파일은 고급 언어를 사용하여 기계어로 변환하는 것입니다.하지만 그것은 일종의 편집이다.기계 코드가 아닌 중간 코드로 컴파일되었습니다(지금 바로 입수하셨기를 바랍니다).

실행 프로세스로 돌아가면 컴파일 단계에서 생성된 pyc 파일에 있는 바이트 코드가 적절한 가상 머신에 의해 실행됩니다.이 예에서는 CPython VM 타임스탬프(매직 번호라고 함)를 사용하여 .py 파일이 변경되었는지 여부를 검증합니다.이 경우 새로운 py 파일이 생성되었는지 여부에 따라 달라집니다.pyc가 현재 코드인 경우 컴파일 단계를 건너뜁니다.

이미 말한 바와 같이, "해석/컴파일된 것은 언어의 속성이 아니라 구현의 속성입니다.Python은 컴파일 모드뿐만 아니라 해석 모드에서도 사용할 수 있습니다.python 코드를 terminal 또는 cmd에서 직접 실행하면 python interpreter가 시작됩니다.명령어를 쓰면 이 명령어가 직접 해석됩니다.Python 코드가 포함된 파일을 사용하여 IDE에서 실행하거나 명령 프롬프트를 사용하면 먼저 코드 전체가 바이트 코드로 변환된 후 실행됩니다.그래서 어떻게 쓰느냐에 따라 다르죠.

의미론적인 경우인 것 같습니다.나는 우리 대부분이 컴파일의 일반적인 결과는 기계 코드라고 추론한다고 생각한다.그래서 나는 비단뱀은 컴파일되지 않았다고 스스로에게 말한다.컴파일은 실제로는 낮은 레벨로 변환하는 것을 의미하기 때문에 소스에서 바이트 코드로 변환하는 것도 컴파일이 되기 때문에 틀립니다.

Python은 (python 코드에서 cpu 실행까지) 개별 python 문을 완전히 처리할 수 있도록 설계되었기 때문에 인터프리터 카테고리에 들어갑니다.즉, 하나의 스테이트먼트를 작성하여 실행할 수 있으며 오류가 없는 경우 해당 결과를 얻을 수 있습니다.

중간 코드(바이트 코드 등)를 가지고 있기 때문에 전체적으로 컴파일러로 분류하는 것은 중요하지 않다고 생각합니다.이 컴포넌트(중간 코드 생성)는 일반적으로 컴파일러의 일부이지만 인터프리터에서도 사용할 수 있습니다.Wiki 의 인터프리터 정의(https://en.m.wikipedia.org/wiki/Interpreter_(computing) 를 참조해 주세요.이는 실행 속도 측면에서 효율성을 높이는 데 매우 중요한 요소입니다.캐시를 사용하면 현재 프로그램 범위에서 코드가 변경되지 않을 경우 어휘, 의미 분석, 코드 최적화 등의 처리 단계를 생략할 수 있습니다.

언급URL : https://stackoverflow.com/questions/6889747/is-python-interpreted-or-compiled-or-both