- function=method ⇒ subprograms
Fundamentals of subprograms (초기에 지켜야했던 원칙 3가지)
- 각 서브프로그램는 단일 엔트리 포인트를 가진다. (지금도 지켜지는 원칙)
- 호출 프로그램은 호출된 서브프로그램을 실행하는 동안 일시 중단됨.
- 호출된 서브프로그램의 실행이 종료될 때 제어권(control)이 항상 호출자에게 반환됨
- 밑에 2개는 지금은 병렬, 멀티플 스레드 지원으로 현재 원리는 아니다.
Function
- 선언 declaration : 펑션에 헤더만 쓰는 것 (protocol, proto type만 쓰는 것)
- 정의 definition : 헤더, 바디 모두 적는 것
- python만 선언, 정의 구분 안됨 (선언 없음)
- 호출 calling
Design Issues for subprograms
- Are local variables static or dynamic?
- c,c++,java,python: default는 stack
- c,c++, java는 static 쓸 수 있지만 python은 안됨
- python은 heap, stack 둘 중 하나 ⇒ 모두 dynamic
- Can subprogram definitions appear in other subprogram definitions?
- 함수안에서 정의되면 nested function 또는 inner function임
- inner function을 정의할 수 있는 언어: python
- What parameter passing methods are provided?
- pass by reference: c++, java, python 제공 (c 제공안함)
- pass by value: c, 모든 언어
- Are parameter types checked?
- java, c, c++, python 순으로 빡세게 함
- java는 narrowing 안되고, widening만 된다.
- parameter로 function 넘길 수 있는가? (함수가 함수의 파라미터 가능?)
- python 됨, c,c++은 문법상은 안됨, java 안됨
XYZ(ABC)
- Are functional side effects allowed?
- What types of values can be returned from functions?
- How many values can be returned from functions?
- Can subprograms be overloaded? (메소드에 대한 오버로드
- Can subprogram be generic?
- If the language allows nested subprograms, are closures supported?
- 함수와 그 함수가 참조하는 변수들을 합치면 closure(function+reference environment), function이 parameter로 넘어갈때 필요함.
argument↔parameter 연결하는 방법
Semantic Model : in, out, inout

- in mode→ 호출했을 때 parameter가 함수로 전달 (Call) = pass by value
- out mode → 종료할 때 parameter가 밖으로 (Return) = pass by result
- inout mode → 양방향 전달, 시작시 in mode, 종료시 out mode = pass by value-result = pass by copy
Conceptual Models of Transfer: pass by reference, pass by value
Implementation model(구현 관점에 따라) → 5가지로 구분
- pass by value, pass by result, pass by value-result, pass by reference, pass by name
- inmode: pass by value
- outmode: pass by result
- in-out mode: pass by value-result, pass by reference, pass by name
pass by reference는 상호 two way 연결이 가능하도록 하는 것. 주소만 준다고 pass by reference가 아님. pass by value로도 주소를 줄 수 있음
- pass by value: 값이 복사되기 때문에 formal parameter를 바꿔도 actual parameter의 값이 바뀌지 않는다. write protection 필요, 메모리가 많이 쓰이며 메모리 카피로 인한 시간이 걸린다.
- pass by result : 4가지 언어 중 지원하는 언어 없음. 함수의 일관성 떨어짐
- 단점 1. readability
- 함수의 일관성 깨진다
- pass by value result: value와 result의 단점을 다 가져온다.
- pass by reference = call by sharing: 그래서 나온 방법.
- inout 모두 됨, read, write 모두 열려있음 → 동일한 메모리 공간을 parameter와 argument가 같이 쓴다.
- 단점: 접근이 느려진다. 메모리를 2번 접근해야 값을 뽑아올 수 있다. (메모리 접근, 값 접근으로 2번)
- 단점: 원하지 않는 aliasing 가능 (argument, parameter 이름이 같음으로 인해 발생 가능)
- pass by name: a,b가 쓰이는 시점마다 a, b를 x,y로 바꿔주는 것. (x, y가 위치한 곳에 따라 참조환경에 따라서) → textual substitution
- 가독성이 떨어진다.
- 구현상의 복잡도 떨어져서 아이디어 상에나 사용하고, 실제 구현상에는 사용하지 않는 방법.
- late binding을 허용
⇒ 결국 parameter passing은 parameter가 들어갈 위치를 run time stack 메모리 공간에 할당, pass by value는 run time stack의 메모리 복사해서 할당 pass by reference는 주소를 저장할 공간을 할당
💡 c: pass by value 지원,
💡 c++ : 참조 오퍼레이터 쓰면 pass by reference, 없으면 pass by value
💡 java: primitive type은 pass by value, object는 pass by reference
💡 python: pass by assignment (pass by value+pass by reference) 기본데이터타입은 pass by value, 자료구조 혼합된 combined data type은 pass by reference
Efficiency, reliability 를 따졌을때 Efficiency 측면에서는 reference 방식이 더 좋음
reliability 측면에서는 pass by value 방식이 더 좋음
parameter로 function이 넘어갈때 그 function도 body가 있을 것 ABC(XYZ)
- 변수의 scope에 따라 static, dynamic 으로 분류됨 (넷모두 static)
- static scope language의 referencing environment는 deep binding
- dynamic scope를 가지는 언어들은 shallow binding
- 둘다 싫을 때는 Ad hoc binding, ad hoc: 임시를 의미

-
function의 side effect 허용 되나?
-
c, c++, python, java 모두 됨
- imperative functional logic 3중 functional이 허용 안됨(variable이 없기 때문에), imperative는 허용 되지만 Ada만 안된다 (Ada는 무기만드는 언어, reliability가 가장 중요)
-
리턴은 하나만 되냐 두개 이상 되냐?
- 문법적으로 두개 이상이 허용되는 것은 python뿐
-
리턴은 어떤 값들을 쓸 수 있나?
- c, c++ : 기본 데이터 타입 다 됨, array는 안됨 (시작 주소만 포인터로 줄 수 있지만 배열 자체를 넘길 수는 없다), function 안됨
- java: function(method)만 리턴 안됨.
- python: 다 된다 . 배열, 함수 모두 . 모두 다 return 되는 것이 python
- first class variable: 대입문의 왼쪽에 쓸 수 있고, function의 parameter로 넘길 수 있고 리턴 받을 수도 있고 동적할당이 가능한 변수를 말함 ⇒ python에서는 method가 first class variable
-
Overriding: 상속받아서 parent class의 method를 다르게 정의하고 싶을 때
-
Overloading의 종류
- method overloading
- operator overloading
-
Overloading: 함수의 이름이 똑같고, parameter가 다른 것
- c++, java에서 생성자때문에 필요한 것
- function overloading을 지원하는 언어: c++, java, python (python은 다음함수로 계속 대체됨, 나중껏만 살아남음), python의 생성자는 init, init를 2개 하면 안된다. 클래스 인자가 (x,y,z)일때 init: x is none 이런식으로 조건에 따라 생성자에 블록을 만들면 된다. → python은 기능적으로는 되지만 (있는 것 처럼은 되지만) 문법적으로는 안된다.
- user defined function overloading되는가?
- c 안됨
- c++ 됨
- java 됨
- python 안됨 (기능적으로는 됨)
-
Generic function
- generic: 퉁쳐서 이름 부를 때 (전체적인 것을 하나로 부를 때)
- overloading하기 싫을 때 (body를 따로 쓰기 싫을 때) 사용하는 것
- c빼고 다 됨
- python은 언어자체가 generic이라 의미 없음
- c++ (템플릿, typename T) , java는 class로
- java가 c++ 보다 readability가 좋다
- java는 메모리에 함수가 1번만 올라옴, c++ 은 호출횟수만큼 올라옴 (int, float, double에 대해 호출 시 3번)
- java는 부분적으로 restriction(제한) 줄 수 있음, wildcard 지원
List <?> List <? extends __> List <? super ___> 지원
-
연산자 오버로딩 (operator overloading)
- user define operator overloading을 말하는 것
- c , java 안됨, c++, python 됨
- python, c++ 차이 : c++은 내가 쓰는 연산자에 대해, python은 오버로딩 가능한 연산자가 정해져있음.
__add__ 이런식으로
-
Closures
- subprogram에 referencing environment(참조환경)가 더하여 정의된 것
- 정의: function+non local variables
- 선언할 당시의 환경을 기억했다가 나중에 호출될 시 원래의 환경에 따라 호출되는 함수
- nested function이 없는 경우에는 의미가 없다. → static scoped language에서는 안필요함
-
Coroutines
-
서브프로그램의 시작 부분이 한곳(맨위)이 아닌 여러곳에서 실행 가능 → multiple entries
def gen(x):
for i in range(x)
yield i
i = gen(10)
print(i)
i = gen(10)
for j in i
print (j)
-
이렇게하면 함수가 아니다. for문 몇번 돌고 멈추는 것이다. → 이것이 coroutine
-
coroutine의 호출은 resume, 첫번째 제외하고는 직전에 멈췄던 곳부터 다시 실행
-
coroutine은 2개이상의 function이 지그재그로 실행되는 것. thread 전에 나온 개념 (유사하지만 짝퉁 병렬 프로그램)
-
yield point: 양보하는 시점
-
일반적으로 프로그래밍할때 control flow 1개 (main에서 호출하고 실행하다가 호출한 시점으로 돌아오고.. 반복) → 한번에 function 1개만 실행된다.
-
control flow 여러개: 한번에 function 2개이상을 실행할 수 있다.

-
multi processing, multi threading도 control flow가 여러개, 요즘은 coroutine보다 이 방법들을 사용한다.