diff options
Diffstat (limited to 'FUTURE')
| -rw-r--r-- | FUTURE | 335 |
1 files changed, 335 insertions, 0 deletions
@@ -0,0 +1,335 @@ +SWIG-1.3.12, SWIG 2.0, and Beyond +================================= + +With the release of SWIG-1.3.12, I thought I'd take a few moments of +everyone's time to talk about the past, the present, and the future of +SWIG development. I'm really quite excited about the current release +because I think it represents a huge turning point in SWIG's +development. Furthermore, it is only the beginning of bigger and +better things to come. However, we definitely need your help. + +To put a little perspective on the discussion, I'd start with a few +development statistics. In the last 12 months, there have been over +300 entries added to the CHANGES log and over 4000 CVS commits. +Although that may not sound like a lot compared to a huge software +project, it is significant in the context of SWIG. As a point of +comparison, there has been more SWIG development this year than in any +other year of the project and more than in the previous three years +combined. This even includes the first few years of development in +which there was also a lot of activity. Furthermore, many of the +recent changes have been extremely non-trivial (e.g., templates, +namespaces, type system, operators, etc.). As a result, SWIG is more +capable than I ever imagined possible. + +Regrettably, I must admit that I've been a little negligent in +discussing the roadmap for where I thought this flurry of SWIG +development was actually headed. In part, this is because I've been +buried in work. However, the real reason is that I didn't really know +where we were going---except that in a time far far far away in the +future, we might arrive at some kind of "stable" release with a +version number other than "1.3.x". Needless to say, that's not a very +compelling story. + +That said, I've spent a lot of time thinking about SWIG and trying to +wrap my brain around it. Specifically, just what is (or should be) +the primary focus of this project and what are we really trying to do? +That's what the rest of this message is about. + +SWIG Prehistory +--------------- +The first version of SWIG was written in 1995. The original system +was developed to help with some software wrapping problems I +encountered while writing molecular dynamics software at Los +Alamos. Later that year, I became interested in extending the wrapper +generator to support other scripting languages so it was rewritten in +C++ and modified with multiple backends (Tcl, Perl, and Guile). This +led to a first public release in February, 1996. Feedback from this +release led to a series of enhancements and the release of SWIG 1.0 in +September 1996. Throughout this process, my intent was to create a +tool that I would want to use---I never viewed the project as an +CS experiment in programming languages or software engineering. + +SWIG 1.1 +-------- +SWIG-1.1 (June, 1997) represented a series of enhancements that were +added in response to feedback at conferences and from users. Shadow +classes, exception handling, typemaps, and a number of more useful +features were added. However, the overall structure of the system was +relatively unchanged from the initial version. Following the release +of 1.1, a series of minor patch releases were made. This resulted in +the release of SWIG-1.1p5 in February, 1998. Unfortunately, this +release would remain the last "stable" release for quite a long +time---in fact, it is still listed as the last "stable" release on the +SWIG web page! + +SWIG Hell +--------- +Even during the development of SWIG-1.1, it was clear that the whole +design of the system was deeply flawed. The implementation was a mess +and the C/C++ support was full of holes and nasty corner cases. +Furthermore, there was no unifying principle that tied all of the +different SWIG directives together. Not only that, fixing these +problems appeared to be nothing short of impossible---requiring a +total ground-up rewrite at best. The only redeeming quality was that +the system basically worked "well enough," it was extensively +documented, and its flaws mostly known. People could use it and there +were work-arounds for most common problems. + +To deal with the design problem, there were at least four attempts to +completely rewrite SWIG, some of which were attempted in parallel with +the work on SWIG-1.1. Unfortunately, none of these were ever +completed. The primary problem was a strong "second system" effect and +a desire to make SWIG do everything that one might conceivably want to +do with a wrapper generator (somehow). Clearly, this was a recipe for +disaster. In fact, all such attempts to rewrite SWIG were eventually +abandoned several years ago. In hindsight, I think the real problem +was that these rewrite efforts focused far too much attention on +implementation technique rather than principles. In short, the +failure of these efforts was due to a lack of clarity in understanding +how SWIG ought to work (regardless of how it was actually +implemented). + +SWIG Restart (1.3a1-1.3a5) +-------------------------- +Having languished for several years, the SWIG1.1p5 release had a +growing pile of maintenance issues. It didn't work for newer versions +of certain language modules and a lot of minor bug reports and feature +requests had been building up. With a lot of help from Loic Dachary and +Thien-Thi Nguyen, we put together the 1.3a1 release (February, +2000). This was mostly a bug fix release to 1.1p5 except that the +preprocessor module from SWIG1.2 was added and a lot of minor +enhancements were added. + +For the next six months, a massive effort was made to rewrite all of +SWIG's internal data structures (strings, lists, hashes, etc.). This +work was all going on underneath the covers while we tried to keep +SWIG in an operational state. The primary focus of this work was +really one of cleanup. Having given up on a total rewrite, perhaps +we could settle with making the implementation incrementally better +than before. In addition this, Matthias Koppe jumped on board to +reimplement the Guile module and to make other improvements to the system. + +An important aspect of these releases was that many parts of the +system not directly related to wrapper code generation were removed. +This included the documentation system and Objective-C support. These +were not removed because they weren't useful. Instead, the +documentation system was removed because it accounted for nearly half +of the special SWIG directives, yet had no direct bearing on what SWIG +actually did. Obective-C support was removed because it was tangled +with C++ support in a way that was very difficult to understand and +maintain. The removal of these features was seen as a way to vastly +simplify cleanup--and to buy some time where we could rethink their +role in a future release. + +SWIG Redux (1.3.6-1.3.11) +------------------------- +This work, started in February 2001, is the beginning of the current +SWIG implementation. With the help of William Fulton, Matthias Koppe, +Lyle Johnson, Luigi Ballabio, Jason Stewart, Richard Palmer, Sam +Liddicot, and others, this work can best be described as the wholesale +destruction of everything remaining from SWIG-1.1. The language +module API, type system, the parser, numerous SWIG directives, and +SWIG library files---all destroyed or rewritten. Not only that, we +started introducing significant incompatibilities with +SWIG-1.1---mostly in an effort to correct past wrongs and get +ourselves out of the tangled mess of earlier versions. A huge number +of long-standing bugs and difficult feature requests have also been +resolved. + +The general goal of this development could best be described as an +attempt to reduce SWIG to an easily described set of general "ideas" +about how it should operate. Special SWIG directives have been +eliminated or combined with others. Different parts of the system have +been better integrated. Features not directly related to wrapper code +generation have been removed and the system has become more +focused. Changes in internal data structures and APIs have allowed +SWIG to capture more information from interface files and to resolve +hard corner cases. More often than not, these are things that you +never notice unless you are an old user and you suddenly realize that +a problem you had several years back has disappeared. + +Along with the destruction of old code, this work has quietly +introduced a new core--the most significant features of which are a +new C++ type system and multi-pass compilation. More importantly, +this work has really tried to provide a more principled foundation for +future SWIG development. However, just what is this "more principled +foundation?" + +Convergence (1.3.12) +-------------------- +With the upcoming 1.3.12 release, SWIG is about to take a big leap +forward. Almost all of this is due to one realization---that almost +every hard problem in past SWIG releases has been directly related to +errors and limitations in its type system. Types are the key to +understanding the structure of C and C++ code. They are at the heart +of understanding advanced language features like namespaces, nested +classes, and templates. They are directly related to the data +marshalling that occurs in wrappers. Not only that, they interact +with nearly every SWIG directive. A proper type system *is* the +necessary foundation for moving SWIG forward. + +To be honest, I don't think that the emphasis on types is entirely +obvious. In fact, a great deal of work in past SWIG rewrites has +focused on the problem of C++ parsing. For instance, modifying the +parser to handle more advanced C++ code or representing parse trees as +XML. Furthermore, if one looks at the SWIG mailing list, you can find +a *lot* of messages related to issues of C++ parsing whereas almost no +one ever talks about types (well, other than typemaps). Even other +wrapper generation tools seems to spend a lot of time dealing with the +parsing issue. Although parsing is clearly important, I don't think it +has ever been the real problem in SWIG. This is because even though a +parser can tell you what's in a header file, it doesn't tell you +anything about how the different pieces of the system behave or how +they might interact. To do that, you need to do a lot more than just +parsing--and that's really the whole point. + +Although earlier 1.3 releases have made big improvements to the type +system, SWIG-1.3.12 is the first release that really tries to tackle +the type-system issue in a major way. We have patched nearly all +remaining holes in the type system and we have added full support for +C++ namespaces. Not only that, we have completely reimplemented C++ +template support in a way that supports templates, member templates, +and template specialization. Luigi and I are currently using this to +work on proper SWIG library support for parts of the C++ standard +library and the Standard Template Library (STL). Although some crusty +C programmers (present company excepted), might balk at such apparent +insanity, this work has impacted all parts of SWIG at all levels. +Even a variety of subtle errors in C support have been fixed by this +work. + +In addition to the type system work, SWIG-1.3.12 contains continued +reduction in the implementation. Directives have been removed, +refined, renamed, or consolidated. We're still narrowing the focus of +the system and working towards some kind of convergence. "Convergence +to what?!?", you ask. + +So, what is SWIG? +----------------- +In a nutshell, SWIG is a C/C++ declaration compiler that generates +wrapper code (okay, so you knew that much). However, to really +understand what SWIG is doing and where SWIG-1.3.x is headed, it is +useful to know that the whole system is essentially being built around +three extensions to the C++ type system: + + - Typemaps. Typemaps are rules that define the process by which + data is converted between languages. They are fully integrated + with the C++ type system and they are applied using a type-based + pattern matching mechanism. All data conversion SWIG is + defined by typemaps and is fully reconfigurable. + + - Declaration annotation. There are special directives that modify + the wrapping behavior of individual declarations. Declarations + can be selectively identified and decorated with arbitrary + attributes that affect wrapper generation. Like typemaps, + declaration matching is fully integrated with the C++ type system. + Almost all SWIG customization directives are a form of declaration + annotation. + + - Class extension. The ability to extend classes and structures + with new methods/attributes when building wrappers. Classes + are part of the type system so class extension is naturally + integrated with the C++ type system as well (big surprise). + +And that's it--this is the end-game of SWIG-1.3.x development. When +stabilized and documented it will become SWIG-2.0. + +The Bigger Picture +------------------ +I really want to emphasize that all of this work is part of a much +bigger picture. SWIG is used by a surprising number of people in +industry, government, and academia. It's used to build systems used +by millions of people every day. It has even shown up in video games +and other unlikely settings. Although SWIG doesn't have the same +visibility as many large software projects, over 12000 people have +downloaded SWIG-1.3.11 in the last 4 months. Clearly someone is using +it for something! Because of this, I think it is important for us to +work on moving SWIG towards a more solid foundation. Doing so will +give the system more credibility and long term viability---and it will +be a lot more fun to use! + +It's also worth noting that there are some rather interesting CS +connections at work here. Extensions to the type system and typemaps +have some interesting relations to work in programming languages. The +SWIG declaration annotation system and class extension feature seem +oddly similar to work in the emerging area of Aspect Oriented +Programming (AOP). There are undoubtedly connections to other areas +of software engineering and architecture. + +The key point is that SWIG isn't going to connect to anything if +no-one can quite describe what it is or how it works. + +SWIG-2.0 and the Future +----------------------- +SWIG-1.3.12 still represents work in progress. There are bugs, the +documentation is still incomplete, and there are parts of the +implementation that are rather ugly. We are also still working out a +few very hard problems like nested classes, callback functions, and +overloading. A few old features are still missing (Objective-C, +documentation). However, I believe the end of the 1.3.x series is +near and achievable. + +Over the summer, a few more 1.3.x releases may appear but the current +plan is to aim for a SWIG-2.0 release in September. This release is +really moving towards the design principles described above and will +be a very major enhancement over SWIG-1.1. + +As for the future, a number of interesting ideas are on the table. I +want to add support for contracts/assertions in order to solve some +reliability issues that arise when retrofitting legacy codes with a +scripting interface. Support for an extension language has been +promoted by David Fletcher and was suggested by someone else on the +mailing list rather recently. I have a graduate student working on +SWIG support for the Microsoft CLR and .NET languages. Other work +might include support for alternative parsers, dynamically loadable +language modules, and so forth. However, none of this is really going +to materialize if we can't get the 2.0 release stablized. In fact, I +see SWIG-2.0 as a necessary step for moving forward with these ideas. + +We need your help! Yes, you. +---------------------------- +Nobody gets paid to work on SWIG. The developers are volunteers who +work in their spare time. Furthermore, SWIG is not supported by +investors, a large corporation, or research grants. I work on it +because it's fun, challenging, and useful. I presume that other +developers do the same. However, we only have limited resources and +we need your help. + +- If you like SWIG and find it useful, we need you to try new versions. + We want you to torture test the releases and to break them. We need + bug reports. No bug is too obscure or unimportant---we *will* fix it + if we can. We also need feedback about things that are annoying or + compatibility features that might help in going from 1.1 to 2.0. + +- We need help with documentation, examples, testing, libraries, and all + sorts of other aspects of the release. Even if you have never + written a SWIG language module or dived into its implementation, + there are many ways that you can help. Consider writing a case study + about how you wrapped a big library. Contribute tests that break the + implementation in horrible ways. Help with the web page or FAQ. + +- Most of the SWIG-1.3.x work has focused on the SWIG core. However, as + the 2.0 release nears, we will be working on a variety of enhancements + to the language modules. If there are things you would like to see + in any of the language modules, you need to let us know. + +- There are SWIG language modules that have not made it into the + distribution. Examples that I know about include ITCL, Swig-Eiffel, + and Swig-Lua. We would gladly make these part of the standard SWIG + distribution. However, we also need help to do it. Porting from + SWIG-1.1 is no easy task, but we're more than willing to help. It's + not as bad as one might imagine. + +- We are always looking for developers. Subscribe to + the swig-dev mailing list, details at http://www.swig.org/mail.html, + or send me email to get involved. + +Acknowledgements +---------------- +I'd just like to thank everyone who has submitted feedback, bugs, made +contributions, and put up with my occasional thrashing over the years. +I welcome any comments about this document and how we can make SWIG even +better. + +Dave Beazley (beazley@cs.uchicago.edu) +June 2, 2002 + |
