태그 보관물: runtime

runtime

파이썬 런타임은 실제로 어떻게 작동합니까? 의 개념

의 개념 runtime library, 특히 파이썬 개념을 이해하는 데 문제가 있습니다 . 그래서 저는 hello world python 프로그램을 작성하여 실행하려고합니다 python ./hello_world.py.

Enter 버튼을 눌렀을 때와 CPU에서 실행되는 파이썬 코드에서 생성 된 기계어 코드 사이에 어떤 단계가 발생합니까? 그리고 이것이 파이썬 런타임 시스템 및 / 또는 라이브러리와 어떤 관련이 있습니까?



답변

다양한 현대식 프로그래밍 언어가 공유하는 몇 가지 공통 개념이 있습니다. 그중 두 가지는 위의 질문에 대한 답변의 핵심입니다.

Enter 버튼을 눌렀을 때와 CPU에서 실행되는 파이썬 코드에서 생성 된 기계어 코드 사이에 어떤 단계가 발생합니까?

코드는 파싱, 분석 및 통역사로 제공됩니다. 이것은 컴파일러 이론으로 알려진 컴퓨터 과학의 매우 중요한 영역에 관한 것 입니다. 컴파일러는 한 언어 (소스 코드)에서 다른 언어로 코드를 변환하는 프로그램입니다 (일반적으로 하나의 고급 언어에서 다른 언어로 변환하는 “변환기”는 존재하지만 기계 코드). 이것은 몇 년 동안 연구 할 수있는 매우 방대한 주제이지만 기본 버전은 다음과 같습니다.

컴파일러는 소스 코드를 읽고 언어의 구문 규칙을 적용하여 유효한 Python (귀하의 경우) 코드인지 이해하는 루틴 인 parser로 시작 합니다. 그렇지 않으면 파서에서 오류가 발생하고 컴파일러가 종료되지만 파서가 발생하면 파서가 요약 구문 트리 또는 AST를 간단히 출력합니다. AST는 노드에 각각 구문 요소가 포함 된 트리 데이터 구조입니다. 예를 들어, 당신이 말한다면 x = 5, 당신은 끝낼 수 BinaryExpression와 노드 operator의 값 =하는 LeftReferenceExpression(x)Right의 값 IntegerLiteralExpression(5). 전체 프로그램은 이와 같은 큰 나무로 표현 될 수 있습니다.

파서가 AST를 생성하면 두 번째 단계는 의미 분석 입니다. 평범한 영어로, 이것은 “이 AST가 무엇을 의미하는지 파악”을 의미합니다. 유효한 구문 분석 (예 : 3 개의 인수로 1 인수 함수 호출)과 같이 불법적 인 일을했는지 ​​확인하기 위해 AST를 확인하고, 그렇지 않으면 오류를 발생시킵니다. 그렇지 않으면 AST를 분석하고 편집을 수행하여 기계가 이해하기 쉽도록합니다.

세 번째 단계는 코드 생성입니다. 완벽하게 분석되고 단순화 된 유효한 AST를 생성 한 후에는 AST를 생성하고 출력 언어로 코드를 생성하는 생성기로 공급합니다. 이것은 완제품입니다.

파이썬에서는 컴파일러가 아닌 인터프리터를 사용합니다. 인터프리터는 컴파일러와 정확히 같은 방식으로 작동하지만 한 가지 차이점이 있습니다. 코드 생성 대신 출력을 메모리 내에서로드하고 시스템에서 직접 실행합니다. (이런 상황에 대한 정확한 세부 사항은 언어와 통역사마다 크게 다를 수 있습니다.)

그리고 이것이 파이썬 런타임 시스템 및 / 또는 라이브러리와 어떤 관련이 있습니까?

가장 단순한 언어를 제외한 모든 언어에는 사전 정의 된 함수 세트가 제공되는데,이 기능은 많은 사용자에게 중요하며 사용자가 어떤 이유로 든 스스로 구현하기가 어려울 수 있습니다. 이들의 코드는 타사 라이브러리가 없어도 이러한 함수를 호출 할 수 있습니다. (예를 들어, 파이썬 print에서는 출력을 전송합니다 stdout. 직접 구현하십시오.)이 함수 집합은 일반적으로 코드가 런타임에 호출 할 수있는 공유 라이브러리에 수집되므로 알려진 이유입니다. 언어 런타임 라이브러리 또는 간단히 “런타임”으로


답변

표준 파이썬 구현은 바이트 코드 가상 머신입니다. 이는 머신 코드 (프로세서의 opcode 세트의 opcode)가 프로그램에서 생성 되지 않았 음 을 의미합니다. opcode는 VM이 바이트 코드를 해석하는 동안 이미 가상 머신으로 컴파일 된 opcode 에서만 선택 됩니다.

처음에 프로그램이 바이트 코드로 바뀌는 방법은 약간 다른 질문이지만 짧은 대답은 “다른 하향식 언어 변환과 마찬가지로 컴파일을 통한 것”입니다.


답변