파이썬에는 왜 컴파일러가 필요하지 않습니까?


29

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

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


4
파이썬은 구현이 많은 언어 일뿐입니다. Iron Python은 C # 및 C ++과 같은 방식으로 컴파일되며 이와 유사한 다른 구현이있을 수 있습니다.
직업

1
C #과 C ++는 같은 방식으로 컴파일되지 않습니다. 결국 둘 다 기계 명령어로 끝날 수 있다고 주장 할 수 있지만 그렇게하면 BASIC도 같은 방식으로 컴파일 될 수 있습니다.
gbjbaanb

7
@gbjbaanb 그러나 다시 한 번 영어는 컴파일되지 않고 한 문장의 의미 론적 분석은 두 가지 똑같이 유효한 결과를 얻을 수 있으며 위의 내용은 "철 파이썬은 C #과 C ++이 컴파일되는 것처럼 컴파일됩니다"
Rune FS

파이썬 코드를 작성하기 위해 어떤 플랫폼 / 소프트웨어를 사용하고 있습니까? .py 파일을 작성하면 실행 파일이 아닙니다. 여전히 소스 코드 파일입니다. 명령 행에서 python명령을 사용하여 .py 파일을 해석하거나 IDLE 또는 Eclipse를 사용하는 경우 IDE가이를 수행합니다.
Rick Henderson

답변:


68

파이썬에는 컴파일러가 있습니다! 자동으로 실행되므로 알 수 없습니다. 그래도 거기에 있다고 말할 수 있습니다 . 모듈에 대해 생성 된 .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명시 적 모듈 종속성을 지정하고 종속성 트리를 암시하며 모듈은 헤더 및 소스 파일 (예 : 인터페이스 및 구현)로 분할되지 않습니다.


3
Python의 C 구현은 CPython 이고 Cython 은 다릅니다.
Greg Hewgill

4
C가 기계어 코드로 컴파일 된 다른 이유는 바이트 코드 인터프리터가 보유한 하드웨어에서 기술적으로 실현 불가능하고 가장 중요한 작업 중 하나가 OS 커널을 작성했기 때문에 영광스러운 어셈블러에 불과하다는 것이 었습니다.
tdammers

2
@BillyONeal c / c ++에서 프로그래머가 파이썬에서 특정 방식으로 (makefiles 또는 모든 것을 동일한 blob으로 덤프해야 함) 파이썬에서 작업과 컴파일러를 VM과 함께 수행해야한다는 큰 예외가 있습니다. 나머지를 돌봐
룬 FS

3
"언어 자체가 불완전하기 때문에 C ++의 컴파일 프로세스를 공개해야합니다." Er, what ??
Monica와의 가벼움 경주

3
그 직후 부분을 ​​읽었 습니까? "링커가 프로그램을 빌드하기 위해 알아야 할 모든 것을 지정하지 않으며 컴파일 옵션을 이식 가능하게 지정할 수도 없습니다." 당신은 구축 할 수 있는 컴파일러에 공급함으로써 C ++ 파일을; 컴파일 플래그, 경로 포함 등의 메타 데이터를 제공해야하는 경우가 종종 있습니다.이 메타 데이터는 표준에서 지정하지 않았으며 이식 가능하지 않으므로 make, cmake, Visual Studio 등과 같은 다른 항목을 끌어 와야합니다. 작업을 마치십시오. 따라서 표준은 컴파일 단위에서와 일부를 프로그램 전체에서 호출해야합니다.
Mike DeSimone

7

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

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


21
해석되거나 컴파일 된 언어는 없습니다. 언어는 추상적 인 수학 규칙 세트입니다. 언어는 컴파일되거나 해석되지 않습니다. 언어 입니다. 컴파일과 해석은 언어가 아닌 컴파일러 또는 해석기의 특성입니다 (duh!). 모든 언어는 컴파일러로 구현할 수 있으며 모든 언어는 인터프리터로 구현할 수 있습니다. 대부분의 언어에는 컴파일 및 해석 구현이 모두 있습니다. C ++에 대한 인터프리터와 Python에 대한 컴파일러가 있습니다. (사실, 현재 존재하는 모든 파이썬 구현에는 컴파일러가 있습니다.)
Jörg W Mittag

4
최신 고성능 언어 구현의 대부분은 최대 성능을 위해 인터프리터와 컴파일러 (또는 여러 컴파일러)를 결합합니다. 사실,은 불가능 실행할 수 있는 프로그램을 하지 않고 통역. 결국, 컴파일러는 프로그램을 한 언어에서 다른 언어로 번역하는 프로그램 일뿐입니다. 그러나 언젠가 는 인터프리터 (실리콘으로 구현되거나 구현되지 않을 수 있음)가 수행하는 프로그램 을 실제로 실행 해야합니다 .
Jörg W Mittag

10
@ JörgWMittag : 기술적으로 옳습니다. 그러나 대부분의 언어는 해석 된 컨텍스트 또는 전체 컴파일을 위해 설계되었습니다. GW BASIC 또는 Common Lisp에 대한 통역사 작성은 C ++ 또는 C #에 대한 통역사 작성보다 훨씬 쉽습니다. 파이썬은 대화식 환경없이 많은 판매 포인트를 잃습니다. 컴파일 된 실행 파일은 eval () 및 이와 유사한 구문으로 인해 전체 PHP 인터프리터를 포함해야하기 때문에 PHP 용 컴파일러를 작성하는 것은 매우 어렵고 비효율적 일 수 있습니다.
tdammers

2
@tdammers, 그렇습니다. 우리는 합리적으로 "컴파일 된 언어"를 사용하여 "일반적으로 컴파일 된 언어"를 의미 할 수 있습니다. 그러나 PHP, Java, Python, Lua 및 C #이 모두 바이트 코드의 컴파일러로 구현된다는 점이 누락되었습니다. 이러한 모든 언어에는 JIT가 구현되어 있습니다. 따라서 실제로는 동일한 구현 전략을 가지고 있기 때문에 이러한 언어 중 일부는 컴파일 및 해석 된 언어라고 부를 수 없습니다.
Winston Ewert

2
@BillyONeal, 적어도 파이썬에는 해당되지 않습니다. 파이썬 바이트 코드를 배포하고 소스없이 실행할 수 있습니다. 그러나 컴파일러 없이는 파이썬을 배포 할 수 없습니다.
Winston Ewert

5

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

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

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

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

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

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

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

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


2

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

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

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


1

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

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.