Mô-đun C ++ - tại sao chúng bị xóa khỏi C ++ 0x? Liệu họ có quay lại sau không?


110

Tôi vừa phát hiện ra bản nháp C ++ 0x cũ này về các mô-đun trong C ++ 0x.

Ý tưởng là thoát khỏi hệ thống .h / .cpp hiện tại bằng cách chỉ viết các tệp .cpp, sau đó sẽ tạo ra các tệp mô-đun trong quá trình biên dịch, sau đó sẽ được các tệp .cpp khác sử dụng.

Đây có vẻ như là một tính năng thực sự tuyệt vời.

Nhưng câu hỏi của tôi là: tại sao họ lại xóa nó khỏi C ++ 0x? Có phải do quá nhiều khó khăn về kỹ thuật? Thiếu thời gian? Và bạn có nghĩ rằng họ sẽ xem xét làm việc trên nó cho một phiên bản C ++ mới hơn?

Câu trả lời:


70

Từ State of C ++ Evolution (Post San Francisco 2008) , đề xuất Mô-đun được phân loại là "Hướng tới một TR riêng biệt:"

Các chủ đề này được coi là quá quan trọng để chờ một tiêu chuẩn khác sau C ++ 0x trước khi được xuất bản, nhưng quá thử nghiệm để được hoàn thiện kịp thời cho Tiêu chuẩn tiếp theo. Do đó, các tính năng này sẽ được cung cấp bởi một báo cáo kỹ thuật trong thời gian sớm nhất.

Đề xuất mô-đun chưa sẵn sàng và việc chờ đợi nó sẽ khiến việc hoàn thiện tiêu chuẩn C ++ 0x bị trì hoãn. Nó không thực sự bị loại bỏ, chỉ là nó chưa bao giờ được đưa vào giấy làm việc.


89

Dự thảo mô-đun C ++ (Đặc điểm kỹ thuật sau C ++ 17)

Một dự thảo và chỉnh sửa vài lần cập nhật cho C / C ++ mô-đun đặc điểm kỹ thuật đã được công bố bởi WG21 trên open-std.org. Tôi sẽ chỉ liên kết đến các tài liệu mới nhất ở đây:

  • Bản thảo làm việc, Phần mở rộng cho C ++ cho Mô-đun N4610 (tháng 10 năm 2016).
  • Bản sửa đổi thứ tư được xuất bản là P0142R0 (tháng 3 năm 2016).
  • Ghi cho Mô-đun được xuất bản là P0143R2 (tháng 3 năm 2016).
  • Nhóm clang đã xuất bản bản sửa đổi thứ hai về những thay đổi của họ: P0273R1 (tháng 10 năm 2016).

Các bài đăng trên blog sau chứa tóm tắt về các cuộc họp tiêu chuẩn và đặc biệt là tóm tắt về tình trạng hiện tại của dự thảo mô-đun:

Cập nhật: Như đã giải thích trong báo cáo chuyến đi Kona mà tôi đã liên kết ở trên, hiện có hai đề xuất cạnh tranh, một từ Microsoft và một từ Clang. Giải pháp được đề xuất từ ​​Microsoft không cho phép xuất Macro, trong khi giải pháp từ nhóm Clang sẽ hỗ trợ xuất Macro. Cho đến nay chỉ có Microsoft chính thức gửi bản thảo cho một đặc tả mô-đun.

Đặc điểm kỹ thuật mô-đun theo đề xuất của Microsoft

Dưới đây là tổng quan nhanh về các khái niệm quan trọng nhất trong đề xuất này. Như một bản nháp, điều này có thể vẫn thay đổi. Tiêu chuẩn mô-đun mới sẽ bao gồm những điều sau đây:

Một moduletừ khóa để khai báo một mô-đun, nhiều tệp có thể khai báo điều này để xây dựng một mô-đun (nhưng đối với mỗi mô-đun, chỉ một đơn vị biên dịch có thể chứa một export {}phần):

module M;

Một importtừ khóa để nhập mô-đun, thay vì importnó cũng có thể được quyết định sử dụng using modulethay thế, vì vậy có thể tránh sử dụng từ khóa nhập mới.

import std.io;
import module.submodule;

Một exportcú pháp, xác định các khai báo công khai là một phần của mô-đun này, các khai báo không phải giao diện không nên được xuất như một phần của mô-đun sẽ được xác định bên ngoài khối xuất. Tờ khai có thể được bất kỳ loại khai trong C / C ++, có nghĩa là, không chỉ có chức năng mà còn biến, cấu trúc, mẫu, không gian tên và các lớp:

export {
    int f(int);
    double g(double, int);

    int foo;

    namespace Calc {
         int add(int a, int b);
    }        
}

void not_exported_function(char* foo);

Một thay đổi quan trọng của các mô-đun sẽ là các macro và định nghĩa bộ xử lý trước sẽ là cục bộ cho các mô-đun và sẽ không được xuất. Do đó, macro không có bất kỳ tác động nào đến các mô-đun đã nhập:

#define FILE "my/file"
import std.io;   //will not be impacted by the above definition

Lưu ý quan trọng của nó là cả hệ thống tiền xử lý hiện tại và các mô-đun sẽ có thể cùng tồn tại và các tiêu đề vẫn có thể được sử dụng chẳng hạn để bao gồm các macro.

Để biết thêm thông tin chi tiết, tôi đề nghị đọc bản nháp.

Mô-đun Clang

Clang đã và đang làm việc trên một triển khai mô-đun có thể được tìm thấy tại trang mô-đun clang . Tuy nhiên, clang hiện không triển khai cú pháp cụ thể cho các mô-đun, tức là không có cú pháp nào trong số các cú pháp nêu trên đã được thực hiện bởi Clang. Để giải thích điều này, trang này chứa câu lệnh sau:

Hiện tại chưa có cú pháp C hoặc C ++ cho các khai báo nhập khẩu. Clang sẽ theo dõi đề xuất mô-đun trong ủy ban C ++. Xem phần Bao gồm dưới dạng nhập để xem cách các mô-đun được nhập ngay hôm nay.

Phần chính hiện được Clang thực hiện là "Ngôn ngữ bản đồ mô-đun" cho phép viết bản đồ mô-đun cho mã hiện có vẫn sử dụng tệp tiêu đề.

Xuất Macro từ Mô-đun

Như đã đề cập ở trên, vẫn chưa rõ liệu xuất khẩu vĩ mô sẽ là một phần của Mô-đun cuối cùng TS . Trong P0273R1 , cú pháp sau được đề xuất để xuất macro:

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);

2
Cập nhật từ Rapperswil 2018, có đề xuất hợp nhất từ ​​Gabriel dos Reis và Richard Smith, p1103r0. botondballo.wordpress.com/2018/06/20/…
Dwayne Robinson

32

Clang là trình biên dịch đầu tiên bắt đầu làm việc trên các mô-đun ngay cả trước khi quá trình tiêu chuẩn hóa hoàn tất. Chưa có nhiều tài liệu nhưng bạn có thể tìm thấy mã ví dụ tại đây:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

Một số nhận xét từ Douglas Gregor (nhà phát triển thực hiện chúng):
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

Về lý thuyết, bạn có thể xác định một loạt các macro trợ giúp như begin_module, end_module, import_module để bảo vệ bản thân khỏi bất kỳ thay đổi nào có thể xảy ra đối với cú pháp sẽ xảy ra trong tương lai.

CHỈNH SỬA 1:
Douglas Gregor đã phát hành bản trình bày về việc triển khai của mình:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

CHỈNH SỬA 2:
Hỗ trợ mô-đun trong clang đã được ghi lại tại đây:
http://clang.llvm.org/docs/Modules.html

CHỈNH SỬA 3:
Các mô-đun hiện cũng được hỗ trợ trong trình biên dịch C ++ của Microsoft: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1. aspx


-39
  1. Bởi vì nó là sự thay đổi khái niệm rất lớn.
  2. Không có nhu cầu thực sự về nó vì việc tách các nguồn để h / cpp thực hiện công việc
  3. Bởi vì C ++ không xác định cách các thư viện "mô-đun" thực sự được xây dựng. Nó để nó cho nhà phát triển trình biên dịch và cho trình liên kết.
  4. "Mô-đun" đôi khi khá phụ thuộc vào nền tảng, ví dụ như DLL khá khác với các đối tượng được chia sẻ. Vì vậy, nó không phải là tầm thường để hợp nhất giữa các khái niệm này.

78
Chắc chắn là có nhu cầu. .h / .cpp là một cách giải quyết quá tệ và lỗi thời. Một hệ thống mô-đun sẽ là một thay đổi lớn, nhưng đó là hệ thống mà ủy ban tiêu chuẩn rõ ràng coi là quan trọng.
jalf

13
Mô hình xây dựng tiêu đề là các mô-đun vấn đề được dùng để giải quyết, không phải là giải pháp. Ngoài ra, các mô-đun không phải là sự thay thế cho các tệp DLL / SO.
bames53

5
Điều này là sai: 1. Đề xuất mô-đun được chú ý cẩn thận để đảm bảo khả năng tương thích ngược với hệ thống tiêu đề hiện có, vì vậy sẽ không có gì hỏng khi mô-đun sẽ được giới thiệu trong tương lai. 2. Nhu cầu giảm độ phức tạp thời gian biên dịch của mô-đun tiêu đề từ độ phức tạp O (M * N) xuống O (M + N) đã được ghi nhận rất đầy đủ. 3. Tiêu chuẩn mô-đun sẽ không chỉ định cách các mô-đun đang được biên dịch và liên kết, nhưng nó bổ sung một ngữ nghĩa rõ ràng để phân tách giữa API riêng và công khai của một mô-đun. 4. Định dạng nhị phân của các tệp DLL hoặc các đối tượng được chia sẻ không bị ảnh hưởng bởi tiêu chuẩn.
lanoxx

3
"Không cần thực sự cần thiết vì việc tách các nguồn để h / cpp thực hiện công việc" cưa dây chuyền cắt ngón tay tiêm cũng vậy nhưng nó không có nghĩa là nó không phải là vấn đề! Chỉ cần nhìn vào .NET hoặc bất kỳ ngôn ngữ mới hơn nào khác, việc phải sắp xếp mọi thứ theo một cách nhất định để nó thực sự có thể hiển thị hoặc xây dựng một cách chính xác là một gánh nặng lớn cần phải loại bỏ.
paulm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.