lekcii (522345), страница 10
Текст из файла (страница 10)
При передаче по ссылке также не следует задавать фактические параметры-выражения или константы, даже если они синтаксически допустимы. Кроме того, в языке Фортран таким образом может быть испорчена константа, переданная по ссылке в подпрограмму. ргопгаш Лггау(1уйе(сгепсе[(прп(, оп(рШ); Фуре Ъ' -- аггау(1..6553б( оК ш(ей;ег; ъ'аг а, Ь, с: Ъ'; ргосес1пге п)((наг~ х, у, и: Ч): Ьеи1п '(Ц: [11 з у[1(:, г (2] : — х (2( у (2]: ('*И:: — 4 уИ: —:4'1 епс1; Ьеиш а[1]:=- 1; а[2]:: 1; Ь [1]:= 2; Ь [2]: — 2; ш[а, Ь, с); и~гйе1п(а(1], '„', Ь[1]); тът1ье1п(с[1], ' ', с [2]); епс1. Если в процедуре раскомментировать два последних присваивания, то частично испортятся значения формальных параметров х и у.
Но так же, как и в случае скалярных переменных, модифицированные значения векторов х и у нс вернутся в вызывающую программу. Если дополнительно раскомментировать айаг в заголовке пропедуры, то формальные параметры-массивы будут передаваться по ссылке и значения фактических параметров-массивов таким образом будут изменены. 3.4.3.4 Передача по имени Этот способ откладывает обработку фактических параметров до того момента, когда они действительно потребуются, то есть относится к идеям динамического связывания или динамического знакомства. Этот метод является самой мощной формой передачи параметров, одновременно наиболее опасной и неэффективной. Этот способ был введен уже в Алголе-60, развит в Алголе-68 и в некотором виде присутствует в абсолютно об"ьектных системах ттрограммирования.
При передаче параметра по имени фактический параметр перед выполнением подпрограммы буквально (текстуально) без каких-либо предварительных вычислений его значения подставляется вме<:то формального параметра (реалттзовать такую подстановку можно на уровне внутреннего представления., передавая ссылку на внутреннее представление дерево соответствующего выражения). '1"аким образом., вместо передачи значения или ссылки, в тело подпрограммы передается правило, по которому должен быть вычислен параметр.
При переда те по имени значение фактического параметра вычисляется всякий раз заново в месгле и в лттитттттт использования в вызываемой подпрограмме, то есть всякий раз, когда в теле подпрограммы есть обратцение к соответствуютцему формальному параметру. При этом значения фактических параметров вычисляются в контексте вызова, а нс в контексте буквальной подстановки в теле подпрограммы. Если параметр — простая скалярная переменная, то вызов по имени в точности совпадает с вызовом по ссылке. Если параметр -- выражение из скалярных переменных, то результат аналогичен вызову по значению, за исключением того, что выражение вычисляется столько раз, сколько раз используется параметр, а не один раз при входе в подпрограмму. Если параметр содержит элемент массива, то при вызове по имени индексы (индексные выражения!) вычисляются при каждом использовании параметра в то время как при вызове по значению или ссылке значения индексов замораживаются.
При передаче параметров по имени может случиться конфликт имен формальных и фактических параметров, который разрешается систематической заменой имен, проводимой интерпретативно средой языка ттрн выполнении программы. Все это также усложняет транслятор, поскольку соответствующие места он должен оставлять в недотранслированном виде, подлежащем интерпретации в период выполнения программы. Поддержка процесса передачи по имени возлагается на языковую среду, роль которой существенно возрастает, .увеличивая интерпретативпую компоненту кохлпилируемого языка.
При передаче по имени возможны неожиданные с примитивной точки зрения результаты. Так, вызвав процедуру ргоседпге втт.ар(айаг а, Ь: шФея,'ег (6у патлен; маг т.: денег; Ьеиш т. г-а; а:-- Ь; Ь: .1; епс1; инструкцией втчар(т, х~т)) получим 'т: — 1; х ~т ~; (я(т( берется от прежнею т, тилле чего т' ттзмвттявтся тт х(т ~: — 'т; ( х(т( берется от, измвпвь ного т'.т ( 187 т, е, фактический обмен в связи с изменением 1 произойдет с другим элементом вектора х. Жлллаеъльлй эффекл дослигастся вызовом по ссылке, при котс>ром значения-ссылки будут заморожены. В заключение остановимся на передаче параметров-процедур. 11оскольку значением программы являетля ее двоичное выполнимое тело, субъект, а не объект обработки данных, то передепла процедур по значению-результату не имеет особого смысла. !1ередача, по ссылкл вполне отражает парадигму переда Еи управления в программе по заданному адресу в машине фон Неймана..
Хорошие примеры передачи процедур приведены в книгах Н, Вллрта и ! 1. Грогоно. Это процедура интегрирования с подынтегральной функцией и процедура итерационного решения нелинейного уравнения, параметрами которой являются функции уравнения, разрешенного относительно х и ее производной. Но самое интересное — это передача процедур по имени. Все рассмотренные способы передачи параметров нашли применение в языках программирования. Каждый из них имеет свои достоинства и недостатки. Критериями выбора того или иного способа передачи параметров являются: 1.
',Защита области данных вызывающей программы от влияния подпрограммы. 2. Предохранение данных вызывающей программы от изменений до нормального завершения подпрограмълы. 3. Экономия памяти, выделяемой всей программе. !. Э~~~~~~~ времшли вычисления. 5. Простота реализации и использования. 3.4.4 Побочные эффекты В теле подпрограммы могут быть использованы глобальные обьекты, которые могут получить ПОВьи' значеепля пОсле с'.Ё выпОлнения. Вели 1тоднрограълъла не~1 лисляет фуеплпию то целью ее выполнения является получение нового значения для идентификатора подпрограммы.
Изменение же глобальных переменных в результате вычисления функции не является цельк> выполнения тела подпрограммы и в соответствии с этим называется побочньълл эффеллтом. Кроме того, побочный эффскт может выражаться еще и в изменении значений фактических параметров функции, вызванном нежелательным для функций способом передачи параметров. Кппсйоп вЕЫ,(сопв13 х: геа1): геа1; Ьеп1п в!и:=- х — х е х з х ~' 6.0 —; х > х э х е х л х > 120.0; (лоп!е!и('влп (', х, ') '::', влп);) епс1; (в>а ) Во избежание побочных эффектов формальные параметры функции не должны иметь спсцификатора чаг.
Более того, для надежности их следует атрибутировать сопя$. В пропсдуре побочныъл эффектом является изменение значений глобальных объектов и тех фактических параметров, .которое не является целью выполнения тела процедуры. Рекомендуется защищать входные фактические параметры процедуры от ълодификации неуказанисм айаг и даже указанием сопМ при описании соответствующих формальных параметров. Кроме того, ввод-вывод в процедурах и функпиях также является побочным эффектом, если он модифицирует внешние глобальные файлы, не указанные в заголовке процедуры.
Побочный эффект приводит к ряду трудностей при программировании и отладке. Это также, как и использование меток и безусловных переходов поело,;затрудняет автоматичсскук> оптимизацин>, верификацинэ, фильтрацинэ и обфускацинэ программ. 3.4.5 Критика алгоритмической модели фон Неймана Модель фон Неймана получена нами как развитие простой опсрационной модели Тьнь ринга, к которой также могут быть отнесены и различные автоматы. Математические основания модели Тьюринга точные и полезные ~261. Модель Тьюринга наделена памятью и чувствительностью к предыстории.
Простая операционная семантика ~102~ машин "1"ьюрин~а состоит в чаи той смене состояний (э1а1е-1гапэ1й~оп), а сами состояния очень просты. Программы для МТ неясные и концептуально бесполезные. Строя диаграммное и схемное исчисления и предлагая нотацию для линейной записи (язык ОСТ), мы улучшили эту модель.
Однако, .избавиться от ее существенных недостатков не удалось. Только модель фон Неймана позволила предложить практически полезную и физически реализуемую концепцию. К модели фон Неймана относят как аппаратные компьютеры, так и традиционные языки программирования. Их математические основания считаются сложными, громоздкими и концептуально бесполезными [26~. Так же, как и машина Тьюринга, модель фон Неймана существенно использует память и чувствительна к предыстории.
Семантика модели фон Неймана также заключается в переходах из состояния в состояние, только состояния более сложные. Ясность программ и концептуальная полезность по сравнению с Тьюрингом несколько выше. Критика традиционных языков программирования всегда основывается на исследовании их интеллектульного предка компьютера фон Неймана. Когда фон Нейман и его гениальные коллеги предложили концсшщн~ компьютера, они изягцно и практично решили ряд математических, инженерных и программистских проблем. Несмотря на прошедшие с тех пор 60 лет, суть фон пеймановского компьютера пе измениласгя по-прежнему он состоит из процессора„памяти и соединяющей их шины, которая за один такт может передавать только одно слово между ними.