about summary refs log tree commit diff stats
path: root/js/games/nluqo.github.io/~bh/ssch26/preview
diff options
context:
space:
mode:
Diffstat (limited to 'js/games/nluqo.github.io/~bh/ssch26/preview')
-rw-r--r--js/games/nluqo.github.io/~bh/ssch26/preview231
1 files changed, 231 insertions, 0 deletions
diff --git a/js/games/nluqo.github.io/~bh/ssch26/preview b/js/games/nluqo.github.io/~bh/ssch26/preview
new file mode 100644
index 0000000..24e71bc
--- /dev/null
+++ b/js/games/nluqo.github.io/~bh/ssch26/preview
@@ -0,0 +1,231 @@
+\input bkmacs
+\bigskip
+\photo{}{\pspicture{4in}{sicp}{sicp}{\TrimBoundingBox{40pt}}\vfill}
+\chapter{What's Next?}
+\chaptag{\preview}
+
+We've concluded this introduction to computer science with two examples of
+``real world'' programming---spreadsheets and databases.  What may have
+seemed like a pointless game near the beginning of the book allowed us to
+write these serious programs.
+
+But we've only begun to explore the ideas that make up computer science.
+If you're interested in learning more, where do you go from here?
+
+\subhd{The Best Computer Science Book}
+
+The next step is to read \itidx{Structure and Interpretation of Computer
+Programs} by \swapidx{Harold}{Abelson} and \swapidx{Gerald Jay}{Sussman}
+with \swapidx{Julie}{Sussman} (MIT Press/McGraw-Hill, Second Edition,
+1996).  Our book was inspired by theirs, and our main goal in writing this
+book has been to prepare you for that one.  If you're a student and your
+school offers a course based on {\it SICP,\/} take it!  If not, read the
+book on your own.
+
+The big organizing idea of {\it SICP\/} is \idx{abstraction}.  We've used
+this idea in several ways.  We've talked about {\it data abstraction\/} such
+as inventing the sentence and tree data types.  We've also invented more
+specialized data types, such as positions in the tic-tac-toe program and
+cells in the spreadsheet program.  We've discussed how higher-order
+procedures abstract a pattern of computation by using an extra argument to
+represent the function that's abstracted out.
+
+What we've done in this book covers most of the main ideas in about the first
+hundred pages of {\it SICP.\/} But don't skip over those pages.  In the
+footnotes alone you'll find ideas about numerical analysis, cryptography,
+epistemology (the study of what it means to know something), number theory,
+programming language design, and the analysis of algorithms.
+
+Because there {\it is\/} some overlap between what we teach and what they
+teach, you may think at first that you can breeze through a course based on
+{\it SICP.\/} Don't fall into that trap; even from the beginning there will
+be some ideas that are new to you, and after about four weeks it will {\it
+all\/} be new to you.
+
+The core ideas of this book are in the first chapter of {\it SICP:\/}
+functions, recursion, the substitution model, and higher-order functions.
+The second chapter is about lists and data abstraction, extending the ladder
+of data abstractions in both directions.  (That is, in our book, lists are
+the fundamental data type used to construct the {\it sentence\/} and {\it
+tree\/} abstract data types.  In {\it SICP\/} you first learn that lists
+themselves are built of an even more fundamental type, the {\it pairs\/}
+that we mentioned in a pitfall in Chapter \lists.  Then you learn about
+several more abstract data types that can be built out of lists.)  The idea
+of data abstraction extends beyond inventing new types. For example, {\it
+SICP\/} uses data structures not only to contain passive information but
+also to control the algorithms used in a computation.  You got a taste of
+this in the a-list of functions in the {\tt functions} program.
+
+The third chapter of {\it SICP\/} is largely about non-functional
+programming, a topic we only begin in this book.  Specifically, {\it
+SICP\/} introduces object-oriented programming, a very popular technique in
+which the dichotomy between ``smart'' procedures and passive data is broken
+down.  Instead of a single program controlling the computation, there are
+many {\it objects\/} that contain both algorithms and data; each object acts
+independently of the others.  (This is a metaphor; there is still one
+computer implementing all this activity.  The point is that the programmer
+is able to think in terms of the metaphor, and the mechanism that simulates
+the independent objects is hidden behind the object abstraction.)
+
+You may have forgotten by now that {\it SICP\/} stands for {\it Structure
+and Interpretation of Computer Programs.\/} We've been talking about the
+``structure'' part:\ how a program is organized to reflect the algorithm it
+implements.  The ``interpretation'' half of the book explains how a
+programming language like Scheme really works---how a computer understands
+the program and carries out the activities that the program requests.  The
+centerpiece of the interpretation part of the book is the Scheme interpreter
+in the fourth chapter,
+a program that takes any other Scheme program as its data and does
+what that program specifies.  (The {\tt compute} procedure that evaluates
+arithmetic expression trees in Chapter \trees\ and the {\tt ss-eval}
+procedure in our spreadsheet program give a hint of what the {\it SICP\/}
+Scheme evaluator is like.)  The book goes on to implement different
+programming languages and illustrate a variety of implementation techniques.
+Finally, the fifth chapter introduces the study of machine organization:\ how
+computer hardware carries out a program.
+
+\subhd{Beyond {\it SICP\/}}
+
+Computer science can be broadly divided into three areas:\ software,
+hardware, and theory.  (Of course not everyone will agree with our division
+in detail.)  This book is about software.  {\it SICP\/} is also mostly about
+software, although it introduces some ideas from the other two areas.  More
+advanced computer science courses will concentrate on one particular area.
+
+Software includes programming languages, operating systems, and application
+programs.  You know what a programming language is; there are courses on
+language design questions (why one language is different from another) and
+implementation (for example, how to write a Scheme
+interpreter).\footnt{Many beginners think that studying computer science
+means learning a lot of different programming languages.  Perhaps you start
+with BASIC, then you learn Pascal, then C, and so on.  That's not
+true.  The crucial ideas in computer science can be expressed in any modern
+language; it's unusual for a computer science student to be taught more than
+two languages throughout college.} An operating system is a program
+that maintains disk file structures and allows different programs to run on
+a computer without interfering with each other.  Application programming
+techniques studied in computer science courses include database management,
+graphics programming, user interfaces, and artificial intelligence.
+
+The study of computer hardware ranges from physical principles, through the
+workings of electronic components such as transistors, to large-scale
+circuits such as memories and adders, to the design of actual computers.  This
+is a range of levels of abstraction, just as there are levels of abstraction
+in programming.  At the higher levels of abstraction, you can think of an
+electronic circuit as a perfect representation of some function that it
+implements; that is, the signals coming out the output wires are functions
+of the signals coming in at the input wires.  At a lower level of
+abstraction, you have to think about the limitations of physical devices.
+(For example, a device may fail if its output is attached to the inputs of
+too many other devices.  It's as if you could use the return value from
+a function only a certain number of times.)
+
+Theoretical computer science is a kind of applied mathematics.  It includes
+analysis of algorithms, which is the study of how fast one program runs
+compared to another.  (We touched on this topic when we mentioned that the
+simple selection sort is slower than the more complicated mergesort.
+Analysis of algorithms provides the tools to show exactly how much slower.)
+Theoreticians also study problems that can't be solved by any computer
+program at all; the most famous example is the {\it halting problem\/} of
+determining in finite time whether some other program would run forever.
+{\it Automata theory\/} is the study of simplified pseudo-computers to prove
+theorems about the capabilities of computers in general.
+
+A few topics don't fit readily into one of our three groups, such as {\it
+numerical analysis,\/} the study of how computers do arithmetic to ensure
+that the algorithms used really give correct results.  This field involves
+aspects of programming, hardware design, and mathematics.  {\it Robotics\/}
+involves artificial intelligence programming techniques along with
+electrical and mechanical engineering.
+
+\backskipsubhd{Standard Scheme}{8}
+
+{\blskip{2}
+
+As we've mentioned, this book uses a lot of ``primitive'' procedures that
+aren't part of standard Scheme.  These are procedures we wrote in
+Scheme and included in the file {\tt simply.scm}, which is listed in
+Appendix C\null.
+
+When you use Scheme in some other context, it probably won't come with these
+procedures included.  There are three things you can do about this:
+
+\medskip
+{\parindent=1em
+\bb Learn to love standard Scheme.  That means not using the word and
+sentence functions, not using our implementation of trees, not using our
+higher-order procedures ({\tt map} and {\tt for-each} are the only standard
+ones), and not using {\tt read-line}, {\tt read-string}, {\tt show}, {\tt
+show-line}, {\tt align}, or {\tt close-all-ports}.  Also, you may find it
+necessary to use data types we haven't fully explained:\ characters,
+strings, and pairs.
+\bb Load our {\tt simply.scm} and continue to work in the style we've used
+in this book.  The advantage is that (in our humble opinion) we've provided
+some very convenient facilities.  The disadvantage is that other Scheme
+programmers won't understand your programs unless they've read our book.
+\bb Develop your own collection of tools to match the kind of programming
+you're doing in the new situations that come up.  You can start with some
+of ours and add new procedures that you invent.
+
+}
+
+Actually, all three of these are good ideas.  If you are going to continue
+working with Scheme, you'll certainly need to know what's in the standard and
+what's an extension to the language.  After a while you're bound to develop
+a collection of tools that fit with your own preferred programming style.
+And sometimes {\tt butfirst} will be just what you need for some project.
+
+You may be curious about the {\it implementation\/} of our tool procedures.
+You've already seen some of them, such as the higher-order procedures whose
+implementation is described in Chapter \implhof.  The input/output procedures
+({\tt show} and its friends) are straightforward once you've learned about
+the character data type.  But you'll find that the implementation of words
+is quite complicated.  Not only did we have to write the obvious {\tt word},
+{\tt first}, and so on, but we also had to rewrite all of the arithmetic
+procedures so they work on words like {\tt "007"} as well as ordinary numbers.
+
+There are two documents that specify exactly what makes up standard Scheme.
+The first is updated fairly frequently to reflect ongoing experimentation in
+the language design.  As we go to press, the most recent edition is called
+the {\it Revised\/${}^5$ Report on the Algorithmic Language Scheme.\/} The
+second document is meant to provide a more stable basis for people who
+depend on a language that's guaranteed not to become obsolete; it's IEEE
+Standard 1178-1990, {\it IEEE Standard for the Scheme Programming
+Language,\/} published by the Institute of Electrical and Electronic
+Engineers in 1991.  Appendix A tells you how to find both documents.
+
+\backskipsubhd{Last Words}{8}
+
+It's hard to wrap up something like this without sounding preachy.  Perhaps
+you'll forgive us this one section since we've been so cool all
+through the rest of the book.
+
+We thought of two general points that we want to leave you with.  First, in
+our teaching experience at Berkeley we've seen many students learn the ideas
+of functional programming in Scheme, then seem to forget all the ideas when
+they use another programming language, such as C.  Part of the skill of a
+computer scientist is to see past surface differences in notation and
+understand, for example, that if the best way to solve some problem in Scheme
+is with a recursive procedure, then it's probably the best way in C, too.
+
+The second point is that it's very easy to get a narrow technical education,
+learn lots of great ideas about computer science, and still have a hard time
+dealing with the rest of reality.  The utilitarian way to put it is that when
+you work as a computer programmer it's rare that you can just sit in your
+corner and write programs.  Instead, you have to cooperate with other people
+on a team project; you have to write documentation both for other
+programmers and for the people who will eventually use your program; you have
+to talk with customers and find out what they really want the program to do,
+before you write it.  For all these reasons you have to work at developing
+communication skills just as much as you work at your programming skills.
+But the utilitarian argument is just our sneaky way of convincing
+you; the truth is that we want you to know about things that have nothing to
+do with your technical work.  Matt majored in music along with computer
+science; Brian has a degree in clinical psychology.  After you read Abelson
+and Sussman, go on to read Freud and Marx.
+\justidx{Freud, Sigmund}
+\justidx{Marx, Karl}
+
+} % skip kludge
+
+\bye