파이썬에는 왜 컴파일러가 필요하지 않습니까? ++로 시작했다는 것)? 코드를 입력하고 exec로 저장하고 실행하십시오.

왜 파이썬에 컴파일러가 필요하지 않은지 궁금해 (지금은 컴파일러가 필요한 C ++로 시작했다는 것)?

코드를 입력하고 exec로 저장하고 실행하십시오. C ++에서는 빌드와 다른 재미있는 것들을 만들어야합니다.



답변

파이썬에는 컴파일러가 있습니다! 자동으로 실행되므로 알 수 없습니다. 그래도 거기에 있다고 말할 수 있습니다 . 모듈에 대해 생성 된 .pyc(또는 .pyo최적화 프로그램이 켜져있는 경우) 파일을보십시오 import.

또한 네이티브 머신의 코드로 컴파일되지 않습니다. 대신 가상 시스템에서 사용하는 바이트 코드로 컴파일됩니다. 가상 머신 자체는 컴파일 된 프로그램입니다. 이것은 Java 작동 방식과 매우 유사합니다. 사실, 유사하게 Java Virtual Machine의 바이트 코드로 컴파일 되는 Python 변형 ( Jython )이 있습니다! IronPython 도 있습니다.이 프로그램은 Microsoft의 CLR (.NET에서 사용)로 컴파일합니다. (일반적인 파이썬 바이트 코드 컴파일러는 CPython이라고도하는데, 이러한 대안과 명확하게 구분되지 않습니다.)

C ++는 언어 자체가 불완전하기 때문에 컴파일 프로세스를 공개해야합니다. 링커가 프로그램을 빌드하기 위해 알아야 할 모든 것을 지정하지는 않으며 컴파일 옵션을 이식 가능하게 지정할 수도 없습니다 (일부 컴파일러에서는 사용할 수 #pragma있지만 표준은 아닙니다). 따라서 makefile과 auto hell (autoconf / automake / libtool)을 사용하여 나머지 작업을 수행해야합니다. 이것은 실제로 C가 그랬던 것과는 다른 것입니다. 그리고 C는 컴파일러를 단순하게 만들었 기 때문에 그렇게했습니다. 사람들이 80 년대에 간단한 C 컴파일러를 만들 수있는 주된 이유입니다.


컴파일러 또는 링커 작동에 영향을 줄 수 있지만 C 또는 C ++의 구문에는 지정되지 않은 몇 가지 사항 :

  • 의존성 해결
  • 외부 라이브러리 요구 사항 (종속성 순서 포함)
  • 최적화 수준
  • 경고 설정
  • 언어 사양 버전
  • 링커 매핑 (최종 프로그램에서 해당 섹션으로 이동)
  • 대상 아키텍처

이들 중 일부는 감지 될 수 있지만 지정할 수는 없습니다. 예를 들어와 함께 사용중인 C ++을 감지 할 수 __cplusplus있지만 C ++ 98이 코드 자체 내 코드에 사용되는 것으로 지정할 수 없습니다. Makefile에서 플래그를 컴파일러에 플래그로 전달하거나 대화 상자에서 설정해야합니다.

컴파일러에 “종속성 해결”시스템이 존재하여 자동으로 종속성 레코드를 생성한다고 생각할 수 있지만 이러한 레코드는 지정된 소스 파일이 사용하는 헤더 파일 만 나타냅니다. 주어진 헤더 파일이 다른 소스 코드 모듈에 대한 인터페이스 정의임을 나타 내기 위해 C 또는 C ++에는 표준 방법이 없기 때문에 실행 가능한 프로그램에 링크하는 데 필요한 추가 소스 코드 모듈을 표시 할 수 없습니다. 반복하지 않도록 여러 위치에 표시하려는 행. 파일 명명 규칙에는 전통이 있지만 컴파일러와 링커에서 알려 지거나 적용하지는 않습니다.

이 중 일부는을 사용하여 설정할 수 #pragma있지만 이것은 비표준이며 표준에 대해 말하고 있습니다. 이러한 모든 것들은 표준에 의해 지정 수 있지만, 이전 버전과의 호환성에 관심이 없었습니다. 일반적인 지식은 makefile과 IDE가 손상되지 않았으므로 수정하지 마십시오.

파이썬은이 모든 것을 언어로 처리합니다. 예를 들어, import명시 적 모듈 종속성을 지정하고 종속성 트리를 암시하며 모듈은 헤더 및 소스 파일 (예 : 인터페이스 및 구현)로 분할되지 않습니다.


답변

파이썬은 해석 된 언어입니다. 이것은 컴퓨터에 파이썬 코드를 읽고 “명령”을 컴퓨터로 보내는 소프트웨어가 있음을 의미합니다. 해석 언어 위키 백과 문서가 관심이 될 수 있습니다.

C ++ (컴파일 된 언어)와 같은 언어가 컴파일 될 때 실행시 하드웨어가 직접 읽을 수 있도록 머신 코드로 변환됩니다. 컴파일 된 언어 위키 백과 문서는 흥미로운 대조를 제공 할 수 있습니다.


답변

모든 컴파일 된 언어에면 편집 편집 링크 실행주기가있는 것은 아닙니다.

당신이 겪고있는 것은 C ++ (또는 적어도 C ++ 구현)의 기능 / 제한입니다.

무엇이든하려면 코드를 파일에 저장하고 링크라는 프로세스를 통해 모 놀리 식 이미지를 작성해야합니다.

특히,이 모 놀리 식 연결 프로세스는 컴파일과 해석의 구별로 오해됩니다.

일부 언어는 기계 코드로의 컴파일을 제거하지 않고 서투른 모 놀리 식 연결 단계를 제거함으로써이 모든 것을 훨씬 더 동적으로 수행합니다. 소스는 여전히 오브젝트 파일로 컴파일되지만 모 놀리 식 실행 파일에 링크되지 않고 런타임 이미지로로드됩니다.

“이 모듈을 다시로드하십시오”라고 말하면 일부 모드 스위치에 따라 소스를로드하여 해석하거나 컴파일합니다.

Linux 커널 프로그래밍은 C에서 작업하고 있지만 이러한 특징 중 일부를 가지고 있습니다. 모듈을 다시 컴파일하고로드 및 언로드 할 수 있습니다. 물론, 당신은 여전히 ​​일부 실행 가능한 것을 생산하고 있으며, 여전히 수동 단계가있는 복잡한 빌드 시스템으로 관리됩니다. 그러나 실제로는 작은 모듈 만 언로드하고 다시로드 할 수 있으며 전체 커널을 다시 시작할 필요가 없습니다.

일부 언어는 이것보다 훨씬 세분화 된 모듈화를 가지고 있으며, 빌드 및 로딩은 런타임 내에서 이루어 지므로 더 원활합니다.


답변

초기 질문과의 차이점 … 언급하지 않은 요점은 파이썬 프로그램의 소스는 사용자 관점에서 사용하고 배포하는 것이 프로그램이라는 것입니다. 우리는 잘 정의되지 않은 범주로 사물을 단순화하는 경향이 있습니다.

컴파일 된 프로그램은 일반적으로 독립형 머신 코드 파일로 간주됩니다. (특정 운영 체제와 관련된 동적 링크 라이브러리에 대한 링크가 포함되어 있음). 이것은 … 컴파일되거나 해석 된 것으로 설명 될 수있는 대부분의 프로그래밍 언어의 변형이 있습니다.

파이썬은 쉽게 액세스하거나 배포 할 수있는 형태로 생성 된 머신 코드를 저장하지 않고 코드를 컴파일하고 실행하는 애플리케이션 (인터프리터)에 의존하므로 컴파일러가 필요하지 않습니다.


답변

모든 프로그래밍 언어는 인간 개념에서 대상 기계 코드로 변환해야합니다. 어셈블리 언어조차도 기계 코드로 번역해야합니다. 이 번역은 일반적으로 다음 단계로 이루어집니다.

1 단계 : 중간 코드로 분석 및 변환 (구문 분석) 2 단계 : 외부 참조를위한 자리 표시자를 사용하여 중간 코드를 대상 기계 코드로 변환 3 단계 : 외부 참조 및 시스템 실행 프로그램으로 패키징 해결

이 번역을 종종 사전 컴파일 링 및 “JIT in time”(JIT) 또는 런타임 컴파일 링이라고합니다.

C, C ++, COBOL, Fortran, Pascal (모두는 아님) 및 어셈블리와 같은 언어는 사전 컴파일 된 언어로, 통역사가 필요없이 운영 체제에서 직접 실행할 수 있습니다.

Java, BASIC, C # 및 Python과 같은 언어가 해석됩니다. 그들은 모두 1 단계에서 생성 된 중간 코드를 사용하지만 때로는 기계 코드로 변환하는 방법이 다를 수 있습니다. 가장 간단한 양식은 중간 코드를 사용하여 예상 작업을 수행하는 기계 코드 루틴을 실행합니다. 다른 사람들은 중간 코드를 기계 코드로 컴파일하고 런타임 중에 외부 종속성 수정을 수행합니다. 컴파일되면 즉시 실행할 수 있습니다. 또한 머신 코드는 이전에 컴파일 된 재사용 가능한 머신 코드의 캐시에 저장되어 나중에 기능이 나중에 다시 필요할 경우 재사용 할 수 있습니다. 함수가 이미 캐시 된 경우 인터프리터는 다시 컴파일 할 필요가 없습니다.

대부분의 최신 고급 언어는 JIT와 함께 해석 범주에 속합니다. 사전 컴파일 된 C & C ++와 같은 대부분의 오래된 언어입니다.


답변