лекции (2007) (1160825), страница 7
Текст из файла (страница 7)
Раб: Сообщение;
Готов: Разбор;
begin
loop
accept Принять (X: Сообщение) do
Раб:=X;
end Принять;
…….
Буфер.Положить(Готов);
end loop;
end;
task body Синтез is
Раб: Разбор;
Готов: Ответ;
………………………… //аналогично Анализ
task body Буфер is
begin
loop
select
when not Полон =>
accept Положить (X: Разбор) do В_Буфер();
end;
or
when Полон
or else
(not Пуст and then Положить Count=0)
accept Взять (X: out Разбор) do Из_Буфера();
end;
terminate();
end select;
end loop;
end Буфер;
loop
select
accept Считать_Значение (T: in Температура)
do Текущая_Т:=T;
end;
or
delay 0.1;
raise Сломался_Градусник;
end select;
end loop;
loop
select
accept Выдать_Значение (X: out Температура) do X:=Текущая_Т;
end;
else
……..
end select;
end loop;
loop
select
card React(…);
Обработать_Карту();
exit;
else
Локальные_Вычисления;
end select;
end loop;
select
Архив.Записать(X);
or
delay 5.0;
PutLine(«Занято!»);
end select;
Ревизия языка – 1995 г.
select
delay 5.0;
Put_Line(“Too Long!”);
then abort
Horrible_Complicated_Func(X,Y);
end select;
loop
select
Terminal.Wait_For_Interrupt;
Put_Line(“Interrupted!”);
then abort
Put_Line(“->”);
Get_Line(Command_Last);
Process_Command(Command(1..Last));
end select;
end loop;
Защищённые записи
protected T is
private
end
protected body T is
end
protected Variable is
function Read return Item
procedure Write (New_Value: Item);
private
Data: Item;
end Variable;
protected body Variable is
function Read return Item is
begin
return Data;
end Read;
procedure Write(New_Value: Item) is
begin
Data:=New_Item;
end Write;
end Variable;
X:=Variable.Read;
Variable.Write(Y);
protected Buffer is
entry Put(X: in Item);
entry Get(X: out Item);
private
A: Item_Array(1..Max);
I, J: Integer range 1..Max:=1;
count: Integer range 0..Max:=0;
end Buffer;
protected body Buffer is
entry Put(X: in Item) when Count<Max is
begin
A(I):=X; I:=I mod Max+1;
Count:=Count+1;
End Put;
entry Get(X: out Item) when Count>0 is
begin
X:=A(J); J:=J mod Max+1;
Count:=Count-1;
end Get;
end Buffer;
protected type Counting_Semaphore (Start_Count: In)
entry Secure;
procedure Release;
function Count return Integer;
private
Current_Count: Integer:=Start_Count;
end;
protected body Counting_Semaphore is
entry Secure when Current_Count>0 is
begin
Current_Count:=Current_Count-1;
end Secure;
procedure Release is
begin
Current_Count:=Current_Count+1;
end Release;
function Count return Integer is
begin
return Current_Count;
end;
end;
protected Event is
entry Wait;
procedure Signal;
private
occurred: Boolean:=False;
end;
protected body Event is
entry Wait is when Occurred is
begin
Occurred:=False;
end Wait;
procedure Signal is
begin
Occurred:=True;
end Signal;
end Event;
protected Event1 is
entry Wait;
entry Signal;
private
entry Reset;
Occurred: Boolean:=False;
end Event1;
protected body Event1 is
entry Wait when Occurred is
begin
null;
end Wait;
entry Signal when True is
begin
if Wait’Count>0 then
Occurred:=True;
requeue Reset;
end if;
end Signal;
entry Reset when Wait’Count=0 is
begin
Occurred:=False;
end Reset;
end Event1;
protected Event2 is
entry Wait;
entry Signal;
end Event3;
protected body Event3 is
entry Wait when Signal’Count>0 is
begin
null;
end Wait;
entry Signal when Wait’Count=0 is
begin
null;
end Signal;
end Event2;
Глава 3. Операторный базис
Оператор присваивания: v:=e
Операторы управления:
- ветвления
- циклы
- переходы
- «специальные»
Алгол60:
if B then S1 else S2
if B then S1
if B1 then if B2 then S1 else S2
б лок = составной оператор
Модула2, Оберон, Оберон2, Ada – языки с явным терминатором
Модула2:
IF B THEN IF B1 THEN
S1;…; PR1;
ELSE ELSIF B2 THEN
S1’;S2’;…; PR2;
END ELSIF B3 THEN
PR3;
ELSE
PR4;
END
CASE E OF
V1: S1; S2;…|
V2..V3,V4,V5..V6:…|
ENSE SN;…
END
Циклы
while B do S while(B)S
repeat do {S} while(B)
S1;…;Sn; ~ ~
until B; for(e1;e2;e3) S
for i:=e1 to e2
do S;
goto
Языки без goto: Модула2, Оберон, Оберон2, Java
Модула2:
LOOP
операторы
END
EXIT
LOOP
IF B THEN EXIT
END
Ada: goto <<M>>;
loop
….. exit
end loop;
while B loop loop
… …
end loop; while B
end loop;
for V in Range loop … end loop;
причем V описывать необязательно
Perl: появился foreach, чтобы просматривать элементы ассоц. массива
foreach(K in A) {…}
C#
Java foreach(T 0 in C) S
foreach(int X in a) {…}
Глава 4. Подпрограммы
1954 – Фортран
Ф-ция – абстракция операции вычисления
Процедура – группировка операторов
Первый вариант Ады:
- процедуры
- функции
- процедура, возвр. значение
procedure P return Integer is
…
end P;
а) Передача Управления
б) Передача Данных
в) Подпрограммный ТД
4.1 Подпрограммы и сопрограммы
CALLER-CALLEE
CALL
CALL RETURN
PL/1:
SUBPROGRAM P(*,*)
-
ENTRY P1
-
E
NTRY P2
… …
RETURN(1)
SUBROUTINE COR1 COR2
C
OROUTINE
Первые сопрограммы – 1963
Модула2:
TRANSFER(P1,P2);
PROCEDURE TRANSFER(VAR P1,P2: ADDRESS);
yield
yield return exp;
yield break;
T []a;
a=new T[1000];
Get ENUMERATOR:
for(int i=0; i<N; i++)
{ yield return a[i];}
yield break;
4.2 Передача данных
Способы передачи:
in 1) по значению
форм. переменнаялок. переменная
до передачи управления П(факт)=>П(форм)
out 2) по результату
--||--
при возврате П(факт)<=П(форм)
inout 3) по значению/результату
до вызова: П(факт)=>П(форм)
перед возвратом П(факт)<=П(форм)
in 4) по адресу/ссылке
out адрес форм. пар ЛП
inout 5) по имени (Алгол-60)
procedure Swap(a,b: T)
var tmp: T;
begin tmp:=a; a:=b; b:=tmp;
end
В Алголе-60 эта программа не сработает, т.к. передача либо по значению, либо по имени: swap(i,a[i]); swap(a[i],i);
Сначала компилятор имел право сам выбирать, что же ему использовать. Современный компилятор Ada сам выбирает, передавать параметры по значению или по ссылке,
но эти случаи строго оговорены. Передача по значению лучше, так как не надо заботиться о семантике ссылки. Есть тип value types - базовые классы и структуры – передаются по значению, все остальные по ссылке.
В C++ все стандартно по значению, либо по ссылке с явным указанием.
void f(ref T x){
x=new T();
}
a=new T();
f(ref a)
C#, Java: «простые» объекты передаются по значению, сложные – по ссылке
C#: ref inout-параметр
out out-параметр
Классы-обёртки и механизм упаковки-распаковки (в чистом ООП все должно быть объектно)
Java: int -> Integer
bool -> Boolean (для каждого простого типа данных существуют соответствующие классы-обертки)
C#: CLR
int int32
unsigned int - uint32
Эти классы удобны тем, что многие методы являются статическими методами классов обёрток.
В C# и Java есть класс данных Object, из которого порождаются остальные. Есть неявный механизм преобразования, из простого типа данных можно получить объект, а из объекта - тип данных.
Если в языке нет неявных преобразований, то
class X{
X(T x){...}
}
Для классов оберток существует специальный конструктор:
integer i
i=new Integer(b);
Это не есть механизм упаковки-распаковки. Этот алгоритм включается только тогда, когда это можно делать неявно.
i=b - автораспаковка и упаковка. В Java доступно с 2005 года.
Здесь i содержит не значение b, а ссылку на него.
Параметры по умолчанию: отсутствуют в Модуле2, Обероне, Обероне2, Java, C#
Переменное число параметров: в C/C++, например, int printf (const char *put, …)
4.3 Подпрограммные типы
а) Ada83, Java, ст. Паскаль – подпрограммные типы отсутствуют
б) Модула2, Оберон, C/C++, Delphi – «классический» п/п тип
Модула2:
TYPE SUBT: PROCEDURE(VAR: INTEGER);
PROCEDURE P(VAR X:INTEGER);
A: SUBT A:=P;
A(X);
Type SUBT is access procedure (inout: integer);
procedure P(x: inout integer) is…;
X: SUBT; Y: integer; X=P’access;
Делегаты
delegate void f(int);
+= f mydel;
-=
() void g(int i) {…}
new mydel=new f(g)
+=
-=
mydel(i)
Глава 5. Определение новых типов
ТД= мн-во опр-й + мн-во зн-й
(подпрогр-мы) (стр. данных)
-
Логический модуль
Ada, Модула2, Оберон
-
Класс
C#, C++, Java, Delphi
Модула2, Оберон, Delphi
- Главный модуль DEFINITION MODULE
- Библиотечные модули END M
- Локальные модули IMPLEMENTATION MODULE
………….
END M
DM: - объявление ТД (структуры)
- прототипы (заголовок подпр-ммы) операций
IM: - тела операций
D unit – unit M;
interface
implementation
end
Принцип РОРИ (Разделения Определения Реализации Использования)
M: .DEF => .SYM
.MOD => .OBJ
DEFINITION MODULE stacks;
CONST S_SIZE=128;
TYPE STACK=RECORD
B: ARRAY[0..S_SIZE] of INTEGER;
TOP: INTEGER;
END;
PROCEDURE PUSH(VAR S:STACK, X:INTEGER);
PROCEDURE POP(VAR S:STACK):INTEGER;
VAR DONE: BOOLEAN;
END stacks;
IMPLEMENTATION MODULE Stacks;
{IMPORT}
опр-е подпрограмм и функций (тела)
BEGIN
операторы;