[Python-3000] Python/C++ question (original) (raw)

Guido van Rossum guido at python.org
Thu Aug 10 01🔞02 CEST 2006


On 8/9/06, Talin <talin at acm.org> wrote:

A while back someone proposed switching to C++ as the implementation language for CPython, and the response was that this would make ABI compatibility too difficult, since the different C++ compilers don't have a common way to represent things like vtables and such.

However, I was thinking - if you remove all of the ABI-breaking features of C++, such as virtual functions, name mangling, RTTI, exceptions, and so on, its still a pretty nice language compared to C - you still have things like namespaces, constructors/destructors (especially nice for stack-local objects), overloadable type conversion, automatic upcasting/downcasting, references, plus you don't have to keep repeating the word 'struct' everywhere. Think how much cleaner the Python source would be if just one C++ feature - namespaces - could be used. Imagine being able to put all of your enumeration values in their own namespace, instead of mixing them in with all the other global symbols. Think of the gazillions of cast operators you could get rid of if you could assign from PyString* to PyObject*, without having to explicitly cast between pointer types. My question is, however - would this even work? That is, if you wrapped all the source files in 'extern "C"', turned off the exception and RTTI compiler switches, suppressed the use of the C++ runtime libs and forbade use of the word 'virtual', would that effectively avoid the ABI compatibility issues? Would you be able to produce, on all supported platforms, a binary executable that was interoperable with ones produced by straight C? I actually have a personal motivation in asking this - it has been so many years since I've written in C, that I've actually forgotten how. Despite the fact that my very first C program, written in 1982, was a C compiler, today I find writing C programs a considerable challenge, because I don't remember exactly where the dividing line between C and C++ is - and I will either end up accidentally using a C++-specific language feature, or worse, I'll unconsciously avoid a valid C language feature because I don't remember whether it's C++ specific or not. (For example, I don't remember whether its valid to define an enumeration within a struct, which is something that I do all the time in C++.)

For the majority of Python developers it's probably the other way around. It's been 15 years since I wrote C++, and unlike C, that language has changed a lot since then...

It would be a complete rewrite; I prefer doing a gradual transmogrification of the current codebase into Py3k rather than starting from scratch (read Joel Spolsky on why).

-- --Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-3000 mailing list