2013-01-01 4 views
4

:SBCL의 내장 함수에 ftype 선언이 미치는 영향은 무엇입니까? 나는 같은 몇 가지 기능의 시작에 다음과 같은 라인을 포함하고 다른 사람에 의해 쓰여진 오래된 커먼 리스프 코드에 짓고 있어요

(declare (ftype (function (&rest float) float) + - * min max)) 

나의 이해는 이것의 목적은 말씀하는 것입니다 컴파일러는 양식의 끝에 나열된 다섯 가지 기능 만 전달 될 수 있습니다. 컴파일러는이 정보를 사용하여보다 효율적인 코드를 만들 수 있습니다.

일부 리스프는이 선언 (ABCL, CCL, ECL, LispWorks, CLISP)에 대해 불평하지 않지만 SBCL은 기본 구성에서이 선언을 허용하지 않습니다. .sbclrc 초기화 파일에

(unlock-package 'common-lisp) 

을 입력하여 SBCL을 수락 할 수 있습니다. 그게 지난 1 년 정도 해왔습니다. 나는 +, -, 등등이 그 패키지 안에 있고, 코드가이 함수의 선언을 변경하기 때문에 이것이 필요하다고 가정한다.

내 질문은 : + 및 min과 같은 내장 함수의 함수 유형을 선언하면 SBCL의 컴파일 된 코드에 유익한 영향을 미칠 수 있습니까? (가능한 경우 SBCL이 기본적으로이 선언에 대해 불만을 제기하는 이유는 무엇입니까?) 그러한 ftype 선언을 제거하고 .sbclrc의 unlock-package 행을 제거하는 것이 더 낫지 않습니까?

감사합니다.

답변

8

이 기사의 목적은 폼의 끝에 나열된 5 개의 함수가 float 만 전달된다는 것을 컴파일러에 알리는 것입니다. 컴파일러는이 정보를 사용하여보다 효율적인 코드를 만들 수 있습니다.

또한 float 만 반환합니다. 특정 최적화 설정을 사용하면 Common Lisp 컴파일러는 런타임 검사를 생성하지 않으며 float 계산을위한 코드 만 생성 할 수 있습니다. 또한 SBCL은 코드가 유형 선언을 위반 한 것을 감지하는 경우 컴파일 타임 경고를 표시 할 수 있습니다.

또한 오류의 원인이기 때문에 선언 범위 내에서 +-과 같은 기본 함수가 다른 숫자 유형 (정수, 복합, ...)에서는 작동하지 않는다고 선언되므로 오류의 원인이기도합니다.

그래서 이러한 선언의 목적은 무엇입니까? 이식 가능한 코드이므로 (대부분의 구현은 컴파일 타임 형식 검사를 구현하지 않음) 최적화 목적으로 만 사용할 수 있습니다. 타입 유추를 사용하기 때문에 SBCL에서는 그 중 일부가 필요하지 않을 수 있습니다.

SBCL은 기본적으로 내장 기능을 변경할 수없는 이유는 무엇입니까? 발에 총격을 예방하는 것이 기본 언어를 변경하는 것입니다. 이제 기본 숫자 연산으로 인해 오류가 발생할 수 있습니다.

방법은 처리하기 :

  • 사용 로컬 선언은 전 세계적으로 언어를 변경하지 않습니다. 당신은 이것들이 단지 국부적으로 선언되었다는 것을 나타냅니다. 그것은 훌륭합니다.

  • 대신
  • 는 플로트 경우에 특수 기능을 작성하고 인라인을 선언 할 변수의 값을 선언합니다.

  • 은 이러한 몇 가지 기능을 컴파일하는 동안 패키지 CL의 잠금을 해제합니다. 나중에 잠근 상태로 유지하십시오.

내 질문은 : 수는 +와 분 같은 내장 함수 SBCL에서 컴파일 된 코드에 유익한 영향을 미칠의 기능 유형을 선언?

분해 된 코드를보고 프로파일 링하여 확인할 수 있습니다. 올바른 최적화 설정으로 함수를 컴파일해야합니다. Common Lisp에서 함수`DISASSEMBLE '은 기계어 코드를 읽을 수있는 방식으로 보여줘야합니다. SBCL 컴파일러는 컴파일 된 코드를 최적화 할 수 없는지 알려줄 것입니다.

+0

감사합니다. Rainer. 유용한 정보와 유용한 조언 - 어둠 속에서 내가 배우던 것을 배우기에 충분할 정도로 충분합니다. – Mars