Subprogram
각 Subprogram은 하나의 entry point(진입점)를 가진다.
Calling program은 Subprogram이 실행되는 동안 일시 정지된다.
Subprogram이 종료되면 Control은 항상 Caller로 반환된다.
Function의 Declaration(function body가 X)과 Define(function body가 포함)이 구분되는 언어
C/C++/Java (Python은 구분 X)
Subprogram Definition
Subprogram 추상화의 동작과 interface를 설명
Python의 function definition은 실행 가능하다.
다른 모든 언어의 function definition은 실행 불가능하다.
Subprogram Call
Subprogram을 실행하도록 하는 명시적인 요청
Subprogram header
Definition의 첫 부분
Subprogram의 name, kind와 formal parameters를 포함
Parameter profile(signature) of subprogram
parameters의 수, 순서, 타입
Protocol
subprogram의 Parameter profile + 만약 function이라면 return type까지
C/C++의 function declaration은 prototype이라고 불린다.
Subprogram declaration
Subprogram의 protocol / body는 없음
Formal parameter
Subprogram header에 나열된 가짜 변수
Subprogram에서 사용됨
Actual parameter
Subprogram call statement에서 사용되는 값이나 주소
Actual / Formal Parameter Correspondence
- Positional : actual parameter와 formal parameter의 바인딩이 position에 의해 실행. (순서대로) : Safe and effective
- Keyword : actual parameter에 바인딩될 formal parameter의 이름을 actual parameter와 함께 명시한다.
- 장점 : parameter를 원하는 순서대로 쓸 수 있음. parameter correspondence error(일치 오류)를 피함
- 단점 : User가 formal parameter의 이름을 반드시 알아야 함.
Formal parameter의 Default 값
- actual parameter가 전달되지 않으면 default 값을 사용. (선언에 3개, 호출에 2개 쓴 경우)
- C - 불가능(Null 값이라도 줘야 함.)
- Java - 불가능
- C++ - 가능, 단, 마지막 위치에 와야 함
- Python - 가능
Variable Numbers of Parameters
- C++/Java/Python 지원 (C는 헤더를 선언하고 사용 가능) (주로 *를 사용)
Procedure
리턴 값이 없다.
매개변수화된 계산을 정의하는 statement의 모음
Function
리턴 값이 있다.
Procedure랑 비슷, 의미적으로 수학적 함수에 기반을 둠.
No side effect를 기대하지만 실제로는 side effect를 가질 수 있다.
Design Issue for Subprograms
- local 변수는 정적(static) 또는 동적(dynamic)인가요? (C/C++/Java 둘 다 가능) (Python은 Static은 Global로 가능)
- Subprogram definition은 다른 Subprogram definition 안에 나타날 수 있나요? (Nested function) (Python 가능) (C/C++/Java 제약이 있음)
- 어떤 parameter 전달 방식이 제공되나요? (Pass by value, Pass by reference)
- parameter type check를 하나요? (Java는 한다, Python은 안 한다.)
- Subprogram이 parameter로 전달될 수 있고 Subprogram이 nested 가능하면,
전달된 Subprogram의 referencing environment는? (C/C++은 Function 포인터로 가능, Java/Python 가능) - 함수의 Side effect는 허용되나요?
- 어떤 타입의 값이 함수에서 return될 수 있나요?
- 함수에서 몇 개의 값이 반환될 수 있나요?
- Subprogram이 overload될 수 있나요?
- Subprogram이 generic function이 지원되나요?
- 언어가 중첩된 Subprogram을 허용한다면 closure가 지원되나요?
Local Referencing Environments
함수 안에 선언한 Local 변수들의 참조 환경
Stack-Dynamic (기본적)
- 장점 : Recursion 지원 / 로컬 변수의 저장소가 Subprogram 간에 공유
- 단점 : 할당, 해제, 초기화 시간 / Indirect Addressing / Subprogram이 history sensitive 하지 않다
Static (Static 키워드를 썼을 때)
- 장-단점 : Stack-Dynamic의 반대
- C 기반 언어에서는 Stack-Dynamic이 로컬 변수의 default 값. Static 키워드를 사용해서 Static 사용 가능
- C++/Java/Python/C#의 Method는 오직 Stack-Dynamic local 변수만 가지고 있다.
In mode : Argument가 Formal Parameter로 가는 것 (Caller -> Called)
Out mode : 반대 (Return과 2-way parameter) - Inout mode : In mode 와 Out mode 모두 사용
Copy : 값을 복사하는 것. (값이 작을 때, Copy, Pass의 속도는 비슷하지만 1way인 Copy가 더 빠름)
Pass : 주소 값을 넘겨주는 것. (가리키는 값이 클 때 유용)
=> 이론적 방식은 3x2=6가지 / 주로 In은 Copy로 Inout은 Pass로 자주 쓴다.
대부분 언어에서의 parameter communication은 run-time Stack을 통해 이루어진다.
Pass by reference는 stack에 주소만 넣으면 된다. (가장 간단한 방법)
- C : 기본적으로 Pass by value / Pass by reference는 pointer를 parameter로 이용
- C++ : 기본적으로 Pass by value / Pass by reference는 pointer/reference type을 parameter로 이용
- Java : 모든 primitive type parameter는 Pass by value / object parameter는 Pass by reference
- Python : Pass by assignment (변경이 가능한 object는 by reference, 변경 불가능한 object는 by value)
- C# : 기본적으로 Pass by value / Pass by reference는 ref 키워드를 통해 이용
Type Checking
- Formal parameter에 선언한 type을 actual argument로 넘겨줄 때 -> Reliability가 높아진다.
- C/C++ : Type checking을 한다. (Strong 하지는 않음.)
- Java : 모든 parameter에 대해 검사를 한다.
- 비교적 최신 언어인 Perl/JavaScript/PHP : type checking을 요구하지 않는다.
- Python/Ruby : 변수의 type이 없기 때문에 type checking이 불가능하다.
Multidimensional Arrays as Parameters
다차원 배열이 Subprogram으로 전달되면 Subprogram은 별도로 컴파일된다면,
컴파일러는 storage mapping function을 구축하기 위해 배열의 선언된 크기를 알아야 한다.
Parameter Passing의 디자인 고려사항
- Efficiency (효율성) by reference가 좋다. (integer 1개의 경우 value, reference는 효율성이 같다. size가 크면 reference가 좋다.)
- Reliability (One-way or Two-way data transfer) (신뢰성) by value가 좋다. (reference는 aliasing이 생길 수 있다.)
Subprogram의 parameter로 subprogram이 가능한?
함수의 파라미터로 함수가 가능한가?
- C – X
- C++ - X
- Java - X
- Python – O
(C/C++은 함수 포인터는 가능)
(Java는 Interface 안에 함수를 정의하고 Interface를 넘겨줌)
특정 함수를 간접적으로 호출하는 방식
실행 전까지는 정확히 어떤 Subprogram이 실행되는지 알 수 없는 여러 Subprogram을 호출해야 할 때 사용
예시 : Event handling / GUIs / C/C++은 함수 포인터를 통해 이루어진다.
Design Issue for Functions
Side Effect를 허용할 것인지? (없애기 위해서는 항상 in mode이어야 한다. Ex. Ada)
Return 값으로 어떤 type을 허용할 것인지?
- 대부분의 명령형(Imperative) 언어는 return type을 제한한다.
- C는 배열과 함수를 제외한 모든 type
- C++은 C와 같지만 User-defined type도 가능
- Java/C#의 Method는 모든 type이 가능 (Method 자체는 type이 아니므로 불가능)
- Python/Ruby는 Method를 일급 객체(first-class object=대입문, parameter, return값)로 취급하므로 return 가능
Overloaded Subprograms
같은 이름의 함수를 매개변수를 다르게 줘서 중복으로 쓸 수 있는 것
overloaded subprogram의 모든 버전을 각각 다른 protocol을 가져야 한다.
C는 지원 X
C++, Java는 지원
Python은 중복된 것을 만들면 그 전의 것은 사라진다. = 지원 X
Generic Subprogram
= polymorphic subprogram
지원 여부
- C – X
- C++ - O
- Java – O
- Python – X
다른 activation에서 다른 type의 parameter를 받는다.
Parametric polymorphism = 매개변수 다향성
Subtype polymorphism = T type의 변수는 T type 객체 혹은 T로부터 상속받은 어느 객체든지 접근할 수 있다.
Overloaded subprogram은 ad hoc polymorphism이라고 한다.
(매개변수가 다르기 때문에 완전히 같지는 않지만 다향성을 가진다.)
User-Defined Overloaded Operator : C++/Python이 지원
Closures
4개 중에 Python만 지원
Subprogram과 해당 프로그램이 정된 Referencing Environment
Nested function : Python 가능 / C 불가능
makeAdder(10); [ 10 -> x ]
add10(20); [ 20 -> y ]
Coroutines
= symmetric control
4개 중에 Python만 지원
여러 entries를 가지고 있고 직접 entry를 제어하는 Subprogram
coroutine call : ‘resume’
coroutine의 첫 resume은 시작점으로 이동하지만 이후의 호출은 마지막으로 실행된 다음 문장으로 진입
coroutine은 서로 반복적으로 resume 가능, 영원히 가능
프로그램 단위(coroutine)의 quasi-concurrent execution을 제공한다. 실행은 교차되지만 겹치지 않는다.
'Programming Languages [PL]' 카테고리의 다른 글
[PL] 10. Abstract Data Types and Encapsulation Constructs (0) | 2024.01.10 |
---|---|
[PL] 09. Implementing Subprograms (1) | 2024.01.10 |
[PL] 07. Statement-Level Control Structures (0) | 2024.01.10 |
[PL] 06. Expressions and Assignment Statements (0) | 2024.01.10 |
[PL] 05. Data Types (1) | 2024.01.10 |