Frage

Sowohl Macro Expansion & Code-Generierung hat Vor-und Nachteile. Was ist Ihr Lieblings-Ansatz und warum? Wann sollten wir einen über den anderen wählen? Bitte raten Sie freundlich. Vielen Dank!

Makro Expansion kann sehr praktisch und nützlich sein: http://dtemplatelib.sourceforge.net/table.htm

vs

Während Codegenerierung gibt Ihnen viele schönen Code: http://code.google.com/p/protobuf/ http://incubator.apache.org/thrift/

War es hilfreich?

Lösung

Es ist ein Kompromiss. Lassen Sie mich ein Beispiel geben. Ich stolperte über die Technik der Differential Ausführung um 1985, und ich denke, es ist eine wirklich gute Werkzeug für die Programmierung von Benutzeroberflächen. Grundsätzlich dauert es einfach strukturierte Programme wie folgt aus:

void Foo(..args..){
  x = y;
  if (..some test..){
    Bar(arg1, ...)
  }
  while(..another test..){
    ...
  }
  ...
}

und mucks mit der Steuerstruktur wie folgt aus:

void deFoo(..args..){
  if (mode & 1){x = y;}
  {int svmode = mode; if (deIf(..some test..)){
    deBar(((mode & 1) arg1 : 0), ...)
  } mode = svmode;}
  {int svmode = mode; while(deIf(..another test..)){
    ...
  } mode = svmode;}
  ...
}

Nun, eine wirklich gute Möglichkeit, dies zu tun wäre, einen Parser für C oder was auch immer die Basissprache ist, zu schreiben gewesen und dann zu Fuß des Parse-Baumes, die Erzeugung des Code, den ich will. (Wenn ich es in Lisp hat, dass ein Teil war einfach.)

Aber wer will einen Parser für C, C ++, oder was auch immer schreiben?

Also, statt, ich Makros nur schreiben, so dass ich den Code so schreiben kann:

void deFoo(..args..){
  PROTECT(x = y);
  IF(..some test..)
    deBar(PROTECT(arg1), ...)
  END
  WHILE(..another test..)
    ...
  END
  ...
}

Allerdings, wenn ich dies in C # zu tun, jemand in ihrer Weisheit beschlossen Makros war schlecht, und ich möchte nicht, einen C # Parser schreiben, also ich muß von Hand der Code-Generierung zu tun. Dies ist ein königlicher Schmerz, aber es ist immer noch wert im Vergleich zu der üblichen Art und Weise, diese Dinge der Codierung.

Andere Tipps

c ++ Ich ziehe es entweder Metaprogrammierung oder Code-Generierung über Makros, aber Makros haben noch ihre Verwendung.

Das Beispiel, das Sie mit dbtemplatelib gegeben haben könnte mit c abgedeckt werden ++ 0x Variadische Vorlagen , mit zusätzlichen Vorteilen wie Typ Überprüfung etc.

In C oder C ++, Makroerweiterung ist notorisch schwierig zu debuggen. Auf der anderen Seite, ist ein Code-Generator Schreiben einfacher zu debuggen, weil es an sich schon ein separates Programm ist.

Sie sollten jedoch darüber im Klaren sein, dass dies lediglich eine Beschränkung des C-Präprozessor. Zum Beispiel in der Lisp-Familie von Sprachen, Makroerweiterung ist Code-Generierung, sie sind genau das Gleiche. So schreiben Sie einen Makro, schreiben Sie ein Programm (in Lisp) S-Expression Eingang in einer anderen S-Ausdruck zu transformieren, die dann an die Compiler übergeben wird.

Beide haben ihre Probleme. Im Gegensatz zu Makros kann Code-Generierung erzeugt lesbar und debug (ist das auch nur ein Wort?) Code, aber es ist weniger flexibel und schwieriger zu ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top