2011-08-23 7 views
13

RPython (Python의 하위 집합)이 정적으로 입력되었다고 자주 언급됩니다. (예 : Wikipedia)RPython에 정적으로 무엇이 입력 되었습니까?

처음에는 어떻게 그 코드를 파이썬에 추가 할 것인지 궁금했고, 각 함수의 시작 부분에 assert isinstance(arg1, ...)과 같은 명령문을 추가 할 필요가 있다고 생각했습니다. (하지만 실제로는 믿을 수 없었습니다. 그).

그런 다음 RPython 코드를 살펴 보았지만 실제로 정적으로 표시되지는 않습니다. 대부분의 경우, 컴파일러는 함수 인수가 특정 유형에만있을 수 있지만 모든 경우에 확실히 해당 할 수는 없다는 것을 증명할 수 있습니다.

예컨대, 이것은 RPython의 string.split의 구현 : RPython에 대한 PyPy 문서에서

def split(value, by, maxsplit=-1): 
    bylen = len(by) 
    if bylen == 0: 
     raise ValueError("empty separator") 

    res = [] 
    start = 0 
    while maxsplit != 0: 
     next = value.find(by, start) 
     if next < 0: 
      break 
     res.append(value[start:next]) 
     start = next + bylen 
     maxsplit -= 1 # NB. if it's already < 0, it stays < 0 

    res.append(value[start:len(value)]) 
    return res 

, 말한다 : "변수는 최대 하나 개의 유형의 값이 포함되어야합니다."

함수 인수도 변수로 계산합니까? RPython은 어떤 의미에서 정적으로 타입이 지정 되었습니까? 아니면 실제로 위증입니까?

+1

http://codespeak.net/pypy/dist/pypy/doc/translation.html –

답변

14

따라서 함수 인수도 변수로 간주됩니까?

물론 그렇습니다. 그들은 항상 거의 모든 언어로합니다.

어떤 의미에서 RPython은 정적으로 입력 되었습니까? 아니면 실제로 위증입니까?

문구가 정확합니다. RPython은 Python이 아닙니다. 글쎄, 그것의 하위 집합이며 파이썬 코드로 실행할 수 있습니다. 그러나 실제로 RPython 코드를 컴파일 할 때, 많은 동적 성이 사용자로부터 제거됩니다. (비록 가져 오기 시간이 지난 후에 만, 메타 클래스를 사용하고 문자열로부터 코드를 생성 할 수 있습니다 - 일부 모듈에서는 큰 효과를 나타냅니다.) 컴파일러 (이 아니고 파이썬 컴파일러이지만 전통적인 컴파일러와 크게 다르며 관련 문서 참조) 실제로 유형을 정적으로 사용할지 결정할 수 있습니다. 좀 더 정확히 말하자면, 동적 성을 사용하는 코드는 파서와 모든 것을 지나치게 만들지 만 어느 시점에서는 유형 오류가 발생합니다.

대부분의 경우 컴파일러는 함수 인수가 특정 유형에만있을 수 있지만 모든 경우에 확실히 해당 할 수는 없다는 것을 증명할 수 있습니다.

물론 아닙니다. 정적으로 타이핑되지 않은 많은 코드와 현재의 주석자가 정적으로 타이핑 할 수없는 정적 인 타입의 코드가 있습니다. 그러나 그러한 코드가 발생하면 컴파일 오류가 발생합니다.

실현하는 중요한 몇 가지 포인트가 있습니다

  • 유형을 명시 적으로 언급하지, 추론은 (물론, 대부분의 경우, 나는 생각에 주장을해야 할 몇 가지 기능이 있습니다 주석자를 돕는다). 정적 유형 지정 (주석에 암시하는 것처럼)은 유형을 작성해야한다는 것을 의미합니다 (즉, 매니페스트 유형 지정이라고 함). 즉, 변수를 포함하는 각 표현식은 절대로 변경되지 않는 단일 유형을 가짐을 의미합니다.

  • 모든 분석은 전체 프로그램을 기준으로 수행됩니다. def add(a, b): return a + b (인수는 ints, float, strings, lists 등이 될 수 있음)에 대해 (generic이 아닌) 유형을 추론 할 수는 없지만 정수 인수 (예 : 정수 리터럴 또는 이전에 있던 변수 정수를 포함하도록 추측 된 경우) ab (그리고 + 유형의 경우 add의 결과)도 정수입니다.

  • PyPy 저장소의 일부 코드가 RPython 인 것은 아닙니다. 예를 들어, 컴파일 타임에 실행되고 RPython 코드를 생성하지만 RPython이 아닌 코드 생성기 (예 : rlib.parsing)가 있습니다 (그런데 종종 "NOT_RPYTHON" docstring이 있음). 또한 표준 라이브러리의 대부분은 전체 Python으로 작성됩니다 (주로 CPython에서 직접 작성).

전체 번역 및 입력이 실제로 어떻게 작동하는지 매우 흥미로운 자료가 있습니다. 예를 들어 The RPython Toolchain은 유형 유추를 포함하여 일반적으로 번역 프로세스를 설명하고 The RPython Typer은 사용 된 유형 시스템을 설명합니다.

+0

아, 그 비트 * \ [정적으로 형식화 된 \] 전체 프로그램 기준으로 생각합니다. * 중요한 것은 여기 중요하다고 생각합니다. 왜냐하면, 여러분이 작성한 것처럼'def add (a, b) : return a + b' 함수는 정적으로 타입이 지정되지 않으며 여러 다른 유형에도 사용될 수 있기 때문입니다. – Albert

+0

@Albert : zeekay의 답변에 대한 의견에 회신 해주십시오. 정적 타이핑이 명백한 타이핑이라는 오해와 대중적 오해를 넘어 설 수도 있습니다. – delnan

4

예, 정적으로 입력됩니다. 귀하의 예에서 어떤 변수도 타입을 변경하지 않습니다. 이는 RPython의 요구 사항을 충족시킵니다. RPython is not formally defined, and it's restrictions are constantly evolving이지만 설명서는 아직 시작하기에 좋은 곳입니다. 조금이라도 읽고 나면 할 수있는 가장 좋은 방법은 일부 코드를 시도하고 번역하는 것입니다. 당신이 할 수있는 일과 매우 빠르게 할 수없는 것을 알아낼 것입니다!

+0

유형을 변경하지 않고 정적으로 입력 한 것은 다른 것입니다. 이 예제에서 변수는 유형을 변경하지 않지만 정적으로 입력되지는 않습니다. – Albert

+0

번역 유형 유추가 완료되면 명시 적으로 변수 유형을 정의 할 필요가 없습니다. – zeekay

+0

URL이 더 이상 작동하지 않는 것 같습니다. 실제 제한이 무엇인지 아는 것은 좋을 것입니다. – Dexter

관련 문제