date, many recent developments are not covered. These include VLSI, parallel algorithm design, distributed processes, programming languages for concurrent processes and the theory of parallelism. The chapters on algorithms are highly mathematical and deal with solutions, analysis and optimization of various parallel problems. The section on software mainly deals with parallel extensions to existing sequential languages such as FORTRAN, ALGOL and PASCAL rather than special-purpose languages with parallel features. For example ADA, MODULA-2 and OCCAM are not covered. Other languages with possibilities for parallelism such as logic programming languages (eg PROLOG) and functional languages like HOPE are not mentioned.
The chapters about hardware also feel a little historical, using the CDC Star-100 and Cray 1 as examples of supercomputers with parallel features rather than the more modern Cyber 205 and Cray XMP. Microprocessors suitable for parallel computers such as the Inmos Transputer, systolic arrays and parallelism in computer graphics are not covered. The chapters mainly concentrate on data-flow, pipeline and arrayprocessor techniques. However, the ICL DAP is not used as an example, presumably because it falls outside the book's period. In general, the book deals with parallel computing in a theoretical way with references to 'real world' computers and programming languages included as examples. There are no photographic illustra-
tions and few diagrams. However, the quality of the binding, paper and typeface is good. To sum up, this book appears outdated to Western eyes. If the Soviets really are ten years behind in the computer race then presumably it will not appear so to Eastern readers. The motivation to translate a book of this kind into English seems unclear and perhaps misguided. It is unlikely to become a best seller. The time would be better spent translating recent Soviet journals which are, hopefully, more timely. This is a book for the library shelf rather than the parallel computing researcher's desk.
Jonathan Bowen Oxford University Computing Laboratory, Oxford, UK
S/w teaches principles of assembly language and microprogramming Lubomir Bic
'Micos: a microprogrammable computer simulator' Blackwell Scientific, Oxford, UK (1984) £11.95 pp 364 One of the major decisions to be made in teaching assembly language programming is to decide whether the programming models used are to be those of actual microprocessors, such as the 6800 and 8080, or whether more general models not identical to specific microprocessors available on the market should be used. The obvious advantage of the latter approach is that the student can then apply the general principles learnt to any microprocessor he/she encounters, and not be tied to any one specific type. However, the choice of model is of the utmost importance, for it should be general enough to be as universally applicable as possible, yet not be unrealistically simple. This book uses a general model which is simple, yet includes all the important features of a real processor. The book is basically aimed at those who would like to gain a solid
grounding in the principles of assembly language programming, as well as computer architecture and microprogramming. It should be most useful to the student or engineer who has some familiarity with fundamental programming concepts as well as a basic knowledge of computer hardware. (For those unfamiliar with binary arithmetic, an appendix provides an introduction to number systems.) The programming model used in the book for assembly language programming is that of a 24-bit stack-oriented processor which is capable of addressing a 512-word memory. The scope of the book, however, extends well beyond assembly language, for it defines the architecture of the model in comprehensive detail and provides a microprogramming language in which the instruction set of the computer is written. This model is implemented in Micos (microprogrammable computer simulator), a software package developed by the author at the University of California, Irvine, USA. The stated aim of Micos is to teach the principles of assembly language and microprogramming,
using a microprogrammable computer model which is implemented completely in software. The book describes both assembly language and microprogramming levels of this model in a clear and well organized manner, defining each of the instructions unambiguously. It is here that the book has its most immediate value, that of providing and describing a simple computer model which is functional at both levels and clarifying the relationship between the two levels. The instruction sets for both levels are well chosen and provide a good basis for the study of more complicated sets. The assembly language instruction set consists of 30 different instructions, while the microprogramming set is naturally much leaner, consisting of only nine instructions. Each instruction is individually described in detail, and its function often illustrated with programming examples and diagrams. The 24-bit formats of the machine language equivalents of both assembly and microprogramming languages are also precisely described. The actual Micos software package is a comprehensive one, providing a simulation of the micro-
programmable computer in software, as well as an assembler to translate the source assembly language programs into the machine language of the computer. In addition, an interpreter is provided which translates each instruction into its corresponding microprogram routine. The user may add new instructions to the higher-level set by writing new microprogram routines to execute these instructions. For this purpose, a microprogram assembler is also provided which appends the new routines to the assembler. A simple trace facility is provided for both the assembly language and microprogramming levels. The book describes the use of the assembler, interpreter and microassembler as well as their interrelationships within the Micos system. It must be emphasized that the book does not provide a listing of the complete package. The only listing provided is that of the Micos interpreter written in the microprogramming language; no listings or flowcharts of the assembler, the microprogramming assembler, the microprogrammable computer simulator, or any of the utilities are given. The machine on which the package was implemented is not even mentioned, nor is there any offer to sell, rent or lease the package, or assist to implement it, to interested instructors. The book has thus to be seen in this light as a students' manual for the Micos package, which the author feels might serve as a pedagogical aid to those interested in microprogrammable architectures. In this sense, the book fulfils its purpose admirably. However, it would be even more useful for teaching if interested parties could also implement the package for their students to gain hands-on experience in assembly language and microprogramming. The book would probably serve most usefully as a supplementary textbook in a course on computer architecture and assembly language programming.
B T G Tan National University of Singapore
Divide-a conquer approach studentsto evaluate and handle ab t system designs Carol A Z i e g l e r
'Programming language methodologies' Prentice-Hall, Englewood Cliffs, N J, USA (1983) £20.65 pp 260 This book sets out to survey the entire process of producing a software system from the first steps of analysis through various methods of design to implementation and validation. It is intended principally as a text for computer science students and so the speed may intimidate the casual or less experienced reader. However, he/ she should not feel disheartened, for there is much material here which can be of value. The very good design premise, known in algorithm terms as 'divide-and-conquer', is established in the early part of the book in breaking first the abstract design and later the final system into manageable-sized chunks. A number of useful methods of evaluating program design are introduced and discussed and some are followed up later in the text. The necessity for evaluation before design is emphasized here with a few examples. The chapters on design, whether of system, data or program, are intelligently linked together with some useful examples. Many now well established design techniques are illustrated although, perhaps inevitably, none of them is given sufficient coverage to be useful without further study. Many of these techniques give rise to a rather picturesque design diagram which can be somewhat verbose. However, they are unquestionably useful to those who have used either primitive or no design tools before. The author also establishes a number of useful classifications of both programs and data, which I found of particular interest. For my part, I found the chapter on algorithm design to be the best. This is, of course, not surprising. It is the area in which most research has
been done, and about which most work has been published. Never-theless, the few classic examples used to illustrate the classification of algorithms should whet the appetite of many people for more irfformation. In considering the mapping o! design into a real programming language, a number of techniques are used, ~anging from structured pseudocode to the various specialize(] notations established in recent years. The use o~ pseudocode is undoubtedly easie~ to cope with for anyone who is familiar with any languages of the At_(;O~ clan, whilst the more diagrammatic forms may suit some other designers A number of valid points of concern about d o c u r n e ~ - tation are also rnade. The author expresses a number ol opinior~s on the detailed implementation of modules. To >: large exte;1L these couid be considered common sense but the mottos liberally scattered throughout the text are al! too often forgotten hy programmers, wit~ disastrous consequences. A number of methods for measuring the complexity .,)t code are outlined in this context. Sadly, they are no1 always easy to follow or apply, although they might be of value ir~ large projects. The most valuable section of the book for many people will be the section on errors, tt is t o o often forgotten that a small error introduced at one point in a calculation can give rise to a large error which could even totally invalidate any results. The author produces a number of results about errors introduced by number representation, arithmetic truncation and approximations. The algebraic detail and manipulation may be offputting lo those without a mathematical inclination, but it is confined to a small section which may be omitted if necessary. In addition, the section on formai verification of programs wilt be of interest to a number of students.