2017-12-30 34 views
4

나는 약 유용성을 요청합니다. 이것은 컴파일 된 실행 파일/라이브러리의 크기에 미치는 영향에 관한 것입니다. 코드 유지 보수성이나 가독성과 관련이 없습니다.명시 적 가져 오기는 컴파일 된 파일 크기를 줄일 수 있습니까?

특정 모듈을 가져 오기

것이 유용 대신 (자체 서브 모듈 수입)의 주요 모듈을 가져 오는 패키지에서 유일하게 사용되는 모듈을 가져 오는 것입니다.

import Foreign.Storable 

대신 : (만 가져 오기 목록을 포함)을 Foreign 모듈 예를 들어

,

import Foreign 

명시 적으로 가져 오는 기능/유형

은에 유용인가 전체 모듈을 가져 오는 대신 사용 된 함수/유형을 가져 오시겠습니까? 예를 들어

:

import Foreign.ForeignPtr (ForeignPtr, mallocForeignPtr, withForeignPtr) 

대신 :

import Foreign.ForeignPtr 
+5

당신이 차이를받을 경우 두 가지 방법으로 간단한 응용 프로그램을 컴파일하고 보는 시도? 최적화하지 않고 컴파일하고 최적화를 통해 같은 크기로 컴파일하면 더 큰 파일을 얻을 것이라는 것이 나의 의구심입니다. 그러나 LTO가 필요할 수도 있습니다. 함수를 명시 적으로 모듈 대 한 번에 가져 오는 것의 차이점을 얻지 못할 것이라고 생각합니다. –

+2

이것은 하스켈 코드의 특징이 아닙니다. 그것은 연결의 특징입니다.첫째, 동적으로 링크하는 경우이 중 아무 것도 차이를 만들지 않으므로 정적 링크에 대해 이야기한다고 가정합니다. 첫 번째 경우에는 ['split-objs'] (https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/phases.html#ghc-flag--split)에만 영향을 미칩니다. -objs)가 사용 가능합니다. 그렇지 않으면 전체 라이브러리가 링크됩니다. 두 번째 경우에는 아무런 변화가 없습니다. 모듈에서 이름 (!)을 가져 오지 않으면 전체 모듈 (또는 'split-objs'가 활성화되지 않은 전체 패키지)에서 링크가 필요합니다. – user2407038

+0

@ user2407038 답변 해 주셔서 감사합니다. 그것을 진짜 응답으로 만들어라. 나는 그것을 검증 할 것이다. –

답변

1

모듈이 오브젝트 파일로 컴파일하는 경우에, 아니, 심지어는 이론이다. 가져올 수없는 함수는 여전히 내부적으로 사용할 수 있으며 GHCI에 모듈을로드하고 추출되지 않은 내부 함수를 테스트 할 수 있습니다.

정적으로 링크하거나 일반 함수의 특정 인스턴스를 사용하는 경우 컴파일러는 이론적으로이 특정 프로그램에서 도달 할 수없는 라이브러리 조각을 분석 할 수 있어야하며 전체 프로그램 최적화로 pare 그것들은 실행 파일에서 제외됩니다. (예를 들어, 프로그램 사용이 Int의 목록입니다 만 나열하면, 아마도 컴파일러는 일반적인 기능의 부분적 전문 [Int] 버전 및 사용에만 사람을 컴파일합니다.) 그러나, 같은 정적을 할 수 있어야 수입 및 수출 신고 방법에 관계없이 전체 프로그램 최적화로 분석 할 수 있습니다.

동적 라이브러리를 컴파일 할 때 이론적으로 정적 인터페이스가 내 보낸 인터페이스를 통해 가능한 모든 호출에 의해 직접 또는 간접적으로 도달 할 수없는 코드 경로 나 데이터 조각을 제외 할 수 있습니다. 그렇다면 컴파일러는 내보내기 목록을 사용하여 라이브러리의 일부 식별자가 완전히 쓸모없고 컴파일 된 라이브러리 밖으로 나가는 것을 증명할 수 있습니다.

당신은 GHC (8)과 같은 일부 특정 컴파일러,,, 나도 몰라 무엇을 요구하는 경우. 당신은 그것을 시험하고보아야 할 것입니다.

수출 및 수입품을 구체적으로 나열하면 몇 년 후 두 번째 모듈에서 이미 사용중인 식별자를 선언해도 문제가 생기지 않습니다. 이것은 전에 나에게 일어 났고, 지금 나는 훨씬 더 조심 스럽다.