ecosnos.ru |
Главная Микроустройства: номенклатура изделий электронной промышленности 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 [ 83 ] 84 85 86 87 88 89 90 91 92 93 94 95 Вслед за заголовком функции размещается декларативная часть, содержащая объявления всех локальных объектов. Приведем пример: program г1 (output); var X, у, n:integer; function g (m, n : integer) : integer; begin if П = 0 then g: = m else g: = g (n, m mod n) end; {g} procedure t(a, b : integer); begin writeln (a, b, g(a, b)) end; {t} begin t{18, 27); t(312, 2142) end. В данном примере указатель функции размещается в выражении в объявлении функции. Это приводит к рекурсивному вызову функции g, что допустимо в языке Паскаль. Операционная среда. Компилятор с языка Паскаль сам представляет Паскаль-программу (для версии Pascal 6000-3.4 [27]). Заголовок программы имеет вид: program PASCAL (input, output, Igo); где input, output, Igo - это стандартные файлы INPUT, OUTPUT н LGO, содержащие по умолчанию исходный файл, листинг и объектный код. Компилятор с языка Паскаль и поддерживающие программы периода выполнения вырабатывают диагностические сообщения на двух этапах: во время выполнения программы, вследствие избыточности описаний данных в программе, и во время компиляции. Последовательность опций, располагающихся в тексте программы и записываемых в виде строк комментария с первым символов $, управляет процессом компиляции: {$ (последовательность опций )(любой комментарий)}. Пример: {$Т +, Р+}. Опции разделяются запятыми. Плюс (+) означает активизацию опции, а минус (-) - выключение. За опциями могут также располагаться цифры. Всего опций 7:Т - контроль типов, границ массивов, выполнеиня операций и т. д.; Р - генерация кода, необходимого для выполнения дампа в случае аварийного заверщения программы; Хп - загрузка дескрипторов действительных параметров на регистры (О < = п < =6, Х2 - загрузка на первые два регистра, ХЗ - загрузка па первые 3 регистра и т. д.); Е - сохранение имен программных модулей в объектном коде; L - вывод листинга; U - расширение числа литер в строке в исходном тексте программы (если U, то число литер 120); Вп - определяет размер буфера для файла (1 < = л < = 9, размер буфера равен s > > 128 ¥: п). Язык ЭДИСОН Язык может быть использован для обучения принципам параллельного программирования и для проектирования надежных программ, выполняемых в реальном временипа мультипроцессорных системах. Компилятор, написанный на языке ЭДИСОН, является частью операционной системы, написанной также как и компилятор на языке ЭДИСОН [72]. В язык ЭДИСОН включена более развитая концепция процессов по сравнению с языком Модула. В нем отсутствуют средства описания процессов как таковых (подобно описаниям подпрограмм или иным описаниям), имеется возможность указывать, что определенные команды должны выполняться параллельно друг другу. Это делается с помощью специального параллельного оператора. Так как эти команды могут быть вызовами процедур, то вызванные процедуры выполняются параллельно и представляют собой подпроцессы исходного процесса, который приостанавливается до тех пор, пока ие завершится последняя параллельная команда. Под-. процессы не могут возвращать значений, например, параллельная команда ие может состоять из вызова функции. Динамический запуск процессов запрещен, отсутствуют и средства выбрасывания процессов, т. е. операторы досрочного завершения процесса или группы процессов извне, из других процессов. Именованные объекты программы группируются в блоки двух типов: процедуры й модули. Блоки могут размещаться в пределах других блоков, формируясь в гнездованные формы. Процедура - это группа именованных объектов и утверждений, которые описывают преобразования над операндами фиксироваи-иых типов. Операнды, называемые параметрами, могут изменять значения от одного вызова к другому. Параметрами могут быть переменные или другие процедуры. Объекты, объявленные в процедуре,- локальные и не могут использоваться вне процедуры. Модуль - это группа именованных объектов, которые распадаются на две категории: локальные объекты, которые .могут использоваться только в модуле; и экспортируемые объекты, которые-могут быть использованы как в пределах модуля, так и в непосредственно окружающем блоке. Переменные, локальные в модуле, инициализируются до их использования экспортируемыми процедурами. Модуль може! содержать утверждения, которые выполняются сразу после инициализации объектов, объявленных в модуле. Программа н выполнение. Программа на языке ЭДИСОН состоит из объявлений констант, типов и единственной полной процедуры. Выполнение программы инициализируется как единственный процесс. Пример: const last= .; п1 = char (10) ргос copier (ргос read (var с: char) ргос write (с: char)) module var slot : char; full : bool proc send (c : cliar) begin when not full do slot: = c; full: = true end end proc receive (var с : char) begin when full do с : = slot; full : = false end end begin full : = false end proc producer var X : char begin read (x); while x( > last do send (x); read (x) end; send (x) end proc consumer var у : char begin receive (y); while y( ) last do write (y); receive (y) end; - write (y); write (nl) end begin cobegin 1 do producer also 2 do consumer end Данная программа определяет два процесса: producer и consumer, выполняемых параллельно. Процессы обмениваются данными через общий буфер, образуемый модулем (moduli). Модуль содержит две экспортируемые процедуры для посылки (send) и приема (receive) символа, доступные из процедур producer и consumer. Значение переменной full в модуле - true, если буфер slot содержит очередной символ для пересылки и, - false, если символ был уже передан. Тело процедуры copier, представляющее полную процедуру, состоит из параллельного оператора, имеющего структуру; cobegin константа процесса 1 do список утверждений also константа процесса 2 do список утверждений aso Тнп и значение констант процессов системно зависимы. Они могут, например, использоваться для выделения памяти процессу. Синхронизирующее утверждение реализует механизм, который обеспечивает параллельным процессам, защищенный от вмещатель-ства других процессов, доступ к общим переменным. Процесс выполняет синхронизирующее утверждение в две фазы: синхронизирующая - процесс приостанавливается до тех пор, пока хотя бы один из процессов выполняет критическую фазу; критическая - вначале вычисляются булевы выражения, содержащиеся в списке условных утверждений; если хотя бы одно из них принимает значение true, то выполняется последовательность связанных с выражением утверждений, иначе не выполняется ни одно из иих, и процесс вновь выполняет синхронизирующую фазу. Структура синхронизирующего утверждения следующая: when булевое выражение 1 do список утверждений else булевое выра.жение 2 do список утверждений else...................... end...................... |