COMPILE, — 실행 토큰 컴파일
COMPILE, — 실행 토큰 컴파일
COMPILE,(compile-comma)는 실행 토큰 xt가 나타내는 정의의 실행 의미를 현재 정의의 실행 의미에 추가하는 코어 확장 단어예요. EXECUTE의 컴파일 버전에 해당해요.
본문
실행 (Execution)
( xt -- )
xt가 나타내는 정의의 실행 의미를 현재 정의의 실행 의미에 추가해요.
참조 (See)
- A.6.2.0945 COMPILE,
합리성 (Rationale)
COMPILE,는 EXECUTE의 컴파일 등가물이에요. 전통적인 스레드 코드(threaded-code) 구현에서는 컴파일이 ,(comma)로 수행돼요. 그러나 이 사용법은 이식성이 없어요 — 서브루틴 스레드, 네이티브 코드, 재배치 가능 구현에서는 동작하지 않아요. COMPILE,의 사용은 이식성이 있어요. 대부분의 시스템에서 COMPILE,는 정상 컴파일 과정이 만든 코드와 동일한 정도로 최적화된 코드를 생성하도록 구현할 수 있어요. 그러나 일부 구현에서는 특정 정의 이름에 두 가지의 서로 다른 "토큰"이 있어요: 해석 중이거나 EXECUTE에서 쓰이는 정상 "실행 토큰"과, 컴파일 중에 쓰이는 또 다른 "컴파일 토큰"이 그것이에요. 실행 토큰으로부터 컴파일 토큰을 얻는 것이 항상 가능한 것은 아니에요. 그러한 구현에서 COMPILE,는 정상적으로 컴파일된 코드만큼 효율적인 코드를 생성하지 못할 수 있어요. COMPILE,는 고전적인 인터프리터/컴파일러 루프를 쓰는 데 다음과 같이 사용할 수 있도록 의도되었어요:
... ( c-addr )
FIND ?DUP IF ( xt +-1 )
STATE @ IF ( xt +-1 )
0> IF
EXECUTE
ELSE
COMPILE,
THEN ( ??? )
ELSE ( xt +-1 )
DROP EXECUTE ( ??? )
THEN
ELSE ( c-addr )
( undefined word 의 처리를 원하는 대로 )
THEN
...
따라서 해석 의미는 정의되지 않은 채로 남는데, 컴파일 중에는 COMPILE,가 해석 시점에 실행되지 않기 때문이에요.
테스트 (Testing)
T{ : q dup+ COMPILE, ; -> }T
T{ : as [ q ] ; -> }T
T{ 123 as -> 246 }T