Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
E-Bookshop-master / uploads / file / 0152_T_Sebesta_programming.pdf
Скачиваний:
265
Добавлен:
28.06.2021
Размер:
5.2 Mб
Скачать

Programming Exercises

439

second += second;

}

void main() {

int list[2] = {1, 3}; fun(list[0], list[1]);

}

For each of the following parameter-passing methods, what are the values of the list array after execution?

a.Passed by value

b.Passed by reference

c.Passed by value-result

8.Argue against the C design of providing only function subprograms.

9.From a textbook on Fortran, learn the syntax and semantics of statement functions. Justify their existence in Fortran.

10.Study the methods of user-defined operator overloading in C++ and Ada, and write a report comparing the two using our criteria for evaluating languages.

11.C# supports out-mode parameters, but neither Java nor C++ does. Explain the difference.

12.Research Jensen’s Device, which was a widely known use of pass-by- name parameters, and write a short description of what it is and how it can be used.

13.Study the iterator mechanisms of Ruby and CLU and list their similarities and differences.

14.Speculate on the issue of allowing nested subprograms in programming languages—why are they not allowed in many contemporary languages?

15.What are at least two arguments against the use of pass-by-name parameters?

16.Write a detailed comparison of the generic subprograms of Java 5.0 and C# 2005.

P R O G R A M M I N G E X E R C I S E S

1.Write a program in a language that you know to determine the ratio of the time required to pass a large array by reference and the time required to pass the same array by value. Make the array as large as possible on the machine and implementation you use. Pass the array as many times as necessary to get reasonably accurate timings of the passing operations.

2.Write a C# or Ada program that determines when the address of an outmode parameter is computed (at the time of the call or at the time execution of the subprogram finishes).

440

Chapter 9 Subprograms

3.Write a Perl program that passes by reference a literal to a subprogram, which attempts to change the parameter. Given the overall design philosophy of Perl, explain the results.

4.Repeat Programming Exercise 3 in C#.

5.Write a program in some language that has both static and stack-

dynamic local variables in subprograms. Create six large (at least

100 * 100) matrices in the subprogram—three static and three stack dynamic. Fill two of the static matrices and two of the stack-dynamic matrices with random numbers in the range of 1 to 100. The code in the subprogram must perform a large number of matrix multiplication operations on the static matrices and time the process. Then it must repeat this with the stack-dynamic matrices. Compare and explain the results.

6.Write a C# program that includes two methods that are called a large number of times. Both methods are passed a large array, one by value and one by reference. Compare the times required to call these two methods and explain the difference. Be sure to call them a sufficient number of times to illustrate a difference in the required time.

7.Write a program, using the syntax of whatever language you like, that produces different behavior depending on whether pass-by-reference or pass-by-value-result is used in its parameter passing.

8.Write a generic Ada function that takes an array of generic elements and a scalar of the same type as the array elements. The type of the array elements and the scalar is the generic parameter. The subscripts of the array are positive integers. The function must search the given array for the given scalar and return the subscript of the scalar in the array. If the scalar is not in the array, the function must return –1. Instantiate the function for Integer and Float types and test both.

9.Write a generic C++ function that takes an array of generic elements and a scalar of the same type as the array elements. The type of the array elements and the scalar is the generic parameter. The function must search the given array for the given scalar and return the subscript of the scalar in the array. If the scalar is not in the array, the function must return –1. Test the function for int and float types.

10.Devise a subprogram and calling code in which pass-by-reference and pass-by-value-result of one or more parameters produces different results.

10

Implementing

Subprograms

10.1 The General Semantics of Calls and Returns

10.2 Implementing “Simple” Subprograms

10.3 Implementing Subprograms with Stack-Dynamic Local Variables

10.4 Nested Subprograms

10.5 Blocks

10.6 Implementing Dynamic Scoping

441

442 Chapter 10 Implementing Subprograms

T he purpose of this chapter is to explore the implementation of subprograms. The discussion will provide the reader with some knowledge of how subprogram linkage works, and also why ALGOL 60 was a challenge to the unsus-

pecting compiler writers of the early 1960s. We begin with the simplest situation, nonnestable subprograms with static local variables, advance to more complicated subprograms with stack-dynamic local variables, and conclude with nested subprograms with stack-dynamic local variables and static scoping. The increased difficulty of implementing subprograms in languages with nested subprograms is caused by the need to include mechanisms to access nonlocal variables.

The static chain method of accessing nonlocals in static-scoped languages is discussed in detail. Then, techniques for implementing blocks are described. Finally, several methods of implementing nonlocal variable access in a dynamic-scoped language are discussed.

10.1 The General Semantics of Calls and Returns

The subprogram call and return operations are together called subprogram linkage. The implementation of subprograms must be based on the semantics of the subprogram linkage of the language being implemented.

A subprogram call in a typical language has numerous actions associated with it. The call process must include the implementation of whatever parameter-passing method is used. If local variables are not static, the call process must allocate storage for the locals declared in the called subprogram and bind those variables to that storage. It must save the execution status of the calling program unit. The execution status is everything needed to resume execution of the calling program unit. This includes register values, CPU status bits, and the environment pointer (EP). The EP, which is further discussed in Section 10.3, is used to access parameters and local variables during the execution of a subprogram. The calling process also must arrange to transfer control to the code of the subprogram and ensure that control can return to the proper place when the subprogram execution is completed. Finally, if the language supports nested subprograms, the call process must create some mechanism to provide access to nonlocal variables that are visible to the called subprogram.

The required actions of a subprogram return are less complicated than those of a call. If the subprogram has parameters that are out mode or inout mode and are implemented by copy, the first action of the return process is to move the local values of the associated formal parameters to the actual parameters. Next, it must deallocate the storage used for local variables and restore the execution status of the calling program unit. Finally, control must be returned to the calling program unit.

Соседние файлы в папке file