당신은 당신의 질문을 표현할 때 귀도의 진술을 지나치게 단순화했습니다. 문제는 동적 형식 언어의 컴파일러를 작성하지 않습니다. 문제는 (기준 1) 항상 정확하고 (기준 2) 동적 타이핑을 유지 하며 (기준 3)은 상당한 양의 코드에 대해 눈에 띄게 빠른 것을 작성하는 것입니다.
Python의 90 % (실패 기준 1)를 쉽게 구현하고 일관되게 빠릅니다. 마찬가지로 정적 타이핑 (실패 기준 2)으로 더 빠른 Python 변형을 쉽게 만들 수 있습니다. 100 %를 구현하는 것도 쉽지만 (복잡한 언어를 구현하는 것은 쉽지만), 지금까지 구현하는 모든 쉬운 방법은 상대적으로 느립니다 (실패 기준 3).
인터프리터 와 JIT 가 올바른 JIT 를 구현하고 전체 언어를 구현하며 일부 코드가 더 빠를지라도 더 빠르지 만 (PyPy 참조) JIT 컴파일러 생성을 자동화하는 경우에만 가능합니다 (Psyco는없이 수행했습니다) 그러나 속도를 높일 수있는 코드는 매우 제한적입니다). 그러나 우리가 정적 에 대해 이야기하고 있기 때문에 이것은 명시 적으로 범위를 벗어났습니다.(일명 사전 컴파일러) 컴파일러. 정적 컴파일러에서 왜 그 접근 방식이 작동하지 않는지 설명하기 위해 이것을 언급합니다 (또는 적어도 기존의 반대 사례가 없습니다). 먼저 프로그램을 해석하고 관찰 한 다음 루프의 특정 반복을위한 코드 (또는 다른 선형 코드)를 생성해야합니다 그런 다음 특정 반복에 대해서만 (또는 적어도 가능한 모든 반복에 대해서는) 가정하지 않음으로 지옥을 최적화하십시오. 그 코드의 이후의 많은 실행이 기대와 일치하여 최적화의 이점을 기대합니다. 정확성을 보장하기 위해 일부 (상대적으로 저렴한) 검사가 추가됩니다. 이 모든 작업을 수행하려면 전문화 할 대상에 대한 아이디어와 느리지 만 일반적인 구현으로 넘어 가야합니다. AOT 컴파일러에는 없습니다. 그들은 전문 수 없습니다 전혀볼 수없는 코드 (예 : 동적으로로드 된 코드)를 기반으로하고 부주의하게 전문화한다는 것은 더 많은 코드를 생성하는 것을 의미합니다.
전체 언어 를 올바르게 구현하는 AOT 컴파일러를 구현하는 것도 비교적 쉽습니다. 런타임에 호출하여 인터프리터가이 코드를 제공 할 때 수행 할 작업을 수행하는 코드를 생성하십시오. Nuitka (주로)이 작업을 수행합니다. 그러나 인터프리터만큼 불필요한 작업을 수행해야하므로 바이트 코드를 C 코드 블록으로 디스패치하기 위해 저장해야하므로 성능이 향상되지 않습니다 (실패 기준 3). 이는 기존의 인터프리터에서 최적화 할 가치가 있지만 비용이 적게 들지만 자체적 인 문제로 완전히 새로운 구현을 정당화 할만큼 중요하지는 않습니다.
세 가지 기준을 모두 충족하려면 무엇이 필요합니까? 우리는 모른다. Python 프로그램에서 콘크리트 유형, 제어 흐름 등에 대한 일부 정보를 추출 할 수있는 정적 분석 체계가 있습니다. 단일 기본 블록의 범위를 벗어난 정확한 데이터를 생성하는 것은 매우 느리고 전체 프로그램 또는 적어도 대부분을 볼 필요가 있습니다. 그러나 기본 제공 유형에 대한 몇 가지 작업을 최적화하는 것 외에는 해당 정보로 많은 것을 할 수 없습니다.
왜 그래? 솔직히 말하면 컴파일러는 런타임에로드 된 Python 코드를 실행하는 기능을 제거하거나 (실패 기준 1), 또는 Python 코드에서 전혀 무효화 할 수있는 가정을하지 않습니다. 불행하게도, 그 프로그램을 최적화하기위한 거의 모든 유용한 포함 등을 하나의 문자열로 전달, 여러 가지 방법으로 납치 할 수 가져 오기 회복 할 수있는 기능, 클래스가 변이 될 수있다 또는 완전히 교체, 모듈 임의로도 수정할 수 있습니다 포함한 전역을 eval
, exec
, __import__
또는 기타 여러 기능이이 기능을 수행 할 수 있습니다. 실제로, 큰 최적화를 거의 적용 할 수 없으므로 성능상의 이점이 거의 없습니다 (실패 기준 3). 위 단락으로 돌아갑니다.