부 프로그램 (SubProgram)
- 일련의 행위나 계산을 추상화 하는 기법을 제공
- 실행과 분리해서 선언할 수 있는 블록(호출을 요구)
- 식별자를 가지고 있고, 특정 언어 구성자를 이용하여 다른 모듈에 의해서 호출되거나, 다른 프로그램에서의 제어 흐름(control flow)속으로 호출되는 모듈
- 그 모듈에서부터 제어 흐름은 호출한 프로그램이나 모듈로 변환된다.
ex)
함수(function) : 함수 이름으로 값 반환, 하나의 결과값만을 반환
서브루틴(subroutine, procedure) : 하나 이상의 결과값 배정, 환경 변환 등 주어진 목적의 완료
프로시저의 구성
1) 프로시저 이름
2) 매개변수(parameter)리스트
3) 환경(environment)
4) 몸체(body)
매개변수(parameter) : 모듈 간에 자료 객체나 자료값을 넘겨주기 위한 언어 구성자
1) 형식 매개 변수(피 호출자) : 변수가 아니라 프로시저가 호출 될 때 실 매개변수 역할을 대신 하는것
- 일반적으로 지역 변수( 또는 상수) 역할
- 매개 변수 명세 제공(형식 매개변수 이름, 자료형, 바인딩 방법 등등)
2) 실 매개 변수(호출자) : 실제로 제공되는 변수 및 식
- 호출 프로그램으로 전달하기 위하여 사용된 원래의 식 또는 이름
- 식 식별자 또는 이외의 언어 구성자들로서 된 매개변수
매개변수 결합(parameter association) : 호출 또는 포괄 인스턴스화(generic instantiation) 할 때, 형식 매개변수와 그에 대응되는 실 매개변수 간의 결합
1) 위치 매개변수 결합 (positional parameter association)
- 리스트에 나타난 위치로 바인딩
- 짧은 매개변수 리스트에 적합
- 부 프로그램 선언에서 주어진 위치에 따라 형식 매개변수와 실 매개변수를 대응 시키는 방법
2) 이름 매개변수 결합 (named parameter association)
- 이름으로 바인딩
- 매개변수 리스트가 길 때 적합
- 일부 매개변수 값을 디폴트로 줄 때 적합
- 부 프로그램 호출에서 매개 변수 결합을 이루기 위해 실 매개 변수에 대응하는 형식
- 위치 매개변수와 다르게 실 매개 변수는 순서에 상관이 없음
함수(Function)
- 함수 이름으로 값을 반환
- 함수의 투명성을 제공(환경 변화 없이)
- 함수 값 반환 방법 : 함수 이름에 값 배정 / Return 문으로 결과 값 반환
함수 반환 값으로 허용되는 자료형
1) Fortran , Algol 60 : 스칼라형 (실수, 정수, 논리형)
2) Pascal : 스칼라형, 포인터
3) PL/I : 스칼라형, 포인터 , 문자열
4) Ada: 모든 자료형을 허용한다(배열, 레코드 포함)
5) C, C++ : 스칼라형, 구조체, 포인터
Ada와 C, C++ 의 경우 반환문에서 직교성을 갖는다.
프로시저에서 사용하는 식별자로는 형식 매개변수 , 지역 변수, 비 지역 변수가 있다.
프로시저에 관해서 고려할 사항
1) 비 지역 변수 값을 바인딩 하는 환경은 무엇인가?
2) 실 매개 변수의 평가 방법은 무엇인가?
3) 형식 매개 변수와 실 매개 변수의 바인딩 방법은 무엇인가?
참조 호출(Call by reference -by address -by location)
- 호출 모듈이 넘겨질 매개 변수의 주소를 호출된 모듈에 제공하는 호출
- 호출된 모듈이 호출 모듈이 저장한 매개변수의 값을 바꿀 수 있다.
LDIND : 간접 주소를 사용하여 로드
STIND : 간접 주소를 사용하여 저장
값 호출(Call by value)
- 형식 매개 변수의 지역 변수화
- 실 매개 변수 값을 대응 지역 변수로 복사
- 실 매개변수의 값은 변하지 않는다.
결과 호출 (Call by result)
- 피 호출자가 반환 직전에 형식 매개 변수의 값을 대응되는 실 매개변수에 복사 후 반환
- 형식 매개 변수는 지역 변수를 취급하며 형식 매개 변수의 초기값은 미정의 하여 callee에서 정의한다.
값-결과 호출 (Call by value-result)
- 값 호출 기법 + 결과 호출 기법
- callee 실행 시작은 값 호출 기법을 , callee 실행 끝은 결과 호출 기법을 적용한다.
이름 호출 기법(Call by name)
- 형식 매개 변수의 이름이 사용될 때마다 그에 대응되는 실 매개변수 자체가 사용된 것으로 간주
- 필요한 r-value나 l-value를 매번 계산하여 변경한다.
- caller는 실 매개변수의 r-value와 l-value 계산 routine (THUNK)를 작성하고, callee는 필요시 THUNK를 이용하여 필요한 값을 계산한다.
- 단점은 구현이 난해하고 프로그램의 판독성이 난해하.
- 함수형 언어에서 자주 사용된다.
실 매개 변수와 형식 매개 변수의 정적형 검사는 형식 매개 변수 명세표를 요구하며
컴파일 시간에 컴파일러에서 검사한다.
형식 매개 변수 명세 : 자료형, 전달 기법, 초기값, 대응 관계 등
1)Pascal : 자료형, 전달 기법 (값 전달 기본 / var 선언 - 참조 전달, 값-결과 전달)
2)Algol 60 : 전달 기법 (이름 전달 기본 / value - 값 전달)
3)Ada : 전달 기법 in(값 전달) out(결과 전달) in out (값-결과 전달)
in은 지역 상수로 취급, 형식 매개 변수 자료형 선언 및 디폴트 값 지정 가능
Ada의 함수는 in 모드만 가능
프로그래밍 언어의 유해성
1) GOTO 문 : 프로그램의 제어 구조가 어려워짐
2) Pointer : 이명 발생 유도
3) 부수 효과 (side effect) : 식, 문장, 부 프로그램의 실행에 의해 야기되는 어떤 간접적인 결과
- 단위 프로그램 간의 의사 소통 방법으로 큰 배열의 공유시 , 비 지역 변수 접근 시 발생한다.
- 참조 전달 기법, 이름 전달 기법 사용 시 발생한다.
-> 프로그램 판독성이 저하되고, 심각한 오류가 발생하며, 함수의 투명성이 상실한다.
-> 값 전달 방식이나 비지역변수 사용 제한으로 문제를 해결한다.
4) 이명 (aliasing) : 언어 구성자에 대한 대체 식별자
- 동일한 기억 장소를 함께 사용하고 있는 다른 이름
- 한 변수의 값 변화가 동일 장소를 사용하는 다른 변수의 값을 변화시킨다.
- FORTRAN의 EQUIVALENCE , Cobol의 REDEFINES , C의 union
- 효율적인 기억 장소 사용은 가능하다
연산자 중복 정의 (overloading)
- 한 개체(식별자, 함수 이름, 연산자)가 두 가지 이상의 개념을 갖는다. <-> 영역 구멍
- 동일한 이름이나 연산자를 중복 사용하여 하나의 프로그램으로 통합하여도 혼동 되지 않는다. (문맥으로 구별)
- 의미 확정을 문맥에서 알 수 있다면 컴파일러가 수행하고, 알 수 없다면 사용자가 제약사항을 명시할 자격을 부여한다.
- 하나의 어휘 토큰에 두 개 이상의 의미를 할당한다.
ex)
Ada의 * 연산자 : 행렬 곱셈 연산자로 중복 정의 하는 예시
function "*" (X, Y : MATRIX) return MATRIX;
이럴 경우 MATRIX의 형 검사는 Ada 시스템에서 수행 한다.
중복 정의 연산자를 결정하는 방법으로는 자료형 정보를 파스 트리의 각 노드에 붙인 것을 가정한다.
보통 정적으로 결정하도록 한다.
트리의 단말 노드들의 자료형 확장은 사이 노드의 자료형 결정으로 이어진다.
포괄 프로시저(generic procedure) - C++에서의 템플릿
- 하나 이상의 요소를 매개변수로 받아들여 실 프로시저를 생성할 수 있는 프로시저 틀
- 컴파일 시간에 실 매개변수로 대체되어 실 프로시저가 발생한다.
장점) 코딩의 오류가 감소하고 프로그램의 길이가 축소되며 추상화 개념을 제공한다.
ELI, SIMULA, CLU
포괄적인(generic) : 언어 구성자의 속성으로 강자료형의 규칙에 따라서 적용 가능한 자료형을 위한 실 언어 구성자를 생성하기 위한 틀로 제공
EX) Ada : 부프로그램이나 패키지에서 포괄 설비 사용 ( 매크로의 확장 개념) (번역시 실 프로시저가 정적으로 생성된다)
포괄 기능 제공 설계 시 고려사항
1) 포괄 기능 시 사용 가능한 연산은 무엇인가?
코루틴(coroutines)
- 어떤 실행 후에 다시 호출 되었을 때, 이전의 실행이 반환된 위치에서 실행을 재개하는 부 프로그램
- 호출된 프로그램의 수행이 완전 끝나기 전에 타 프로시저에 제어를 넘겼다가 resume하는 프로시저
- 제어를 넘겨 받을 시 프로시저의 일부만 실행
- 제어를 반환 시 실행 일시 정지
- 다시 제어를 받으면 정지된 위치에서 실행 재개(resume)
- 프로시저들 간의 관계가 주종 관계는 아니다
- 이산 체계 시뮬레이션 언어의 범주에서 취급
'CS(Computer Science) > 프로그래밍언어' 카테고리의 다른 글
12. 예외 처리 (0) | 2023.06.04 |
---|---|
11. 추상 자료형 (0) | 2023.06.04 |
9장 요약 (0) | 2023.06.04 |
9. 기억장소 배당 (3) | 2023.06.03 |
8. 영역과 수명 (0) | 2023.06.03 |