Why I Promote Python

by Paul Prescod

It's easy to understand why I use Python. It's flexible, easy, and powerful in a way that cannot be matched by other mainstream languages. If you use Python, then you know what I am talking about. If you do not, you will eventually; and then you'll know what I am talking about. I've asked myself why I promote Python so much. I have never been such a vocal advocate for other languages I've liked--even XML, my bread and butter. There's a selfish component and an ethical one.

Selfishly speaking, I want to live in a world where most software is written in a decent programming language. Java is decent, and I don't mind it. Therefore I don't begrudge its success. But I consider it a proprietary language surrounded by a re-invent-the-wheel culture.

I do not consider Perl decent for reasons that will become clear, and I do hope that Python takes most of its popularity. I refuse to become proficient in "indecent" languages. That means that much of the software out there in the "open-source" world is in fact closed to me. In an emergency, I could hold my nose and dive in, but I would not do so to scratch the proverbial itch.

For more information on open-source technologies, visit O'Reilly's Open Source Resource Center. You'll find there links to books on the increasingly popular Python programming language, books like Learning Python.

My primary criteria for decency--whether in programming languages, markup languages, or graphical systems--is scalability. By scalability, I mean two things: the ability to scale from easy to difficult problems and the ability for beginners and experts to be comfortable.

Consider an episode from my own life. I was around nine or ten years old and my father taught me how to do things on our Apple II using Basic. My dad was always much more of a hardware rather than software guy. Whenever I would tell him I wanted to do something more complex than we could find in the Basic manual, he would say, "You have to do that in assembly language, and assembly is too hard for a kid." He didn't mean to shut me down but he also didn't know 6502 assembly language himself and was not in much of a position to teach it to me.

The effect, though, was that my travel down the path to programmer enlightenment was delayed for several years. The Basic dialect was (like today's "TCL") designed for beginners and had many arbitrary limitations built in. Assembly was designed for programmers and made no concessions to usability, intuitiveness, or learning. Neither was scalable.

Today we have Perl, TCL, and C++: all non-scalable in their own way. C++ and Perl only make sense if you have a particular programming background. If you did not come from the "Unix tradition", many of their conventions and idioms seem alien.

Consider the modern nine-year-old boy trying to configure and extend his Linux system. He would find that many string-processing programs are inexplicably written in C: one of a very few languages that does not even have a first-class string data type! Most of the GUIs would be written in C++, despite the inflexibility of the language. Many other programs are written in a variety of illegible dialects within the family of languages called "Perl".

C and assembly have historical reasons for being so low-level and thus difficult to use and learn. It makes sense sometimes to trade usability for performance. C++ and Perl have no such excuse. They are cryptic and complex because of an overemphasis on backwards compatibility and plain, old-fashioned poor design.

Where languages like Basic, TCL, and Logo were artificially limiting, C++ and Perl are, in my opinion, artificially complex. Obviously there are many smart people out there preparing to send me an email claiming that the complexity "buys" them something valuable. I think that the cost is high.

When you use some wickedly cool and obscure feature of the language, you reduce the number of potential readers of your code. Ideally the language would encourage you to concentrate your creativity on high-level design. Choosing algorithms and data structures is hard enough. Keeping all of the library functions in your head is also tricky. On top of all of this, programmers should not need to decipher obscure core language features. Why make life harder for those who will follow you?

Personally, I cannot stand this design aesthetic, because it divides the world into "programmers" and "non-programmers". My dream is a world wherein all but the very lowest levels and tightest loops of programs are written in a language that is so simple that it can be taught in primary school as a first language; where every word-processor user who can write a macro can at least try to dive into their word processor's source code to fix a bug, because the macro language is also the implementation language.

We know that such a language exists. Python is easy enough to be a first language and powerful enough to write object databases (like ZODB) and in-memory relational database engines (like Gadfly). And yet, you do not have to come to grips with a complex and difficult type system to use it, and there are few magical variables and functions. I believe it to be as flexible as Smalltalk and as feature-full as Perl; and yet it is as easy as Basic or TCL.

Python's inventor is involved in a project to make the Python language and tools accessible to children. The project is called Computer Programming for Everybody (CP4E). I like that title enough to consider it the name of a movement, a goal, a dream: Computer Programming for Everybody (CP4E).

I am not entirely naive: Computer programming is hard. It is precisely because it is hard that there is no excuse for adding artificial obstacles like modern languages rooted in the idioms of dead languages, and adding syntaxes so complex that humans cannot keep them in their head.

Usability to "newbies" is only half of Python's importance. The second half is Python's ability to scale to real-world programs. Like many other dynamic systems, Python allows layers of sophisticated abstractions to be built in concise, understandable ways. In my opinion, this is precisely what I require for "programming in the large": the ability to build layers of abstraction without losing track of the details.

So why is most of the world's cool new software being written in C and now Java? Partially because people do not know about Python, which I am helping to change through advocacy. Partially it is because these languages are more efficient than Python. I am also helping to change this through support of compiler technologies.

Perl is a little bit more efficient than Python, but not enough for me to care; and very little of its efficiency is inherently a property of the language. Rather, it is a result of Perl having been around long enough that many programmers have improved its internals. If they put the same effort into Python, they would achieve the same results. (And we will soon.) In fact there are now multiple, independent Python implementations, all pursuing radically different optimization and runtime strategies.

I want to briefly address another class of languages. Languages like Lisp and Smalltalk both tried, in their day, to be "for everybody." Unfortunately, they have been rejected by programmers for years; and I do not see that changing.

Smalltalk merged the dynamic nature of Lisp with the modeling capabilities of Simula. Python merges many of Smalltalk's ideas with a syntax that is more likely to appeal to C, C++ and Java programmers. Computer Programming for Everybody must include them also!

A critical reader might wonder whether I am promoting a world in which there is only one programming language. I admit that I am in favor of systems built with fewer languages. The current situation is too costly. There are programs written in half a dozen different languages on your average Linux system. This causes massive code duplication, data interoperability headaches, and an artificially large learning curve.

On the other hand, I can see a role for small, focused languages like ANSI C for speed, Python for ease and abstraction, Web template languages for Web delivery, and so forth.

Python may or may not be the language that brings about a Computer-Programming-for-Everybody world. But it is currently the best contender. When there is a better horse, I'll switch my bet. The hard part for a competitive system is building a sophisticated class library; but if the language is good enough, it will find early adherents that will do the work, as Python has.

A hint to would-be language developers: If your language runs on the JVM as JPython does, you get the benefit of the Java library "for free". Being Open Source is also a necessity today.

Power, elegance, simplicity, equality, liberty, fraternity: This is heady stuff, and it explains the evangelical tone of some Python programmers. I promote Python because doing so is the right thing.

You can respond to Paul at pyguy@prescod.net

For more information on Open Source technologies, visit O'Reilly's Open Source Resource Center.

You'll find there links to books on the increasingly popular Python programming language, books like Learning Python, Programming Python, the Python Pocket Reference, and Python Programming on Win32.