[PL] Chapter 9

subin·2024년 7월 20일

PL/프로그래밍언어

목록 보기
8/9
post-thumbnail
  • function=method ⇒ subprograms

Fundamentals of subprograms (초기에 지켜야했던 원칙 3가지)

  • 각 서브프로그램는 단일 엔트리 포인트를 가진다. (지금도 지켜지는 원칙)
  • 호출 프로그램은 호출된 서브프로그램을 실행하는 동안 일시 중단됨.
  • 호출된 서브프로그램의 실행이 종료될 때 제어권(control)이 항상 호출자에게 반환됨
    • 밑에 2개는 지금은 병렬, 멀티플 스레드 지원으로 현재 원리는 아니다.

Function

  • 선언 declaration : 펑션에 헤더만 쓰는 것 (protocol, proto type만 쓰는 것)
    • header를 제외한 것이 body
  • 정의 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?
    • python만 여러개 됨
  • Can subprograms be overloaded? (메소드에 대한 오버로드
    • c 안됨
  • 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
      1. 함수의 일관성 깨진다
  • 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 방식이 더 좋음

  • multidimensional arrays as parameters

    • python: list로 배열 모두 처리
    • c,c++: parameter로는 배열 쓸 수 있지만 return값으로는 불가 (pointer를 넘김=배열의 시작 주소)
    • java: parameter, return 값으로 배열 쓸 수 있음
  • parameter passing 할 때

    • consideration
      • efficiency(효율성)
      • one-way or two-way data transfer(신뢰성)
      • 이 둘은 충돌된다.
      • 효율성은 pass by reference, 안정성은 pass by value
  • parameter로 함수 이름 넘긴 경우

    • python만 됨, 기능적으로는 넷 모두 됨
    • java는 interface활용
    • c,c++는 function pointer사용
  • referencing environment

    • shallow binding: 가장 최근 호출된 곳에서의 값을 가져다 사용
    • deep binding: 구조적으로 보았을때 상위에 정의된 값을 가져와 사용
    • ad hoc binding: 자신을 호출하기 직전값을 사용

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보다 이 방법들을 사용한다.

0개의 댓글