annotate Doc/qua.tex @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents f4d26a0e2975
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
805
bab2bebd35e7 Don't use times by default
Guido van Rossum <guido@python.org>
parents: 669
diff changeset
1 \documentstyle[11pt]{article}
1767
907605320a5f Lots of small corrections by Andrew Kuchling (plus all new rotor docs)
Guido van Rossum <guido@python.org>
parents: 1402
diff changeset
2 \newcommand{\Cpp}{C\protect\raisebox{.18ex}{++}}
669
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 \title{
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 Interactively Testing Remote Servers Using the Python Programming Language
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 }
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 \author{
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 Guido van Rossum \\
2554
f4d26a0e2975 change of address and date
Guido van Rossum <guido@python.org>
parents: 1767
diff changeset
10 Dept. AA, CWI, P.O. Box 94079 \\
1402
af4e271d07b1 * ext.tex: did most of the tedious changes from plain ASCII text to LaTeX.
Guido van Rossum <guido@python.org>
parents: 805
diff changeset
11 1090 GB Amsterdam, The Netherlands \\
669
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 E-mail: {\tt guido@cwi.nl}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 \and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 Jelke de Boer \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 HIO Enschede; P.O.Box 1326 \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 7500 BH Enschede, The Netherlands
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 }
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 \begin{document}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 \maketitle
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 \begin{abstract}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 This paper describes how two tools that were developed quite
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 independently gained in power by a well-designed connection between
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 them. The tools are Python, an interpreted prototyping language, and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 AIL, a Remote Procedure Call stub generator. The context is Amoeba, a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 well-known distributed operating system developed jointly by the Free
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 University and CWI in Amsterdam.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 As a consequence of their integration, both tools have profited:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 Python gained usability when used with Amoeba --- for which it was not
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 specifically developed --- and AIL users now have a powerful
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 interactive tool to test servers and to experiment with new
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 client/server interfaces.%
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 \footnote{
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 An earlier version of this paper was presented at the Spring 1991
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 EurOpen Conference in Troms{\o} under the title ``Linking a Stub
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 Generator (AIL) to a Prototyping Language (Python).''
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 }
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 \end{abstract}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 \section{Introduction}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 Remote Procedure Call (RPC) interfaces, used in distributed systems
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 like Amoeba
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 \cite{Amoeba:IEEE,Amoeba:CACM},
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 have a much more concrete character than local procedure call
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 interfaces in traditional systems. Because clients and servers may
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 run on different machines, with possibly different word size, byte
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 order, etc., much care is needed to describe interfaces exactly and to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 implement them in such a way that they continue to work when a client
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 or server is moved to a different machine. Since machines may fail
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 independently, error handling must also be treated more carefully.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 A common approach to such problems is to use a {\em stub generator}.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 This is a program that takes an interface description and transforms
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 it into functions that must be compiled and linked with client and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 server applications. These functions are called by the application
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 code to take care of details of interfacing to the system's RPC layer,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 to implement transformations between data representations of different
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 machines, to check for errors, etc. They are called `stubs' because
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 they don't actually perform the action that they are called for but
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 only relay the parameters to the server
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 \cite{RPC}.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 Amoeba's stub generator is called AIL, which stands for Amoeba
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 Interface Language
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 \cite{AIL}.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 The first version of AIL generated only C functions, but an explicit
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 goal of AIL's design was {\em retargetability}: it should be possible
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 to add back-ends that generate stubs for different languages from the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 same interface descriptions. Moreover, the stubs generated by
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 different back-ends must be {\em interoperable}: a client written in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 Modula-3, say, should be able to use a server written in C, and vice
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 versa.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 This interoperability is the key to the success of the marriage
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 between AIL and Python. Python is a versatile interpreted language
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 developed by the first author. Originally intended as an alternative
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 for the kind of odd jobs that are traditionally solved by a mixture of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 shell scripts, manually given shell commands, and an occasional ad hoc
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 C program, Python has evolved into a general interactive prototyping
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 language. It has been applied to a wide range of problems, from
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 replacements for large shell scripts to fancy graphics demos and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 multimedia applications.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 One of Python's strengths is the ability for the user to type in some
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 code and immediately run it: no compilation or linking is necessary.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 Interactive performance is further enhanced by Python's concise, clear
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 syntax, its very-high-level data types, and its lack of declarations
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 (which is compensated by run-time type checking). All this makes
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 programming in Python feel like a leisure trip compared to the hard
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 work involved in writing and debugging even a smallish C program.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 It should be clear by now that Python will be the ideal tool to test
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 servers and their interfaces. Especially during the development of a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 complex server, one often needs to generate test requests on an ad hoc
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 basis, to answer questions like ``what happens if request X arrives
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 when the server is in state Y,'' to test the behavior of the server
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 with requests that touch its limitations, to check server responses to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 all sorts of wrong requests, etc. Python's ability to immediately
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 execute `improvised' code makes it a much better tool for this
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 situation than C.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 The link to AIL extends Python with the necessary functionality to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 connect to arbitrary servers, making the server testbed sketched above
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 a reality. Python's high-level data types, general programming
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 features, and system interface ensure that it has all the power and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 flexibility needed for the job.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 One could go even further than this. Current distributed operating
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 systems, based on client-server interaction, all lack a good command
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 language or `shell' to give adequate access to available services.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 Python has considerable potential for becoming such a shell.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 \subsection{Overview of this Paper}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 The rest of this paper contains three major sections and a conclusion.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 First an overview of the Python programming language is given. Next
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 comes a short description of AIL, together with some relevant details
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 about Amoeba. Finally, the design and construction of the link
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 between Python and AIL is described in much detail. The conclusion
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 looks back at the work and points out weaknesses and strengths of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 Python and AIL that were discovered in the process.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 \section{An Overview of Python}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 Python%
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 \footnote{
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 Named after the funny TV show, not the nasty reptile.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 }
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 owes much to ABC
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 \cite{ABC},
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 a language developed at CWI as a programming language for non-expert
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 computer users. Python borrows freely from ABC's syntax and data
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 types, but adds modules, exceptions and classes, extensibility, and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 the ability to call system functions. The concepts of modules,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 exceptions and (to some extent) classes are influenced strongly by
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 their occurrence in Modula-3
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 \cite{Modula-3}.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 Although Python resembles ABC in many ways, there is a a clear
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 difference in application domain. ABC is intended to be the only
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 programming language for those who use a computer as a tool, but
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 occasionally need to write a program. For this reason, ABC is not
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 just a programming language but also a programming environment, which
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 comes with an integrated syntax-directed editor and some source
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 manipulation commands. Python, on the other hand, aims to be a tool
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 for professional (system) programmers, for whom having a choice of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 languages with different feature sets makes it possible to choose `the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 right tool for the job.' The features added to Python make it more
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 useful than ABC in an environment where access to system functions
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 (such as file and directory manipulations) are common. They also
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 support the building of larger systems and libraries. The Python
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 implementation offers little in the way of a programming environment,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 but is designed to integrate seamlessly with existing programming
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 environments (e.g. UNIX and Emacs).
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 Perhaps the best introduction to Python is a short example. The
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 following is a complete Python program to list the contents of a UNIX
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 directory.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 import sys, posix
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 def ls(dirname): # Print sorted directory contents
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 names = posix.listdir(dirname)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 names.sort()
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 for name in names:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 if name[0] != '.': print name
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 ls(sys.argv[1])
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 The largest part of this program, in the middle starting with {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 def}, is a function definition. It defines a function named {\tt ls}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 with a single parameter called {\tt dirname}. (Comments in Python
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 start with `\#' and extend to the end of the line.) The function body
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 is indented: Python uses indentation for statement grouping instead of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 braces or begin/end keywords. This is shorter to type and avoids
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 frustrating mismatches between the perception of grouping by the user
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 and the parser. Python accepts one statement per line; long
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 statements may be broken in pieces using the standard backslash
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 convention. If the body of a compound statement is a single, simple
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 statement, it may be placed on the same line as the head.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 The first statement of the function body calls the function {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 listdir} defined in the module {\tt posix}. This function returns a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 list of strings representing the contents of the directory name passed
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 as a string argument, here the argument {\tt dirname}. If {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 dirname} were not a valid directory name, or perhaps not even a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 string, {\tt listdir} would raise an exception and the next statement
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 would never be reached. (Exceptions can be caught in Python; see
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 later.) Assuming {\tt listdir} returns normally, its result is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 assigned to the local variable {\tt names}.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 The second statement calls the method {\tt sort} of the variable {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 names}. This method is defined for all lists in Python and does the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 obvious thing: the elements of the list are reordered according to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 their natural ordering relationship. Since in our example the list
2554
f4d26a0e2975 change of address and date
Guido van Rossum <guido@python.org>
parents: 1767
diff changeset
200 contains strings, they are sorted in ascending \ASCII{} order.
669
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 The last two lines of the function contain a loop that prints all
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 elements of the list whose first character isn't a period. In each
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 iteration, the {\tt for} statement assigns an element of the list to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 the local variable {\tt name}. The {\tt print} statement is intended
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 for simple-minded output; more elaborate formatting is possible with
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 Python's string handling functions.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 The other two parts of the program are easily explained. The first
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 line is an {\tt import} statement that tells the interpreter to import
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 the modules {\tt sys} and {\tt posix}. As it happens these are both
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 built into the interpreter. Importing a module (built-in or
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 otherwise) only makes the module name available in the current scope;
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 functions and data defined in the module are accessed through the dot
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 notation as in {\tt posix.listdir}. The scope rules of Python are
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 such that the imported module name {\tt posix} is also available in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 the function {\tt ls} (this will be discussed in more detail later).
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 Finally, the last line of the program calls the {\tt ls} function with
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 a definite argument. It must be last since Python objects must be
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 defined before they can be used; in particular, the function {\tt ls}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 must be defined before it can be called. The argument to {\tt ls} is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 {\tt sys.argv[1]}, which happens to be the Python equivalent of {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 \$1} in a shell script or {\tt argv[1]} in a C program's {\tt main}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 function.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 \subsection{Python Data Types}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 (This and the following subsections describe Python in quite a lot of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 detail. If you are more interested in AIL, Amoeba and how they are
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 linked with Python, you can skip to section 3 now.)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 Python's syntax may not have big surprises (which is exactly as it
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 should be), but its data types are quite different from what is found
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 in languages like C, Ada or Modula-3. All data types in Python, even
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 integers, are `objects'. All objects participate in a common garbage
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 collection scheme (currently implemented using reference counting).
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 Assignment is cheap, independent of object size and type: only a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 pointer to the assigned object is stored in the assigned-to variable.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 No type checking is performed on assignment; only specific operations
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 like addition test for particular operand types.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
242
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 The basic object types in Python are numbers, strings, tuples, lists
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 and dictionaries. Some other object types are open files, functions,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 modules, classes, and class instances; even types themselves are
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 represented as objects. Extension modules written in C can define
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 additional object types; examples are objects representing windows and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 Amoeba capabilities. Finally, the implementation itself makes heavy
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 use of objects, and defines some private object types that aren't
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 normally visible to the user. There is no explicit pointer type in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 Python.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 {\em Numbers}, both integers and floating point, are pretty
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 straightforward. The notation for numeric literals is the same as in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 C, including octal and hexadecimal integers; precision is the same as
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 {\tt long} or {\tt double} in C\@. A third numeric type, `long
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 integer', written with an `L' suffix, can be used for arbitrary
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 precision calculations. All arithmetic, shifting and masking
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 operations from C are supported.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
260
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 {\em Strings} are `primitive' objects just like numbers. String
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 literals are written between single quotes, using similar escape
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 sequences as in C\@. Operations are built into the language to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 concatenate and to replicate strings, to extract substrings, etc.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 There is no limit to the length of the strings created by a program.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 There is no separate character data type; strings of length one do
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 nicely.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 {\em Tuples} are a way to `pack' small amounts of heterogeneous data
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 together and carry them around as a unit. Unlike structure members in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 C, tuple items are nameless. Packing and unpacking assignments allow
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 access to the items, for example:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 x = 'Hi', (1, 2), 'World' # x is a 3-item tuple,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 # its middle item is (1, 2)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 p, q, r = x # unpack x into p, q and r
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 a, b = q # unpack q into a and b
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 A combination of packing and unpacking assignment can be used as
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 parallel assignment, and is idiom for permutations, e.g.:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 p, q = q, p # swap without temporary
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 a, b, c = b, c, a # cyclic permutation
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 Tuples are also used for function argument lists if there is more than
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 one argument. A tuple object, once created, cannot be modified; but
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 it is easy enough to unpack it and create a new, modified tuple from
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 the unpacked items and assign this to the variable that held the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 original tuple object (which will then be garbage-collected).
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 {\em Lists} are array-like objects. List items may be arbitrary
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 objects and can be accessed and changed using standard subscription
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 notation. Lists support item insertion and deletion, and can
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 therefore be used as queues, stacks etc.; there is no limit to their
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 size.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 Strings, tuples and lists together are {\em sequence} types. These
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
298 share a common notation for generic operations on sequences such as
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 subscription, concatenation, slicing (taking subsequences) and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
300 membership tests. As in C, subscripts start at 0.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
301
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 {\em Dictionaries} are `mappings' from one domain to another. The
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 basic operations on dictionaries are item insertion, extraction and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 deletion, using subscript notation with the key as subscript. (The
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 current implementation allows only strings in the key domain, but a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 future version of the language may remove this restriction.)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
307
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 \subsection{Statements}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
309
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 Python has various kinds of simple statements, such as assignments
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
311 and {\tt print} statements, and several kinds of compound statements,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
312 like {\tt if} and {\tt for} statements. Formally, function
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 definitions and {\tt import} statements are also statements, and there
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
314 are no restrictions on the ordering of statements or their nesting:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 {\tt import} may be used inside a function, functions may be defined
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 conditionally using an {\tt if} statement, etc. The effect of a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 declaration-like statement takes place only when it is executed.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
318
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 All statements except assignments and expression statements begin with
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320 a keyword: this makes the language easy to parse. An overview of the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 most common statement forms in Python follows.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
322
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 An {\em assignment} has the general form
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 \vspace{\itemsep}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
325
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
326 \noindent
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 {\em variable $=$ variable $= ... =$ variable $=$ expression}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 \vspace{\itemsep}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
329
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 It assigns the value of the expression to all listed variables. (As
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 shown in the section on tuples, variables and expressions can in fact
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 be comma-separated lists.) The assignment operator is not an
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 expression operator; there are no horrible things in Python like
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 while (p = p->next) { ... }
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
337 Expression syntax is mostly straightforward and will not be explained
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
338 in detail here.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
339
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 An {\em expression statement} is just an expression on a line by
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 itself. This writes the value of the expression to standard output,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 in a suitably unambiguous way, unless it is a `procedure call' (a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 function call that returns no value). Writing the value is useful
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
344 when Python is used in `calculator mode', and reminds the programmer
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 not to ignore function results.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
346
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
347 The {\tt if} statement allows conditional execution. It has optional
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 {\tt elif} and {\tt else} parts; a construct like {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
349 if...elif...elif...elif...else} can be used to compensate for the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 absence of a {\em switch} or {\em case} statement.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 Looping is done with {\tt while} and {\tt for} statements. The latter
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 (demonstrated in the `ls' example earlier) iterates over the elements
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 of a `sequence' (see the discussion of data types below). It is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 possible to terminate a loop with a {\tt break} statement or to start
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 the next iteration with {\tt continue}. Both looping statements have
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 an optional {\tt else} clause which is executed after the loop is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 terminated normally, but skipped when it is terminated by {\tt break}.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 This can be handy for searches, to handle the case that the item is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 not found.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
361
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 Python's {\em exception} mechanism is modelled after that of Modula-3.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 Exceptions are raised by the interpreter when an illegal operation is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 tried. It is also possible to explicitly raise an exception with the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 {\tt raise} statement:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 \vspace{\itemsep}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
367
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 \noindent
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 {\tt raise {\em expression}, {\em expression}}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 \vspace{\itemsep}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
371
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 The first expression identifies which exception should be raised;
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 there are several built-in exceptions and the user may define
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 additional ones. The second, optional expression is passed to the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
375 handler, e.g. as a detailed error message.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
376
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 Exceptions may be handled (caught) with the {\tt try} statement, which
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
378 has the following general form:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 \vspace{\itemsep}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
380
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 \noindent
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
382 {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 \begin{tabular}{l}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
384 try: {\em block} \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 except {\em expression}, {\em variable}: {\em block} \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 except {\em expression}, {\em variable}: {\em block} \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 ... \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 except: {\em block}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 \end{tabular}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 }
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 \vspace{\itemsep}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
392
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 When an exception is raised during execution of the first block, a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394 search for an exception handler starts. The first {\tt except} clause
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 whose {\em expression} matches the exception is executed. The
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 expression may specify a list of exceptions to match against. A
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
397 handler without an expression serves as a `catch-all'. If there is no
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 match, the search for a handler continues with outer {\tt try}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
399 statements; if no match is found on the entire invocation stack, an
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 error message and stack trace are printed, and the program is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 terminated (interactively, the interpreter returns to its main loop).
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
402
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
403 Note that the form of the {\tt except} clauses encourages a style of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 programming whereby only selected exceptions are caught, passing
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 unanticipated exceptions on to the caller and ultimately to the user.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
406 This is preferable over a simpler `catch-all' error handling
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
407 mechanism, where a simplistic handler intended to catch a single type
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 of error like `file not found' can easily mask genuine programming
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
409 errors --- especially in a language like Python which relies strongly
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 on run-time checking and allows the catching of almost any type of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 error.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
412
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
413 Other common statement forms, which we have already encountered, are
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 function definitions, {\tt import} statements and {\tt print}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
415 statements. There is also a {\tt del} statement to delete one or more
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 variables, a {\tt return} statement to return from a function, and a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 {\tt global} statement to allow assignments to global variables.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
418 Finally, the {\tt pass} statement is a no-op.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
419
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 \subsection{Execution Model}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
421
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 A Python program is executed by a stack-based interpreter.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
423
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
424 When a function is called, a new `execution environment' for it is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 pushed onto the stack. An execution environment contains (among other
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 data) pointers to two `symbol tables' that are used to hold variables:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
427 the local and the global symbol table. The local symbol table
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 contains local variables of the current function invocation (including
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 the function arguments); the global symbol table contains variables
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
430 defined in the module containing the current function.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
431
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 The `global' symbol table is thus only global with respect to the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 current function. There are no system-wide global variables; using
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 the {\tt import} statement it is easy enough to reference variables
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 that are defined in other modules. A system-wide read-only symbol
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
436 table is used for built-in functions and constants though.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
437
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
438 On assignment to a variable, by default an entry for it is made in the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 local symbol table of the current execution environment. The {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 global} command can override this (it is not enough that a global
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 variable by the same name already exists). When a variable's value is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 needed, it is searched first in the local symbol table, then in the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
443 global one, and finally in the symbol table containing built-in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 functions and constants.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
445
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 The term `variable' in this context refers to any name: functions and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
447 imported modules are searched in exactly the same way.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
448
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 Names defined in a module's symbol table survive until the end of the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
450 program. This approximates the semantics of file-static global
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 variables in C or module variables in Modula-3. A module is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
452 initialized the first time it is imported, by executing the text of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
453 the module as a parameterless function whose local and global symbol
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
454 tables are the same, so names are defined in module's symbol table.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
455 (Modules implemented in C have another way to define symbols.)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
456
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 A Python main program is read from standard input or from a script
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 file passed as an argument to the interpreter. It is executed as if
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
459 an anonymous module was imported. Since {\tt import} statements are
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 executed like all other statements, the initialization order of the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
461 modules used in a program is defined by the flow of control through
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 the program.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
463
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 The `attribute' notation {\em m.name}, where {\em m} is a module,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 accesses the symbol {\em name} in that module's symbol table. It can
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 be assigned to as well. This is in fact a special case of the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 construct {\em x.name} where {\em x} denotes an arbitrary object; the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
468 type of {\em x} determines how this is to be interpreted, and what
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 assignment to it means.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
470
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 For instance, when {\tt a} is a list object, {\tt a.append} yields a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 built-in `method' object which, when called, appends an item to {\tt a}.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 (If {\tt a} and {\tt b} are distinct list objects, {\tt a.append} and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
474 {\tt b.append} are distinguishable method objects.) Normally, in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
475 statements like {\tt a.append(x)}, the method object {\tt a.append} is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
476 called and then discarded, but this is a matter of convention.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
477
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
478 List attributes are read-only --- the user cannot define new list
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
479 methods. Some objects, like numbers and strings, have no attributes
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
480 at all. Like all type checking in Python, the meaning of an attribute
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
481 is determined at run-time --- when the parser sees {\em x.name}, it
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
482 has no idea of the type of {\em x}. Note that {\em x} here does not
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
483 have to be a variable --- it can be an arbitrary (perhaps
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
484 parenthesized) expression.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
485
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
486 Given the flexibility of the attribute notation, one is tempted to use
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
487 methods to replace all standard operations. Yet, Python has kept a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
488 small repertoire of built-in functions like {\tt len()} and {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
489 abs()}. The reason is that in some cases the function notation is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
490 more familiar than the method notation; just like programs would
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
491 become less readable if all infix operators were replaced by function
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
492 calls, they would become less readable if all function calls had to be
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
493 replaced by method calls (and vice versa!).
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
494
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
495 The choice whether to make something a built-in function or a method
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
496 is a matter of taste. For arithmetic and string operations, function
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
497 notation is preferred, since frequently the argument to such an
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
498 operation is an expression using infix notation, as in {\tt abs(a+b)};
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
499 this definitely looks better than {\tt (a+b).abs()}. The choice
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
500 between make something a built-in function or a function defined in a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
501 built-in method (requiring {\tt import}) is similarly guided by
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
502 intuition; all in all, only functions needed by `general' programming
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 techniques are built-in functions.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
504
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
505 \subsection{Classes}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
506
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 Python has a class mechanism distinct from the object-orientation
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
508 already explained. A class in Python is not much more than a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
509 collection of methods and a way to create class instances. Class
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
510 methods are ordinary functions whose first parameter is the class
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 instance; they are called using the method notation.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
512
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
513 For instance, a class can be defined as follows:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
514 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
515 class Foo:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
516 def meth1(self, arg): ...
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
517 def meth2(self): ...
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
518 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
519 A class instance is created by
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
520 {\tt x = Foo()}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 and its methods can be called thus:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
522 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
523 x.meth1('Hi There!')
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
524 x.meth2()
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
525 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
526 The functions used as methods are also available as attributes of the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
527 class object, and the above method calls could also have been written
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
528 as follows:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
529 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
530 Foo.meth1(x, 'Hi There!')
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
531 Foo.meth2(x)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
532 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
533 Class methods can store instance data by assigning to instance data
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
534 attributes, e.g.:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
535 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
536 self.size = 100
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
537 self.title = 'Dear John'
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
538 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
539 Data attributes do not have to be declared; as with local variables,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
540 they spring into existence when assigned to. It is a matter of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
541 discretion to avoid name conflicts with method names. This facility
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
542 is also available to class users; instances of a method-less class can
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
543 be used as records with named fields.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
544
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
545 There is no built-in mechanism for instance initialization. Classes
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
546 by convention provide an {\tt init()} method which initializes the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
547 instance and then returns it, so the user can write
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
548 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
549 x = Foo().init('Dr. Strangelove')
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
550 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
551
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
552 Any user-defined class can be used as a base class to derive other
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
553 classes. However, built-in types like lists cannot be used as base
1767
907605320a5f Lots of small corrections by Andrew Kuchling (plus all new rotor docs)
Guido van Rossum <guido@python.org>
parents: 1402
diff changeset
554 classes. (Incidentally, the same is true in \Cpp{} and Modula-3.) A
669
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
555 class may override any method of its base classes. Instance methods
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
556 are first searched in the method list of their class, and then,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
557 recursively, in the method lists of their base class. Initialization
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
558 methods of derived classes should explicitly call the initialization
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
559 methods of their base class.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
560
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
561 A simple form of multiple inheritance is also supported: a class can
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
562 have multiple base classes, but the language rules for resolving name
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
563 conflicts are somewhat simplistic, and consequently the feature has so
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
564 far found little usage.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
565
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
566 \subsection{The Python Library}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
567
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
568 Python comes with an extensive library, structured as a collection of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
569 modules. A few modules are built into the interpreter: these
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
570 generally provide access to system libraries implemented in C such as
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
571 mathematical functions or operating system calls. Two built-in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
572 modules provide access to internals of the interpreter and its
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
573 environment. Even abusing these internals will at most cause an
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
574 exception in the Python program; the interpreter will not dump core
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
575 because of errors in Python code.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
576
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
577 Most modules however are written in Python and distributed with the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
578 interpreter; they provide general programming tools like string
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
579 operations and random number generators, provide more convenient
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
580 interfaces to some built-in modules, or provide specialized services
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
581 like a {\em getopt}-style command line option processor for
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
582 stand-alone scripts.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
583
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
584 There are also some modules written in Python that dig deep in the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
585 internals of the interpreter; there is a module to browse the stack
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
586 backtrace when an unhandled exception has occurred, one to disassemble
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
587 the internal representation of Python code, and even an interactive
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
588 source code debugger which can trace Python code, set breakpoints,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
589 etc.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
590
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 \subsection{Extensibility}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
592
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
593 It is easy to add new built-in modules written in C to the Python
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
594 interpreter. Extensions appear to the Python user as built-in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
595 modules. Using a built-in module is no different from using a module
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
596 written in Python, but obviously the author of a built-in module can
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
597 do things that cannot be implemented purely in Python.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
598
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
599 In particular, built-in modules can contain Python-callable functions
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
600 that call functions from particular system libraries (`wrapper
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 functions'), and they can define new object types. In general, if a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
602 built-in module defines a new object type, it should also provide at
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
603 least one function that creates such objects. Attributes of such
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
604 object types are also implemented in C; they can return data
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
605 associated with the object or methods, implemented as C functions.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
606
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
607 For instance, an extension was created for Amoeba: it provides wrapper
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
608 functions for the basic Amoeba name server functions, and defines a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
609 `capability' object type, whose methods are file server operations.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
610 Another extension is a built-in module called {\tt posix}; it provides
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 wrappers around post UNIX system calls. Extension modules also
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
612 provide access to two different windowing/graphics interfaces: STDWIN
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
613 \cite{STDWIN}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
614 (which connects to X11 on UNIX and to the Mac Toolbox on the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
615 Macintosh), and the Graphics Library (GL) for Silicon Graphics
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
616 machines.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
617
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
618 Any function in an extension module is supposed to type-check its
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
619 arguments; the interpreter contains a convenience function to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
620 facilitate extracting C values from arguments and type-checking them
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
621 at the same time. Returning values is also painless, using standard
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
622 functions to create Python objects from C values.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
623
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
624 On some systems extension modules may be dynamically loaded, thus
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
625 avoiding the need to maintain a private copy of the Python interpreter
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
626 in order to use a private extension.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
627
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
628 \section{A Short Description of AIL and Amoeba}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
629
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
630 An RPC stub generator takes an interface description as input. The
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
631 designer of a stub generator has at least two choices for the input
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
632 language: use a suitably restricted version of the target language, or
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
633 design a new language. The first solution was chosen, for instance,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
634 by the designers of Flume, the stub generator for the Topaz
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
635 distributed operating system built at DEC SRC
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
636 \cite{Flume,Evolving}.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
637
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
638 Flume's one and only target language is Modula-2+ (the predecessor of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
639 Modula-3). Modula-2+, like Modula-N for any N, has an interface
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
640 syntax that is well suited as a stub generator input language: an
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
641 interface module declares the functions that are `exported' by a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
642 module implementation, with their parameter and return types, plus the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
643 types and constants used for the parameters. Therefore, the input to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
644 Flume is simply a Modula-2+ interface module. But even in this ideal
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
645 situation, an RPC stub generator needs to know things about functions
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
646 that are not stated explicitly in the interface module: for instance,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
647 the transfer direction of VAR parameters (IN, OUT or both) is not
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
648 given. Flume solves this and other problems by a mixture of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
649 directives hidden in comments and a convention for the names of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
650 objects. Thus, one could say that the designers of Flume really
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
651 created a new language, even though it looks remarkably like their
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
652 target language.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
653
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
654 \subsection{The AIL Input Language}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
655
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
656 Amoeba uses C as its primary programming language. C function
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
657 declarations (at least in `Classic' C) don't specify the types of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
658 the parameters, let alone their transfer direction. Using this as
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
659 input for a stub generator would require almost all information for
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
660 the stub generator to be hidden inside comments, which would require a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
661 rather contorted scanner. Therefore we decided to design the input
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
662 syntax for Amoeba's stub generator `from scratch'. This gave us the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
663 liberty to invent proper syntax not only for the transfer direction of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
664 parameters, but also for variable-length arrays.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
665
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
666 On the other hand we decided not to abuse our freedom, and borrowed as
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
667 much from C as we could. For instance, AIL runs its input through the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
668 C preprocessor, so we get macros, include files and conditional
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
669 compilation for free. AIL's type declaration syntax is a superset of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
670 C's, so the user can include C header files to use the types declared
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
671 there as function parameter types --- which are declared using
1767
907605320a5f Lots of small corrections by Andrew Kuchling (plus all new rotor docs)
Guido van Rossum <guido@python.org>
parents: 1402
diff changeset
672 function prototypes as in \Cpp{} or Standard C\@. It should be clear by
669
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
673 now that AIL's lexical conventions are also identical to C's. The
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
674 same is true for its expression syntax.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
675
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
676 Where does AIL differ from C, then? Function declarations in AIL are
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
677 grouped in {\em classes}. Classes in AIL are mostly intended as a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
678 grouping mechanism: all functions implemented by a server are grouped
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
679 together in a class. Inheritance is used to form new groups by adding
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
680 elements to existing groups; multiple inheritance is supported to join
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
681 groups together. Classes can also contain constant and type
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
682 definitions, and one form of output that AIL can generate is a header
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
683 file for use by C programmers who wish to use functions from a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
684 particular AIL class.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
685
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
686 Let's have a look at some (unrealistically simple) class definitions:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
687 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
688 #include <amoeba.h> /* Defines `capability', etc. */
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
689
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
690 class standard_ops [1000 .. 1999] {
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
691 /* Operations supported by most interfaces */
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
692 std_info(*, out char buf[size:100], out int size);
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
693 std_destroy(*);
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
694 };
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
695 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
696 This defines a class called `standard\_ops' whose request codes are
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
697 chosen by AIL from the range 1000-1999. Request codes are small
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
698 integers used to identify remote operations. The author of the class
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
699 must specify a range from which AIL chooses, and class authors must
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
700 make sure they avoid conflicts, e.g. by using an `assigned number
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
701 administration office'. In the example, `std\_info' will be assigned
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
702 request code 1000 and `std\_destroy' will get code 1001. There is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
703 also an option to explicitly assign request codes, for compatibility
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
704 with servers with manually written interfaces.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
705
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
706 The class `standard\_ops' defines two operations, `std\_info' and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
707 `std\_destroy'. The first parameter of each operation is a star
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
708 (`*'); this is a placeholder for a capability that must be passed when
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
709 the operation is called. The description of Amoeba below explains the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
710 meaning and usage of capabilities; for now, it is sufficient to know
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
711 that a capability is a small structure that uniquely identifies an
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
712 object and a server or service.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
713
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
714 The standard operation `std\_info' has two output parameters: a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
715 variable-size character buffer (which will be filled with a short
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
716 descriptive string of the object to which the operation is applied)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
717 and an integer giving the length of this string. The standard
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
718 operation `std\_destroy' has no further parameters --- it just
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
719 destroys the object, if the caller has the right to do so.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
720
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
721 The next class is called `tty':
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
722 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
723 class tty [2000 .. 2099] {
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
724 inherit standard_ops;
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
725 const TTY_MAXBUF = 1000;
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
726 tty_write(*, char buf[size:TTY_MAXBUF], int size);
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
727 tty_read(*, out char buf[size:TTY_MAXBUF], out int size);
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
728 };
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
729 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
730 The request codes for operations defined in this class lie in the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
731 range 2000-2099; inherited operations use the request codes already
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
732 assigned to them. The operations defined by this class are
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
733 `tty\_read' and `tty\_write', which pass variable-sized data buffers
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
734 between client and server. Class `tty' inherits class
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
735 `standard\_ops', so tty objects also support the operations
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
736 `std\_info' and `std\_destroy'.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
737
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
738 Only the {\em interface} for `std\_info' and `std\_destroy' is shared
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
739 between tty objects and other objects whose interface inherits
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
740 `standard\_ops'; the implementation may differ. Even multiple
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
741 implementations of the `tty' interface may exist, e.g. a driver for a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
742 console terminal and a terminal emulator in a window. To expand on
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
743 the latter example, consider:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
744 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
745 class window [2100 .. 2199] {
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
746 inherit standard_ops;
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
747 win_create(*, int x, int y, int width, int height,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
748 out capability win_cap);
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
749 win_reconfigure(*, int x, int y, int width, int height);
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
750 };
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
751
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
752 class tty_emulator [2200 .. 2299] {
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
753 inherit tty, window;
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
754 };
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
755 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
756 Here two new interface classes are defined.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
757 Class `window' could be used for creating and manipulating windows.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
758 Note that `win\_create' returns a capability for the new window.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
759 This request should probably should be sent to a generic window
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
760 server capability, or it might create a subwindow when applied to a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
761 window object.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
762
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
763 Class `tty\_emulator' demonstrates the essence of multiple inheritance.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
764 It is presumably the interface to a window-based terminal emulator.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
765 Inheritance is transitive, so `tty\_emulator' also implicitly inherits
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
766 `standard\_ops'.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
767 In fact, it inherits it twice: once via `tty' and once via `window'.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
768 Since AIL class inheritance only means interface sharing, not
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
769 implementation sharing, inheriting the same class multiple times is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
770 never a problem and has the same effect as inheriting it once.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
771
1767
907605320a5f Lots of small corrections by Andrew Kuchling (plus all new rotor docs)
Guido van Rossum <guido@python.org>
parents: 1402
diff changeset
772 Note that the power of AIL classes doesn't go as far as \Cpp{}.
669
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
773 AIL classes cannot have data members, and there is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
774 no mechanism for a server that implements a derived class
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
775 to inherit the implementation of the base
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
776 class --- other than copying the source code.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
777 The syntax for class definitions and inheritance is also different.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
778
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
779 \subsection{Amoeba}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
780
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
781 The smell of `object-orientedness' that the use of classes in AIL
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
782 creates matches nicely with Amoeba's object-oriented approach to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
783 RPC\@. In Amoeba, almost all operating system entities (files,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
784 directories, processes, devices etc.) are implemented as {\em
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
785 objects}. Objects are managed by {\em services} and represented by
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
786 {\em capabilities}. A capability gives its holder access to the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
787 object it represents. Capabilities are protected cryptographically
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
788 against forgery and can thus be kept in user space. A capability is a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
789 128-bit binary string, subdivided as follows:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
790
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
791 % XXX Need a better version of this picture!
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
792 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
793 48 24 8 48 Bits
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
794 +----------------+------------+--------+---------------+
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
795 | Service | Object | Perm. | Check |
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
796 | port | number | bits | word |
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
797 +----------------+------------+--------+---------------+
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
798 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
799
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
800 The service port is used by the RPC implementation in the Amoeba
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
801 kernel to locate a server implementing the service that manages the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
802 object. In many cases there is a one-to-one correspondence between
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
803 servers and services (each service is implemented by exactly one
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
804 server process), but some services are replicated. For instance,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
805 Amoeba's directory service, which is crucial for gaining access to most
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
806 other services, is implemented by two servers that listen on the same
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
807 port and know about exactly the same objects.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
808
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
809 The object number in the capability is used by the server receiving
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
810 the request for identifying the object to which the operation applies.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
811 The permission bits specify which operations the holder of the capability
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
812 may apply. The last part of a capability is a 48-bit long `check
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
813 word', which is used to prevent forgery. The check word is computed
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
814 by the server based upon the permission bits and a random key per object
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
815 that it keeps secret. If you change the permission bits you must compute
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
816 the proper check word or else the server will refuse the capability.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
817 Due to the size of the check word and the nature of the cryptographic
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
818 `one-way function' used to compute it, inverting this function is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
819 impractical, so forging capabilities is impossible.%
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
820 \footnote{
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
821 As computers become faster, inverting the one-way function becomes
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
822 less impractical.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
823 Therefore, a next version of Amoeba will have 64-bit check words.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
824 }
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
825
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
826 A working Amoeba system is a collection of diverse servers, managing
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
827 files, directories, processes, devices etc. While most servers have
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
828 their own interface, there are some requests that make sense for some
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
829 or all object types. For instance, the {\em std\_info()} request,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
830 which returns a short descriptive string, applies to all object types.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
831 Likewise, {\em std\_destroy()} applies to files, directories and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
832 processes, but not to devices.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
833
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
834 Similarly, different file server implementations may want to offer the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
835 same interface for operations like {\em read()} and {\em write()} to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
836 their clients. AIL's grouping of requests into classes is ideally
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
837 suited to describe this kind of interface sharing, and a class
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
838 hierarchy results which clearly shows the similarities between server
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
839 interfaces (not necessarily their implementations!).
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
840
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
841 The base class of all classes defines the {\em std\_info()} request.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
842 Most server interfaces actually inherit a derived class that also
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
843 defines {\em std\_destroy().} File servers inherit a class that
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
844 defines the common operations on files, etc.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
845
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
846 \subsection{How AIL Works}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
847
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
848 The AIL stub generator functions in three phases:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
849 \begin{itemize}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
850 \item
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
851 parsing,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
852 \item
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
853 strategy determination,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
854 \item
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
855 code generation.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
856 \end{itemize}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
857
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
858 {\bf Phase one} parses the input and builds a symbol table containing
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
859 everything it knows about the classes and other definitions found in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
860 the input.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
861
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
862 {\bf Phase two} determines the strategy to use for each function
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
863 declaration in turn and decides upon the request and reply message
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
864 formats. This is not a simple matter, because of various optimization
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
865 attempts. Amoeba's kernel interface for RPC requests takes a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
866 fixed-size header and one arbitrary-size buffer. A large part of the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
867 header holds the capability of the object to which the request is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
868 directed, but there is some space left for a few integer parameters
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
869 whose interpretation is left up to the server. AIL tries to use these
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
870 slots for simple integer parameters, for two reasons.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
871
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
872 First, unlike the buffer, header fields are byte-swapped by the RPC
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
873 layer in the kernel if necessary, so it saves a few byte swapping
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
874 instructions in the user code. Second, and more important, a common
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
875 form of request transfers a few integers and one large buffer to or
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
876 from a server. The {\em read()} and {\em write()} requests of most
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
877 file servers have this form, for instance. If it is possible to place
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
878 all integer parameters in the header, the address of the buffer
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
879 parameter can be passed directly to the kernel RPC layer. While AIL
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
880 is perfectly capable of handling requests that do not fit this format,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
881 the resulting code involves allocating a new buffer and copying all
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
882 parameters into it. It is a top priority to avoid this copying
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
883 (`marshalling') if at all possible, in order to maintain Amoeba's
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
884 famous RPC performance.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
885
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
886 When AIL resorts to copying parameters into a buffer, it reorders them
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
887 so that integers indicating the lengths of variable-size arrays are
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
888 placed in the buffer before the arrays they describe, since otherwise
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
889 decoding the request would be impossible. It also adds occasional
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
890 padding bytes to ensure integers are aligned properly in the buffer ---
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
891 this can speed up (un)marshalling.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
892
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
893 {\bf Phase three} is the code generator, or back-end. There are in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
894 fact many different back-ends that may be called in a single run to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
895 generate different types of output. The most important output types
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
896 are header files (for inclusion by the clients of an interface),
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
897 client stubs, and `server main loop' code. The latter decodes
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
898 incoming requests in the server. The generated code depends on the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
899 programming language requested, and there are separate back-ends for
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
900 each supported language.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
901
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
902 It is important that the strategy chosen by phase two is independent
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
903 of the language requested for phase three --- otherwise the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
904 interoperability of servers and clients written in different languages
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
905 would be compromised.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
906
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
907 \section{Linking AIL to Python}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
908
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
909 From the previous section it can be concluded that linking AIL to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
910 Python is a matter of writing a back-end for Python. This is indeed
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
911 what we did.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
912
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
913 Considerable time went into the design of the back-end in order to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
914 make the resulting RPC interface for Python fit as smoothly as
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
915 possible in Python's programming style. For instance, the issues of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
916 parameter transfer, variable-size arrays, error handling, and call
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
917 syntax were all solved in a manner that favors ease of use in Python
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
918 rather than strict correspondence with the stubs generated for C,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
919 without compromising network-level compatibility.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
920
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
921 \subsection{Mapping AIL Entities to Python}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
922
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
923 For each programming language that AIL is to support, a mapping must
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
924 be designed between the data types in AIL and those in that language.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
925 Other aspects of the programming languages, such as differences in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
926 function call semantics, must also be taken care of.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
927
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
928 While the mapping for C is mostly straightforward, the mapping for
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
929 Python requires a little thinking to get the best results for Python
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
930 programmers.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
931
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
932 \subsubsection{Parameter Transfer Direction}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
933
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
934 Perhaps the simplest issue is that of parameter transfer direction.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
935 Parameters of functions declared in AIL are categorized as being of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
936 type {\tt in}, {\tt out} or {\tt in} {\tt out} (the same distinction
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
937 as made in Ada). Python only has call-by-value parameter semantics;
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
938 functions can return multiple values as a tuple. This means that,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
939 unlike the C back-end, the Python back-end cannot always generate
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
940 Python functions with exactly the same parameter list as the AIL
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
941 functions.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
942
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
943 Instead, the Python parameter list consists of all {\tt in} and {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
944 in} {\tt out} parameters, in the order in which they occur in the AIL
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
945 parameter list; similarly, the Python function returns a tuple
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
946 containing all {\tt in} {\tt out} and {\tt out} parameters. In fact
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
947 Python packs function parameters into a tuple as well, stressing the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
948 symmetry between parameters and return value. For example, a stub
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
949 with this AIL parameter list:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
950 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
951 (*, in int p1, in out int p2, in int p3, out int p4)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
952 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
953 will have the following parameter list and return values in Python:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
954 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
955 (p1, p2, p3) -> (p2, p4)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
956 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
957
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
958 \subsubsection{Variable-size Entities}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
959
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
960 The support for variable-size objects in AIL is strongly guided by the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
961 limitations of C in this matter. Basically, AIL allows what is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
962 feasible in C: functions may have variable-size arrays as parameters
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
963 (both input or output), provided their length is passed separately.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
964 In practice this is narrowed to the following rule: for each
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
965 variable-size array parameter, there must be an integer parameter
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
966 giving its length. (An exception for null-terminated strings is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
967 planned but not yet realized.)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
968
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
969 Variable-size arrays in AIL or C correspond to {\em sequences} in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
970 Python: lists, tuples or strings. These are much easier to use than
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
971 their C counterparts. Given a sequence object in Python, it is always
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
972 possible to determine its size: the built-in function {\tt len()}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
973 returns it. It would be annoying to require the caller of an RPC stub
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
974 with a variable-size parameter to also pass a parameter that
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
975 explicitly gives its size. Therefore we eliminate all parameters from
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
976 the Python parameter list whose value is used as the size of a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
977 variable-size array. Such parameters are easily found: the array
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
978 bound expression contains the name of the parameter giving its size.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
979 This requires the stub code to work harder (it has to recover the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
980 value for size parameters from the corresponding sequence parameter),
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
981 but at least part of this work would otherwise be needed as well, to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
982 check that the given and actual sizes match.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
983
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
984 Because of the symmetry in Python between the parameter list and the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
985 return value of a function, the same elimination is performed on
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
986 return values containing variable-size arrays: integers returned
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
987 solely to tell the client the size of a returned array are not
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
988 returned explicitly to the caller in Python.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
989
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
990 \subsubsection{Error Handling}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
991
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
992 Another point where Python is really better than C is the issue of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
993 error handling. It is a fact of life that everything involving RPC
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
994 may fail, for a variety of reasons outside the user's control: the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
995 network may be disconnected, the server may be down, etc. Clients
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
996 must be prepared to handle such failures and recover from them, or at
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
997 least print an error message and die. In C this means that every
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
998 function returns an error status that must be checked by the caller,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
999 causing programs to be cluttered with error checks --- or worse,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1000 programs that ignore errors and carry on working with garbage data.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1001
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1002 In Python, errors are generally indicated by exceptions, which can be
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1003 handled out of line from the main flow of control if necessary, and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1004 cause immediate program termination (with a stack trace) if ignored.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1005 To profit from this feature, all RPC errors that may be encountered by
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1006 AIL-generated stubs in Python are turned into exceptions. An extra
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1007 value passed together with the exception is used to relay the error
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1008 code returned by the server to the handler. Since in general RPC
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1009 failures are rare, Python test programs can usually ignore exceptions
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1010 --- making the program simpler --- without the risk of occasional
1767
907605320a5f Lots of small corrections by Andrew Kuchling (plus all new rotor docs)
Guido van Rossum <guido@python.org>
parents: 1402
diff changeset
1011 errors going undetected. (I still remember the embarrassment of a
669
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1012 hundredfold speed improvement reported, long, long, ago, about a new
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1013 version of a certain program, which later had to be attributed to a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1014 benchmark that silently dumped core...)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1015
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1016 \subsubsection{Function Call Syntax}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1017
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1018 Amoeba RPC operations always need a capability parameter (this is what
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1019 the `*' in the AIL function templates stands for); the service is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1020 identified by the port field of the capability. In C, the capability
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1021 must always be the first parameter of the stub function, but in Python
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1022 we can do better.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1023
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1024 A Python capability is an opaque object type in its own right, which
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1025 is used, for instance, as parameter to and return value from Amoeba's
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1026 name server functions. Python objects can have methods, so it is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1027 convenient to make all AIL-generated stubs methods of capabilities
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1028 instead of just functions. Therefore, instead of writing
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1029 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1030 some_stub(cap, other_parameters)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1031 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1032 as in C, Python programmers can write
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1033 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1034 cap.some_stub(other_parameters)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1035 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1036 This is better because it reduces name conflicts: in Python, no
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1037 confusion is possible between a stub and a local or global variable or
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1038 user-defined function with the same name.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1039
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1040 \subsubsection{Example}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1041
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1042 All the preceding principles can be seen at work in the following
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1043 example. Suppose a function is declared in AIL as follows:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1044 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1045 some_stub(*, in char buf[size:1000], in int size,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1046 out int n_done, out int status);
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1047 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1048 In C it might be called by the following code (including declarations,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1049 for clarity, but not initializations):
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1050 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1051 int err, n_done, status;
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1052 capability cap;
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1053 char buf[500];
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1054 ...
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1055 err = some_stub(&cap, buf, sizeof buf, &n_done, &status);
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1056 if (err != 0) return err;
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1057 printf("%d done; status = %d\n", n_done, status);
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1058 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1059 Equivalent code in Python might be the following:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1060 \begin{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1061 cap = ...
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1062 buf = ...
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1063 n_done, status = cap.some_stub(buf)
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1064 print n_done, 'done;', 'status =', status
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1065 \end{verbatim}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1066 No explicit error check is required in Python: if the RPC fails, an
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1067 exception is raised so the {\tt print} statement is never reached.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1068
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1069 \subsection{The Implementation}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1070
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1071 More or less orthogonal to the issue of how to map AIL operations to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1072 the Python language is the question of how they should be implemented.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1073
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1074 In principle it would be possible to use the same strategy that is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1075 used for C: add an interface to Amoeba's low-level RPC primitives to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1076 Python and generate Python code to marshal parameters into and out of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1077 a buffer. However, Python's high-level data types are not well suited
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1078 for marshalling: byte-level operations are clumsy and expensive, with
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1079 the result that marshalling a single byte of data can take several
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1080 Python statements. This would mean that a large amount of code would
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1081 be needed to implement a stub, which would cost a lot of time to parse
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1082 and take up a lot of space in `compiled' form (as parse tree or pseudo
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1083 code). Execution of the marshalling code would be sluggish as well.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1084
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1085 We therefore chose an alternate approach, writing the marshalling in
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1086 C, which is efficient at such byte-level operations. While it is easy
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1087 enough to generate C code that can be linked with the Python
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1088 interpreter, it would obviously not stimulate the use of Python for
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1089 server testing if each change to an interface required relinking the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1090 interpreter (dynamic loading of C code is not yet available on
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1091 Amoeba). This is circumvented by the following solution: the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1092 marshalling is handled by a simple {\em virtual machine}, and AIL
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1093 generates instructions for this machine. An interpreter for the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1094 machine is linked into the Python interpreter and reads its
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1095 instructions from a file written by AIL.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1096
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1097 The machine language for our virtual machine is dubbed {\em Stubcode}.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1098 Stubcode is a super-specialized language. There are two sets of of
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1099 about a dozen instructions each: one set marshals Python objects
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1100 representing parameters into a buffer, the other set (similar but not
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1101 quite symmetric) unmarshals results from a buffer into Python objects.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1102 The Stubcode interpreter uses a stack to hold Python intermediate
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1103 results. Other state elements are an Amoeba header and buffer, a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1104 pointer indicating the current position in the buffer, and of course a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1105 program counter. Besides (un)marshalling, the virtual machine must
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1106 also implement type checking, and raise a Python exception when a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1107 parameter does not have the expected type.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1108
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1109 The Stubcode interpreter marshals Python data types very efficiently,
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1110 since each instruction can marshal a large amount of data. For
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1111 instance, a whole Python string is marshalled by a single Stubcode
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1112 instruction, which (after some checking) executes the most efficient
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1113 byte-copying loop possible --- it calls {\tt memcpy()}.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1114
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1115
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1116 Construction details of the Stubcode interpreter are straightforward.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1117 Most complications are caused by the peculiarities of AIL's strategy
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1118 module and Python's type system. By far the most complex single
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1119 instruction is the `loop' instruction, which is used to marshal
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1120 arrays.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1121
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1122 As an example, here is the complete Stubcode program (with spaces and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1123 comments added for clarity) generated for the function {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1124 some\_stub()} of the example above. The stack contains pointers to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1125 Python objects, and its initial contents is the parameter to the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1126 function, the string {\tt buf}. The final stack contents will be the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1127 function return value, the tuple {\tt (n\_done, status)}. The name
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1128 {\tt header} refers to the fixed size Amoeba RPC header structure.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1129 \vspace{1em}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1130
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1131 {\tt
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1132 \begin{tabular}{l l l}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1133 BufSize & 1000 & {\em Allocate RPC buffer of 1000 bytes} \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1134 Dup & 1 & {\em Duplicate stack top} \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1135 StringS & & {\em Replace stack top by its string size} \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1136 PutI & h\_extra int32 & {\em Store top element in }header.h\_extra \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1137 TStringSlt & 1000 & {\em Assert string size less than 1000} \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1138 PutVS & & {\em Marshal variable-size string} \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1139 & & \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1140 Trans & 1234 & {\em Execute the RPC (request code 1234)} \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1141 & & \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1142 GetI & h\_extra int32 & {\em Push integer from} header.h\_extra \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1143 GetI & h\_size int32 & {\em Push integer from} header.h\_size \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1144 Pack & 2 & {\em Pack top 2 elements into a tuple} \\
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1145 \end{tabular}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1146 }
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1147 \vspace{1em}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1148
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1149 As much work as possible is done by the Python back-end in AIL, rather
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1150 than in the Stubcode interpreter, to make the latter both simple and
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1151 fast. For instance, the decision to eliminate an array size parameter
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1152 from the Python parameter list is taken by AIL, and Stubcode
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1153 instructions are generated to recover the size from the actual
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1154 parameter and to marshal it properly. Similarly, there is a special
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1155 alignment instruction (not used in the example) to meet alignment
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1156 requirements.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1157
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1158 Communication between AIL and the Stubcode generator is via the file
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1159 system. For each stub function, AIL creates a file in its output
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1160 directory, named after the stub with a specific suffix. This file
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1161 contains a machine-readable version of the Stubcode program for the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1162 stub. The Python user can specify a search path containing
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1163 directories which the interpreter searches for a Stubcode file the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1164 first time the definition for a particular stub is needed.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1165
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1166 The transformations on the parameter list and data types needed to map
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1167 AIL data types to Python data types make it necessary to help the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1168 Python programmer a bit in figuring out the parameters to a call.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1169 Although in most cases the rules are simple enough, it is sometimes
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1170 hard to figure out exactly what the parameter and return values of a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1171 particular stub are. There are two sources of help in this case:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1172 first, the exception contains enough information so that the user can
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1173 figure what type was expected; second, AIL's Python back-end
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1174 optionally generates a human-readable `interface specification' file.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1175
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1176 \section{Conclusion}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1177
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1178 We have succeeded in creating a useful extension to Python that
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1179 enables Amoeba server writers to test and experiment with their server
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1180 in a much more interactive manner. We hope that this facility will
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1181 add to the popularity of AIL amongst Amoeba programmers.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1182
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1183 Python's extensibility was proven convincingly by the exercise
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1184 (performed by the second author) of adding the Stubcode interpreter to
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1185 Python. Standard data abstraction techniques are used to insulate
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1186 extension modules from details of the rest of the Python interpreter.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1187 In the case of the Stubcode interpreter this worked well enough that
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1188 it survived a major overhaul of the main Python interpreter virtually
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1189 unchanged.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1190
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1191 On the other hand, adding a new back-end to AIL turned out to be quite
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1192 a bit of work. One problem, specific to Python, was to be expected:
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1193 Python's variable-size data types differ considerably from the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1194 C-derived data model that AIL favors. Two additional problems we
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1195 encountered were the complexity of the interface between AIL's second
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1196 and third phases, and a number of remaining bugs in the second phase
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1197 that surfaced when the implementation of the Python back-end was
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1198 tested. The bugs have been tracked down and fixed, but nothing
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1199 has been done about the complexity of the interface.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1200
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1201 \subsection{Future Plans}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1202
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1203 AIL's C back-end generates server main loop code as well as client
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1204 stubs. The Python back-end currently only generates client stubs, so
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1205 it is not yet possible to write servers in Python. While it is
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1206 clearly more important to be able to use Python as a client than as a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1207 server, the ability to write server prototypes in Python would be a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1208 valuable addition: it allows server designers to experiment with
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1209 interfaces in a much earlier stage of the design, with a much smaller
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1210 programming effort. This makes it possible to concentrate on concepts
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1211 first, before worrying about efficient implementation.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1212
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1213 The unmarshalling done in the server is almost symmetric with the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1214 marshalling in the client, and vice versa, so relative small
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1215 extensions to the Stubcode virtual machine will allow its use in a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1216 server main loop. We hope to find the time to add this feature to a
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1217 future version of Python.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1218
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1219 \section{Availability}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1220
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1221 The Python source distribution is available to Internet users by
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1222 anonymous ftp to site {\tt ftp.cwi.nl} [IP address 192.16.184.180]
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1223 from directory {\tt /pub}, file name {\tt python*.tar.Z} (where the
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1224 {\tt *} stands for a version number). This is a compressed UNIX tar
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1225 file containing the C source and \LaTeX documentation for the Python
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1226 interpreter. It includes the Python library modules and the {\em
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1227 Stubcode} interpreter, as well as many example Python programs. Total
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1228 disk space occupied by the distribution is about 3 Mb; compilation
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1229 requires 1-3 Mb depending on the configuration built, the compile
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1230 options, etc.
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1231
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1232 \bibliographystyle{plain}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1233
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1234 \bibliography{quabib}
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1235
c2ba887d9492 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1236 \end{document}