2012-02-08 19 views
8

Khi tôi nhập (lớn) module vào một module chính trong một trong các cách sau:Haskell: Tăng trưởng nhị phân không cần thiết với hàng nhập khẩu mô-đun

import Mymodule 
import qualified Mymodule as M 
import Mymodule (MyDatatype) 

nhị phân tổng hợp phát triển số lượng khổng lồ cùng so với khi tôi don không nhập mô-đun đó. Điều này xảy ra bất kể tôi có sử dụng bất cứ thứ gì bên trong mô-đun đó hay không trong mô-đun chính. Không nên trình biên dịch (tôi đang sử dụng GHC trên thử nghiệm Debian) chỉ thêm vào nhị phân những gì là cần thiết để chạy nó?

Trong trường hợp cụ thể của tôi, tôi có một Bản đồ khổng lồ trong Mymodule mà tôi không sử dụng trong mô-đun Chính. Chọn lọc nhập khẩu những gì tôi thực sự cần, không thay đổi sự tăng trưởng của nhị phân biên dịch.

Trả lời

17

Theo như GHC liên quan, danh sách nhập chỉ có ở đó để dễ đọc và tránh xung đột tên; chúng không ảnh hưởng đến những gì được liên kết.

Ngoài ra, ngay cả khi bạn chỉ nhập một vài chức năng từ thư viện, chúng vẫn có thể phụ thuộc vào phần lớn thư viện trong nội bộ, vì vậy bạn không nhất thiết phải thấy giảm kích thước. giao diện nói chung.

Theo mặc định, các liên kết GHC trong toàn bộ thư viện, thay vì chỉ các phần bạn sử dụng; bạn có thể tránh điều này bằng cách xây dựng thư viện với tùy chọn -split-objs tới GHC (hoặc đặt split-objs: True trong tệp cấu hình cabal-install (~/.cabal/config trên Unix)), nhưng nó làm chậm quá trình biên dịch và dường như không được nhà phát triển GHC đề xuất:

-split-objs

cho mối liên kết để phân chia các tập tin đối tượng duy nhất mà thông thường sẽ được tạo thành nhiều file đối tượng, mỗi cấp cao chức năng Haskell hoặc gõ vào mô-đun. Điều này chỉ có ý nghĩa đối với các thư viện, nơi nó có nghĩa là các tệp thực thi được liên kết với thư viện nhỏ hơn vì chúng chỉ liên kết với các tệp đối tượng mà chúng cần. Tuy nhiên, lắp ráp tất cả các phần riêng biệt là tốn kém, vì vậy đây là chậm hơn so với biên dịch bình thường. Ngoài ra, kích thước của chính thư viện (tệp .a) có thể là hệ số lớn hơn từ 2 đến 2,5. Chúng tôi sử dụng tính năng này để xây dựng thư viện của GHC.

- The GHC manual

này sẽ bỏ qua phần không sử dụng các thư viện bạn sử dụng, bất kể những gì bạn nhập.

Bạn cũng có thể quan tâm đến việc sử dụng shared Haskell libraries.

+0

Trích dẫn ehird: "Theo như GHC liên quan, danh sách nhập chỉ có thể đọc được và tránh xung đột tên; chúng không ảnh hưởng đến những gì được liên kết." Điều đó không thể đúng, vì sự tăng trưởng về kích thước xảy ra ngay cả khi tôi chỉ đặt "nhập Mymodule" trong mô-đun chính mà không sử dụng bất kỳ thứ gì bên trong mô-đun đó. – Josephine

+1

"Danh sách nhập" đề cập đến danh sách số nhận dạng cần nhập trong dấu ngoặc đơn sau tên mô-đun, không phải danh sách các câu lệnh nhập ở đầu mô-đun. – ehird

+0

Phải, điều đó có ý nghĩa. Cảm ơn bạn đã làm rõ và câu trả lời rất thông tin! – Josephine

Các vấn đề liên quan