C ++ - Module - warum wurden sie aus C ++ 0x entfernt? Werden sie später zurück sein?

110

Ich habe gerade diesen alten C ++ 0x-Entwurf über Module in C ++ 0x entdeckt.

Die Idee war, aus dem aktuellen .h / .cpp-System herauszukommen, indem nur .cpp-Dateien geschrieben wurden, die dann während der Kompilierung Moduldateien generierten, die dann wiederum von den anderen .cpp-Dateien verwendet wurden.

Das sieht nach einer wirklich großartigen Funktion aus.

Aber meine Frage ist: Warum haben sie es aus C ++ 0x entfernt? War es wegen zu vieler technischer Schwierigkeiten? Zeitmangel? Und glauben Sie, dass sie darüber nachdenken werden, für eine andere Version von C ++ daran zu arbeiten?

Tomaka17
quelle

Antworten:

70

Ausgehend vom Stand der C ++ - Evolution (nach San Francisco 2008) wurde der Modulvorschlag als "Überschrift für eine separate TR:" eingestuft.

Diese Themen werden als zu wichtig erachtet, um nach der Veröffentlichung von C ++ 0x auf einen anderen Standard zu warten, aber zu experimentell, um rechtzeitig für den nächsten Standard fertiggestellt zu werden. Daher werden diese Funktionen zum frühestmöglichen Zeitpunkt durch einen technischen Bericht bereitgestellt.

Der Modulvorschlag war einfach nicht fertig und das Warten darauf hätte die Fertigstellung des C ++ 0x-Standards verzögert. Es wurde nicht wirklich entfernt, es wurde nur nie in das Arbeitspapier aufgenommen.

James McNellis
quelle
89

Entwurf von C ++ - Modulen (Technische Spezifikation nach C ++ 17)

Ein Entwurf und mehrere aktualisierte Überarbeitungen für die C / C ++ - Modulspezifikation wurden von WG21 auf open-std.org veröffentlicht. Ich werde hier nur auf die neuesten Dokumente verlinken:

  • Arbeitsentwurf, Erweiterungen von C ++ für Module N4610 (Oktober 2016).
  • Vierte Revision veröffentlicht als P0142R0 (März 2016).
  • Formulierung für Module veröffentlicht als P0143R2 (März 2016).
  • Das Clang-Team hat eine zweite Überarbeitung seiner Änderungen veröffentlicht: P0273R1 (Oktober 2016).

Die folgenden Blog-Beiträge enthalten eine Zusammenfassung der Normungsbesprechungen und insbesondere eine Zusammenfassung des aktuellen Status des Modulentwurfs:

Update: Wie in dem oben verlinkten Kona-Reisebericht erläutert, gibt es derzeit zwei konkurrierende Vorschläge, einen von Microsoft und einen von Clang. Die vorgeschlagene Lösung von Microsoft erlaubt keinen Export von Makros, während die Lösung des Clang-Teams den Export von Makros unterstützen würde. Bisher hat nur Microsoft offiziell einen Entwurf für eine Modulspezifikation eingereicht.

Modulspezifikation wie von Microsoft vorgeschlagen

Hier finden Sie eine kurze Übersicht über die wichtigsten Konzepte, die dieser Vorschlag enthält. Da es sich um einen Entwurf handelt, könnte sich dies möglicherweise noch ändern. Der neue Modulstandard wird unter anderem aus Folgendem bestehen:

Ein moduleSchlüsselwort zum Deklarieren eines Moduls. Mehrere Dateien können dies deklarieren, um ein Modul zu erstellen (aber für jedes Modul kann nur eine Kompilierungseinheit einen export {}Abschnitt enthalten ):

module M;

Möglicherweise wird auch ein importSchlüsselwort zum Importieren von Modulen importverwendet using module, sodass stattdessen ein neues Importschlüsselwort vermieden werden kann.

import std.io;
import module.submodule;

Eine exportSyntax, die die öffentlichen definiert Erklärungen , die Teil dieses Moduls, nicht-Schnittstelle sind Erklärungen , die nicht als Teil des Moduls ausgeführt werden sollte , wird außerhalb des Exportblock definiert werden. Deklarationen können jede Art von Deklaration in C / C ++ sein, dh nicht nur Funktionen, sondern auch Variablen, Strukturen, Vorlagen, Namespaces und Klassen:

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

    int foo;

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

void not_exported_function(char* foo);

Eine wichtige Änderung der Module besteht darin, dass Makros und Präprozessordefinitionen für Module lokal sind und nicht exportiert werden. Somit haben Makros keine Auswirkungen auf importierte Module:

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

Es ist wichtig zu beachten, dass sowohl das aktuelle Präprozessorsystem als auch die Module nebeneinander existieren können und Header weiterhin verwendet werden können, um beispielsweise Makros einzuschließen.

Für detailliertere Informationen empfehle ich, den Entwurf zu lesen.

Clang-Module

Clang hat an einer Modulimplementierung gearbeitet, die auf der Seite mit den Clang-Modulen zu finden ist . Derzeit implementiert clang jedoch keine konkrete Syntax für Module, dh keine der oben genannten Syntax wurde von Clang implementiert. Um dies zu erklären, enthält die Seite die folgende Anweisung:

Derzeit gibt es keine C- oder C ++ - Syntax für Importdeklarationen. Clang wird den Modulvorschlag im C ++ - Komitee verfolgen. Im Abschnitt Enthält als Importe finden Sie Informationen dazu, wie Module heute importiert werden.

Der Hauptteil, der derzeit von Clang implementiert wird, ist die "Module Map Language", mit der Modulzuordnungen für vorhandenen Code geschrieben werden können, der weiterhin Header-Dateien verwendet.

Makroexporte aus Modulen

Wie oben erwähnt, ist noch unklar, ob Makroexporte Teil der endgültigen Module TS sein werden . In P0273R1 wurde die folgende Syntax für den Export von Makros vorgeschlagen:

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);
Lanoxx
quelle
2
Update von 2018 Rapperswil, es gibt den zusammengeführten Vorschlag von Gabriel dos Reis und Richard Smith, p1103r0. botondballo.wordpress.com/2018/06/20/…
Dwayne Robinson
32

Clang ist der erste Compiler, der bereits vor Abschluss der Standardisierung mit der Arbeit an Modulen beginnt. Es gibt noch nicht viel Dokumentation, aber Beispielcode finden Sie hier:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

Einige Kommentare von Douglas Gregor (dem Entwickler, der sie implementiert):
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

Theoretisch können Sie eine Reihe von Hilfsmakros wie begin_module, end_module und import_module definieren, um sich vor möglichen Änderungen der Syntax zu schützen, die in Zukunft auftreten werden.

EDIT 1:
Douglas Gregor hat eine Präsentation über seine Implementierung veröffentlicht:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

EDIT 2:
Die Modulunterstützung in Clang wurde hier dokumentiert:
http://clang.llvm.org/docs/Modules.html

EDIT 3:
Module werden jetzt auch im C ++ - Compiler von Microsoft unterstützt: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1. aspx

zah
quelle
-39
  1. Weil es eine sehr große konzeptionelle Veränderung ist.
  2. Es besteht keine wirkliche Notwendigkeit, da die Trennung der Quellen zu h / cpp den Job erledigt
  3. Weil C ++ nicht definiert, wie tatsächliche "Modul" -Bibliotheken erstellt werden. Es überlässt es dem Compiler-Entwickler und dem Linker.
  4. "Module" sind manchmal ziemlich plattformabhängig, zum Beispiel DLLs, die sich stark von gemeinsam genutzten Objekten unterscheiden. Es ist also nicht so trivial, diese Konzepte zusammenzuführen.
Artyom
quelle
78
Es besteht sicherlich ein Bedarf. .h / .cpp ist eine lächerlich schlechte und veraltete Problemumgehung. Ein Modulsystem wäre eine große Veränderung, aber es ist eine, die das Standardkomitee anscheinend für wichtig hält.
Jalf
13
Das Header-Build-Modell ist das Problem, das Module lösen sollen, nicht die Lösung. Auch Module sind kein Ersatz für DLLs / SOs.
Bames53
5
Dies ist falsch: 1. Der Modulvorschlag achtet sorgfältig darauf, die Abwärtskompatibilität mit dem vorhandenen Headersystem sicherzustellen, sodass bei der zukünftigen Einführung von Modulen nichts kaputt geht. 2. Die Notwendigkeit, die Komplexität der Kompilierungszeit des Header-Moduls von einer O (M * N) -Komplexität auf O (M + N) zu reduzieren, ist sehr gut dokumentiert. 3. Der Modulstandard bestimmt nicht, wie Module kompiliert und verknüpft werden, sondern fügt eine klare Semantik hinzu, um zwischen der privaten und der öffentlichen API eines Moduls zu trennen. 4. Das Binärformat von DLLs oder gemeinsam genutzten Objekten wird vom Standard nicht beeinflusst.
Lanoxx
3
"Es besteht keine wirkliche Notwendigkeit, da die Trennung der Quellen zu h / cpp den Job erledigt", ebenso wie das Kettensägen eines injizierten Fingers, aber das bedeutet nicht, dass es kein Problem ist! Schauen Sie sich einfach .NET oder eine andere neuere Sprache an. Wenn Sie die Dinge auf eine bestimmte Weise bestellen müssen, damit sie tatsächlich sichtbar sind oder korrekt erstellt werden, ist dies eine enorme Belastung, die wegfallen muss.
Paulm