2011-10-16 53 views
20

Tại sao GHC's Int type không đảm bảo sử dụng chính xác 32 bit chính xác? This document claimít nhất độ chính xác được ký 30 bit. Có phải nó liên quan đến việc lắp Maybe Int hoặc tương tự vào 32 bit không?Kích thước bit của GHC's Int Type

+3

Sẽ có những người khác có nhiều chi tiết hơn, nhưng tôi nghĩ rằng nó phải liên quan đến thu gom rác và lười biếng.Một chút cho "được đánh giá", một chút để sao chép bằng GC. Không chắc chắn 100% mặc dù. – luqui

+3

Nếu bạn cần bảo đảm 32 bit, có loại 'Int32' trong' Data.Int'. – hammar

+1

Không có giới hạn trên bởi vì nó phụ thuộc vào nền tảng: trên máy 64x 'Prelude.maxBound :: Int' phải ở khoảng 2^63 –

Trả lời

23

Nó cho phép triển khai Haskell sử dụng gắn thẻ. Khi sử dụng gắn thẻ, bạn cần một vài bit làm thẻ (ít nhất một, hai thẻ là tốt hơn). Tôi không chắc chắn hiện tại có bất kỳ triển khai như vậy, nhưng tôi dường như nhớ Yale Haskell sử dụng nó.

Gắn thẻ phần nào có thể tránh được những bất lợi của quyền anh, vì bạn không còn phải đóng hộp tất cả mọi thứ; thay vào đó, bit thẻ sẽ cho bạn biết nếu nó được đánh giá, v.v.

+7

Bạn có thể giải thích" gắn thẻ "và" quyền anh "không? –

5

Tôi nghĩ điều này là do những cách sớm để triển khai GC và tất cả nội dung đó. Nếu bạn có 32 bit có sẵn và bạn chỉ cần 30 bit, bạn có thể sử dụng hai bit dự phòng đó để thực hiện những điều thú vị, ví dụ bằng cách sử dụng số không trong bit ít quan trọng nhất để biểu thị một giá trị và một cho con trỏ.

Hôm nay, việc triển khai không sử dụng các bit đó để Int có ít nhất 32 bit trên GHC. (Điều đó không hoàn toàn đúng. IIRC người ta có thể đặt một số cờ để có 30 hoặc 31 bit Int s)

14

Định nghĩa ngôn ngữ Haskell nêu rõ rằng type Int covers at least the range [−229, 229−1]. Có các trình biên dịch/phiên dịch khác sử dụng thuộc tính này để tăng thời gian thực hiện của chương trình kết quả.

Tất cả các tham chiếu bên trong tới (căn chỉnh) Điểm dữ liệu Haskell đến địa chỉ bộ nhớ là bội số của 4 (8) trên hệ thống 32 bit (64 bit). Vì vậy, tài liệu tham khảo chỉ cần 30bits (61bits) và do đó cho phép 2 (3) bit cho "con trỏ gắn thẻ".

Trong trường hợp dữ liệu, GHC sử dụng các thẻ đó để lưu trữ thông tin về dữ liệu được tham chiếu đó, tức là giá trị đó đã được đánh giá chưa và nếu có thì hàm tạo.

Trong trường hợp 30-bit Int s (do đó, không phải GHC), bạn có thể sử dụng một bit để quyết định xem đó có phải là con trỏ tới số Int không được đánh giá hay chính nó là Int.

Gắn thẻ con trỏ có thể được sử dụng cho tính tham chiếu một bit, có thể tăng tốc quá trình thu thập rác. Điều đó có thể hữu ích trong trường hợp mối quan hệ giữa người tiêu dùng và nhà sản xuất trực tiếp được tạo ra trong thời gian chạy: Nó sẽ dẫn đến việc sử dụng lại bộ nhớ thay vì sử dụng bộ thu gom rác.

Vì vậy, sử dụng 2 bit cho gắn thẻ con trỏ, có thể có một số sự kết hợp tự nhiên của tối ưu hóa dữ dội ... Trong trường hợp Ints tôi có thể tưởng tượng những 4 thẻ:

  • một tài liệu tham khảo đặc biệt đến một unevaluated Int
  • một trong nhiều tài liệu tham khảo để cùng có thể vẫn unevaluated Int
  • 30 bit mà Int tự
  • một tài liệu tham khảo (các thể nhiều tài liệu tham khảo) để được đánh giá là 32 bit Int.
+0

@hvr: Tôi không chắc tại sao tôi nhớ 28bits; Báo cáo Haskell 98 cho biết phạm vi tương tự như năm 2010. Thx để sửa chữa. – comonad

+0

Tôi đã sửa đổi mọi thứ. Văn bản hoàn toàn mới, chính xác hơn trước đây. – comonad

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