blob: 8e52e82a323e44cba44e17a4f8b90a331f36c664 [file] [log] [blame]
Comparing Python to Other Languages
-----------------------------------
These comparisons are a personal view. Comments are requested.
--Guido van Rossum <guido@python.org>
Python is often compared to other interpreted languages such as Java,
JavaScript, Perl, Tcl, or Smalltalk. Comparisons to C++, Common Lisp
and Scheme can also be enlightening. In this section I will briefly
compare Python to each of these languages. These comparisons
concentrate on language issues only. In practice, the choice of a
programming language is often dictated by other real-world constraints
such as cost, availability, training, and prior investment, or even
emotional attachment. Since these aspects are highly variable, it
seems a waste of time to consider them much for this publication.
Java
Python programs are generally expected to run slower than Java
programs, but they also take much less time to develop. Python
programs are typically 3-5 times shorter than equivalent Java
programs. This difference can be attributed to Python's built-in
high-level data types and its dynamic typing. For example, a Python
programmer wastes no time declaring the types of arguments or
variables, and Python's powerful polymorphic list and dictionary
types, for which rich syntactic support is built straight into the
language, find a use in almost every Python program. Because of the
run-time typing, Python's run time must work harder than Java's. For
example, when evaluating the expression a+b, it must first inspect the
objects a and b to find out their type, which is not known at compile
time. It then invokes the appropriate addition operation, which may be
an overloaded user-defined method. Java, on the other hand, can
perform an efficient integer or floating point addition, but requires
variable declarations for a and b, and does not allow overloading of
the + operator for instances of user-defined classes.
For these reasons, Python is much better suited as a "glue" language,
while Java is better characterized as a low-level implementation
language. In fact, the two together make an excellent
combination. Components can be developed in Java and combined to form
applications in Python; Python can also be used to prototype
components until their design can be "hardened" in a Java
implementation. To support this type of development, a Python
implementation written in Java is under development, which allows
calling Python code from Java and vice versa. In this implementation,
Python source code is translated to Java bytecode (with help from a
run-time library to support Python's dynamic semantics).
Javascript
Python's "object-based" subset is roughly equivalent to
JavaScript. Like JavaScript (and unlike Java), Python supports a
programming style that uses simple functions and variables without
engaging in class definitions. However, for JavaScript, that's all
there is. Python, on the other hand, supports writing much larger
programs and better code reuse through a true object-oriented
programming style, where classes and inheritance play an important
role.
Perl
Python and Perl come from a similar background (Unix scripting, which
both have long outgrown), and sport many similar features, but have a
different philosophy. Perl emphasizes support for common
application-oriented tasks, e.g. by having built-in regular
expressions, file scanning and report generating features. Python
emphasizes support for common programming methodologies such as data
structure design and object-oriented programming, and encourages
programmers to write readable (and thus maintainable) code by
providing an elegant but not overly cryptic notation. As a
consequence, Python comes close to Perl but rarely beats it in its
original application domain; however Python has an applicability well
beyond Perl's niche.
Tcl
Like Python, Tcl is usable as an application extension language, as
well as a stand-alone programming language. However, Tcl, which
traditionally stores all data as strings, is weak on data structures,
and executes typical code much slower than Python. Tcl also lacks
features needed for writing large programs, such as modular
namespaces. Thus, while a "typical" large application using Tcl
usually contains Tcl extensions written in C or C++ that are specific
to that application, an equivalent Python application can often be
written in "pure Python". Of course, pure Python development is much
quicker than having to write and debug a C or C++ component. It has
been said that Tcl's one redeeming quality is the Tk toolkit. Python
has adopted an interface to Tk as its standard GUI component library.
Smalltalk
Perhaps the biggest difference between Python and Smalltalk is
Python's more "mainstream" syntax, which gives it a leg up on
programmer training. Like Smalltalk, Python has dynamic typing and
binding, and everything in Python is an object. However, Python
distinguishes built-in object types from user-defined classes, and
currently doesn't allow inheritance from built-in types. Smalltalk's
standard library of collection data types is more refined, while
Python's library has more facilities for dealing with Internet and WWW
realities such as email, HTML and FTP. Python has a different
philosophy regarding the development environment and distribution of
code. Where Smalltalk traditionally has a monolithic "system image"
which comprises both the environment and the user's program, Python
stores both standard modules and user modules in individual files
which can easily be rearranged or distributed outside the system. One
consequence is that there is more than one option for attaching a
Graphical User Interface (GUI) to a Python program, since the GUI is
not built into the system.
C++
Almost everything said for Java also applies for C++, just more so:
where Python code is typically 3-5 times shorter than equivalent Java
code, it is often 5-10 times shorter than equivalent C++ code!
Anecdotal evidence suggests that one Python programmer can finish in
two months what two C++ programmers can't complete in a year. Python
shines as a glue language, used to combine components written in C++.
Common Lisp and Scheme
These languages are close to Python in their dynamic semantics, but so
different in their approach to syntax that a comparison becomes almost
a religious argument: is Lisp's lack of syntax an advantage or a
disadvantage? It should be noted that Python has introspective
capabilities similar to those of Lisp, and Python programs can
construct and execute program fragments on the fly. Usually,
real-world properties are decisive: Common Lisp is big (in every
sense), and the Scheme world is fragmented between many incompatible
versions, where Python has a single, free, compact implementation.