Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- terminal
- PersistenceContext
- 티스토리챌린지
- JanusWebRTCServer
- 코루틴 빌더
- JanusGateway
- preemption #
- Value too long for column
- 깡돼후
- vfr video
- 겨울 부산
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- kotlin
- VARCHAR (1)
- taint
- k8s #kubernetes #쿠버네티스
- JanusWebRTC
- 달인막창
- 자원부족
- 오블완
- PytestPluginManager
- JanusWebRTCGateway
- tolerated
- 개성국밥
- mp4fpsmod
- table not found
- pytest
- Spring Batch
- 코루틴 컨텍스트
- python
Archives
너와 나의 스토리
[프로그래밍 언어론] CH9 Subprograms 본문
반응형
두 가지 기본 추상화 설비
- 프로세스 추상화
- 예전부터 강조
- 이번 챕터에서 논의
- 데이터 추상화
- 챕터 11에서 논의
Subprogram의 기본
- 각 서브프로그램는 단일 엔트리 포인트를 가진다.
- 호출 프로그램은 호출된 서브프로그램을 실행하는 동안 일시 중단됨.
- 호출된 서브프로그램의 실행이 종료될 때 제어권(control)이 항상 호출자에게 반환됨
기본 정의
- 서브 프로그램 정의(Subprogram definition)는 서브 프로그램 추상화에 대한 인터페이스 동작을 설명한다.
- Python에서 함수 정의는 실행가능하며, 다른 모든 언어에서 실행가능하지 않다.
- Ruby에서 함수 정의는 클래스 정의 내부 또는 외부에 나타날 수 있다. 바깥쪽이라면, 그들은 객체의 메서드이다. 그들은 함수처럼 객체없이 호출할 수 있다.
- Lua에서 모든 함수는 익명이다.
- 서브 프로그램 호출(Subprogram call)은 서브 프로그램을 실행하라는 명시적 요청이다.
- 하위 프로그램 헤더는 이름, 하위 프로그램의 종류 및 공식 매개변수를 포함하는 정의의 첫 번째 부분이다.
- 목적1: 다음 구문 구조는 어떤 특별한 종류의 부프로그램의 정의라는 것을 명시. 한 종류 이상의 부 프로그램을 갖는 언어에서, 부프로그램의 종류는 일반적으로 특수어로 나타낸다.
- 목적2: 부프로그램이 이름을 갖는다면, 헤더는 부프로그램의 이름을 제공한다.
- 목적3: 선택적으로 매개변의 리스트를 지정한다.
- 하위 프로그램은 파라미터 profile (signature라고도 함)은 해당 파라미터의 수, 순서 및 유형이다.
- 프로토콜은 하위 프로그램의 매개변수 프로파일이며, 함수인 경우 반환하는 유형이다.
- C와 C++에서 함수 선언은 종종 prototypes이라고 부른다.
- 서브프로그램 선언은 프로토콜을 제공하지만 서브프로그램의 본문(body)는 아니다.
- 형식 매개변수는 하위 프로그램 헤더에 나열되고 하위 프로그램에 사용되는 dummy 변수이다.
- 실제 파라미터는 하위 프로그램 호출에 사용되는 값 또는 주소를 나타낸다.
Actual/Formal Parameter Correspondence
- 위치(Positional)
- 실제 매개변수를 공식 매개변수에 바인딩하는 것은 위치: 첫 번째 실제 매개변수가 첫 번째 공식 매개변수 등에 바인딩된다.
- 안전하고 효과적
- Keyword
- 실제 매개변수가 바인딩될 형식 매개변수의 이름은 실제 매개변수와 함께 지정된다.
- 장점: 매개변수는 임의의 순서로 나타날 수 있으므로 매개변수 대응 오류를 피할 수
- 무시: 사용자는 형식 매개 변수의 이름을 알아야 함
Formal Parameter Default Values
- 특정 언어(예: C++, Python, Ruby, Ada, PHP)에서 형식 매개변수는 기본값을 가질 수 있다(실제 매개변수가 전달되지 않은 경우)
- C++에서는 파라미터가 위치적으로 연결되어 있으므로 기본 파라미터가 마지막에 표시되어야 함(키워드 파라미터가 없음)
- 파라미터의 변수 수
- C# 메서드는 동일한 유형의 매개변수만 사용할 수 있다. 해당 공식 매개변수는 모수 앞에 배열된다.
- 루비에서는 실제 파라미터가 해시 리터럴의 요소로 전송되고 해당 형식 파라미터 앞에 별표가 붙는다.
- Python에서 실제는 값의 목록이며 해당 형식 매개변수는 별표를 가진 이름이다.
- Lua에서 변수 개수의 파라미터는 3개의 마침표를 가진 공식 파라미터로 표시되며, 3개의 마침표에서 a 또는 복수 할당으로 액세스된다.
Ruby Blocks
- Ruby는 어레이의 요소를 처리하는 데 종종 사용되는 여러 iterator 기능을 포함한다.
- iterators는 블록으로 구현되며, 애플리케이션으로도 정의 가능
- 블록은 부착된 메서드 호출이며, 매개변수를 가질 수 있으며(수직 막대에서), 메서드가 yield문을 실행할 때 실행된다.
Procedures and Functions
- 하위 프로그램의 두 가지 카테고리가 있습니다.
- Procedures는 매개변수 연산을 정의하는 문장(statements)의 집합이다.
- 함수는 구조적으로 procedures지만 의미론적으로 수학에서 함수를 모델로 한 것입니다.
- 그들은 부작용이 생길 것으로 예상된다.
- 실제로, 프로그램 함수는 부작용을 가지고 있다.
Design Issues for Subprograms
- 로컬 변수가 정적 변수인가, 동적 변수인가?
- 하위 프로그램 정의가 다른 하위 프로그램 정의에 나타날 수 있는가?
- 어떤 매개변수 전달 방법이 제공되는가?
- 매개변수 유형을 확인하였는가?
- 서브프로그램을 매개 변수로 전달할 수 있고 서브프로그램을 중첩할 수 있는 경우 전달된 서브 프로그램의 참조 환경은 무엇입니까?
- 하위 프로그램을 오버로드할 수 있는가?
- 하위 프로그램이 일반적일 수 있는가?
- 하위 프로그램 중첩을 허용하는 언어인 경우 폐쇄(closure)가 지원되는가?
Local Referencing Environments
- 지역 변수는 stack-dynamic일 수 있다.
- 장점:
- 재귀 허용
- local용 저장소는 일부 서브 프로그램들에서 공유된다.
- 단점:
- 할당/해제, 시간 초기화
- 간접 addressing
- 서브프로그램은 hitory sensitive할 수 없다.
- 장점:
- 지역 변수는 static일 수 있다.
- 장점과 단점은 stack-dynamic local variable의 반대
- 예:
- 대부분의 현대 언어에서 local은 stack-dynamic이다.
- C 기반 언어에서 local은 기본적으로 stack-dynamic이지만(default), static으로 선언될 수도 있다.
- C++, JAVA, Python, C#의 메서드에는 stack-dynamic local만 가진다.
- Lua에서 암시적으로 선언된 모든 변수는 전역이다. 지역 변수는 local로 선언되고 stack-dynamic이다.
Semantic Models of Parameter Passing
- In mode
- Out mode
- Inout mode
Conceptual Models of Transfer
- 물리적으로 값(value)을 변경
- 값(value)의 경로에 접근하여 변경
Pass-by-Value (In mode) [값-전달]
- 보통 복사로 구현됨. 값-전달은 호출자의 실 매개변수 값에 대한 접근 경로를 전달함으로써 구현하는 것이 가능하지만, 값이 쓰기 보호 셀(읽는 것만 가능한 셀)에 있어야한다.
Pass-by-Result (Out mode) [결과-전달]
- 매개변수가 결과로 전달될 때, 어떤 값도 부프로그램으로 전달되지 않는다. 해당 형식 매개변수는 지역변수로서 사용되지만, 제어가 호출자에게 반환되기 바로 전에 그 값은 호출자의 실 매개변수로 전달된다.
끝
반응형
'Programming Language' 카테고리의 다른 글
[C++] 클래스(class)와 구조체(struct ) (0) | 2020.02.18 |
---|---|
[프로그래밍 언어론] CH7 Expressions and Assignment Statements (0) | 2019.12.04 |
[프로그래밍 언어론] CH6 Subprograms (0) | 2019.12.04 |
[프로그래밍 언어론] Ch8 Statement-Level Control Structures (0) | 2019.12.01 |
[C++] freopen()한 후 cin 무시되는 상황 해결 (0) | 2019.06.01 |
Comments