лекции (2009), страница 6
Описание файла
Текстовый-файл из архива "лекции (2009)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр 6 страницы текстового-файла онлайн
….
Call
…..
Call
…..
…...…..
.
….
Сопрограммы – фактически квазипараллельные процессы.
Модула-2
Вызов сопрограммы аналогичен длинному переходу на некоторый абстрактный адрес, по которому
находится команда сопрограммы, с которой нужно начать выполнение. Но, помимо этого, нужно ещё как-то
запомнить адрес возврата и другую служебную информацию, передать входные параметры, наследуется
часть контекста. Для этой цели Вирт в своём языке Модула-2 ввёл тип данных ADDRESS (то же самое, что и
«void *»).
Этот тип данных является потенциальной дырой в системе безопасности, т.к. любой указатель «Т *»
автоматически приводится к «void *», и возможно обратное явное преобразование «Т *» = (Т *)«void *». Для
Вирта было неприятной неожиданность то, что программисты часто использовали тип данных ADDRESS.
Строгость типизации зависит от возможностей преобразования.
Типы – непересекающиеся области эквивалентности, определяемые операциями на объектами этих
областей.
Итак, в Модуле-2 вызов сопрограммы имеет такой вид:
NEWPROCESS(P, C,N);
Где P – процедура без параметров типа PROCEDURE, который является встроенным, C – переменная типа
ADDRESS. N - размер области для «запоминания» информации. Область начинается с адреса C
PROCEDURE NEWPROCESS(P : PROCEDURE; VAR C : ADDRESS; N : INTEGER);
Передача управления от одного процесса другому на уровне сопpогpамм осуществляется процедурой
"Передать управление от процесса P1 процессу P2". В Модуле-2 эта процедура выглядела как
PROCEDURE TRANSFER(VAR P1,P2 : ADDRESS);
При этом в переменную P1 записывается запись реактивации этого процесса, а значение переменной P2
определяет запись активации процесса P2.
RESUME; – оператор языка.
Маленькое замечание:
Изначально Вирт вместо ADDRESS использовал тип COROUTINE, теперь понятнее? Тип COROUTINE был похож
не структуру.
В современных языках сопрограммы трансформировались в понятие потока.
.Net Thread Квазипараллельный поток
C# 2.0:
foreach(T x in C)
Тип T должен реализовывать интерфейс IEnumerable. Этот интерфейс содержит метод GetEnumerator(),
который возвращает объект некоторого типа, который должен реализовывать интерфейс IEnumerator со
свойствами Current,методом Reset и методом bool MoveNext(). Любой класс, поддерживающий интерфейс
IEnumerable должен содержать класс, поддерживающий IEnumerator.
yield-операторы в C# 2.0:
yield return <expression>;
yield break;
Итератор – процесс(сопрограмма), выдающий последовательно очередные элементы коллекции тогда, когда
они понадобятся. yield-оператор используется в блоке итератора для предоставления значения объекта
перечислителя или для сообщения о конце итерации. Т.е. это не простой «return» или «break», а оператор,
совмещающий в себе дополнительно работу по переходу между сопрограммами (от процесса-итератора в
основной процесс). Выражение expression вычисляется и возвращается в виде значения объекту
перечислителя; выражение expression должно неявно преобразовываться в тип результата итератора.
ublic class List
{
//using System.Collections;
public static IEnumerable Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}
static void Main()
{
// Display powers of 2 up to the exponent 8:
foreach (int i in Power(2, 8))
{
Console.Write("{0} ", i);
}
}
}
/* Output:
2 4 8 16 32 64 128 256 */
Генеральная линия развития C# - добавление элементов функционального программирования
п.5.2 Потоки данных в подпрограммах
• Через глобальные данные
• Через параметры
Побочный эффект действия процедур и функций – изменение значений глобальных переменных и данных, а
так же модификация данных, глобальных по отношению к самой процедуре\функции.
Глобальная переменная – переменная, которая видна везде
В объектно-ориентированной парадигме:
Виды формальных параметров(семантика):
• Входные (in) – должны быть определены до входа
• Выходные (out) – должны быть определены к моменту выхода
• Вх/Вых(InOut) – и то и другое
Способы передачи
Способ передачи – способ связывания фактических и формальных параметров:
объект
Члены-данные
//Методы
…
void f(){ … ;
Глобальное, по
отношению к данному
объекту , пространство
имён
Сначала «i» ищется в теле
функции, потом в членах-
даннных, и только после этого
вне объекта
Возможен конфликт
связей
int a
P1 P2 P1 P4
• По значению (семантика - in)
• По результату (семантика – out)
• По значению/результату (семантика – InOut)
• По адресу(по ссылке) (семантика - любая)
• По имени
Ада83:
Квалификаторы: in, out, inout
Procedure P(int X:T;inout Y:T;out Z:T);
X может быть выражением типа T. Компилятор может вставлять квазистатические проверки. Эффект
процедуры – модификация Y и Z. Каков способ передачи определяет компилятор( что не есть хорошо, т.к.
различные компиляторы в одной и той же ситуации могут выбрать разные способы передачи, что приведёт к
различной работе программ).
Пользователь определяет семантику использования.
Формальные параметры – те, которые объявлены в заголовке подпрограммы и используются в теле.
Большинство ЯП переменные, которые объявлены в заголовке, считают частью тела.
Фактические параметры – те, которые передаются в подпрограмму при её вызове.
При вызове подпрограммы фактические параметры, указанные в команде вызова, становятся значениями
соответствующих формальных параметров, чем и обеспечивается передача данных в подпрограмму.
Способ передачи Семан
тика
Что делается
По значению in При вызове подпрограммы фактические параметры
копируются в Запись Активацаии
По результату Out При выходе из подпрограммы из записи активации
формальные параметры копируются в фактические
По значению и результату inout При вызове подпрограммы фактические параметры
Запись активации
…..
……
Место для формальных параметров
копируются в Запись Активацаии
При выходе из подпрограммы из записи активации
формальные параметры обратно копируются в
фактические
По Адресу Любая При передаче по Адресу в Запись активации
копируется адрес фактического параметры.
Именование и разыменование происходят
автоматически
• В Фортране обычно параметры передаются по адресу, но когда передаётся простой объект данных,
чтобы не происходило лишних операций разыменования, можно передавать «по значению и
результату»( /<параметр>/)
• В Аде-83 способ передачи зависел от компилятора, т.е. компилятор сам выбирал способ передачи в
зависимости от ситуации. Пример программы, в которой это важно:
Procedure P(inout X : T; inout Y : T)
X := <newvalueX>;
<возбуждение исключения>
Y := <newvalueY>;