Какие существуют способы передачи данных между подпрограммой и вызывающей ее программой?
=========================================================================================

 **Какие существуют способы передачи данных между подпрограммой и вызывающей ее программой?** 

 Имеется два способа передачи данных между подпрограммой и той программой, из которой производится ее вызов - через глобальные параметры и через формальные параметры.   
  
 **Передача данных через глобальные параметры**   
  
 Параметры, которые введены и описаны внутри подпрограмм, называются локальными, т.к. они локализированы внутри той подпрограммы, в которой они описаны, и как бы "невидимы" снаружи (из других подпрограмм). В то же время, параметры, которые введены и описаны в программе до описания подпрограммы, называются глобальными по отношению к этой подпрограмме, т.к. они "видимы" как внутри неё, так и в программе её вызывающей. Это позволяет использовать глобальные параметры для передачи данных.   
  
 **Передача данных через формальные параметры**   
  
 Формальные параметры могут быть трех разновидностей: Параметры-значения, параметры - переменные, параметры - константы.   
  
 1) Параметры-значения. Для каждого формального параметра - значения транслятор внутри подпрограммы резервирует дополнительные ячейки памяти в соответствии с типом параметра. При вызове подпрограммы, происходит пересылка фактического параметра в эти ячейки памяти, после чего выполняется подпрограмма. При этом значение ячейки, где находился сам фактический параметр, не изменяется. Этот механизм обеспечивает, как, защищенность фактического параметра, так и его универсальность, т.е. то, что фактическим параметром может быть константа, переменная или арифметическое выражение.   
  
 2) Параметры-константы. В этом случае фактическим параметром может быть переменная или константа. Для такого формального параметра новой ячейки не отводится, а при вызове подпрограммы в неё передается адрес ячейки фактического параметра, но внутри запрещены все его изменения.   
  
 3) Параметры-переменные. В этом случае фактическим параметром может быть только имя переменной. При вызове подпрограмм передается адрес ячейки переменной, в которой находится фактический параметр, и все действия производятся над этой ячейкой. Поэтому после работы подпрограммы в ячейке фактического параметра при необходимости будет находиться результат. 

 Если речь идет о языках высокого уровня, то данные передаются:   
  
 1) Через глобальные переменные.   
 2) Через параметры подпрограммы.   
 3) Через внешние устройства (например через файлы на диске).   
  
 Глобальные переменные - программа и подпрограмма "знают" в какие переменные записываются исходные данные, а в какие результаты выполнения подпрограммы. Параметры подпрограммы - в параметрах подпрограммы можно передать исходные данные и получить через них результаты выполнения. Внешние устройства - теоретически, программа может исходные данные записывать в файл, а подпрограмма считывать данные из этого файла. Результаты выполнения можно передавать в обратном порядке.   
  
 Если речь идет о языках низкого уровня или машинных кодах, то данные передаются:   
  
 1) Через регистры процессора.   
 2) Через выделенные ячейки оперативной памяти.   
 3) Через стек.   
  
 Регистры процессора - перед вызовом подпрограммы в заранее оговоренные регистры процессора записываются исходные данные. После выполнения, подпрограмма записывает результаты также в заранее оговоренные регистры. Выделенные ячейки ОЗУ - входные и результирующие данные записываются по заранее оговоренным адресам ОЗУ. 

 Внешние данные в подпрограмме могут использоваться, если они являются глобальными объектами для данной подпрограммы или переданы ей в качестве параметров. В описании подпрограммы указываются формальные параметры, а в точке вызова подпрограммы задаются фактические параметры. Формальный параметр определяет тип передаваемого фактического параметра. Фактический параметр представляет собой выражение соответствующего типа.   
  
 Различаются следующие способы передачи параметров: по ссылке, по имени, по значению, по значению-результату, по результату, по значению-константе. Набор допустимых способов передачи параметров зависит от конкретного языка программирования.   
  
 При передаче параметров по ссылке в записи активации, создаваемой при выполнении подпрограммы, ассоциация для фактического параметра может формироваться в нелокальной среде ссылок (в зависимости от реализации компилятора). Так, при вызове подпрограммы для параметров, передаваемых по ссылке, формируются указатели, доступные как из вызывающей, так и из вызываемой подпрограммы. Таким образом, при изменении в вызываемой подпрограмме значения фактического параметра, переданного по ссылке, в вызывающей программе объект, соответствующий фактическому параметру, также будет изменен.   
  
 При передаче параметров по имени в вызываемой подпрограмме до ее выполнения происходит замена формальных параметров на фактические. При этом значения фактических параметров вычисляются внутри вызываемой подпрограммы.   
  
 При передаче параметров по значению в вызываемой подпрограмме создается псевдоним фактического параметра (копия фактического параметра), значение которого присваивается формальному параметру подпрограммы. При таком способе передачи параметров изменения, произведенные в вызванной процедуре над значением фактического параметра, будут не видны далее в вызывающей подпрограмме.   
  
 При передаче параметров по значению-результату измененное значение фактического параметра возвращается вызывающей подпрограмме. Однако, в отличие от передачи параметров по ссылке, при данном способе сначала в момент вызова подпрограммы значение фактического параметра присваивается соответствующему формальному параметру вызываемой подпрограммы, и все изменения выполняются над формальным параметром, а не над ссылкой на фактический параметр. При завершении вызываемой подпрограммы текущее значение формального параметра присваивается обратно фактическому параметру. Такой тип передачи параметров был применен в языке ALGOL-W.   
  
 При передаче параметров по результату текущее значение формального параметра присваивается обратно фактическому параметру при завершении вызываемой подпрограммы, но первоначальное значение фактического параметра вызываемой подпрограмме не передается. Формальный параметр подпрограммы должен быть инициирован подпрограммой (реализация может позволять инициализацию по умолчанию в соответствии с типом данных параметра).   
  
 При передаче параметров по значению-константе значение фактического параметра не может быть изменено. Такой способ передачи параметров может быть реализован и как частный случай передачи параметра по значению, и как передача параметра по ссылке на константное выражение, что однозначно гарантирует неизменность фактического параметра вызывающей подпрограммы.   
  
 В большинстве случаев языки программирования используют один или два способа передачи параметров. Так, язык программирования С позволяет только передачу параметров по значению (ссылка реализуется как значение указателя). В языке программирования Pascal допускается два способа передачи параметров: по значению и по ссылке. 

 Существует два способа обмена данными между программой и подпрограммой:   
  
 - использование глобальных переменных;   
 - использование механизма формальных и фактических параметров.   
  
 Первый способ является очевидным, ведь глобальные переменные являются доступными для всех подпрограмм, расположенных в тексте программы ниже объявления глобальных переменных. Такие подпрограммы могут использовать глобальные переменные как исходные данные, а после соответствующей их модификации передавать через них в программу результаты своих вычислений.   
  
 При использовании глобальных переменных для обмена данными между программой и подпрограммой необходимо следить за непредусмотренными изменениями значений глобальных переменных в подпрограммах. Ошибки такого рода часто встречаются у начинающих программистов и довольно трудно обнаруживаются. По этой причине переменная цикла всегда должна быть локальной.   
  
 Формальные параметры являются локальными и расширяют секцию описаний соответствующего блока. В вызове процедур и функций указываются фактические параметры. По существу идентификаторы формальных параметров являются условными обозначениями в подпрограмме тех фактических параметров, которые передаются при ее вызове из программы.   
 Механизм использования параметров позволяет передавать данные из подпрограммы обратно в вызывающую программу.