Ein Compiler erzwingt Regeln der Syntax. Was ich will, ist ein semantischer Compiler oder eine semantische Stufe auf einem normalen Compiler.Kompilierzeit-Durchsetzung von semantischen Regeln
Ich bin mir nicht sicher, der beste Weg, um darüber zu gehen. Einige Sprachen Mai haben direkte Mittel, einige Sprachen können Ihnen erlauben, Dinge wie Vorlagen zu "missbrauchen", schließlich, Clang erlaubt sehr leistungsfähige AST-Generation. Aber mir sind keine Werkzeuge bekannt, die es benutzen, um willkürliche Regeln durchzusetzen.
Ich bin auf der Suche nach einer leistungsstarken statischen, (Kompilierzeit) "Kontext" Checker.
Zum Beispiel: Ich möchte sicherstellen (mit einer Kompilierzeit Warnung oder Fehlermeldung), dass der Rückgabewert einer bestimmten Funktion ausgewertet wurde. Ziemlich einfach, und die hilfsbereiten Leute in den D-Foren haben einen Beispielcode zur Verfügung gestellt.
Aber was ist mit anderen Regeln? Beispiel: Erzeuge einen Fehler, wenn jemand eine Bibliotheksfunktion vor dem Aufruf einer vorausgesetzten Initialisierungsfunktion aufruft. (*) Sicher, du könntest eine Ausnahme spawnen. Aber sollte es keine elegantere Kompilierzeit, Lösung und System geben, wenn das Problem selbst von Natur aus statisch ist? Oder bin ich reduziert auf "Biegen" Sprachen mit exotischen Vorlage Voodoo zu tun, was ich möchte?
(*) Ja, dieser Fall erfordert möglicherweise einen dynamischen Checker. Aber es hängt vielleicht nicht vom Kontext ab. Wie die Verwendung einer Variablen vor der Initialisierung.
Ich habe einige Code-Checker gesehen, die "Best Practices" scannen. Unterstützt einer von ihnen (die kostenlos sind) benutzerdefinierte Regeln? Und sind sie für den Entwicklungsprozess sehr invasiv? Im Idealfall möchte ich nur "benutzerdefinierte semantische Regeln, die Compilerfehler oder Warnungen erzeugen", wenn ich mein Projekt kompiliere.
p.s. Ich bin mir im Voraus bewusst, dass einige Leute verkünden werden, dass "Code Enforcement" in Code-Richtlinien verbannt werden sollte und dass man Programmierer nicht zwingen kann, Regeln zu folgen. Aber ich frage nicht nach Perfektion. Ich fordere den leitenden Entwickler eines Projekts auf, bestimmte Regeln mit einem Compiler durchsetzen zu können, was andere dazu bringen wird, zu bemerken, wenn diese Regeln verletzt werden.
Können Sie uns ein Beispiel geben, was Sie zu tun versuchen? –
Sie sollten Ihre Bibliotheken so entwerfen, dass sie nicht (einfach) missbraucht werden können. Beispiel: Das Anfordern einer Initialisierungsfunktion ist einfach. Sie legen es in einen Konstruktor. Jetzt können Sie die Methode nicht aufrufen, ohne das Objekt zu erstellen, an dem der Initializer bereits ausgeführt wurde.Beispiel: Rückgabewert einer bestimmten Funktion wurde ausgewertet. Schalten Sie alle Compiler-Warnungen ein, der Compiler wird Ihnen sagen, ob Sie etwas falsch gemacht haben. –
Um sicherzustellen, dass der Rückgabewert verwendet wird, wird C++ 17 wahrscheinlich ein "[[nodiscard]]" Attribut haben. – chris