Khi thiết kế và implenting một ngôn ngữ lập trình hướng đối tượng, tại một số một thời điểm phải thực hiện một sự lựa chọn về việc thực hiện các loại cơ bản (như int
, float
, double
hoặc tương đương) như các lớp học hay cái gì khác. Rõ ràng, các ngôn ngữ trong họ C có xu hướng không định nghĩa chúng là các lớp (Java có các kiểu nguyên thủy đặc biệt, C # thực hiện chúng như các cấu trúc bất biến, v.v.).
Tôi có thể nghĩ về một lợi thế rất quan trọng khi các kiểu cơ bản được triển khai như các lớp (trong một hệ thống kiểu với hệ thống phân cấp thống nhất): các kiểu này có thể là các kiểu con Liskov thích hợp của kiểu gốc. Vì vậy, chúng tôi tránh làm phức tạp ngôn ngữ với quyền anh / unboxing (rõ ràng hoặc ẩn), các loại trình bao bọc, quy tắc phương sai đặc biệt, hành vi đặc biệt, v.v.
Tất nhiên, tôi có thể hiểu một phần lý do tại sao các nhà thiết kế ngôn ngữ quyết định cách họ làm: các thể hiện của lớp có xu hướng có một số chi phí không gian (vì các thể hiện có thể chứa một siêu dữ liệu vtable hoặc siêu dữ liệu khác trong bố cục bộ nhớ của họ), rằng các nguyên hàm / cấu trúc không cần có (nếu ngôn ngữ không cho phép thừa kế trên những cái đó).
Là hiệu quả không gian (và cải thiện không gian địa phương, đặc biệt là trong các mảng lớn) là lý do duy nhất tại sao các loại cơ bản thường không phải là các lớp?
Nói chung, tôi đã giả sử câu trả lời là có, nhưng trình biên dịch có thuật toán phân tích thoát và do đó họ có thể suy luận liệu họ có thể (chọn lọc) bỏ qua chi phí không gian hay không khi một trường hợp (bất kỳ trường hợp nào, không chỉ là loại cơ bản) được chứng minh là nghiêm ngặt địa phương.
Là sai ở trên, hoặc có cái gì khác tôi đang thiếu?