| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
| <html> |
| <head> |
| |
| |
| <title>Preface</title> |
| <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> |
| |
| <link href="theme/style.css" rel="stylesheet" type="text/css"> |
| </head> |
| |
| |
| <body background="theme/bkd.gif" text="#000000"> |
| |
| <table background="theme/bkd2.gif" border="0" cellspacing="2" width="100%"> |
| |
| <tbody> |
| <tr> |
| |
| <td width="21"> |
| <h1></h1> |
| </td> |
| |
| <td width="885"> <font face="Verdana, Arial, Helvetica, sans-serif"><b><font size="6">Preface</font></b></font></td> |
| |
| <td width="96"><a href="http://www.boost.org"><img src="theme/wave.gif" align="right" border="0" height="68" width="93"></a></td> |
| |
| </tr> |
| |
| </tbody> |
| </table> |
| |
| <br> |
| |
| <table border="0"> |
| |
| <tbody> |
| <tr> |
| |
| <td width="10"></td> |
| |
| <td width="30"><a href="../index.html"><img src="theme/u_arr.gif" border="0"></a></td> |
| |
| <td width="30"><img src="theme/l_arr_disabled.gif" border="0" height="19" width="20"></td> |
| |
| <td width="30"><a href="introduction.html"><img src="theme/r_arr.gif" border="0"></a></td> |
| |
| </tr> |
| |
| </tbody> |
| </table> |
| |
| <p>During the last time many new features have been developed as additions to the <tt>Spirit</tt> |
| <a href="references.html#spirit">[4]</a> parser construction framework and we |
| felt more and more, that it would be very helpful, to have a 'real world' example, |
| which could be used as a sandbox for testing the usability of certain features. |
| Additionally a recent discussion on the Boost mailing list showed the widespread |
| interest of developers to have a modern, open source C++ preprocessor library |
| to play with. So we had the idea to implement a C++ preprocessor to fit |
| this needs - <tt>Wave</tt> was born.</p> |
| |
| <p align="justify">The <tt>Wave</tt> C++ preprocessor library uses the <a href="http://www.boost.org/"> |
| </a> <tt>Spirit<a href="references.html#spirit">[4]</a></tt> parser construction |
| library to implement a C++ lexer with ISO/ANSI Standards conformant preprocessing |
| capabilities. It exposes an iterator interface, which returns the current preprocessed |
| token from the input stream. This preprocessed token is generated on the fly |
| while iterating over the preprocessor iterator sequence (in the terminology |
| of the STL these iterators are forward iterators). </p> |
| |
| <p align="justify"> The C++ preprocessor is a macro processor that under normal |
| circumstances is used automatically by your C++ compiler to transform your program |
| before actual compilation. It is called a macro processor because it allows |
| to define macros, which are brief abbreviations for longer constructs. The |
| C++ preprocessor provides four separate facilities that you can use as you see |
| fit: </p> |
| |
| <blockquote> |
| |
| <p><b><img src="theme/bullet.gif" id="IMG1" height="13" width="13"> </b>Inclusion |
| of header files<br> |
| |
| <b><img src="theme/bullet.gif" id="IMG2" height="13" width="13"> </b>Macro |
| expansion<br> |
| |
| <b><img src="theme/bullet.gif" id="IMG3" height="13" width="13"> </b>Conditional |
| compilation<br> |
| |
| <b><img src="theme/bullet.gif" id="IMG4" height="13" width="13"> </b>Line |
| control</p> |
| |
| </blockquote> |
| |
| <p>These features are greatly underestimated today, even more, the preprocessor |
| has been frowned on for so long that its usage just hasn't been effectively |
| pushed until the Boost preprocessor library <a href="references.html#pp_lib">[7]</a> |
| came into being a few years ago. Only today we begin to understand, that preprocessor |
| generative metaprogramming combined with template metaprogramming in C++ is |
| by far one of the most powerful compile-time reflection/metaprogramming facilities |
| that any language has ever supported.</p> |
| |
| <p>The C++ Standard <a href="http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC%2B14882%2D1998">[2] </a> |
| was adopted back in 1998, but there is still no (known to me) |
| commercial C++ compiler, which has a bugfree implementation of the |
| rather simple preprocessor requirements mandated therein. This may be a |
| result of the mentioned underestimation or even banning of the |
| preprocessor from good programming style during the last few years or |
| may stem from the somewhat awkward standardese dialect of English used |
| to describe it. Two open source projects are exceptions of this: gcc |
| and Clang (a subproject of LLVM), both providing preprocessors with |
| very good standards conformance. </p> |
| |
| <p align="justify">So the main goals for the <tt>Wave</tt> project are:</p> |
| |
| <blockquote> |
| |
| <p><b><img src="theme/bullet.gif" id="IMG5" height="13" width="13"> </b>full |
| conformance with the C++ standard (ISO/IEC 14882:1998) <a href="references.html#iso_cpp">[1]</a> |
| and with the C99 standard (INCITS/ISO/IEC 9899:1999) <a href="references.html#iso_c">[2]</a><br> |
| |
| <b><img src="theme/bullet.gif" height="13" width="13"> </b>usage of <tt>Spirit<a href="references.html#spirit">[4]</a></tt> |
| for the parsing parts of the game (certainly :-)<br> |
| |
| <b><img src="theme/bullet.gif" height="13" width="13"> </b>maximal usage |
| of STL and/or <tt>Boost</tt> libraries (for compactness and maintainability)<br> |
| |
| <b><img src="theme/bullet.gif" height="13" width="13"> </b>straightforward |
| extendability for the implementation of additional features<br> |
| |
| <b><img src="theme/bullet.gif" height="13" width="13"> </b>building a |
| flexible library for different C++ lexing and preprocessing needs</p> |
| |
| </blockquote> |
| |
| <p>At the first steps it is not planned to make a very high performance |
| or very small C++ preprocessor. If you are looking for these objectives |
| you probably have to look at other places. Although our C++ |
| preprocessor iterator works as expected and is usable as a reference |
| implementation, for instance for testing of other preprocessor oriented |
| libraries as the Boost Preprocessor library <a href="references.html#pp_lib">[7]</a> et.al. Nevertheless recent work has lead to surprising performance enhancements (if compared |
| with earlier versions). Wave is still somewhat slower as for instance EDG |
| based preprocessors (Intel, Comeau) on simple input files, however, as |
| complexity increases, time dilates expontentially on EDG. Preprocessing time |
| dilates linearly under Wave, which causes it to easily outperform EDG based |
| preprocessors when complexity increases.</p> |
| |
| <p>As tests showed, the <tt>Wave</tt> library is very conformant to the C++ Standard, |
| such that it compiles several strict conformant macro definitions, which are |
| not even compilable with EDG based preprocessors (i.e. Comeau or Intel). </p> |
| |
| <table border="0"> |
| |
| <tbody> |
| <tr> |
| |
| <td width="10"></td> |
| |
| <td width="30"><a href="../index.html"><img src="theme/u_arr.gif" border="0"></a></td> |
| |
| <td width="30"><img src="theme/l_arr_disabled.gif" border="0" height="19" width="20"></td> |
| |
| <td width="30"><a href="introduction.html"><img src="theme/r_arr.gif" border="0"></a></td> |
| |
| </tr> |
| |
| </tbody> |
| </table> |
| |
| <hr size="1"> |
| <p class="copyright">Copyright © 2003-2010 Hartmut Kaiser<br> |
| |
| <br> |
| |
| <font size="2">Distributed under the Boost Software License, Version |
| 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
| http://www.boost.org/LICENSE_1_0.txt) </font> </p> |
| |
| <span class="updated"></span> |
| <p class="copyright"><span class="updated">Last updated: |
| <!-- #BeginDate format:fcAm1m -->Sunday, December 2, 2007 19:03<!-- #EndDate --> |
| </span></p> |
| |
| </body> |
| </html> |