"Linux Gazette...making Linux just a little more fun!"
Abstract
When I wrote the first Making Smalltalk with the
Penguin article
back in March of 2000 [LL],
my target audience was experienced programmers who didn't have much exposure
to OO programming or to Smalltalk.
The article's intent was to give an overview of my favourite programming
language on my favourite operating system. Since then, I've had a
fair amount of email asking introductory type questions about Smalltalk
and OO programming. So I thought I'd try my hand at a small series.
It's been a while coming as after the first article I relocated from KS->CT
and had a baby (obviously using the corporate 'I' here! :-)
The target audience for this series are people new
to OO or new to programming altogether. The intent is to not only
introduce OO programming, but to also spread the fun of Smalltalking.
Why do this format/effort when there's lots of good tutorials
out there? Two reasons really: 1) Tutorials are great,
but can be static and dated pretty quickly. 2) An ongoing series
tends to be more engaging and digestible.
To help address the second reason above, my intent
is to keep the articles concise so they can be digested in under an hour1.
Hopefully, as newbies follow along, they can refer back to the original
article and make more sense of it. I plan on having a touch of advanced
stuff once in a while to add flavour and as before, the articles are going
to be written for read-along or code-along people.
Something new I'm going to try is to make the ongoing
series viewable in a contiguous fashion and downloadable in one chunk for
people who want to browse the series locally. To do this, click on
TOC grapic to right. The articles are going to have 2 sets of links:
one set for www links, another set for local links, indicated as: [LL]
If you like what you're reading, drop
me a line letting me know, and I'll keep putting precious time into
it.
Why Smalltalk?
Before we can get into OO stuff, I feel the need to
set the context of the articles. Unfortunately, this will take up
the bulk of this first article, but it's an important thing to do.
We'll finish with a little bit of OO stuff at the end, and get into it
more in the next article.
I believe Smalltalk is the best environment
to learn OO programming in because:
-
Smalltalk has a very active and very helpful community; when you post a
question to the Smalltalk newsgroups you very often get an answer, unlike
many other newsgroups
-
is very easy to learn... one of it's original design intententions was
to be a learning environment for children
-
is a pure OO environment and encourages OO programming (as opposed to encouraging
procedural/Object mixed programming)
-
cutting your teeth in Smalltalk makes you a better OO programmer in any
other language, because of the previous bullet
-
is a portable environment: write once, run anywhere, so people can
learn on whatever OS they're running (as opposed to just the M$ variety)
-
can look at and manipulate objects in real time; I haven't seen this ability
in any other environment
-
Smalltalk is written in Smalltalk. You can view how the language
is put together to learn the language, and you can change anything that
you don't like about it.
-
has garbage collection, no manual memory management, no explicit pointers
-
is a literate language; by this I mean the syntax is very simple and is
geared towards programmer readability.
-
there's lots of Cool Things that you can do in it that I haven't seen anywhere
else (will have some examples along the way)
-
...and best of all: it's fun.
In particular, I'm going to use Squeak
as the playing vehicle. You'll notice this is a different flavour
of Smalltalk than I used in my first article. I've never used Squeak
before, so this'll be a learning experience for me too. The reasons
for this are:
-
It's a completely opensource project
-
It has some Really Cool features that I haven't seen in other flavours
of Smalltalk
-
It has a comparitively small footprint and it's very easy to install
-
It has a strong Swiki site
(a Wiki site hosted in Squeak, hence Squeak
Wiki)
Quote of the day
In essence, Smalltalk is a programming language focused on human beings
rather than the computer.
-Alan Knight
Installation stuff
Note: before you fire
up Squeak, I need to warn you to not be put off by the sparten GUI. There's
actually two types of GUIs in Squeak: MVC & Morphic, both of
which have skins to implement specific look-n-feels. For at least
the beginning of the series, I plan on sticking to Morphic without skins,
as it's the newer GUI and I want to keep things simple.
To install Squeak, you basically need to download
and unzip 4 files. RPMs are available for people who prefer them.
For instructions on downloading and installing Squeak, see these installation
instructions, or these installation
instructions. (Note: I'm using v2.7 of Squeak, which isn't
the latest version, but for the purposes of these articles, the latest-n-greatest
version is not required unless otherwise noted)
First Looks
Note: do not save anything until we get to
that point below. The initial orientation and setup of squeak is
a little painful, but by the time we're done here it'll be much more friendly.
Now that you have Squeak installed, let's fire it
up. Go to a command prompt, cd to the directory where squeak is,
and type squeak Squeak-2.7.image. You'll see a window open,
with 10 windows within it. Feel free to read the Welcome To...
and Getting Started... windows. If you want to skip this and
read them later, that's fine too. You'll notice that the look-n-feel
is "weird", don't worry about this. There are reasons for this that
I'll get to in a future article. You can also play around with the
various Play With Mes (there's some neat things there). Feel
free to mess around to your heart's content, try resizing things, moving
them ,etc. Don't worry about breaking anything as we haven't saved
anything yet. When you click on Play With Me 3, 6, 7 or 8,
you need to click on the window to get into it. To get out of it,
left
click on the window background, and select previous project.
When you're done playing, and you're back in the
main view you started out in, middle click on the squeak background
somewhere, and select quit, and no, as we don't want to save
any changes. Now restart squeak, and move the Welcome To...
window somewhere. Now middle click on the squeak background
somwhere, and select save and quit. Now, restart sqeuak again...
notice that the window is in the place where you left it. In fact,
every time you save in sqeuak the state of the IDE is saved exactly
as it was! 2 All the window
placements, all the code - everything is exactly where you left it.
This is great for getting back up to speed quickly on what you were doing.
For the read-along folks, here's what the Welcome
To... & two of the Play With Me windows look like:
Now, let's do a little customization before we move
on to examples. Open a workspace (middle click on the squeak
background, select open...>workspace.) You'll notice that
it's the same type of window as the Welcome To... and Getting
Started... windows. Enter in the following code snippits:
Preferences setPreference: #noviceMode toValue:
true.
Preferences setPreference: #inboardScrollbars
toValue: true.
Preferences setPreference: #useGlobalFlaps toValue:
true.
Then highlight both lines and execute the
code (middle click>do it). This is known as 'doing it' in
Smalltalk. Congratulations, you just ran your first Smalltalk code.
Don't worry about the symantics right now, just be aware that we set some
preferences. Now, remember when I mentioned that we'd be using the
morphic GUI type for these articles? To do this, middle click
on the squeak background, select open...>morphic
project. You'll see a small window appear called Unnamed1.
Let's name this project something, as you've already probably experienced,
clicking on the title of the window will bring up a rename prompt.
Type in Making Smalltalk. If you want, you can resize the window
to see the whole title.
Now, let's enter the project, do this by clicking
on the project to give it focus, then clicking on it again. You'll
notice there are four tabs arranged around the screen (Menus,
Squeak, Tools, and Supplies). If you mouse over the tab, a pop
up menu will appear with neat stuff on it. If you mouse over the
Menu
tab you'll see the open... menu in the top left corner, select workspace
to open up a workspace. You'll notice the look-n-feel is a little
different now, as we're using the Morphic type of GUI; this project will
be the basis of these articles.
One thing you'll notice from the menus, is that there's no saving option.
Since we want to save everything we've done, let's get that menu.
To do this, right click on the project background, you should see
a series of different coloured dots around the screen. We're not
going to get into their purpose just yet. Now left click on
the red dot in the top left hand corner of the screen, you'll see
a playfield menu, select keep this menu up. Now the menu is
sticky, and you can move it around. Let's move it out of the way
of the flaps to the bottow left hand corner of the screen. Finally,
let's save what we've done, on that menu you just made sticky, click on
save.
Your window should look something like:
Getting to objects
As I mentioned, the bulk of this article is going to
be setting the stage for future articles. Now we can finally start
addressing the topic at hand. There are many different definitions
of what an object is. One way of thinking about it is that an object
is anything you can think of that is a noun. A window, a menu, an
array, a GUI, a string, an integer, a person, a tree, etc. This is
a very simple view of what an object is, and we'll refine the definition
over time.
In Smalltalk, everything is an object3.
Unlike other languages where small building blocks like integers or strings
aren't objects, everything is an object. If you have procedural programming
experience, this is a good mantra to repeat for about 6 months.
Let's start with the venerable Hello World example,
but with a minor update (sheesh, we're not back in the '60s here).
Instead of printing a string to the stdout (to the command line), let's
open a window with the string in it. In the workspace enter and 'do':
(Workspace new contents: 'Hello World') openLabel:
'Hello World Workspace'
You'll see:
Remember when I said everything is an object?
Well, we asked a new Workspace object to make its contents Hello World,
then
asked it to open itself with the label 'Hello World Workspace'.
Notice there's no 'main' method, no compiling and linking step, no switching
between a text editor and a compiler. The simplicity of being able
to just type Smalltalk code and run it is very refreshing.
...but this old example is pretty worn out.
Let's do something a little more up to date4.
Let's make a line; in the workspace enter and do:
World addMorph:
(PolygonMorph
vertices: {50@50.
200@200}
color: Color red
borderWidth: 20
borderColor: Color
red)
You'll see:
Here, we asked the project (World) we're in (projects
are objects too) to add a morph that is a red line from point 50x50 to
point 200x200. Now, let's play with this object a little bit, if
you right click on the line object, you'll get the various multi-coloured
points again (these are called halos). If you mouse over the line
object, you'll see pop-up help describing what the halos do (Rote, Change
size, debug, Duplicate, Move, etc). Left click on the
yellow halo, and resize the line a few times. Try the rotate,
duplicate, move buttons to play some more. Finally left click
on the 'X' button when you want to get rid of the line object(s).
To make this first article digestible, I'm going
to stop off here. Before I go though, I'm going to introduce the
'Sweet Squeak' section...
A Sweet Squeak
This section won't explore/explain code or example, but merely present
a neat thing to try out5. This
time, lets view a shockwave file. If you have an internet connection
up, try entering this code and do it: (note, might take a while
over 28.8; I did this at a friend's place with a 128K ISDN and it was pretty
snappy)
(FlashMorphReader on: (HTTPSocket
httpGet: 'http://www.audi.co.uk/flash/intro1.swf'
accept:'application/x-shockwave-flash'))
processFile startPlaying openInWorld.
Looking forward
The next article will discuss Objects again as well as classes, messages
and encapsulation.
Also, if any Squeakers out there know of something neat that can be
easily done, let me know and I'll add it if there's room.
Questions and Answers
As opposed to including already answered questions via email, I'm going
to start this section with a clean slate to address questions (as I have
time) that this series raises. If you want a faster response, try
posting your question to the comp.lang.smalltalk newsgroup, or the Swiki.
Article Glossary
This is a glossary of terms that I've used for the first time in this series,
or a term that I want to refine. If you don't see a term defined
here, try the ongoing
glossary [LL]
IDE
Integrated Development Environment.
An environment that programmers use to develop code in that they can program
and debug in.
[LL]
relative Local Link, use
this link when browsing these articles locally
Object
(def 1-simple)
An object is anything you can think of that is a noun. A window,
a menu, an array, a GUI, a string, an integer, a person, a tree, etc.
OO
Object Oriented Briefly,
this is a popular style/methodology of programming that these articles
are going to introduce.
Project
A specific view of the
code. You can have multiple simultaneous views of the code.
This is very handy if you're doing two or three projects at once, and don't
want to lose track of where you're are in them.
Wiki site
A series of web sites where
there is no designated editor (for the most part, the odd page may have
a password). If you see a way to improve the site, you can do so yourself!
If you don't understand something, just edit the web page and type in your
question!
Footnotes
[1] Keeping the articles concise will actually be the biggest challange.
There's such a wealth of information that it's hard to convey just what
is needed. To that end, I plan on making some simplifications
as I go along and gradually refine them to reflect the technicalities.
[2] This is a feature common to all Smalltalk flavours that I
know of. It's one of the many thinks I like about Smalltalk.
[3] This is the same assertion that I made in the first article,
and I had a pile of people email me about how this isn't technically accurate.
I thought from the context of the article that it would be apparent that
this was a simplified generalization, oh well. This time I'll be
explicit: this assertion is technically not accurate: not everything
in Smalltalk is an object, but the vast majority of things are. For
the beginner, it's a helpful simplifying view to have. I plan on
refining this view later on.
[4] This snippet is from a Swiki
entry by Dan Ingalls
[5] This snippet is also from the Swiki
Copyright © 2000, Jason Steffler.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 59 of Linux Gazette, November 2000