C7934_chapter_ada_online.qxd 12/20/11 11:32 AM Page 1 Programming in Ada Online module to accompany Invitation to Computer Science, 6th Edition ISBN-10: 1133190820; ISBN-13: 9781133190820 (Cengage Learning, 2013). 1. Introduction to Ada 1.1 A Simple Ada Program 1.2 Creating and Running an Ada Program 2. Virtual Data Storage 3. Statement Types 3.1 Input/Output Statements 3.2 The Assignment Statement 3.3 Control Statements 4. Another Example 5. Managing Complexity 5.1 Divide and Conquer 5.2 Using Functions/Procedures 5.3 Writing Functions/Procedures 5.4 An Ada Feature: User-Defined Subtypes 6. Object-Oriented Programming 6.1 What Is It? 6.2 Ada and OOP 6.3 One More Example 6.4 What Have We Gained? 7. Graphical Programming 7.1 Graphics Hardware 7.2 Graphics Software 8. Conclusion E X E R C I S E S A N S W E R S T O P R A C T I C E P R O B L E M S 1 ©2013 Course Technology, a part of Cengage Learning. C7934_chapter_ada_online.qxd 12/20/11 11:32 AM Page 2 1 Introduction to Ada Hundreds of high-level programming languages have been developed; a fraction of these have become viable, commercially successful languages. There are a half-dozen or so languages that can illustrate some of the concepts of a high-level programming language, but this module uses Ada for this purpose. The Ada language was developed by the United States Department of Defense in the 1980s and upgraded to include object-oriented capabilities in the mid-1990s. Ada is presented in this module as an example of a language that can carry out all of the tasks expected of a modern programming language, but it has a rather different syntax from the C-like languages of C, C++, C#, and Java. The major difference between Ada and these languages is the manner in which sections of code are delimited. In C-like languages, curly braces are used to delimit code sections, e.g., {. . .}. In Ada, keywords are used as delimiters, e.g., BEGIN . . . END. Our intent here is not to make you an expert programmer—any more than our purpose in Chapter 4 was to make you an expert circuit designer. Indeed, there is much about the language that we will not even discuss. You will, however, get a sense of what programming in a high-level language is like, and perhaps you will see why some people think it is one of the most fascinating of human endeavors. 1.1 A Simple Ada Program Figure 1 shows a simple but complete Ada program. Even if you know nothing about the Ada language, it is not hard to get the general drift of what the program is doing. FIGURE 1 -- Computes and outputs travel time A Simple Ada Program -- for a given speed and distance -- Written by J. Q. Programmer, 6/15/13 WITH TEXT_IO; PROCEDURE TravelPlanner IS PACKAGE INT_IO IS NEW TEXT_IO.INTEGER_IO(INTEGER); PACKAGE FLO_IO IS NEW TEXT_IO.FLOAT_IO(FLOAT); 2 Programming in Ada ©2013 Course Technology, a part of Cengage Learning. C7934_chapter_ada_online.qxd 12/20/11 11:32 AM Page 3 FIGURE 1 A Simple Ada Program speed : INTEGER; -- rate of travel (continued) distance : FLOAT; -- miles to travel time : FLOAT; -- time needed for this travel BEGIN TEXT_IO.PUT(“Enter your speed in mph: ”); INT_IO.GET(speed); TEXT_IO.PUT(“Enter your distance in miles: ”); FLO_IO.GET(distance); time := distance / FLOAT(speed); TEXT_IO.PUT(“At ”); INT_IO.PUT(speed); TEXT_IO.PUT(“ mph, ”); TEXT_IO.PUT(“it will take ”); TEXT_IO.NEW_LINE; FLO_IO.PUT(time); TEXT_IO.PUT(“ hours to travel ”); FLO_IO.PUT(distance); TEXT_IO.PUT(“ miles.”); TEXT_IO.NEW_LINE; END TravelPlanner; Someone running this program (the “user”) could have the following dialogue with the program, where boldface indicates what the user types: Enter your speed in mph: 58 Enter your distance in miles: 657.5 At 58 mph, it will take 1.13362E+01 hours to travel 6.57500E+02 miles. The general form of a typical Ada program is shown in Figure 2. To compare our simple example program with this form, we have reproduced the example program in Figure 3 with a number in front of each line. The numbers are there for reference purposes only; they are notpart of the program. Lines 1–3 in the program of Figure 3 are Ada comments. Anything appearing on a line after the double dash (--) is ignored by the compiler; it is treated as a comment in the assembly language programs of Chapter 6. FIGURE 2 The Overall Form of a Typical prologue comment [optional] Ada Package Body Program with clauses procedure name functions/procedures [optional] declaratives begin code end name 1 Introduction to Ada 3 ©2013 Course Technology, a part of Cengage Learning. C7934_chapter_ada_online.qxd 12/20/11 11:32 AM Page 4 FIGURE 3 The Program of Figure 1 1. -- Computes and outputs travel time (line numbers added for 2. -- for a given speed and distance reference) 3. -- Written by J. Q. Programmer, 6/15/13 4. 5. WITH TEXT_IO; -- USE TEXT_IO; 6. 7. PROCEDURE TravelPlanner IS 8. PACKAGE INT_IO IS NEW TEXT_IO.INTEGER_IO(INTEGER); 9. PACKAGE FLO_IO IS NEW TEXT_IO.FLOAT_IO(FLOAT); 10. 11. speed : INTEGER; -- rate of travel 12. distance : FLOAT; -- miles to travel 13. time : FLOAT; -- time needed for this travel 14. 15. BEGIN 16. 17. TEXT_IO.PUT(“Enter your speed in mph: ”); 18. INT_IO.GET(speed); 19. TEXT_IO.PUT(“Enter your distance in miles: ”); 20. FLO_IO.GET(distance); 21. 22. time := distance / FLOAT(speed); 23. 24. TEXT_IO.PUT(“At ”); 25. INT_IO.PUT(speed); 26. TEXT_IO.PUT(“ mph, ”); 27. TEXT_IO.PUT(“it will take ”); 28. TEXT_IO.NEW_LINE; 29. FLO_IO.PUT(time); 30. TEXT_IO.PUT(“ hours to travel ”); 31. FLO_IO.PUT(distance); 32. TEXT_IO.PUT(“ miles.”); 33. TEXT_IO.NEW_LINE; 34. END TravelPlanner; Although the computer ignores comments, they are important to include in a program because they give information to the human readers of the code. Every high-level language has some facility for including comments, because understanding code that someone else has written (or understanding your own code after a period of time has passed) is very difficult without the notes and explanations that comments provide. Comments are one way to document a computer program to make it more understandable. The comments in the program of Figure 3 describe what the program does plus tell who wrote the program and when. These three comment lines together make up the pro- gram’s prologue comment (the introductory comment that comes first). According to the general form of Figure 2, the prologue comment is optional, but providing it is always a good idea. It’s almost like the headline in a news- paper, giving the big picture up front. 4 Programming in Ada ©2013 Course Technology, a part of Cengage Learning. C7934_chapter_ada_online.qxd 12/20/11 11:32 AM Page 5 History of Ada Ada is probably the most systematically developed pro- known as Ironman. Four designs were evaluated in 1978, gramming language ever. In the mid-1970s, the United and two of these were selected to compete against the States Department of Defense (DoD) set about trying to final set of specifications, named Steelman. The winning solve the problems created by using hundreds of different language was submitted by Cii-Honeywell Bull, led by the programming languages for defense system components. Frenchman Dr. Jean Ichbiah. For his role in developing this Integration was difficult, and reliability was low. Building new language, he was later awarded membership in the on the work begun by the Army, Navy, and Air Force, a Legion of Honor by the President of France. working group laid out the first informal requirements for a The name Ada was chosen, of course, in honor of Lady common programming language. This set of requirements Ada Augusta Byron Lovelace, who worked with Charles was known as Strawman. More complete and stringent Babbage in the 1800s to help “program” his Analytic requirements followed, known successively as Woodenman Engine (see Chapter 1). The Military Standard reference (1975) and Tinman (1976). The working group evaluated manual for Ada was approved in 1980 on Ada Lovelace’s twenty-three existing programming languages against the birthday, December 10. Tinman requirements. As none was found satisfactory, it Between 1987 and 1997, the DoD required the use of was decided to develop a new programming language, and Ada for projects with significant new code. Although this in 1977 the working group issued requests for proposals to standard is no longer in place, Ada is still used to develop be evaluated against the latest specifications, highly reliable software. Blank lines in Ada programs are ignored and are used, like comments, to make the program more readable by human beings. In our example program, we’ve used blank lines (lines 4, 6, 10, 14, 16, 21, 23) to separate sections of the program, visually indicating groups of statements that are related. Before looking at the details of the remaining code line by line, it is important to know that Ada programs are constructed from a collection of packages. Each package consists of two sets of code, an optional specifica- tion, and a body. The code shown in Figures 1 and 3 has only a body, but it is still part of a package. When referencing one package from within another package—for example, the TEXT_IO package from within the pack- age being written (the TravelPlannerprogram)—it is necessary to first iden- tify that package. This is accomplished by adding a with clause to the package being written (line 5). The core Ada language does not provide a way to get data into a program or for a program to display results. The TEXT_IO package contains code for these purposes. Line 5 tells the compiler to look in the TEXT_IO package for the definition of any names not specifi- cally defined within the program. In this program, GET, PUT, and NEW_LINE (used to read input data from the keyboard, write output to the screen, and start a new output line, respectively) obtain their meaning from the TEXT_IO package. One way to reference these code segments is to prefix the name with the name of its package, e.g., line 17: TEXT_IO.PUT(“Enter your speed in mph: ”); This is the method we will use in this module. Another alternative is to add a useclause to the code (see the unnumbered line below line 5 in Figure 3 that is commented out). If this line is in the code, then line 17 can be written as: 1 Introduction to Ada 5 ©2013 Course Technology, a part of Cengage Learning. C7934_chapter_ada_online.qxd 12/20/11 11:32 AM Page 6 PUT(“Enter your speed in mph: ”); without the qualification prefix TEXT_IO. The eventual effect of the with clause is that the linker includes object code from this package. In addition to TEXT_IO, Ada has many other code packages, such as mathematical and graphics packages, and therefore many other with clauses are possible. With clauses are optional, but it would be a trivial program indeed that did not need input data or produce output results, so virtually every Ada program has at least the with clause shown in our example. Names in Ada are not case sensitive and can be written in uppercase, lowercase, or mixed case. The code in this module is written in the style of the Reference Manual for the Ada Programming Language.1 This style can be recognized by noting that many items are typed in all uppercase letters, and that the underscore character is often used as a “word separator,” e.g., TEXT_IO. Now back to the line-by-line code analysis. Line 7 begins the body part of the Ada program. The package body begins with a PROCEDURE statement, which includes a name—in this case, TravelPlanner. The body code concludes with an END statement, line 34, which includes the same name, TravelPlanner. Lines 8 through 13 constitute the declarative portion of the package. Lines 8 and 9 are a special form of declaration. Ada is a strongly-typed language, which means the compiler will not allow you to mix up integers (numbers with no decimal point), floating-point numbers (numbers with decimal points), and strings (such as “abc”) in the same statement. A ram- ification of that requirement is that each type of data must have its own separate mechanism for input and output. Lines 8 and 9 deal with that problem for the TravelPlanner program. There are several “kinds” (think “sizes”) of integers and several “kinds” of floating-point numbers. Line 8 makes a special package named INT_IO for input/output of integers as used in the TravelPlanner program, and line 9 makes a package named FLO_IO for floating-point numbers as used in the TravelPlanner program. Because there is only one kind of string, a special package is not needed. Any I/O operation involving integers must be prefixed by INT_IO, any operation involving floats must be prefixed with FLO_IO, and any I/O operation involving strings must be prefixed by TEXT_IO, as in lines 17–20 and 24–33. Lines 11 through 13 are statements that declare the names and data types for the quantities to be used in the program. Descriptive names—speed, dis- tance, and time—are used for these quantities to help document their purpose in the program, and comments provide further clarification. Note that the data type designation (INTEGER, FLOAT) appears after the name, as opposed to C-like languages, where the data type designation comes first. After all this setup, the executable portion of the package body lies between the BEGIN at line 15 and the END statement at line 34. For want of a 1Reference Manual for the Ada Programming Language(ANSI/MIL-STD-1815A-1983), Springer-Verlag, New York, 1983, ISBN:0-387-90887-0. Ada is a registered trademark of the U.S.Government. 6 Programming in Ada ©2013 Course Technology, a part of Cengage Learning. C7934_chapter_ada_online.qxd 12/20/11 11:32 AM Page 7 better term, we’ll call this portion the “main program code,” even though the entire Ada program is “code.” Line 17 outputs a string (TEXT_IO.PUT( . . . )) as a prompt to the user to enter a value. Line 18 (INT_IO.GET( . . . )) gathers the integer input for speedthat is typed in by the user on the keyboard. Lines 19 and 20 do a similar job for the floating-point value of distance. Line 22 is a replacement statement used to compute the value for time. Two important features of this statement are that the replacement operator is :(cid:2)(as opposed to (cid:2)in many languages), and that strong typing requires that the integer value of speed be converted to type FLOAT before the division operation will be allowed to take place. Lines 24 through 33 create the output display on the console screen. Lines 28 and 33 create the line breaks in the output. Line 34 signals the end of the source code for the package. Each line of code within the structural markers (PROCEDURE, BEGIN, END) must end with a semicolon. The semicolon requirement is a bit of a pain in the neck, but the Ada compiler generates one or more error messages if you omit the semicolon, so after the first few hundred times this happens, you tend to remember to put it in. Ada, along with every other programming language, has very specific rules of syntax—the correct form for each component of the language. Having a semicolon at the end of every executable statement is an Ada syntax rule. Any violation of the syntax rules generates an error message from the com- piler because the compiler does not recognize or know how to translate the offending code. In the case of a missing semicolon, the compiler cannot tell where the instruction ends. The syntax rules for a programming language are often defined by a formal grammar, much as correct English syntax is defined by rules of grammar. Ada is a free-format language, which means that it does not matter where things are placed on a line. For example, we could have written time := distance / FLOAT(speed); although this is clearly harder to read. The free-format characteristic explains why a semicolon is needed to mark the end of an instruction, which might be spread over several lines. 1.2 Creating and Running an Ada Program Creating and running an Ada program is basically a three-step process. The first step is to type the program into a text editor. When you are finished, you save the file, giving it a name with the extension .adb. The extension “adb” (shorthand for Ada body) is used since this is a package body. Specification files would have an extension .ads.So the file for Figure 1 could be named TravelPlanner.adb As the second step, the program in the .adb file must be prepared for execu- tion. This step has three substeps: compilation (turn the source file into an 1 Introduction to Ada 7 ©2013 Course Technology, a part of Cengage Learning. C7934_chapter_ada_online.qxd 12/20/11 11:32 AM Page 8 object file), binding (associate address values with symbolic names), and link- ing (connect the object code just created with any other object code needed), resulting in an executable file. In our example, the result is a file called TravelPlanner.exe The third step operates on the .exe file and loads and executes the program. Depending on your system, you may have to type operating system commands for the last two steps. Another approach is to do all of your work in an Integrated Development Environment, or IDE. The IDE lets the programmer perform a number of tasks within the shell of a single application program, rather than having to use a sep- arate program for each task. A modern programming IDE provides a text editor, a file manager, a compiler, a linker and loader, and tools for debugging, all within this one piece of software. The IDE usually has a GUI interface with menu choices for the different tasks. This can significantly speed up program development. This Ada exercise is just a beginning. In the rest of this module, we’ll examine the features of the language that will enable you to write your own Ada programs to carry out more sophisticated tasks. Ada Compiler and Graphics Library You can download the free open-source GNAT Ada95 command-line compiler that is part of the GNU Compiler Collection from www.gnu.org/software/gnat/gnat.html There are versions that run on Linux, Mac OS X, and Windows systems. The graphics library used in this chapter is AdaGraph, available for free download from http://users.ncrvnet.nl/gmvdijk/adagraph.html 2 Virtual Data Storage One of the improvements we seek in a high-level language is freedom from having to manage data movement within memory. Assembly language does not require us to give the actual memory address of the storage location to be used for each item, as in machine language. However, we still have to move values, one by one, back and forth between memory and the arithmetic logic unit (ALU) as simple modifications are made, such as setting the value of A to the sum of the values of B and C. We want the computer to let us use data values by name in any appropriate computation without thinking about where they are stored or what is currently in some register in the ALU. In fact, we do not even want to know that there is such a thing as an ALU, where data are moved to be operated on; instead, we want the virtual machine to manage the details when we request that a computation be performed. A high-level language allows this, and it also allows the names for data items to be more meaningful than in assembly language. Names in a programming language are called identifiers. Each language has its own specific rules for what a legal identifier can look like. In Ada an identifier 8 Programming in Ada ©2013 Course Technology, a part of Cengage Learning. C7934_chapter_ada_online.qxd 12/20/11 11:32 AM Page 9 can be any combination of letters, digits, and the underscore symbol (_), as long as it starts with a letter. An additional restriction is that an identifier cannot be one of the few reserved words, such as BEGIN, INTEGER, FLOAT, and so forth, that have a special meaning in Ada and that you would not be likely to use any- way. The three integers B, C, and Ain our assembly language program can there- fore have more descriptive names, such as subTotal, tax, and finalTotal. The use of descriptive identifiers is one of the greatest aids to human understanding of a program. Identifiers can be almost arbitrarily long, so be sure to use a meaning- ful identifier such as finalTotal instead of something like A; the improved read- ability is well worth the extra typing time. Ada is nota case-sensitivelanguage, which means that uppercase letters are treated the same as lowercase letters. Thus, FinalTotal, Finaltotal, and finalTotalare all the same identifier. CAPITALIZATION OF IDENTIFIERS There are two standard capitalization patterns for identifiers, particularly “multi- ple word” identifiers: camel case: First word begins with a lowercase letter, additional words begin with uppercase letters (finalTotal) Pascal case: All words begin with an uppercase letter (FinalTotal) As mentioned earlier, the Ada code in this chapter will follow the formatting of the Ada LRM (Language Reference Manual) when referring to packages that are part of the Ada system. For other identifiers, the code in this chapter uses the following convention (examples included): Simple variables – camel case: speed, time, finalTotal Function names – camel case: myFunction, getInput Class names – Pascal case: MyClass Object names – camel case: myObject The underscore character is not used in programmer-defined identifiers; it is used in “standard” Ada such as TEXT_IO.PUT(. . .). Occasionally, we’ll use single capital letters for identifiers in quick code fragments. Data that a program uses can come in two varieties. Some quantities are fixed throughout the duration of the program, and their values are known ahead of time. These quantities are called constants. An example of a constant is the integer value 2. Another is an approximation to p, say 3.1416. The integer 2 is a constant that we don’t have to name by an identifier, nor do we have to build the value 2 in memory manually by the equivalent of a .DATA pseudo-op. We can just use the symbol “2” in any program statement. When “2” is first encoun- tered in a program statement, the binary representation of the integer 2 is auto- matically generated and stored in a memory location. Likewise, we can use “3.1416” for the real number value 3.1416, but if we are really using this number as an approximation to p, it is more informative to use the identifier pi. Some quantities used in a program have values that change as the program executes, or values that are not known ahead of time but must be obtained from the computer user (or from a data file previously prepared 2 Virtual Data Storage 9 ©2013 Course Technology, a part of Cengage Learning. C7934_chapter_ada_online.qxd 12/20/11 11:32 AM Page 10 by the user) as the program runs. These quantities are called variables. For example, in a program doing computations with circles (where we might use the constant pi), we might need to obtain from the user or a data file the radius of the circle. This variable can be given the identifier radius. Identifiers for variables serve the same purpose in program statements as pronouns do in ordinary English statements. The English statement “He will be home today” has specific meaning only when we plug in the value for which “He” stands. Similarly, a program statement such as time := distance/FLOAT(speed); becomes an actual computation only when numeric values have been stored in the memory locations referenced by the distanceand speedidentifiers. We know that all data are represented internally in binary form. In Chapter 4 we noted that any one sequence of binary digits can be interpreted as a whole number, a negative number, a real number (one containing a decimal point, such as –17.5 or 28.342), or as a letter of the alphabet. Ada requires the following information about each variable in the program: • What identifier we want to use for it (its name) • What data type it represents (e.g., an integer or a letter of the alphabet) The data type determines how many bytes will be needed to store the variable—that is, how many memory cells are to be considered as one memory location referenced by one identifier—and also how the string of bits in that memory location is to be interpreted. Ada provides several “primitive” data types that represent a single unit of information, as shown in Figure 4. The way to give the necessary information within an Ada program is to declare each variable. A variable declarationconsists of a list of one or more identifiers of the same data type followed by that data type. Our sample pro- gram used three declaration statements: speed : INTEGER; -- rate of travel distance : FLOAT; -- miles to travel time : FLOAT; -- time needed for this -- travel but these could have been combined into two: speed : INTEGER; -- rate of travel distance, time : FLOAT; -- miles to travel and -- time needed for this -- travel FIGURE 4 Some of the Ada Primitive INTEGER An integer quantity Data Types FLOAT A real number CHARACTER A character (a single keyboard character, such as ‘a’) 10 Programming in Ada ©2013 Course Technology, a part of Cengage Learning.
Description: