Modul C ++ - mengapa mereka dihapus dari C ++ 0x? Apakah mereka akan kembali nanti?

110

Saya baru saja menemukan draf C ++ 0x lama tentang modul di C ++ 0x.

Idenya adalah untuk keluar dari sistem .h / .cpp saat ini dengan hanya menulis file .cpp yang kemudian akan menghasilkan file modul selama kompilasi, yang kemudian akan digunakan oleh file .cpp lainnya.

Sepertinya fitur ini sangat bagus.

Tapi pertanyaan saya adalah: mengapa mereka menghapusnya dari C ++ 0x? Apakah karena terlalu banyak kesulitan teknis? Kekurangan waktu? Dan menurut Anda apakah mereka akan mempertimbangkan untuk mengerjakannya untuk versi tersembunyi dari C ++?

Tomaka17
sumber

Jawaban:

70

Dari State of C ++ Evolution (Post San Francisco 2008) , proposal Modules dikategorikan sebagai "Heading for a terpisah TR:"

Topik ini dianggap terlalu penting untuk menunggu standar lain setelah C ++ 0x sebelum dipublikasikan, tetapi terlalu eksperimental untuk diselesaikan pada waktunya untuk Standar berikutnya. Oleh karena itu, fitur ini akan dikirimkan oleh laporan teknis pada kesempatan paling awal.

Proposal modul belum siap dan menunggu akan menunda penyelesaian standar C ++ 0x. Itu tidak benar-benar dihapus, itu tidak pernah dimasukkan ke dalam kertas kerja.

James McNellis
sumber
89

Draf Modul C ++ (Spesifikasi Teknis setelah C ++ 17)

Draf dan beberapa revisi terbaru untuk spesifikasi modul C / C ++ telah diterbitkan oleh WG21 di open-std.org. Saya hanya akan menautkan ke dokumen terbaru di sini:

  • Draf Kerja, Ekstensi ke C ++ untuk Modul N4610 (Oktober 2016).
  • Revisi keempat diterbitkan sebagai P0142R0 (Maret 2016).
  • Wording for Modules diterbitkan sebagai P0143R2 (Maret 2016).
  • Tim clang telah menerbitkan revisi kedua dari perubahan mereka: P0273R1 (Oktober 2016).

Posting blog berikut berisi ringkasan pertemuan standar dan khususnya ringkasan dari status draf modul saat ini:

Pembaruan: Sebagaimana dijelaskan dalam laporan perjalanan Kona yang saya tautkan di atas, saat ini ada dua proposal yang bersaing, satu dari Microsoft dan satu dari Clang. Solusi yang diusulkan dari Microsoft tidak memungkinkan untuk mengekspor Makro, sedangkan solusi dari tim Clang akan mendukung ekspor Makro. Sejauh ini hanya Microsoft yang secara resmi mengajukan draf spesifikasi modul.

Spesifikasi modul seperti yang diusulkan oleh Microsoft

Berikut adalah ikhtisar singkat tentang konsep terpenting yang terkandung dalam proposal ini. Sebagai draf ini mungkin masih berubah. Standar modul yang baru antara lain terdiri dari:

Kata modulekunci untuk mendeklarasikan modul, beberapa file dapat mendeklarasikan ini untuk membangun satu modul (tetapi untuk setiap modul hanya satu unit kompilasi yang dapat berisi satu export {}bagian):

module M;

Kata importkunci untuk mengimpor modul, sebagai gantinya importmungkin juga akan diputuskan untuk digunakan using module, sehingga kata kunci impor baru dapat dihindari.

import std.io;
import module.submodule;

Sebuah exportsintaks, yang mendefinisikan deklarasi publik yang merupakan bagian dari modul ini, deklarasi non-antarmuka yang tidak boleh diekspor sebagai bagian dari modul akan ditentukan di luar blok ekspor. Deklarasi dapat berupa segala jenis deklarasi di C / C ++, yaitu tidak hanya fungsi tetapi juga variabel, struct, template, namespace, dan kelas:

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

    int foo;

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

void not_exported_function(char* foo);

Perubahan penting dari modul adalah definisi makro dan preprocessor akan menjadi lokal untuk modul dan tidak akan diekspor. Oleh karena itu, makro tidak berdampak apa pun pada modul yang diimpor:

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

Catatan penting bahwa sistem dan modul preprocessor saat ini akan dapat hidup berdampingan dan header masih dapat digunakan misalnya untuk menyertakan makro.

Untuk informasi lebih detail saya sarankan untuk membaca drafnya.

Modul Dentang

Clang telah mengerjakan implementasi modul yang dapat ditemukan di halaman modul clang . Namun clang saat ini tidak mengimplementasikan sintaks konkret untuk modul, yaitu, tidak ada sintaks yang disebutkan di atas yang telah diimplementasikan oleh Clang. Untuk menjelaskannya, halaman tersebut berisi pernyataan berikut:

Saat ini, tidak ada sintaks C atau C ++ untuk deklarasi impor. Clang akan melacak proposal modul di komite C ++. Lihat bagian Termasuk sebagai impor untuk melihat bagaimana modul diimpor hari ini.

Bagian utama yang saat ini diimplementasikan oleh Clang adalah "Module Map Language" yang memungkinkan penulisan peta modul untuk kode yang ada yang masih menggunakan file header.

Ekspor Makro dari Modul

Seperti disebutkan di atas, masih belum jelas apakah ekspor makro akan menjadi bagian dari Modul TS final . Di P0273R1 , sintaks berikut ini diusulkan untuk ekspor makro:

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);
lanoxx.dll
sumber
2
Update dari Rapperswil 2018, ada proposal gabungan dari Gabriel dos Reis dan Richard Smith, p1103r0. botondballo.wordpress.com/2018/06/20/…
Dwayne Robinson
32

Clang adalah kompiler pertama yang mulai mengerjakan modul bahkan sebelum standardisasi selesai. Belum banyak dokumentasi, tetapi kode contoh dapat ditemukan di sini:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

Beberapa komentar dari Douglas Gregor (pengembang yang mengimplementasikannya):
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

Secara teori, Anda dapat menentukan sekumpulan makro pembantu seperti begin_module, end_module, import_module untuk melindungi diri Anda dari kemungkinan perubahan sintaks yang akan datang di masa mendatang.

EDIT 1:
Douglas Gregor telah merilis presentasi tentang implementasinya:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

EDIT 2:
Dukungan modul dalam clang telah didokumentasikan di sini:
http://clang.llvm.org/docs/Modules.html

EDIT 3:
Modul sekarang juga didukung di kompiler C ++ Microsoft: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1. aspx

zah
sumber
-39
  1. Karena itu perubahan konseptual sangat besar.
  2. Tidak ada kebutuhan yang nyata karena pemisahan sumber ke h / cpp melakukan pekerjaannya
  3. Karena C ++ tidak menentukan bagaimana pustaka "modul" sebenarnya dibuat. Ia menyerahkannya kepada pengembang kompilator dan penaut.
  4. "Modul" terkadang sangat bergantung pada platform, misalnya DLL sangat berbeda dari objek bersama. Jadi tidak mudah untuk menggabungkan konsep-konsep ini.
Artyom
sumber
78
Pasti ada kebutuhan. .h / .cpp adalah solusi yang sangat buruk dan ketinggalan zaman. Sistem modul akan menjadi perubahan besar, tapi itu salah satu yang tampaknya dianggap penting oleh komite standar.
jalf
13
Model pembuatan header adalah modul masalah yang dimaksudkan untuk dipecahkan, bukan solusinya. Juga modul bukan pengganti DLL / SO.
bames53
5
Ini salah: 1. Proposal modul sangat berhati-hati untuk memastikan kompatibilitas dengan sistem header yang ada, jadi tidak ada kerusakan saat modul akan diperkenalkan di masa mendatang. 2. Kebutuhan untuk mengurangi kompleksitas waktu kompilasi modul header dari kompleksitas O (M * N) menjadi O (M + N) didokumentasikan dengan sangat baik. 3. Standar modul tidak akan menentukan bagaimana modul dikompilasi dan ditautkan, tetapi menambahkan semantik yang jelas untuk memisahkan antara API privat dan publik dari sebuah modul. 4. Format biner DLL atau objek bersama tidak terpengaruh oleh standar.
lanoxx
3
"Tidak benar-benar membutuhkannya karena pemisahan sumber ke h / cpp melakukan pekerjaannya" begitu juga dengan menggergaji rantai dari jari yang disuntikkan tetapi itu tidak berarti itu bukan masalah! Lihat saja .NET atau bahasa baru lainnya, harus memesan sesuatu dengan cara tertentu agar dapat benar-benar terlihat atau dibangun dengan benar adalah beban besar yang harus disingkirkan.
paulm