프로그래밍 언어론 핵심정리
제1장 프로그래밍언어 소개
프로그래밍 언어란
- 컴퓨터에 프로그래머의 의사를 전달하는 방법
- 프로그램을 작성하는 형식
- 프로그래머가 컴퓨터를 어떻게 추상화 하는가에 영향을 미침
- 컴퓨터가 읽을 수 있고 사람이 읽을 수 있는 형식으로 계산을 서술하는 표기체계
프로그램 이란
- 컴퓨터와 사람이 동시에 이해할 수 있는 형식으로 작성된 글
1.1 추상화
- 자신의 속성들의 특징적인 일부만을 가지고 주어진 작업이나 객체들을 표현하고, 그들의 공통점을 추출하여 표현하는 방법
① 자료 추상화 - 문자열, 수, 탐색트리와 같은 계산의 주체가 되는 자료의 특성을
추상화
② 제어 추상화 - 알고리즘 추상화. 현재의 상황에 따라 실행순서의 수정을 위한
제어의 특성을 추상화
기본적 추상화: 가장 국지적인 기계정보를 수집한 추상화
구조적 추상화: 프로그램의 구조에 대한 보다 전역적인 정보에 관한 추상화
단위 추상화 : 단위 프로그렘의 전체 정보에 관한 추상화
1.1.1 자료 추상화
- 추상화에 포함된 정보의 양에따라 분류
① 기본적 추상화 - 컴퓨터 내부의 자료 표현을 추상화
② 구조화된 추상화 - 구조적 자료형, 배열
③ 단위 추상화 - 추상 자료형, 자료 캡슐화
1.1.2 제어 추상화
① 기본적 추상화 - 몇 개의 기계명령어를 모아 이해하기 쉬운 추상구문으로 만든 것
② 구조화된 추상화 - 프로그램에서 어떤 검사된 값에따라 분할된 명령어의
한 그룹을 수행
- 부 프로그램 사용 = 프로시져 = 서브루틴
◉ 프로시져 추상화 - 프로시져는 이름과 실행해야 할 동작이 결합
- 프로시져는 실제 실행되어야 할 곳에서 호출되어야 한다
③ 단위 추상화 - 프로시져의 집합을 추상화 하도록 추상화
1.2 계산전형
1.1.1 명령형 언어
- 절차 언어
- 순차적인 명령의 수행을 기본개념으로 하는 언어
1.1.2 함수형 언어
- 함수 개념에 기반을 둔 언어
- 계산기술이 함수의 평가, 즉 알려진 값을 함수에 적용하는 것에 기반
- 적용형 언어 (application language)
1.1.3논리형 언어
- 기호논리학에 기반을 둔 언어
- 계산 내용만 선언하듯이 기술
- 선언적 언어 (declarative language)
1.1.4 객체지향 언어
- 객체에 기반을 두고 있는 언어
1.3 언어 정의
1.1.1 구문론(syntax)
- 형식화가 많이 되어 있는 부분
- 언어의 표현적인 구조만을 정의
- 대부분의 언어가 문맥자유(context free) 문법 사용
1.1.2 토큰(token)
- 프로그래밍 언어의 어휘구조
1.1.3 의미론 (semantics)
- 프로그램 실행 시 어떠한 일이 일어나는가를 기술
제2장 언어의 변천
디지털 컴퓨터 이전의 언어
- 찰스 베비지 : 수치계산을 처리하기 위해 차분 엔진과 분석엔진 설계, 분석엔진은 오늘날의 컴퓨터와 구조가 유사하다.
-오거스타: 세계최초의 프로그래머로 인식
2.1 1950년대:실행의 효율성(프로그램의 실행속도), 판독성(프로그램의 읽기능력)
-저급언어: 기계의 의존적인 이진수 개념이거나 자연언어와 차이가 많은 언어,사람이 이해하기보다는 컴퓨터의 내부구조에 의존적인 언어
- FORTRAN:최초의 고급언어,응용과학 분야에서 우위를 차지하고 있음
-COBOL: 미국방성에서 해군 그레이스 호퍼가 이끈 팀에 의해 만들어짐, 은행이나 대규모 회사에서 서류처리와 같은 사무 처리를 위해 재빨리 선택됨
-Algol60:알고리즘을 기술하기 위한 일반적인 표현 언어
-LISP: 일반적인 리스트 구조와 함수의 응용을 기본으로 한 언어
- APL: 배열과 행렬을 포함하는 수학적 연산을 쉽게 프로그램을 하기 위한 언어, IBM에선 시작
2.2 1960년대:복잡성제어(추상화 기법,규칙과 제한의 최소화)다양한 언어들의 출현
-Simula:노르웨이 컴퓨터 식터에서 뉘고르와 달에 의해 탄생, 시뮬레이션을 위해 디자인 됨, 객체지향언어의 기본이되는 클 래스 개념 도입
-BASIC: 다트머스 대학교의 존 케머니와 토머스 커츠가 개발, 새로운 시분할 시스템을 위한 간단한 언어로 개발
- PL/I, Algol68, Snobol,
2.3 1970년대: 간결성, 추상화 그리고 효율성
- C : 벨연구소의 데니스 리치 에 의해 고안, 컴퓨터구조에 대한 접근을 제공해 주는 개념, 중급 프로그래밍 언어
- PASCAL : Algol의 개념 도입, 복잡하거나 교육적 목적에 부합되지 않는 주요기능은 생략, 교육용으로 뿐만 아니라 상업 적으로 도 높은 기능성 갖춤
- CLU, Euclid, Mesa
2.4 1980년대:논리, 수학적 개념 , 통합과 새로운 방향
1980년 - C++ (처음 이름은 C with classes였으나 1983년 7월 이름이 C++로 변경됨)
C언어 확장, 비야네 스트롭스트롭이 개발
1983년 - ADA: 1980년대를 대표할 수 있는 중요한 프로그래밍언어로서 미국방성의 주도로 탄생되었고, J 이치바이어가 이끈 개발자들은 자료추상화, 타입 메커니즘(Package), 병행처리(task)와 예외처리 등 의 특징을 처음 도입
1984년 - Modula-2 : 니클라우스 워스가 개발, 운영체제를 구축하기 위해 고안된 Modula라는 언어를 기반으 로 하는 언어로서 추상화와 부분적 동시처라 개념과 내장형 시스템 프로그래밍을 목적으로 하드웨어 에 쉽게 접근할 수 있는 기능도 추가한 다목적 언어
1984년 - ML(Meta Language) : 에든버러 대학교의 로빈 밀너가 개발한 문법과 타입검사가 훨씬 유연함
1985년 - Prolog : 콜메로에르 가 이끄는 구룹에 의해 마르세유에서 개발 인공지능 분야에서 많이 쓰이고 있 고 모범적인 언어로 인식됨
1986년 - Smalltalk:n: 제록스사의 팰로멜토 연구소에서 엘런케이, 댄 인갈스와 다른 연구자에 의해 개발, 객 체지향 접근방식으로 일관된 객체지향언어의 순수한 모범케이스
1986년 - Erlang
1987년 - Perl
1988년 - Tcl
1988년 - 매스매티카(Mathematica)
1989년 - FL (Backus);
2.5 1990년대 : World Wide Web 프로그래밍(Java)
Java : 1990년대 가장 특징적인 프로그래밍 언어이며 WWW 프로그래밍을 쉽게 구현가능하고 자바가상기계(JVM)위에서 동작 하기 때문에 다양한 응용분야에 적합하다
Java 애플릿 : 웹 클라이언트에서 실행될 수 있는 작은 프로그램
제3장 프로그래밍 언어 설계
3.1 역사와 설계 기준
- 초기 : 실행의 효율성(프로그램의 실행속도), 판독성(프로그램의 읽기능력)
- 60년대 : 복잡성제어(추상화 기법, 규칙과 제한의 최소화)
- 70년대 : 간결성, 추상화
- 80년대 : 논리, 수학적 개념
3.2 효율성
- 판독성과 유지보수 능력은 효율성에 관한 매우 중요한 쟁점
- 여러 가지 형태의 다른 기준들을 포함
① 목적 코드의 효율성 - 효율적인 실행코드를 생성할 수 있도록 언어 설계가
이루어져야 함 - 최적화
② 번역의 효율성 - 원시코드가 효율적으로 번역되도록 허가 하는가?
③ 프로그래밍 효율성 - 프로그램 작성 능력
3.3 일반성, 직교성, 획일성
① 일반성 - 특별한 경우를 피하거나 밀접하게 관련이 있는 여러 개념들을 일반적인
하나의 개념으로 결합
② 직교성 - 언어 구성자들이 각각의 의미를 가진 채 결합될 수 있음을 의미
③ 획일성 - 유사한 것들은 유사하게 보여야 하고, 유사한 의미를 가져야 하며, 반대로
서로 다른 것들은 다르게 보여야 함
3.4 기타 설계원칙
- 간결성
- 표현력 : 언어가 복잡한 과정이나 구조를 표현하는데 용이
- 정확성 : 언어의 행위가 예측될 수 있도록 하는 정의
- 기계 독립성 : 특정 기계에 독립적 언어 정의
- 보호성 : 프로그래머가 만들 수 있는 오류의 수를 최소화
- 일관성
- 확장성
- 제약성
제4장 프로그래밍 언어 구현과 바인딩
4.1 프로그래밍 언어 구현 기법
4.1.1 번역기법(Fortran, Algol, PL/I, Pascal, Cobol, C, Ada .......)
- 기계어로 번역하여 기계어 프로그램을 만들어 실행 시키는 방법
① 컴파일러 - 원시언어(고급언어) → 목적언어(기계어에 가까운 저급언어인 번역기)
② 어셈블러 - 원시언어(어셈블리어) → 목적언어(준 기계어)
③ 링키지에디터 - 재배치 형태의 기계어로 된 여러개의 프로그램(컴파일된 목적코드,
라이브러리)을 묶어 로드모듈이라는 어느정도 실행가능한 하나의
기계어로 번역
④ 로더 - 로드 모듈로된 기계어 프로그램을 실제 실행 가능한 기계어로 번역하여
주기억 장치에 적재
⑤ 프리프로세서 - 원시언어(고급언어) → 목적언어(고급언어)
4.1.2 인터프리터 기법(Lisp, Snobol4, APL, Prolog)
- 고급 언어로된 프로그램을 자료로 읽어 들여서 기계어 수행과 동일한 알고리즘으로
그 프로그램의 각 문장을 디코딩하고 실행시킴
4.1.3 비교
- 입력자료는 고급언어로된 프로그램으로 같지만 출력은
번역기 - 입력 프로그램과 동일한 목적 언어로 된 프로그램
인터프리터 - 직접 입력 프로그램을 실행
① 번역 기법 : 장점 - 반복문이나 부 프로그램 호출이 많은 프로그램 실행시 전체
실행시간 면에서 매우 효율적
단점 - 번역 프로그램이 큰 기억장치 요구할 수 있다
② 인터프리터 기법 : 장점 - 추가의 기억장소 필요없음
단점 - 실행되는 동안 디코딩하는 시간을 매우 많이 요구할 수 있다
4.2 속성과 바인딩
4.2.1 바인딩 개념
- 바인딩 : 이름에 어떤 속성을 연결하는 과정, 속성이 결정되는 행위
- 바인딩 시간 : 바인딩이 발생되는 시간
4.2.2 바인딩 시간의 종류
(1) 실행시간 - 동적 바인딩 : 프로그램 실행시간에 이루어지는 바인딩
ex) 변수값의 확정, 변수와 자료구조에 기억장소를 할당
① 모듈의 시작시간 - 모듈 프로그램(부프로그램, 블록) 실행 시작시간에 발생하는
바인딩
: 형식매개변수와 실매개 변수간의 바인딩
: 지역변수들에 대한 기억장소 할당
② 실행시간의 사용 시점 - 프로그램을 실행하는 동안 사용 시점에서 수시로
발생하는 바인딩
(2) 번역시간 - 정적 바인딩 ex) 변수의 형, 자료구조의 형과 크기등을 확정하는 바인딩
- 구성 : 컴파일 시간, 링크시간, 로드시간
(3) 언어 정의시간 - 프로그래밍 언어의 구조 확정
(4) 언어 구현시간 - 언어를 실제 컴퓨터에 구현시 그 언어의 원소들에 관한 특성의
일부를 확정
4.2.3 바인딩 시간의 중요성
- 프로그래밍 언어들 간의 가장 중요하고 미묘한 대부분의 차이점들은 바인딩 시간의
차이에서 발생
제5장 구문정의
5.1 BNF표기법
① 식별자 정의
<identifier>::=<letter>|<identifier><letter>|<identifier><digit>
<letter>::=A|B|C| ..... |X|Y|Z
<digit>::=0|1|2|3|4|5|6|7|8|9
◉ 메타기호
::= 정의
| 택일
<> nonterminal기호, 다시 정의될 대상
② EBNF 표현
<identifier-name>::=<alphabet>|{<alphanumeric>}
<alphanumeric>::=<alphabet>|<digit>
<alphabet>::=A|B|C| ..... |X|Y|Z
<digit>::=0|1|2|3|4|5|6|7|8|9
◉ 메타기호
{} 반복
[] 선택적인 부분
5.2 구문도표
① termanal x
② nonterminal B
③ A::=a1|a2|a3|....|aN
④ EBNF A::={a}
⑤ EBNF A::=[a]
⑥ EBNF A::=(a1|a2)b
5.3 파스 트리
- 표현이 주어진 BNF에 의해 작성될 수 있는지를 확인하기 위해 만들어진 트리
제6장 변수, 수식 및 제어문
6.1 변수
◉ 정의 : 이름, 속성(attribute)의 집합, 참조(reference), 값(value)의 4요소로 구성
6.2 선언문
◉ 정의 : 실행시 사용될 자료의 속성을 언어의 번역기에 알려주는 프로그램 문장
◉ 선언문의 목적(이점)
① 효율적인 주기억 장치 사용과 접근 방법이 가능
② 보다 효율적인 주기억 장치 경영이 가능
③ 정적 형 검사 가능 - 실행시간에 영향
6.3 배정문
◉ 정의 : 변수의 내용을 변경하는 원시 연산
6.3.1 l-value 와 r-value
- l-value : 변수 이름을 참조와 관련시켜 언급
- r-value : 변수 이름을 값과 관련시켜 언급
● A := B
- A : 참조(위치)를 의미, l-value
- B : 값을 의미, r-value
ex)
상수의 경우 (A = 123) → r-value 만을 가지며 l-value는 가지지 못함
K = (A + D) / C → l-value를 가지지 못함
변수 A,B가 포인터일 때 A = B → r-value가 없다
포인터 P → P의 r-value는 P가 지적하는 위치가 되며
l-value는 P 자신의 값이 들어 있는 위치
배열 A[i] → l-value는 배열 A에서 i번째 원소의 위치
r-value는 그 위치에 저장되어 있는 값
6.3.2 배정문의 구현
- 배정문 A = e에서
- 수식 e의 자료형이 저장할 변수 A의 자료형과 서로 상이할 경우 해결방안
① 수식 e의 값을 계산하여 현재 A의 속성과 동일하도록 e의 값을 형 변환
② A의 속성을 계산된 e의 계산값과 동일한 형으로 변환
6.3.3 배정 연산에 관한 사항
6.4 상수
◉ 정의 : 식별자로 주어지며 프로그램 수행중 값이 변하지 않음
- l-value가 없음
6.5 수식
◉ 목적 : 계산될 값을 기술하는 것
◉ 구성 : 상수나 변수 같은 오퍼랜드들과 연산자들 그리고 사용 가능한 함수호출로
이루어짐
- 산술, 관계, 논리
- 명확성 요구
6.6 조건문
◉ if문
◉ case문
6.7 반복문
◉ 괄호 ◉ loop-repeat문
◉ while문 ◉ repeat문
◉ for문
6.8 GOTO문
6.8.1 레이블과 goto문
- 레이블과 goto문의 기본 사용법
① 레이블을 번역하는 동안 그 위치를 지적하는 태그(tag)로만 사용
② 레이블을 실행시간에 계산은 못하지만 제한된 자료항목으로 간주
③ 레이블을 실행시간 동안의 제한이 없는 자료항목으로 간주
6.8.2 goto문의 장단점
- 장점 : 일반적인 컴퓨터에서 간결한 형태의 goto문 제어구조가 곧바로 하드웨어로 제공
: goto-레이블 구조가 완전한 범용성을 가지고 있다
- 단점 : 프로그램이 매우 빈약하게 디자인 됨
: goto문의 많은 사용이 프로그램을 디버그하고, 이해하고, 유지보수하기 어렵게
만듬
제7장 자료형(기본 자료형, 구조 자료형)
7.1 자료형과 형 선언
◉ 자료형 : 구성원이 될 수 있는 자료들의 집합
: 객체들의 집합과 이 객체들의 실체들을 생성, 작성, 소멸, 수정, 분해하는
연산들의 집합
◉ 자료형과 관련한 쟁점
- 자료형에 관한 정보를 번역 시간에 주어야 하는지 실행시간에 주어야 하는지
* 강 자료형 : 자료형에 관한 모든 특성들이 컴파일 시간에 확정되는 프로그래밍
언어
- 두 자료형이 적법(compatible)할 수 있는지 또는 동치관계 인지를 결정할 수 있는
기법을 어떻게 제공해야 하는지
- 매개변수에 관한 문제 : 자료형을 매개변수화하기 위한 방법과 매개변수들의 평가
시점에 관한 것
◉ 스칼라 형(scala type) = 기본 자료형 : 자료형의 영역이 상수값들로만 구성되어있는
자료형들(정수형, 실수형, 논리형, 문자형 등)
◉ 구조형(structured type) : 자료형의 영역이 자료들의 집합을 구성원으로 하여 구성
(배열, 레코드)
7.2 열거 자료형
7.3 기본 자료형
7.3.1 수치형
- 장점 : 연산 속도가 매우 빠르다
- 단점 : 고급언어로 작성된 프로그램을 한 기계에서 다른 기계로 이동 시키고자 할
때 어려움 초래
* Algol 68에서
◉ 확장(widening) - 값이 정수 또는 실수에서 배정도로 변환될 때 정보의 손실이 없다
◉ 축소(narrowring) - 실수를 정수로 변환하는 경우 일부 정보를 손실하게 된다
7.3.2 논리형
7.3.3 문자형
◉ 범용성 고급언어가 문자열 조작을 위해 갖추어야할 특성
- 문자열 자료형 허용
- 관계 연산자를 문자열 비교에 그대로 사용할 수 있도록 보편화
- 문자열 분해, 조립 연산 제공
◉ PL/I의 문자열 변수 선언 방법
- DCL A CHAR(10) : 길이가 10인 문자열 변수 A를 선언
- DCL B CHAR(80) VARYING : 최대 80 문자의 길이를 갖는 문자열 변수 B 선언
- DCL C PIC 'AAXX99' : 저장될 문자열이 충족시켜야할 조건이 함께 주어짐
: 변수 C에 처음 두 문자는 영문자나 공백, 다음 두 문자는 어떤
문자도 가능, 마지막 두 문자는 숫자를 써야함을 선언
7.3.4 Snobol에서의 문자열 배열
7.4 포인터 자료형
- 포인터 : 어떤 객체에 대한 참조
- 포인터 변수(point variable) : 객체를 참조하기 위한 주소를 값으로 취하는 식별자
7.5 구조 자료형
7.5.1 배열 ◉ 정의 : 집합체에서의 위치로 원소를 식별하는 동질형 자료 모임
7.5.2 레코드 ◉ 정의 : 이름으로 원소를 식별하는 이질형 자료 모임
7.6 자료형의 변환
7.7 자료형의 동치
◉ 이름 동치 : 두 변수를 함께 선언하거나 동일 식별자 이름을 사용해서 선언하면
두 변수는 동일형으로 인식
◉ 구조적 동치 : 자료형의 구성요소가 모든 측면에서 같다면 두 변수는 동일형으로 인식
제8장 식별자 영역과 수명
8.1 식별자 영역
◉ 영역(scope) : 식별자(변수)가 그 이름이 인식되어지는 공간
: 그 이름의 사용이 허락되고 있는 프로그램 범위
8.2 정적 영역 규칙과 동적 영역 규칙
8.2.1 정적 영역 규칙(static scope rule)
- 식별자의 영역이 번역시에 결정(컴파일러 언어)
◉ 지역(local) 변수 - 정적 내포 관계를 유지하는 블록 구조 언어에서 선언된 변수와
형식 매개 변수
◉ 비지역(non-local) 변수 - 블록을 내포하고 있는 외부 블록에서 선언된 변수
◉ 전역(global) 변수 - 전체 프로그램을 영역으로 하는 비지역 변수
◉ 영역 구멍(hole-in-scope) - 실수형으로 선언된 변수 x가 블록 내에서 정수형으로
재선언되었을 경우 그 블록에서 벗어날 때까지 이전에
선언된 속성은 무효가 되어 블록 내에서는 x가 정수형
으로 사용되고 블록 외에서는 실수형으로 사용되는 현상
8.2.2 동적 영역 규칙(dynamic scope rule)
- 식별자 영역을 작성된 프로그램 문맥으로 해결하지 않고 프로그램이 실행되고 있는
순서를 가지고 해결하는 방법
- 식별자의 영역이 실행시간에 결정
8.3 주요 언어에서의 영역 규칙
8.4 변수의 수명
◉ 수명(lifetime or extent) : 생성된 메모리가 사용되는 기간 : 생성과 소멸 사이의 기간
: 값을 넣기 위한 기억 장소를 할당받고 있는 동안
- 동적 수명이 프로그래밍언어에서 사용될 때 기억장소를 회수하는 방법
① 기억장소를 실행시간 내내 할당하다가 주프로그램 종료시 회수
② 기억장소가 다시 사용될 수 있도록 할당된 기억장소를 포기하는 명시적 명령어를
제공(PASCAL의 dispose, PL/I의 free)
③ 프로그램에 더 이상의 참조가 없더라도 계속 기억장소에 존재하게 하다가
새 기억장소가 요구되는 경우 이들 기억장소를 회수하여 재생
(garbage collection : 기억장소를 계속 할당하다가 사용가능한 기억장소 pool이
작아지면 자동적으로 사용하지 않는 기억장소들을 모아 사용
가능하도록 재생)
※ 프로그래밍 언어들에서의 영역과 수명
① Fortran - 영역 단위 : 서브루틴, FUNCTION
- 변수 영역 : 지역 변수
- 변수 수명 : 전체 프로그램의 생존기간과 동일
② Algol 60 - 영역 단위 : 블록과 프로시져
- 변수 영역 : 지역 변수
- 변수 수명 : 한 영역이 활성화되는 시점에서 그 영역을 벗어날 때까지
③ Pascal - 영역 단위 : 프로시져, FUNCTION
- 변수 영역 : 지역 변수
- 변수 수명 : 한 영역이 활성화되는 시점에서 그 영역을 벗어날 때까지
: 전체 프로그램 생존기간(new 함수 사용하여 레코드의 동적 할당 시)
: new 함수의 실행과 dispose 함수 실행시간 사이
(new 함수 사용하여 dispose 함수 제공 시)
④ Ada - 영역 단위 : 프로시져, 블록, 패키지, 태스크
- 변수 영역 : 지역변수
- 변수 수명 : 한 영역이 활성화되는 시점에서 그 영역을 벗어날 때까지
제9장 기억 장소 할당
9.1 정적 및 동적 기억장소 할당
- 정적 기억장소 할당을 가능하게 하기 위한 기본조건
① 사용된 모든 배열은 확정된 고정 크기로 선언되어야 함
② 부 프로그램은 되부름이 허용되지 않는다
9.2 단위 프로그램
- 지역변수(local variable) : 단위 프로그램에서 선언하여 사용하는 변수
- 활성화 상태(activated state) : 한 단위 프로그램의 실행 시작부터 종료까지
- 단위 활성화(unit activation) : 실행 시간에 한 단위 프로그램이 표현된 상태
① 코드부(code segment) : 프로그램의 명령어들로 구성됨. 고정크기로 내용 불변
② 활성 레코드부(activation record) : 단위 활성화의 지역변수에 관련된 자료들을
비롯한 프로그램 실행에 필요한 모든 정보를
가지고 있음. 내용 가변적
* 오프셋(offset) : 주어진 활성레코드 안에서 한 자료에 대한 상대 위치
9.3 정적 기억장소 할당
- FORTRAN 4, COBOL
- 정적 변수(static variable) : 번역시간에 크기가 고정되며 번역시간에 할당되는 변수
- 정적 기억장소 할당
: 각 단위 프로그램에서 요구하는 기억장소의 크기는 실행시간 전에 확정되며,
프로그램이 실행하는 동안에 그 크기가 변하지 않는다.
: 언어에 대한 적응성이 적어진다.
(되부름이 허용안됨. 실행중 배열의 크기를 변화시킬 수 없다.)
: 활성화되지 않을 수도 있는 활성 레코드 역시 주기억 장소를 항상 차지하게 됨
※ 동적 기억장소 할당기법을 사용하는 언어
① Algol 형태의 블록중심 언어 - 컴파일러를 사용하여 구현되는 언어
(Algol 60, Pascal, C, Algol 68, PL/I, Ada) : 스택기반 기억장소 할당
② 인터프리터 기법을 사용하여 구현되는 언어(APL, Lisp, Snobol 4, Prolog, Java)
9.4 스택기반 기억장소 할당
- Algol 형태 언어 : 변수들의 영역을 제한하고, 프로그램을 적당한 단위 프로그램으로
나누어 구성할 수 있도록 블록개념을 도입한 언어(모든 단위 프로
그램들은 서로 공용부분이 없거나 내포관계(nested)에 놓여야 함)
- 단위 프로그램
① 블록 : 정상적인 프로그램 실행 과정에서 차례가 되었을 때 활성화
② 부 프로그램 : 호출문에 의해 호출되었을 때 활성화
◎ 스택기반 기억장소 할당 방법
(1) 활성 레코드의 크기가 정적으로 확정되는 경우(그림 9.3, 9.4, 9.5)
- 단위 프로그램이 활성화되는 시점에서 지역 변수들이 생성
- 지역 변수들이 필요로하는 기억장소 용량은 번역시간에 이미 확정
- 준정적 변수(semistatic variables) : 변수에 대한 실제 주소가 실행시간에 바인딩
(2) 단위 프로그램이 활성화되는 시점에서 활성 레코드의 크기가 확정되는 경우(그림 9.6)
- 단위 프로그램이 활성화되는 시점에서 지역변수들이 모두 생성되며
- 이때 지역변수가 요구하는 기억장소의 크기가 확정
- 준동적 변수(semidynamic variables)
: 준정적 변수 개념 + 번역 시간에 단위 활성 레코드에서 지역 변수들의 offset이
상수값으로 확정되지 못하여 주소에 대한 최종 확정을 실행시간 까지 늦춰야 된다
(3) 활성 레코드가 동적으로 변하는 경우
- 프로그램 실행중에 새로운 자료값이 생성되고 회수되어 활성 레코드의 크기가 변함
- 동적변수(dynamic variable) : 활성 레코드가 활성화되는 시점에서도 활성 레코드의
크기를 알 수 없는 변수
* 힙(heap) : 동적변수를 할당하기위한 기억장소로서 자유롭게 사용할 수 있는 기억장소를
의미한다
* 스택 변수 - 준동적 변수나 준정적 변수
힙 변수 - 동적 변수
9.4.4 비지역 변수의 참조 방법(그림 9.7)
(1) 정적 체인 사용 기법(그림 9.8)
- 모든 활성 레코드에 정적링크라고 부르는 포인터를 할당하여 작성된 프로그램의
정적 내포관계에 있는 활성 레코드를 가리키게 함
(2) (그림 9.9)
(3) 디스플레이 사용 기법(그림 9.10)
- 단위 프로그램의 호출과 반환횟수에 비하여 비지역 변수들의 사용이 상대적으로
증가할 경우 유리
9.5 힙 기억장소 할당
- 인터프리터 기법
제10장 부 프로그램
10.1 개요
- 부 프로그램 : 함수(function), 서브루틴(subroutine or procedure)
- 프로시져의 4구성 요소
: 프로시저이름, 매개변수(parameter) 리스트, 몸체(body), 환경(environment)
10.2 매개변수 평가와 전달 기법
10.2.1 형식 매개 변수와 실매개 변수
- 형식 매개 변수 : 부 프로그램이 실행되는 동안에 식 또는 다른 이름을 대신하여
그 프로그램에서 사용되는 이름
- 실 매개 변수 : 부 프로그램이 실행되는 동안에 사용되는 원래의 식 또는 이름
10.2.2 Call by reference(by address, by location)
- 참조 전달 기법 : 실매개 변수 주소를 대응되는 형식 매개 변수에 보내는 방법
10.2.3 Call by value ; Call by result
- 값 전달 기법 : 호출된 부 프로그램 자신이 형식 매개 변수에 해당되는 기억 장소
를 별도로 유지하는 방법
: 호출한 프로그램이 실매개 변수에 해당되는 주소를 보내면 호출된
부 프로그램은 r-value를 구하여, 그 자신이 보유하고 있는 형식
매개 변수의 기억장소에 복사하여 다른 지역변수와 동일하게 취급
- 결과 전달 기법 : caller가 형식 매개 변수값을 저장할 기억장소를 보유
- 값-결과 전달 기법 : 형식 매개 변수를 지역변수로 간주하며 caller가 시작부에서
실매개 변수값을 형식매개 변수의 초기값으로 복사해 와서 실행한 후 반환되기
직전에 형식매개 변수의 최종값을 실매개 변수에 다시 복사하는 방법
10.2.4 Call by name
- 이름 전달 기법 : 형식 매개 변수의 이름이 사용될 때마다 그에 대응되는 실매개
변수 그 자체가 사용된 것처럼, 필요한 r-value or l-value를
매번 구하여 실행하는 방법
10.3 형식 매개 변수 명세
10.4 프로그래밍 언어에서 유해한 특징들
10.4.1 부작용 - 지역 변수이외의 변수값을 변화시키는 것
10.4.2 이명 - 한 단위 프로그램에서 동일한 기억장소를 함께 사용하고 있는 다른 이름의
변수들
10.5 연산자 중복 표현
10.6 포괄 기능
10.7 코루틴(그림 10.5)
- 호출된 프로시저의 수행이 완전히 끝나기 전에 호출한 프로시져로 제어를 반환하는
프로시져
제11장 자료 추상화
* 자료추상화의 두가지 관점
① 자료를 그 자료를 처리할 연산과 함께 선언할 수 있다는 점
② 정보은닉 개념을 도입하여 프로그램을 쉽게 읽을 수 있고 유지 보수를 용이하게 한 점
11.1 소개
◉ 추상화 : 자신의 속성의 일부만을 가지고 주어진 작업이나 객체들을 필요한 정도로
묘사할 수 있는 방법을 지원
◉ 프로시져 추상화 : 어떻게 수행되는가를 묘사
◉ 자료 추상화 : 자료형의 표현과 그에 관련된 연산들을 함께 묶어 캡슐화 하는 기법
* 캡슐화 : 부적당한 사용으로부터 자료형을 보호하기위한 벽을 형성
창문(window) : 사용자가 잘 정의된 방법으로 호출하여 사용하는 것을 허락
공개부(public part) or 가시부(visible part) : 창문을 통해서 외부에 알려주는 부분
전용부(private part) : 벽으로 보호하는 부분
방출(export) : 공개하는 행위
도입(import) : 다른 모듈 프로그램에서 방출된 객체들을 사용할 수 있도록
연결하는 행위
◉ 자료 추상화에 관한 가상적인 형태
- structur : 자료 추상화 개념에 대한 새로운 이름으로 시작은 structur로 영역의
한계는 end로 표현
11.2 Ada의 자료 추상화
11.3 C++의 자료 추상화
◉ 클래스를 제공하여 자료 추상화를 지원
- new, delete : 자유 기억 장소에 할당(new)하고 회수(delete)하기 위한 연산자
- 생성자 함수 : constructor : new 연산자 사용
소멸자 함수 : destructor : delete 연산자 사용
'컴퓨터과학[2-2] > [2-2]프로그래밍언어론' 카테고리의 다른 글
프로그레밍언어론 중간시험 핵심자료 (2) | 2015.10.06 |
---|---|
프로그래밍 언어론 심화학습 - 파스 트리(Parse tree) (0) | 2015.08.22 |
프로그래밍 언어론 심화학습 - BNF & EBNF & 구문도표 [식별자 정의] (2) | 2015.08.22 |
댓글