2016-06-10 2 views
3

내가 파이썬에서 다음 코드가 있다고 가정 :왜 파이썬은 실행 전에 오류를 발견하지 않습니까?

a = "WelcomeToTheMachine" 
if a == "DarkSideOfTheMoon": 
    awersdfvsdvdcvd 
print "done!" 

하지 않는 이유는이 오류? 어떻게 컴파일합니까? Java 나 C#에서는 컴파일하는 동안 이것이 발견 될 것입니다.

+0

여기서'a! = "DarkSideOfTheMoon"', 따라서 if 조건의 본문은 결코 실행되지 않습니다. – ytk

+0

관련 [실행하지 않고 파이썬 스크립트의 문법을 어떻게 확인할 수 있습니까?] (0120-388-983) –

+0

실행 전까지는 오류가 아니기 때문에 – jonrsharpe

답변

8

파이썬은 컴파일 된 언어가 아니기 때문에 코드가 컴파일 오류를 발생시키지 않습니다.

파이썬은 바이트 코드로 해석되는 언어입니다. 기술적으로 소스 코드는 바이트 코드로 "컴파일"되지만, PyPy 나 Pyston을 사용하면 바이트 코드가 컴파일 (JIT)됩니다. 그렇지 않으면 라인 단위로 해석됩니다. ->컴파일러 ->된 .pyc 파일 ->통역사 ->귀하의 출력

표준 파이썬을 사용하여

파이썬 코드을 다음과 같이

워크 플로는 런타임 무엇이 모든 것을 의미합니까? 근본적으로 모든 무거운 작업은 C 또는 C++과 달리 런타임 중에 발생합니다. 여기서 C 또는 C++에서는 소스 코드가 전체적으로 분석되고 컴파일 타임에 바이너리로 변환됩니다.

+0

조금 컴파일되었지만 실제로 컴파일 할 때 실제 구문 오류가 발견됩니다. 보다 정적 인 언어에서 컴파일 단계의 일부가 될 것 인 많은 것들이 Python에서 런타임에 발생합니다. – user2357112

+2

또한 파이썬의 표준 구현은 JIT를 수행하지 않습니다. PyPy는 JIT를하지만 대부분의 사람들은 PyPy를 사용하지 않습니다. – user2357112

2

"컴파일 중"python은 구문을 검사하는 것뿐입니다. awersdfvsdvdcvd이 유효한 식별자 인이므로 해당 행이 실제로 실행될 때까지 오류가 발생하지 않습니다. 당신이 예를 들면 ... 다른 곳에서 정의되지 않았을 수 있다는 것을 의미하지는 않습니다 정의되지 않은 이름을 사용해서 :

이전 파일의
globals()['awersdfvsdvdcvd'] = 1 

가 발생할 것 NameError 억제하기에 충분한 것 철자가 틀린 이름의 행이 실행 된 경우.

자, 파이썬은 전역 문을 검색 할 수 없습니까? 그 대답은 다시 "아니오"입니다 - 모듈 "foo"에서 비슷한 방식으로 모듈 "bar"의 전역에 추가 할 수 있습니다. 그리고 파이썬은 모듈이 실제로 실행될 때까지 어떤 모듈을 가져올 지 알지 못합니다 (런타임시 모듈을 동적으로 가져올 수도 있습니다). 내가 파이썬 언어로 이러한 것들에 대해 당신에게 경고를 줄 수없는 이유에 대해 언급하고 있습니다 이유의 대부분은 미친 엉망 일을하는 사람들을 포함


참고. 많은 도구가 있습니다.은 이러한 것들에 대해 경고합니다 (그런 바보 같은 짓을하지 않을 것이라는 가정을합니다). 내가 가장 좋아하는 것은 pylint이지만 파이썬 linter는 정의되지 않은 변수에 대해 경고 할 수 있어야한다. 컴파일러에 linter를 연결하면 코드를 실제로 실행하기 전에 대부분 이러한 버그를 잡을 수 있습니다.

2

파이썬은 해석 언어이기 때문에. 즉, 파이썬의 인터프리터가 그 라인에 도착하지 않으면 에러가 발생하지 않습니다.

관련 문제