summaryrefslogtreecommitdiff
path: root/FUTURE
diff options
context:
space:
mode:
Diffstat (limited to 'FUTURE')
-rw-r--r--FUTURE335
1 files changed, 335 insertions, 0 deletions
diff --git a/FUTURE b/FUTURE
new file mode 100644
index 0000000..997de9b
--- /dev/null
+++ b/FUTURE
@@ -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
+