2009-05-15 4 views
10

Erlang 컴파일러가 컴파일 타임에 정의되지 않은 함수를 감지하지 않는 이유는 무엇입니까? 내가 test.erl를 작성하는 경우왜 erlang : foo()가 컴파일 되었습니까?

는 :

-module(test). 
-export([start/0]). 

start() -> 
     erlang:foo(). 

그것은 잘 컴파일합니다.

Eshell V5.6.5 (abort with ^G) 
1> c(test). 
{ok,test} 
2> 

하지만 런타임이 중단됩니다.

2> test:start(). 
** exception error: undefined function erlang:foo/0 

컴파일하는 동안 컴파일러에서 오류 또는 경고를 발행하지 않는 이유는 무엇입니까? 그것은 내 보낸 함수에 대해 알아야하지 않습니까?

답변

16

얼랭은 동적 언어입니다. 그러나 유형 검사 및 정적 분석을 수행하는 것이 좋습니다. 편집 후.

도구 Dialyzer은 이런 종류의 오류 상태를 확인하는 데 사용됩니다.

런타임에 함수를 검색하고 코드 경로에서 동적으로로드 할 수 있기 때문에 컴파일러에서 컴파일러가 컴파일 시간에 알 수없는 이유가 있습니다. Dialyzer는 코드가 실행될 때 코드 경로와 비교하여 코드를 검사합니다.

원격 노드에서 코드를로드하는 기능은 장치에 기본 '시스템'을 설치할 수 있음을 의미하며 장치는 네트워크에서 스스로 부트 스트랩 할 수 있습니다. 그래서이 경우에이 기능이 컴파일시 여부에 존재 알고 단순히 수 없습니다

erlang:apply(ModuleName, FunctionName, ArgList) 

: 또한이 기능을 생성 할 수 있습니다 얼랑의 또 다른 특성을 기억해야

같은 on the fly 사용하여 구조를 호출 .

모듈 및 함수가 컴파일 타임에 존재할 수도 있지만 모듈을 핫 스왑하고 코드를 언로드 할 수 있으므로 런타임에 모듈이 존재하지 않을 수 있습니다.

+1

코드 경로뿐만 아니라 Erlang 클러스터의 다른 노드.코드는 Erlang VM에로드되어 실행되기 위해 로컬 일 필요는 없습니다. –

+1

나는 그것에 대해 정말로 생각하지 않았다. Erlang Cookbook을 간략히 살펴보면 어떻게하는지 알 수 있습니다. http://www.trapexit.org/Remote_Code_Load –

+0

또한 모듈을 런타임에 바꾸거나 언로드 할 수 있으므로 컴파일러가 지금 검사하더라도 나중에는 여전히 실패 할 수 있습니다. – archaelus

0

저는 Erlang 개발자들이 빌드 타임 링크가 아닌 런타임 연결을 결정하기 때문에 구현 문제라고 생각합니다. 이유 중 일부가 버전 및 동적 코드로드를 수행 할 수 있습니다.

0

지원되지 않는 기능, 사용되지 않는 기능 및 사용되지 않는 기능 등을 확인하려면 xref 응용 프로그램을 사용할 수 있습니다.

debug_info과 모듈을 컴파일

Eshell V6.2 (abort with ^G) 
1> c(test, debug_info). 
{ok,test} 

확인 xref:m/1와 모듈이 : 당신은 할 수 있습니다

2> xref:m(test). 
[{deprecated,[]}, 
{undefined,[{{test,start,0},{erlang,foo,0}}]}, 
{unused,[]}] 

여기에 더 xref에 대해 체크 아웃 :

Erlang -- Xref - The Cross Reference Tool (Tools User's Guide)

Erlang -- xref (Tools Reference Manual)

관련 문제