source

Python이 해석되면 .pyc 파일이 뭐죠?

bestscript 2022. 11. 12. 08:25

Python이 해석되면 .pyc 파일이 뭐죠?

Python은 통역된 언어입니다.그런데 왜 내 소스 디렉토리에.pycWindows에서 "Compiled Python Files"로 식별되는 파일입니다.

Python은 통역된 언어라는 것을 알게 되었습니다.

이 인기 있는 밈은 정확하지 않거나 오히려 (자연적인) 언어 수준에 대한 오해로 구성되어 있습니다. 비슷한 실수는 "성경은 양장본"이라고 말하는 것입니다.그 직유에 대해 설명하겠습니다...

"성경"은 (실제, 물리적인 것으로 확인된) 책의 한 종류라는 의미에서 "책"이다; "성경의 복사본"으로 확인된 책들은 기본적인 공통점을 가지고 있어야 한다 (비록 그것들도 다른 언어로, 허용 가능한 번역, 각주 수준과 다른 주석을 가지고 있을 수 있지만).s) 그러나 이 책들은 기본적인 것으로 여겨지지 않는 무수한 측면에서 완전히 다른 것이 허용됩니다. 제본의 종류, 제본의 색상, 인쇄에 사용되는 글꼴, 삽화, 쓰기 가능한 넓은 여백, 내장 북마크의 수나 종류 등입니다.

성경의 전형적인 인쇄는 실제로 양장본으로 되어 있을 가능성이 매우 높습니다.결국, 그것은 몇 군데에 걸쳐 읽고, 여러 군데에 책갈피를 붙이고, 주어진 장과 장의 요점을 찾아 넘기고, 좋은 양장본은 그러한 사용 하에서 주어진 복사본을 더 오래 보존할 수 있습니다.하지만, 이것들은 주어진 실제 책 물체가 성경의 사본인지 아닌지를 결정하는 데 사용될 수 없는 일상적인 문제들이다: 종이 백 인쇄는 완벽하게 가능하다!

마찬가지로 Python은 언어 구현의 클래스를 정의하는 의미에서 "언어"입니다.이러한 클래스는 기본적인 점에서는 모두 유사해야 합니다(구문, 대부분의 의미론).다만, 모든 「실장」의 디테일에 있어서 완전히 다른 것이 허용됩니다(W를 처리하는 방법을 포함한다).주어진 소스 파일, 소스 파일을 하위 수준 형식으로 컴파일하는지 여부(및 컴파일된 폼을 디스크에 저장하는지 여부), 해당 폼을 실행하는 방법 등입니다.

기존의 실장 CPython은 줄여서 Python이라고 불리는 경우가 많지만 Microsoft의 Iron Python(CLR 코드로 컴파일)과 나란히 있는 몇 가지 프로덕션 품질의 실장 중 하나에 불과합니다.NET), Jython(JVM 코드로 컴파일), PyPy(Python 자체에서 작성되어 Just-in-time(저스트 인-타임) 생성 머신 언어를 포함한 다양한 "백엔드" 형식으로 컴파일 가능)겉으로 보기에 다른 많은 책 오브젝트가 모두 성경(=="성경의 문구")일 수 있는 것처럼 모두 파이썬(=="파이썬 언어의 표기")입니다.

구체적으로 CPython에 관심이 있는 경우: 소스 파일을 Python 고유의 하위 수준 형식("바이트 코드"라고 함)으로 컴파일하고 필요할 때 자동으로 컴파일합니다(소스 파일에 대응하는 바이트 코드 파일이 없거나 바이트 코드 파일이 소스보다 오래되었거나 다른 Python 버전에 의해 컴파일된 경우). 보통 바이트코를 저장합니다.파일을 디스크에 다시 컴파일하지 않도록 합니다.OTOH IronPython은 보통 CLR 코드(디스크에 저장 여부에 따라 다름)로 컴파일하고 Jython은 JVM 코드(디스크에 저장 여부)로 컴파일합니다..class저장될 경우 확장)을 클릭합니다.

이러한 하위 레벨의 폼은, 「인터프리터」라고도 불리는 적절한 「가상 머신」(CPython VM, )에 의해서 실행됩니다.필요에 따라 Java VM(JVM이라고도 함)인 넷 런타임.

따라서 Python은 C#과 Java가 먼저 바이트 코드를 생성한 후 VM/인터프리터를 통해 실행하는 일반적인 구현 전략을 가진 경우에만 "인터프리터 언어"입니다.

대부분의 경우 컴파일 프로세스의 "무거운" 수준, 느린 속도 및 높은 처리량에 초점을 맞추고 있습니다.CPython은 가능한 한 빨리, 가능한 한 가벼운 컴파일을 하도록 설계되어 있습니다.컴파일러는 에러 체크와 최적화를 거의 하지 않기 때문에, 고속으로 실행할 수 있고, 소량의 메모리로 실행할 수 있습니다.이것에 의해, 유저는 필요에 따라서 언제라도 자동적으로 투과적으로 실행할 수 있습니다.대부분의 경우 컴파일이 진행 중인 제품입니다.Java 및 C#은 일반적으로 오류를 보다 철저하게 체크하고 더 많은 최적화를 수행하기 위해 컴파일 중에 더 많은 작업을 받아들입니다(따라서 자동 컴파일을 수행하지 않습니다).흑백 상황이 아닌 그레이 스케일의 연속체이며, 특정 레벨에 문턱값을 설정하고, 그 레벨보다 높은 레벨에만 「컴파일」이라고 하는 것은, 완전히 제멋대로입니다.-)

여기에는 Python 인터프리터가 소스를 컴파일하는 바이트 코드가 포함되어 있습니다.이 코드는 Python의 가상 머신에 의해 실행됩니다.

Python의 문서에서는 다음과 같이 정의를 설명하고 있습니다.

Python은 컴파일된 언어와 달리 해석된 언어이지만 바이트코드 컴파일러의 존재로 인해 구별이 흐릿할 수 있습니다.즉, 실행 파일을 명시적으로 생성하지 않고 원본 파일을 직접 실행할 수 있습니다.

통역 언어 같은 건 없어요.인터프리터와 컴파일러 중 어느 쪽을 사용하는지는 순전히 구현의 특성이며 언어와는 전혀 관계가 없습니다.

모든 언어는 인터프리터 또는 컴파일러에 의해 구현될 수 있습니다.대부분의 언어에는 각 유형의 구현이 적어도1개씩 있습니다(예를 들어 C와 C++용 인터프리터, JavaScript, PHP, Perl, Python, Ruby용 컴파일러가 있습니다).게다가 현대의 언어 실장의 대부분은 실제로 인터프리터와 컴파일러(또는 복수의 컴파일러)를 조합하고 있습니다.

언어는 추상적인 수학 규칙의 집합일 뿐이다.통역사는 언어의 구체적인 구현 전략 중 하나입니다.그 둘은 완전히 다른 추상화 수준에서 살고 있다.만약 영어가 입력 언어라면, "통역 언어"라는 용어는 입력 오류일 것입니다."Python은 해석된 언어이다"라는 진술은 단지 거짓이 아니다(왜냐하면 거짓이 그 진술이 비록 틀리더라도 말이 된다는 것을 의미하기 때문이다). 언어는 결코 "해석된 언어"로 정의될 수 없기 때문이다.

특히 현재 Python의 구현을 살펴보면 다음과 같은 구현 전략을 사용할 수 있습니다.

  • IronPython: DLR 트리로 컴파일한 후 DLR이 CIL 바이트 코드로 컴파일합니다.CIL 바이트 코드에 발생하는 동작은, 실행하고 있는 CLI VES 에 의해서 다릅니다만, Microsoft 에서는 다릅니다.NET, GNU Portable.NET 및 Novell Mono는 최종적으로 네이티브 머신 코드로 컴파일합니다.
  • Jython: 핫 코드 경로를 식별할 때까지 Python 소스 코드를 해석한 후 JVML 바이트 코드로 컴파일합니다.JVML 바이트 코드에 발생하는 작업은 실행 중인 JVM에 따라 달라집니다.Maxine은 핫 코드 경로를 식별할 때까지 최적화되지 않은 네이티브 코드로 직접 컴파일하여 최적화된 네이티브 코드로 재컴파일합니다.HotSpot은 먼저 JVML 바이트 코드를 해석한 후 최종적으로 핫 코드 경로를 최적화된 머신 코드로 컴파일합니다.
  • PyPy: PyPy 바이트 코드로 컴파일합니다.이 바이트 코드는 실행 중인 플랫폼에 따라 네이티브 코드, JVML 바이트 코드 또는 CIL 바이트 코드로 컴파일될 때까지 PyPy VM에 의해 해석됩니다.
  • CPython: CPython 바이트 코드로 컴파일하여 해석합니다.
  • Stackless Python : CPython 바이트 코드로 컴파일하여 해석합니다.
  • LLVM 컴파일러가 LLVM IR로 컴파일한 후 네이티브머신 코드로 컴파일하는 핫코드 패스를 식별할 때까지 해석합니다.
  • Cython: Python 코드를 휴대용 C 코드로 컴파일하여 표준 C 컴파일러로 컴파일합니다.
  • Nuitka: Python 코드를 머신에 의존하는 C++ 코드로 컴파일하여 표준 C 컴파일러로 컴파일합니다.

리스트의 모든 실장(그리고 Tinypy, Shatskin, Psyco 등 내가 언급하지 않은 일부 실장)에 컴파일러가 있다는 것을 알 수 있을 것이다.사실, 내가 아는 한, 현재 순수하게 해석되는 Python의 실장은 없고, 그러한 실장은 계획되어 있지 않으며, 그러한 실장은 없었다.

'통역 언어'라는 말이 통하지 않을 뿐만 아니라, '통역된 구현이 있는 언어'라는 의미로 해석해도 분명 사실이 아니다.누가 그런 말을 했는지는 몰라도 무슨 말을 하는지 모르는 게 분명해

특히,.pyc표시되는 파일은 CPython, Stackless Python 또는 Unloaden Swallow에서 생성된 캐시된 바이트 코드 파일입니다.

이것들은 Python 인터프리터에 의해 작성됩니다..py파일이 Import되고 Import된 모듈/프로그램의 "비활성 바이트 코드"가 포함되어 있습니다.소스코드에서 바이트 코드로의 "정보"는 이후 한 번만 수행할 필요가 있습니다.imports의 경우.pyc대응하는 것보다 최신입니다..py파일을 저장하기 때문에 부팅 속도가 약간 빨라집니다.하지만 여전히 해석되고 있습니다.

모듈 로딩 속도를 높이기 위해 Python은 모듈의 컴파일된 콘텐츠를 .pyc에 캐시합니다.

CPython은 소스 코드를 "바이트 코드"로 컴파일하고 성능상의 이유로 소스 파일이 변경될 때마다 이 바이트 코드를 파일 시스템에 캐시합니다.컴파일 단계를 생략할 수 있기 때문에 Python 모듈 로딩이 훨씬 빨라집니다.소스 파일이 foo.py인 경우 CPython은 소스 바로 옆에 있는 foo.pyc 파일에 바이트 코드를 캐시합니다.

python3에서는 Python의 Import 기계가 확장되어 모든 Python 패키지 디렉토리 내의 단일 디렉토리에 바이트 코드 캐시 파일을 쓰고 검색합니다.이 디렉토리는 __pycache__라고 불립니다.

다음으로 모듈 로드 방법을 설명하는 흐름도를 나타냅니다.

enter image description here

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

참조: PEP3147
참조: "컴파일된" Python 파일

이것은 초보자용입니다.

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

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

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

Import되지 않은 모듈의 .pyc 파일을 작성해야 할 경우py_compile그리고.compileall모듈.

py_compile모듈은 모든 모듈을 수동으로 컴파일할 수 있습니다.한 가지 방법은py_compile.compile인터랙티브하게 기능합니다.

>>> import py_compile
>>> py_compile.compile('abc.py')

그러면 .pyc가 abc.py과 같은 위치에 기록됩니다(옵션 파라미터로 덮어쓸 수 있습니다).cfile).

compileall 모듈을 사용하여 디렉토리의 모든 파일을 자동으로 컴파일할 수도 있습니다.

python -m compileall

디렉토리명(이 예에서는 현재 디렉토리)을 생략하면 모듈은 에서 발견된 모든 정보를 컴파일합니다.sys.path

Python(적어도 가장 일반적인 구현)은 원본 소스를 바이트 코드로 컴파일한 다음 가상 머신에서 바이트 코드를 해석하는 패턴을 따릅니다.즉, (가장 일반적인 구현은) 순수한 인터프리터도 아니고 순수한 컴파일러도 아닙니다.

한편 컴파일 프로세스는 대부분 숨겨져 있습니다.기본적으로 .pyc 파일은 캐시처럼 처리되며 처리속도는 빨라지지만 일반적으로는 전혀 의식할 필요가 없습니다.파일 시간/날짜 스탬프를 기반으로 필요할 때 자동으로 비활성화 및 재로드(소스 코드 재컴파일)합니다.

컴파일된 바이트 코드 파일이 나중에 타임스탬프를 얻었을 때에만 문제가 발생했는데, 이는 소스 파일보다 항상 최신으로 보인다는 것을 의미합니다.소스 파일은 새로운 파일이기 때문에 재컴파일 되지 않았기 때문에 어떤 변경을 해도 무시되었습니다.

Python의 *.py 파일은 코드 몇 줄을 쓰는 텍스트 파일입니다.이 파일을 실행하려고 할 때 "http://filename.py" 이라고 입력합니다.

이 명령은 Python Virtual Machine을 호출합니다.Python Virtual Machine에는 컴파일러와 인터프리터의 2개의 컴포넌트가 있습니다.인터프리터는 *.py 파일의 텍스트를 직접 읽을 수 없기 때문에 이 텍스트는 먼저 PVM(하드웨어가 아닌 PVM)을 대상으로 하는 바이트 코드로 변환됩니다.PVM은 이 바이트 코드를 실행합니다.*.pyc 파일도 셸 내의 파일 또는 기타 파일의 Import 작업을 수행하는 실행의 일부로 생성됩니다.

이 *.pyc 파일이 이미 생성되어 있는 경우, 다음에 *.py 파일을 실행/실행할 때마다 컴파일이 필요 없는 *.pyc 파일이 시스템에 직접 로드됩니다(이로 인해 프로세서의 기계 사이클이 절감됩니다).

*.pyc 파일이 생성되면 편집하지 않는 한 *.py 파일은 필요 없습니다.

Python 코드는 2단계를 거칩니다.첫 번째 단계는 코드를 실제로 바이트 코드인 .pyc 파일로 컴파일합니다.이 .pyc 파일(바이트 코드)은 CPython 인터프리터를 사용하여 해석됩니다.이 링크를 참조해 주세요.여기서 코드 컴파일 및 실행 프로세스는 쉬운 용어로 설명됩니다.

tldr. 이것은 소스 코드에서 변환된 코드이며, python VM이 실행을 위해 해석합니다.

상향식 이해: 프로그램의 마지막 단계는 하드웨어/머신에서 프로그램 명령을 실행/실행하는 것입니다.실행 전 단계는 다음과 같습니다.

  1. CPU에서의 실행/실행

  2. 바이트 코드를 기계 코드로 변환하는 중입니다.

    • 기계 코드는 변환의 마지막 단계입니다.

    • CPU에서 실행되는 명령은 기계어로 주어진다.머신 코드는 CPU로 직접 실행할 수 있습니다.

  3. 바이트 코드를 기계 코드로 변환하는 중입니다.

    • 바이트 코드는 중간 단계입니다.효율성을 위해 건너뛸 수 있지만 휴대성은 희생됩니다.
  4. 소스 코드를 바이트 코드로 변환하는 중입니다.

    • 소스 코드는 사람이 읽을 수 있는 코드입니다.Pycharm 등 IDE(코드 에디터)에서 작업할 때 사용합니다.

, 이제 실제 줄거리.이러한 스테이지의 어느쪽인가를 실행할 때는, 코드를 한꺼번에 변환(또는 실행)하는 방법과 코드를 행 단위로 변환(또는 실행)하는 방법의 2개가 있습니다.

  • 예를 들어 소스 코드를 바이트 코드로 컴파일하거나 바이트 코드를 머신 코드로 컴파일하거나 머신 코드를 해석하여 실행할 수 있습니다.

  • 일부 언어 구현은 효율성을 위해 3단계를 건너뛰는 경우가 있습니다. 즉, 소스 코드를 기계 코드로 컴파일한 다음 기계 코드를 해석하여 실행합니다.

  • 일부 구현에서는 모든 중간 단계를 건너뛰고 실행을 위해 소스 코드를 직접 해석합니다.

  • 현대 언어에는 통역을 짜는모두가 수반되는 경우가 많다.

  • 예를 들어, JAVA는 소스 코드를 바이트 코드로 컴파일합니다(JAVA 소스를 바이트 코드로 저장하고 바이트 코드를 머신 코드로 컴파일하여(JVM을 사용하여) 머신 코드를 해석합니다).(따라서 JVM은 OS마다 다르게 구현되지만 JVM이 설치된 OS마다 동일한 JAVA 소스 코드가 실행될 수 있습니다.)

  • 예를 들어 Python은 소스 코드를 바이트 코드(일반적으로 .py 소스 코드와 함께 .pyc 파일로 표시됨)로 컴파일하고 바이트 코드를 머신 코드(PVM 등의 가상 머신에 의해 실행 파일)로 컴파일하여 머신 코드/실행 가능 파일을 해석합니다.

  • 언어는 언제 해석되거나 컴파일된다고 말할 수 있나요?

    • 정답은 실행에 사용되는 접근 방식을 살펴보는 것입니다.기계 코드를 한 번에 실행하면(== 컴파일), 컴파일된 언어입니다.한편, 기계 코드(==)를 1줄씩 실행하는 경우는, 인터프리터 언어입니다.
  • 따라서 JAVA와 Python은 해석된 언어입니다.

  • 바이트 코드를 기계 코드로 변환하는 세 번째 단계 때문에 혼란이 발생할 수 있습니다. 작업은 가상 머신이라고 하는 소프트웨어를 사용하여 이루어지는 경우가 많습니다.가상 시스템이 시스템처럼 작동하기 때문에 혼란이 발생하지만 실제로는 그렇지 않습니다.가상 머신은 이식성을 위해 도입되었습니다.모든 REAL 머신에 VM이 있으면 동일한 소스 코드를 실행할 수 있습니다.대부분의 VM에서 사용되는 접근 방식은 컴파일(3단계)이기 때문에 컴파일된 언어라고 할 수 있습니다.VM의 중요성에 대해 우리는 종종 이러한 언어가 컴파일되고 해석된다고 말합니다.

언어 사양과 언어 구현의 중요한 차이점은 다음과 같습니다.

  • 언어 사양은 문맥 자유 문법과 의미 규칙 정의(예: 원시 유형 및 스코프 역학 지정)를 가진 언어의 공식 사양이 있는 문서입니다.
  • 언어 구현은 사양에 따라 언어를 사용하는 프로그램(컴파일러)에 불과합니다.

컴파일러는 프런트엔드와 백엔드의 2개의 독립된 부분으로 구성됩니다.프런트엔드는 소스 코드를 수신하여 검증하고 중간 코드로 변환합니다.그런 다음 백엔드는 이를 물리적 시스템 또는 가상 시스템에서 실행할 시스템 코드로 변환합니다.인터프리터는 컴파일러이지만 이 경우 가상 시스템에서 직접 중간 코드를 실행하는 방법을 생성할 수 있습니다.python 코드를 실행하기 위해서는 중간 코드로 코드를 변환해야 하며, 그 후 코드는 file.pyc에 저장될 수 있는 바이트 코드로 "어셈블리"되므로 실행할 때마다 프로그램의 모듈을 컴파일할 필요가 없습니다.이 조립된 python 코드는 다음을 사용하여 볼 수 있습니다.

from dis import dis
def a(): pass

dis(a)

Python 언어컴파일러를 정적 바이너리로 빌드할 수 있으며, C 언어로 인터프리터를 빌드할 수 있습니다.컴파일러 구축 프로세스를 심플화 및 자동화하는 툴(lex/yacc)이 있습니다.

머신은 영어나 다른 언어를 이해하지 못하고 바이트 코드만 이해하고 컴파일(C/C++, Java 등)하거나 해석(Ruby, Python 등)해야 합니다. .pyc는 바이트 코드의 캐시된 버전입니다.https://www.geeksforgeeks.org/difference-between-compiled-and-interpreted-language/ 컴파일된 언어와 통역된 언어의 차이점을 간단히 읽어보겠습니다.TLDR은 실행 시간 전에 모든 코드를 컴파일할 필요가 없기 때문에 대부분의 경우 타이핑 등에 엄격하지 않습니다.

언급URL : https://stackoverflow.com/questions/2998215/if-python-is-interpreted-what-are-pyc-files