제 1장 프로그램 언어란?
1. 프로그래밍 언어: 프로그래밍 언어는 컴퓨터가 읽을 수 있고 사람이 읽을 수 있는 형식으로 컴퓨터가 계산을 서술하기 위한 표기 체계.
2. 프로그램 언어에서의 추상화: 속성들의 특징적인 일부분만을 가지고 주어진 작업이나 객체들을 표현하고, 그들의 공통점을 추출하여 표현하는 것.
1) 대상에 따라.
- 자료 추상화: 문자열, 변수, 탐색 트리
- 제어 추상화: 반복문, 조건문, 프로시저 호출
2) 정보의 양에 따라
- 기본적 추상화: 가장 국지적인 기계정보를 관한 추상화
- 구조적 추상화: 프로그램의 구조에 대한 보다 전역적인 정보에 관한 추상화
- 단위 추상화: 단위 프로그램 전체 정보에 관한 추상화
3. 프로그램 언어의 전형
1) 명령형 언어(절차 언어)
- 순차적인 명령의 수행을 기본 개념으로 하는 언어.
- (순차적 실행 + 변수 + 배정문)의 형태로 구성됨.
- C, Basic 등이 있다.
2) 함수형 언어(적용형 언어)
- 알려진 값들을 함수들에 적용하는 것에 기반함.
- 재귀적 함수로 반복문에 대신함.
- lisp 가 있다.
3) 논리형 얶어(선언적 언어)
- 반복이나 선택묷 없이 계산의 내용맊을 선얶하듯 기술
- 기호 논리학에 근거를 두고 있음.
- prolog
4) 객체 지향 얶어
- 실세계에서 존재하는 모든 유형 및 무형의 대상이 되는
객체를 클래스로 표현
4. 언어 정의
1) 구문론(sysntax): 자연어와 유사, 언어의 표면적인 구조만 정의,
토큰이라는 어휘 구조에 대한 형식 규칙으로 일반적으로 문맥 자유문법을 사용함.
구문론 ->어휘구조 ->자연어의 맞춤법과 유사.
2) 의미론(semantics): 프로그램의 실행 시 어떠한 일이 일어나는가를 기술하며,
언어 구문과는 달리 형식화된 정의가 어려움. 형식화가 이루어지지 않음.
5. 프로그래밍 언어의 설계 기준
효율성, 표현력, 정확성, 일반성, 직교성, 획일성, 컴퓨터 독립성, 안전성, 기존 규칙과의 일관성
제 2장 프로그래밍 얶어의 구조 및 해석
1. 언어 구문
1) 번역기: 어휘분석 단계에서 입력 프로그램의 일렦의 묷자를 토큰으로 구분하고, 구문분석 단계에서 이를 처리하여 구문구조 가 정확한 지 확인한다..
2) 어휘 구조 : 어휘 토큰으로 구성, 단어의 구조.
- 어휘 토큰: 프로그래밍 언어의 어휘구조.
- 언어 구성자: 한 개 이상의 어휘 토큰을 가지고 구문적으로 허용된 프로그램의 일부 구조.
3) 식별자 = 키워드
- 한 개 이상의 어휘 토큰을 가지고 구묷적으로 허용된 프로그램의 일부 구조.
- 예약어: 식별자중에서 재정의 할 수 없는 것.
( if, case, for, while, int, procedure, function), 변수로 사용 못함.
장점: 가독성 향상, 컴파일러 탐색 시갂 단축,
오류 검색 시갂 단축.
- 식별자: scanf, printf, strcnmp, #define
- 키워드: 식별자로 예약어와 비슷하나, 예약어는 사용자가그것을 변수 이름 등으로 사용할 수 없는데 비해 키워드
는 그럴 수도 있고 아닐 수도 있다. Fortran, Basic에서는키워드가 모두 예약어 이지맊 Pascal에서는 어떤 것은
예약어 이고 어떤 것은 아니다.
- 특수기호(13개): = + - * / ( ) , . $ . : 공백
- 상수
2. BNF, EBNF
1) BNF 표기법 식별자 : 묷맥 자유 묷법
비단말 기호 -> <> (각괄호), 정의될 수 있는 기호
단말 기호 -> 각괄호로 묶이지 않은기호
메타 기호 -> | 택일, ::= “정의 된다”
2) EBNF
[ ] : 나타나지 않거나 1번 나타남.
{}07: 0번에서 7번까지 나타날 수 있음.
3. 구묷 도표
단말: 원, 비단말: 사각형
3) BNF . EBNF로 변홖
<수>::= <수><숫자>|<숫자>
<숫자>::= 0|1
<수>::= <숫자>{<숫자>}
BNF를 풀어 보자
<수> ::=<수><숫자> - ○1
<수> ::=<숫자> - ○2
<수> ::= <수><숫자><숫자> : ○1식에 ○1식을 대입하면
::= <수><숫자><숫자><숫자> : 계속 반복 된다.
::= <숫자><숫자><숫자><숫자> : 위 식에 ○2 삽입
이렇게 <숫자>가 계속 반복 될 수 있음으로
<수>::= <숫자>{<숫자>} : {} 는 0 ~ n회 이상 반복
4. 파스 트리
주어진 BNF에 의해 어떤 표현이 생성될 수 있는지 확인하기 위해 작성하는 트리 구조의 단말 노드의 나열
1) 추상 구문 트리
- 파스 트리의 본질적인 구조를 나타내는 트리
- 구문 트리(syntax tree)라고도 함.
- 파스 트리에서 불필요핚 비단말 기호 제거
2) 모호성 제거법칙
- 비단말 기호(<term>)와 문법규칙을 추가
- 우 결합 규칙이나 좌 결합 규칙을 적용.
- BNF 문법에 좌순환 규칙을 사용하여 좌 결합 지원
3) *가 + 보다 먼저 계산 (모호성 변홖)
<식>::= <식>-<식> | <식> * <식> | (<식>) | <수>
. 항을 추가하여 모호성 변홖
<식>::= <식>+<식>|<항> <항>::=<항>*<항>|<수>
<식>::=<식> + <식> - ○1
<식>::=<항> - ○2
<항>::=<항>*<항> - ○3
<항>::=수 - ○4
*가 먼저 계산 되는지 확인
○1식에 ○3식을 대입
<식> ::= <항> * <항> + <식> : ○2식을 대입
<식> ::= <항> * <항> + <항> : ○4식 대입
<식> ::= 수 * 수 + 수 : *이 먼저 계산 된다.
5) 좌/우 결합 묷제 해결
<exp>::= <exp>-<exp> | <exp> * <exp> | (<exp >) | <number>
. 규칙적용을 추가하여 모호성 변홖
<exp>::=<exp>-<term>|<term>
<term>::=<term>*<factor>|<factor>
<factor>::=(<term>)|<number>
6) 프로그램 싞뢰성: 프로그래밍 얶어의 구묷이 사람과
기계에 의해 쉽게 분석될 수 있어야 함.
7) 프로그램 묷법의 모호성
A) 현수 else의 모호성
- 두 가지 의미를 가질 수 있는 묷제가 발생.
- 이러한 else묷제 . 현수 else( dangling else)
- BNF 묷법과 관계없이 얶어 자체가 포함하고 있는
모호성에 해당.
- Pascal: begin-end
- PL1: else else 묷장 추가. “;” 추가
5. 인터프린트 기법과 컴파일 기법
- 인터프린트 기법: 프로그램과 자료가 주어지면 바로 실행 시켜 결과를 얻음.
- 컴파일 기법: 목적 코드 출력맊 가능.
- 중간코드: 프로그램을 실행하기 쉬운 형태로 번역한 후에 그 번역된 형태의 프로그램을 실행 시물레이션으로 실행하는 방법.
제 3장 변수, 바인딩, 식 및 제어문
1. 변수 정의
1) 정의: 선언문 또는 묵시적 선언으로 생성되며, 식별자, 자료 속성들의 집합, 하나 이상의 주소 그리고 자료 값들의 네 가지 요소로 구성되는데, 주소와 자료 값들의 관계는 변할 수 있다.
2. 바인딩의 개념
- 변수의 네 가지 요소에 값을 확정하는 것.
- 프로그램 작성시의 변수 속성은 변할 수 있으나, 번역 시
간에 결정된 변수의 속성은 변할 수 없음.
- 일반적으로 변수의 속성은 선언문을 통해 이루어짐.
- 변수의 주소란 변수값이 저장되는 기억장소의 위치
- 바인딩: 이름에 어떤 속성을 연결하는 과정
- 바인딩 시간: 속성이 이름에 연결되고 계산되는 과정이
어느 시점에서 이루어지는가에 따라 바인딩이 분류되는
시간.
3. 바인딩 시간의 종류
1) 실행 시간: - 변수의 값을 확정,
- 자료 구조에 기억장소를 배당.
2) 번역 시간: 부작용을 줄일 수 있다.
- 구성: 컴파일 시간, 링크 시간, 로드 시간
- 종류: 변수의 형, 자료 구조의 형과 크기,
레코드의 각 항목들의 형들을 확정.
3) 언어의 규현 시간: 정수의 자릿수, 실수의 유효 숫자 개수,
수의 기계 내에서의 표기법 등.
4) 언어 정의 시간: 컴퓨터에 이미 정의 되어 있는 내용,
혼합형 연산이 허용되는 연산에서 연산해야 될 두 피연산자의 형에 따라 어떤 형의 연산을 해야 되는지를
확정.
실행시간 ->동적 바인딩
번역, 구현, 정의 - > 정적 바인딩.
4. 바인딩 시간의 중요성:
- 효율성: 컴파일러는 번역시 바인딩 하도록 설계한다.
- 유연성: 대부분의 바인딩을 실행시간까지 지연하여 바인딩 한다.
5. 선언
1) 선언문의 정의 - 실행시 사용할 자료의 속성을 컴파일러 등에 알려 주는 프로그램 문장.
바인딩을 제공하는 중요한 방법
- 자료의 속성: 자료형, 크기, 이름, 생성시기, 소멸시기, 참조하는 첨자.
2) 선언문의 목적
A) 주기억 장치 사용과 접근 방법의 효율성
- 프로그램 실행 동안에 변하지 않는 자료구조의 속성들을 한정해 주는 것.
. 컴파일러가 자료 구조에 접근하기 위한 계산을 최적화함.
. 주기억 장치의 절약 및 프로그램 실행 시갂의 절약
B) 주기억 장치 경영의 효율성
- 자료 구조의 크기, 생성 시기, 소멸 시기 등을 번역 시갂에 알게 됨으로써 보다 효율적인 기억장소 배당 기법을 제공.
C) 정적형 검사 가능
- 잘못 사용한 자료형 등을 번역시간에 찾아낼 수 있어,
프로그램의 신뢰성을 높일 수 있음.
. 혼합형 연산: 연산자에 대한 피연산자와 연산 결과의 자료형이 고정되지 않은 연산 가능.
3) 변수 할당문 - 변수의 내용을 변경할 수 있는 연산.
- 프로그램에서 가장 일반적으로 나타나는 연산.
- 단순 할당문 : S = T, S := T
- 다중 목적 변수 할당문
- 조건 목적변수 할당문
- 복합 할당 연산자: S = S + T
- 단항할당 연산자: S++
- 식으로서의 할당문: 식부작용이 발생 가능. -> 프로그램 가독성 문제.
4) 식 부작용 설계 오류를 발생하는 원인
- 할당을 보통 이항 연산자처럼 취급하는 것을 허용하는 것.
- 산술식을 불리언 피 연산자로 사용하는 것.
- 매우 비슷하게 보이는 두 연산자 =, ==을 완전히 다른 의미로 사용하는 것.
5) 혼합형 할당문: 양편의 형이 틀린 경우.
- 묵시적 형변환은 오른쪽 식이 평가된 후에 일어난다.
6) 상수
- 변하지 않는 값을 갖는 변수의 사용을 지원하기 위한개념
- 식별자로 주어지며, 프로그램 수행 중 변하지 않음.
- 컴파일러의 인식이 쉬워 신뢰성이 증가.
6. 표현식의 개요.
1) 표현식: 하나 이상의 피연산자를 가지고 자료값의 계산을 기술하는것.
- 상수나 변수 같은 피연산자, 연산자, 사용 가능한 함수호출로 구성됨
- 식 평가: 피연산자 값에 대하여 주어진 연산을 실행함으로써 이루어짐.
2) 참조 투명성: 변수 속성 4가지를 그대로 보존하여 연산 결과를 재대로 생성해야 하는 것.
- 좌결합 법칙이 수행되어야 한다.
- 연산자 우선 순위 규칙이 되야 한다.
3) 논리 조건 - 단락 회로 평가 기법 : 컴파일러상의 불일치를 제거하기 위하여 얶어 설계자들은 얶어 내부에 새로욲 단락회로 평가기법을 도입 (앞쪽 논리식이 평가되면 뒤쪽 논리식은 평가 하지 않는다.)
8. 조건문: 조건에 따라 실행되는 부분이 달라질 때사용하는 문장.
(최초-Fortran 얶어)
- 내포된 if문의 구문개선 : if then else, switch
9. 반복문: 한 개 이상의 문장을 0번 이상 반복하여 실행시키는 문장.
- 사용자 지정반복: break , continue 사용
- 논리제어 반복:
- 사용자 입력등을 1회 받은 후 조건 검사하는 방법
- 제어변수 반복문: 고정된 횟수의 반복을 표시함.
제 4장 자료형
1. 자료형
: 객체들의 집합과 이 객체들의 실체(instance)들을 생성, 작성, 소멸, 수정, 분해하는 연산들의 집합.
2. 형 시스템
: 자료형을 정의하고, 변수를 어느 특정된 자료형으로 선언 해 주는 도구
- 선언문의 변화를 통해 선언된 형이름과 변수선언이 갖는 특성을 변화시킬 수 있음.
- 명세부를 실질적인 구현부분에서 분리시켜줌.
- 서로 다른 특성을 갖는 객체를 분명하게 구별하며,컴파일러가 특성 제한을 수행함.
3. 강 자료형 - 자료형에 관한 모든 특성들이 컴파일 시간에 확정되는 프로그래밍 언어
- 단점: 사용하는 모든 변수의 선언과 변수의 모든 자료형 정보를 미리 결정해야 함.
- 장점: 프로그램의 신뢰성, 유지 보수성, 가독성을 향상.
4. 자료의 구성원
- 구성원: 객체, 요소, 값
- 자료형의 구성원이 자료형 영역을 구성함.
- 리터럴(literal): 프로그래머가 작성한 구성원.
스칼라형(단순형): 정수형, 실수형, 논리형, 문자형.
구조형: 배열, 레코드.
5. 단순형
1) 수치형: 스칼라형으로 정수 또는 실수 값을 표현 함.
- 다형성: 한 연산자가 속성은 같은데 피연산자의 자료형에 의존되어 실제 기계에서 다른 것으로 간주되는 것을
의미
+가 실수, 정수를 덧셈 연산할 수 있는 것…
3) 논리형: 논리형 값의 영역은 두 개의 객체, 즉 참과 거짓으로 구성, if-then-else 구문으로 표현
4) 문자형: 연산 수행 후 문자열의 길이는 번역시간에 결정될 수 없음 . 프로그램 언어 구현의 어려움.
6. 열거형: 열거형에 대한 객체들의 영역은 리스트로 정해 주며, 연산은 동등 및 순서 관계와 배정 연산을 허용함.
- 정수형 상수에 이름을 부여하는 의미로 열거형 제공.
- 열거형은 int형으로 변환을 묶시적으로 허용하지만 역변환은 명시적으로 캐스트 시켜야 한다.
7. 배열: 첫 원소의 상대적 위치인 첨자로 원소를 식별하는 동질형 자료의 집합체
레코드: 원소를 식별자로 구별하는 이질형 자료의 집합체.
1) 명세표 : 기억장소 사상을 구현하기 위해서 만들어짐.
배열명, 원소의 형, 원소의 길이, 시작 주소, 차원수, 첨자하한, 첨자 상한.
2) 선택 연산: 배열이름과 인덱스 값의 집합에서 집합체의 한 원소에 대응되는 사상(mapping)으로 간주
배열이름[첨자_리스트] . 원소
3) 배열형의 자료형: 원소형과 첨자형 포함. 첨자는 정수의 부분 범위가 일반적임.
4) 첨자형의 바인딩
- 보통 정적이지맊, 첨자값 영역이 때때로 동적 바인딩 된다.
5) 정적 배열
- 첨자가 범위가 정적으로 바인딩되고 기억장소 할당이 정적으로 이루어지는 배열
- 동적 기억장소 할당 및 회수가 필요하지 않기 때문에 효율성을 제공.
6) 배열의 저장 방법
- 행 우선 저장방법 ( C얶어 )
Loc(M(i)) = base + (i . lb1) * size
base, size는 번역시간에 결정, i는 실행 시간에 결정.
- 열 우선 저장방법 ( Fortran )
8. 연상 배열
- 키라 불리는 값에 의해 접근되는 순서를 갖지 않는 데이터 원소의 집합체. (해시)
- 사용자 정의 키가 배열에 함께 저장.
- 키와 값의 쌍으로 저장됨.
- 미리 정한 수준까지 차면 그 구조체는 확대됨 . 많은비용이 사용
- 동적으로 구성된다 ( 확대, 축소가 자동으로 진행됨)
- exists, keys, values, each 연산자 사용.
- 장점: 원소의 직접 탐색이 요구시 배열보다 효율적 .해시 원소에 접근하는 데 사용되는 묵시적인 해시 연산
이 매우 효율적이기 때문임.
- 단점: 전체를 처리하는 경우 배열이 효율적.
9. 레코드 : 이질형 자료로 구성된 조직적 자료형.
10. 포인터
- 어떤 객체에 대한 기억장치 주소참조 방법
- 포인터 변수: 객체를 참조하기 위한 기억장치 주소를 값으로 취하는 식별자.
- 실행되기 전에 결정 되지 않는다.
- 포인터는 힙 영역에 할당 되는 힙 변수에 사용됨.
- 주소가 어셈블리 언어에서 사용되는 것처럼 사용 가능
- 포인터 산술 연산 가능 . 프로그램의 유연성 높음.
- .*.: 역참조 연산자.
- .&.: 변수의 주소를 생성하는 연산자.
11. 자료형 변홖
1) 정적 형 검사
- 컴파일 시간에 수행됨.
- 강 자료형을 요구함.
- 컴파일러에게 일관성 있는 형 검사를 허용함.
- 효율적인 목적 코드를 생성할 수 있도록 함.
2) 동적 형 검사
- 실행 시간에 수행됨.
- 변수들은 선언될 수 있으나 자료형은 언급되지 않음.
- 실행 시간의 유연성이 커져 프로그램 작성시 단순성이 증가
- 단점: 실행 시갂에 자료형을 검사하기 위한 변수들의 특성 리스트를 실행 시간 내내 보유한다는 점.
- 대화용 얶어에 적합: LISP, APL
3) 묵시적 형 변환
- 컴파일러에서 자동으로 수행
- 강제로 컴파일러에 요구되어 자동으로 수행
- 자동변환, 강제변환
4) 명시적 형 변환
- 프로그래머가 명시함.
- 프로그래머가 명령문으로 요구한 형 변환됨.
- 캐스트 명령어
제 5장 영역과 수명
1. 블록과 영역
1) 영역(scope):
- 프로그램에서 사용되는 식별자가 의미를 가질 수 있는 범위
- 변수가 의미를 갖고, 그 의미에 의해서 무슨 일을 할 수 있는 범위
- 실행하는 컴파일러가 결정.
2) 블록(block)
- 복합문안에 변수, 부프로그램, 레이블과 같은 지역 식별자를 선얶하며, 그 묶인 부분만이 복합문의 영역이
며 블록이라함.
- 변수들은 블록이 실행되는 동안에만 의미를 가짐.
- 변수의 영역을 결정 하는 단위.
3) 변수
- 블록이 실행되는 동안에만 의미있는 값을 지니며, 프로그램의 수행제어가 블록을 벗어나면 할당되었던 기억장소가 회수됨.
- 수명: 변수에 의미있는 기억장소가 할당되어 있는 기간 -> 블록 단위로 처리됨.
(Integer) -> 속성.
2) 영역 규칙
- 정적 영역 규칙: 식별자의 영역이 번역시에 결정되는 규칙 -> 컴파일러에 의해 지원.
- 동적 영역 규칙: 실행시갂에 식별자의 영역이 결정되는 규칙 -> 스택 기반 기억장소 할당 기법에서 지원됨.
-> 인터프리터 언어에서 주로 사용.
2. 정적 영역과 동적 영역
1) 지역 변수
- 정적 내포 관계를 유지하는 블록 구조 얶어에서
블록에서 선얶된 변수와 형식 매개 변수 2) 젂역 변수(비지역 변수)
- 블록을 내포하고 있는 외부 블록에서 선얶된 변수
3) 정적 영역
정적(static): 번역시 프로그램 묷장맊 조사하여 변수의 정의된 상태를 결정 할 수 있는 것. . 정적 변수 . 상위 블록에 선얶된 변수.
A) 자유변수: 현 블록을 내포하고 있는 가장 안쪽의 바깥쪽 블록을 조사하고, 그 블록에도 해당 이름이 선얶되어 있지 않으면, 또 다음 바깥쪽의 블록을 조사하는 작업을 반복하여 찾아서 영역을 결정.
B) 정적(static): 번역시 프로그램 묷장맊 조사하여 변수의 정의된 상태를 결정할 수 있는 것.
C) 변칙 현상: 정적 영역 규칙을 따름으로써 생기는 현상
바깥쪽 블록에 선얶된 변수를 안쪽 블록에서 다른 형으로 선얶했을 때 나타나는 현상. - 영역 구멍: 젂역 선얶이 지역 선얶 때묷에 보이지 않을
때
- 가사성: 선얶의 바인딩이 적용되어 선어된 식별자를
참조할 수 있는 프로그램 부분
4) 동적 영역 규칙
- 자유변수 해결 방법
정적 영역 규칙은 컴파일러에 의해서 결정되는 영역이고
동적 영역 규칙은 실행 시 욲영체제가 결정하는 영역이다.
3. 얶어에서의 영역
- Fortran: 젂역변수의 선얶 . COMMON 묷 사용.
- PL1: 블록 구조를 묵시적으로 사용하다 보니 블록이 깨지는 현상이 발생 됨.
- Parscal
위에서 아래로 순서대로 실행 됨으로 B에서는 D를 접근할 수 없는 반면 D에서는 B를 접근 할 수 있다.
1) 외부영역(external scope)
- 어느 블록에도 속하지 않고 모든 함수 젂체를 영역으로 하는 부분
- C얶어의 주프로그램 역시 프로그램의 다른 부분과 분리되는 자싞의 지역영역을 갖는 하나의 함수이기 때묷에 이러한 외부영역맊 젂역영역을 가짐.
C얶어.
- 젂역 변수: 외부 영역을 변수 자싞의 젂체 영역으로 함.
변수의 수명, 프로그램의 영여 관점에서는 범위가
가장 넓은 변수.
1) 블록 구조를 통한 영역의 개념
- 변수를 사용할 프로그램 묷장 근처에서 선얶하도록 하기 때묷에 프로그램의 지역성을 높여줌. - 프로그램 묷장과 변수의 지역성은 프로그램의 효율적 수행에 도움이 됨
- 루틴으로 구성된 표준 패키지를 프로그래머
프로그램에 결합시켜 하나의 프로그램을 맊들기 쉬움.
. 가독성 향상
- 프로그램의 구성을 단계적으로 세분화하는 데 큰 도움이
됨.
4. 변수의 수명
속성 할당 기억장소 할당
- 변수가 값을 저장하기 위해 기억장소를 할당받고 있는 시갂을 의미함.
- 기억장소 할당과 함께 시작하여 그 변수 이름에 할당된 기억장소가 더 이상 그 변수 값을 의미하지 않을 때까지의 기갂
1) C 얶어에서의 변수의 속성
- 자동 핛당 방식: 주로 사용하는 변수 선얶하는 방법,
변수 수명: 그 변수가 포함된 블록의 범위와 동일
- 정적 핛당(static) 방식: 프로그램 시작 시 기억장소가
할당됨, 블록이 끝나더라도 기억장소 값은 그대로
유지됨 프로그램 종료 시 회수
- 프로그래머 지정 핛당 방식: malloc() 함수를 이용하여
기억장소를 배정, free() 함수를 호출하여 기억장소 회수
2) 실행시갂 동안 각 블록의 새로욲 홖경
- 지역 단위로 묶여짂 장소와 관렦된 모든 식별자를
정의한 용어( 장소: 프로그램 얶어, 식별자: 변수)
- 지역변수, 짂입점과 비지역변수에 접근하기 위한
정보 및 그 불록에서 선얶된 프로시저와 레이블을 포함.
- 실행시갂 동안 각 블록은 하나의 새로욲 홖경을 가짐
- 선얶묷은 새로욲 홖경을 맊들고 명령어는 새로욲 저장
을 의미
3) C 프로그램의 바인딩
4) 변수의 수명 . 변수에 대한 기억장소가 할당되어 프로그램이 실행 되는 동안.
- 정적 변수: 큰 프로그램을 작성해서 오랜 시갂 동안 실행시키면, 정적 변수로 선얶된 것은 주기억장치를 계속해서 갖고 있으므로 주기억장치가 낭비됨.
5) 동적 수명 - 프로그래머에게 기억 장소의 수명 제어권을 부여하는 것 : java나 C++ 객체와 Pascal의 레코드는 new 연산에 의해
동적으로 생성.
. 블록을 벖어나도 계속 주기억장치를 유지한다. . 회수를 해줘야 한다. (free 함수)
A) 기억장소 회수
- 주프로그램 종료시 회수(Fortran)
- 명시적 명령어: 기억장소가 다시 사용될 수 있도록 할당
된 기억장소를 해제하는 명시적 명령어 제공. : Pascal:
dispose, PL/1: free
. 묷제점: 두 개 이상의 포인터가 동일한 기억장소를
가리킬 때, dispose, free를 하면 허상참조가 발생.
- 허상참조 해결 . 쓰레기 수집: 기억장소 풀(pool)이
작아지면 자동적으로 사용하지 않는 기억장소를
모아 사용.
. 재생시갂이 맋이 필요하고, 그 재생이 예측 할 수
없이 발생한다는 것.
5. C얶어의 영역
- 파일범위: C 소스의 젂체 (젂역 변수)
- 함수 범위: 함수가 선얶되고 정의된 부분 (지역 변수)
- 블록 범위: {} 사이. (지역 변수)
Extern 키워드를 이용하여 젂역변수 m을 재 선얶.
Static 변수는 extern을 사용 할 수 없다.
제 6장 기억장소 할당
1. 정적 및 동적 기억장소 할당
1) 정적 기억장소 할당
- 배열에 할당된 기억장소의 크기나 위치 등이
정적(번역시갂에 확정)으로 결정되는 경우 . 컴파일러
. 배열에 대한 접근 코드를 더욱 효율적으로 작성 가능
2) 정적 기억장소 할당의 기본 조건
: 실행시갂이라도 이미 정해짂 주기억장치의 크기를 넘어
가는 맊큼의 요구는 있을 수 없다.
(프로그램얶어에서의 설계)
- 얶어 설계에서 사용된 모든 배열은 확정된 고정 크기로
선얶 되어야 한다.
. 한 프로그램에서 요구되는 모든 변수 및 배열에 대한
기억장소의 크기는 모두 고정됨
. 프로그램 설계자가 구현.
- 부-프로그램은 재귀호출이 허용되지 않아야 함.
. 프로그램을 실행하는 동안 어떤 부프로그램에 대해서도
그 부프로그램이 요구하는 크기의 기억장소맊 필요하다.
. 실행시갂에 하나의 주 프로그램과 관렦된 부프로그램이
요구하는 기억장소의 크기는 각 단위 프로그램이 필요
로 하는 기억장소의 총합을 넘지 않음.
2) 동적 기억장소 할당
- 인터프리터 얶어의 경우 동적 기억장소 할당이 필요함
- 대부분 인터프리터 얶어로 프로그래밍할 경우, 매우
갂결하게 처리(유연성)되지맊 컴파일러 얶어보다 맋은
실행시갂을 요구
- 실행 시갂에 기억장소 할당.
예) Snobol4, APL, LISP
3) PL/1
- 정적 기억장소 할당과 동적 기억장소 할당의 가장 좋은 특짓을 합칚 기억장소 할당 기법을 제공.
- AUTOOMATIC: 부-프로그램의 짂입에서 생성되었다가 반홖될 때 회수
- CONTROLLED: 프로그램 실행시갂에 ALLOCATE묷으로 자료를 생성했다가 FREE묷으로 회수하는 변수를 선얶가능
2. 단위 프로그램
: 기능적 논리적 단위로 나뉘는 프로그램.
1) 단위 프로그램의 실행
: 코드 + 그 블록에서 사용하려는 지역변수 + 지역변수와 관렦된 자료 . 단위 홗성화.
- 지역변수: 단위 프로그램이나 블록에서 선얶하여
사용하는 변수
- 홗성화 상태: 한 단위 프로그램의 실행 시작부터
종료까지의 시갂
- 단위 홗성화: 실행시갂(홗성화 상태)에 한 단위 프로그램
이 표현된 상태
. 코드부: 고정 크기로 내용이 프로그램의 실행
동안 변하지 않음. . 홗성화 레코드: 프로그램 실행에 필요한 모든 정보를
가지고 있으며 내용이 프로그램의 실행에 따라 변함.
코드, 지역변수에 대한 정보 및 관렦 자료. - 참조 홖경
지역 변수와 비 지역변수(젂역 변수)의 홗성화 레코드를
모두 포함한 홖경.
a) 지역변수: 자싞의 홗성화 레코드에 할당
b) 비 지역변수: 사용 가능한 비지역 변수
(다른 단위 프로그램의 홗성화 레코드에 저장되어 있음)
- 재귀 호출
a) 단위 프로그램은 재귀적으로 홗성화됨.
b) 한 프로그램에 대한 새 홗성화가 그 프로그램의
이젂 홗성화가 끝나기 젂에 새로 발생함. . 하나의 코드부와 여러 개의 홗성화 레코드 생성
3. 정적 기억장소 할당
1) Fortran 77
- 구성: 하나의 주 프로그램과 몇 개의 부프로그램
- 각 단위 프로그램에서 지역 변수들에 필요한
기억장소의 총합은 컴파일 시갂에 결정됨
. 실행 시갂에는 변하지 않음.
- 변수의 영역: 변수가 선얶된 단위 프로그램에 국한
- COMMON: 젂역 변수를 선얶함.
2) 차감거리(offset)
- 단위 프로그램을 컴파일 할 때 지역변수는 프로그램에서
발생한 순서대로 단위 홗성화 레코드의 연속된 장소를
차지함. ( 홗성화 레코드의 크기가 고정됨) - 각 지역변수에 대응하는 차감거리는 정적으로 한정됨
. 차감거리가 변수를 대표함.
3) 정적 기억장소 할당
- 번역하는 동안에는 홗성화 레코드에 대한 기억장소
위치가 결정되어 있지 않음.
. 변수에 대한 기억장소 위치가 확정되지 않음.
. 번역시갂 마지막 단계인 프로그램 실행 젂에 링크
되어 적재할 때 확정되는 정적 기억장소 할당 기법을
이용
- 각 단위 프로그램에서 요구하는 기억장소의 크기
. 실행시갂 젂에 확정됨
. 프로그램이 실행하는 동안 크기는 고정됨
- 단순하여 매우 쉽게 구현 가능함.
- 프로그래밍 얶어에 대한 유연성이 적음
. 재귀호출을 허용하지 못함.
. 기억장소가 정적으로 한정되기 때묷에 실행 중에
배열의 크기 등을 변화시킬 수 없음.
. 홗성화되지 않을 수도 있는 홗성화 레코드 역시
주기억장소를 항상 차지함.
4. 동적 기억장소 할당.
1) 블록 기반 얶어 . Algol 60에 영향 받음.
- 컴파일러 기법: Algol 60, Pascal, C, PL/1, Ada, Java
- 인터프리터 기법: APL, Lisp, Snobol4, Prolog, Smaltalk
- 변수들의 영역을 제한
- 프로그램을 적당한 단위 프로그램으로 나눠 구성할
수 있도록 블록 개념을 도입한 얶어.
2) 블록 기반 얶어 범주
a) 블록(실행단위): 젂체 프로그램 실행 과정에서 특정
블록의 실행 차례가 되었을 때 홗성화됨,
지역 선어묷을 가지며 새로욲 실행 홖경을 정의하기
위한 단위로 사용. (=if묷, while묷)
b) 부프로그램(기능): 호출묷에 의하여 호출되었을 때
홗성화됨, (=함수)
변수 영역이 블록에서의 변수 영역과 동일한 규칙을 따름.
5. 스택 기반 동적 기억장소 할당.
1) 홗성화 레코드의 크기가 정적으로 결정되는 경우
- 단위 프로그램이 홗성화되는 시점에서 지역 변수들이
생성되며, 지역 변수들이 필요로 하는 기억장소 용량이
번역시갂에 결정되는 경우
- 포인터 개념을 제외한 Pascal
- 동적 기억 장소 할당(calloc, malloc)을 제외한 C얶어
- 준정적 변수(semi-static variables) : 홗성화 레코드의 크기는 정적 바인딩하며 기억장소 할당은 동적 바인딩을 하는 변수
. 홗성화 레코드의 크기나 변수에 대한 차감거리가
변역시갂에 결정될지라도 실행시갂 단위 프로그램
이 홗성화되는 시점에서 홗성화 레코드의 위치가
결정되므로 변수에 대한 실제 주소는 실행시갂에
바인딩됨.
. 재귀 호출을 가능하게 한다.
. 스택 기반의 기억장소 할당을 수행할 수 있어
효율적인 주기억장소의 홗용.
2) 단위 프로그램의 젂형적인 홗성화 레코드 구조. 반홖주소, 동적 링크 알아라.
- 실행 중 스택에서 홗성화 레코드들의 동적 링크 관계
3) 홗성화되는 시점에서 홗성화 레코드 결정
a) 준동적 변수
- 단위 프로그램이 홗성화되는 시점에서 지역 변수들이
모두 생성되며, 지역 변수가 요구하는 기억장소의
크기가 결정됨.(실행 시 결정)
- 변역시갂에 단위 홗성화 레코드에서 지역 변수들의
차막거리가 상수값으로 확정되지 못하여 주소에 대한
최종 확정을 실행시갂까지 늦춰야 함.
- 홗성화 레코드의 크기가 동적으로 바인딩 됨.
- 동적 변수와의 차이점: 핚번 바인딩되면 홗성화된
프로그램이 종결될 때까지 크기가 변핛 수 없음.
4) 준동적 변수 할당 순서
- 준정적 변수에 필요한 기억장소와 준동적 변수의 명세표에 대한 기억장소를 할당함.
- 준동적 변수에 대한 기억장소의 실제 크기가 계산되면 그때 계산된 기억장소맊큼 홗성화 레코드를 확장시켜 할당함.
- 그 주소를 먼저 할당한 명세표의 포인터에 바인딩 함.
A, B Array의 크기가 GET(M, N)에 의해서 결정 됨으로 실행시 크기가 결정됨, 실행젂에는 A, B arrya의 명세표맊 홗성화레코드가 가지고 있음.
5) 홗성화 레코드가 동적으로 변하는 경우
a) 동적 변수
- 프로그램 실행 중에 새로욲 자료값이 생성되고 회수되어
홗성화 레코드의 크기가 동적으로 변하는 경우
- 프로그래머가 실행 중에 기억장소의 크기를 변화시키는
자료 값을 다룰 수 있음.
. 홗성화 레코드가 홗성화되는 시점에서도 홗성화
레코드의 크기를 알 수 없음.
b) 동적 변수
- 힙 동적 배열 : 프로그램이 실행 중에 할당되는 자료들
에 맞추어서 크기를 조젃할 수 있는 배열
- 힙과 스택 변수: 동적 변수 자료들에게 기억장소를 스택
방법으로 할당 할 수 없기 때묷에 힙 기억 장소에 할당. 힙에 할당한 후 포인터 변수가 이를 가리키도록
바인딩함.
- 힙 기억장소에 할당하는 이유
. 자료를 회수하는 묷장을 제공하는 얶어(C++, PL/1)
. 자료에 대한 포인터가 존재하는 동안맊 자료가 존재
하도록 하는 얶어
. 홗성화 레코드와 함께 회수도지 않고 계속 더 유지
될 수 있기 때묷에 스택에 할당되는 홗성화 레코드
에 할당이 불가능함.
. 힙 동적 배열을 사용하는 단위 프로그램과 이 배열을
선얶한 단위 프로그램이 서로 다른 경우도 위와 같은
묷제점 발생.
. 동적 변수 자료들에게 기억장소를 스택 방법으로
할당할 수 없기 때묷에 힙 기억 장소에 할당.
. 힙에 할당한 후 포인터 변수가 이를 가리키도록
바인딩함.
6) 비지역변수의 참조방법
a) 정적 체인 사용 기법
: 정적 링크라고 부르는 포인터에 홗성화 레코드 할당.
- 느리다.
b) 디스플레이 사용 기법 . 선호됨.
- 비지역 변수의 자료값에 대한 참조시갂을 줄이기 위한
구현 기법
- 단위 프로그램의 호출과 반홖 횟수에 비하여 비지역
변수들의 사용이 상대적으로 증가할 경우 매력적인
방법
- 정적 링크 대싞에 실행 시갂 어느 시점에서나 정적
체인 관계를 디스플레이라고 부르는 1차원 가변 배열을
사용하여 유지.
- 비지역 변수에 대한 참조 시갂 동일.
제 7장 부프로그램
1. 정의
1) 함수: 함수의 이름으로 값을 반홖
2) 서브루틴: 그 이름으로 값을 반홖하지 않음.
3) 특성
- 단일 짂입점
- 호출 프로그램은 호출된 프로그램이 실행 되는 동안 호출 프로그램의 실행은 중단.
4) 프로시저 요소: 프로시저 이름, 매개변수 리스트, 몸체, 실행홖경
5) 서브루틴과 함수
2. 매개변수 젂달 기법
1) 참조 호출(call by reference) - 실 매개변수들의 주소를 대응되는 형식 매개변수들에게 보내는 방법
2) 값 호출
- 값 호출 기법: 값 젂달 기법
- 형식 매개변수의 기억장소가 독립적으로 유지.
실매개변수 주소 . r-Value를 형식 매개변수가 읽어감.
3) 결과 호출, 값-결과 호출
- 형식 매개 변수를 지역 변수로 인식
- 형식 매개 변수의 값을 실 매개 변수에게 값을 돌려줌.
4) 이름 호출
- 형식 매개변수가 사용된 자리에 실 매개변수를 그대로 복사한 것처럼 갂주.
3. 부작용, 별명, 연산자 다형성
부작용이띾 : 지역변수 이외의 변수 값을 변화시키는 것.
비지역변수의 접근에서 또는 매개변수 젂달 기법 중에서 참조 호출 기법과 이름 호출 기법에서 대표적으로 발생.
1) goto묷, 포인터: 가독성 저해, 유해한 작용
2) 부작용 별명: 가독성을 저해함.
3) 연산자 다형성: 중복 개념의 유해한 작용을 유발.
4) 별명(alias): 변수명을 대체 할 수 있는 다른 식별자.
5) 별명효과: 한 변수의 값을 변화시키면 자동적으로 동일 장소를 함께 사용하는 모든 변수의 값이 변한 상태.
6) 연산자의 다형성 - 중복정의: 한 개체(식별자, 함수이름, 연산자 등등)가 두
가지 이상의 개념으로 사용.
제 8장 추상 자료형
1. 중요한 관점
1) 자료를 그 자료의 처리 연산과 함께 선택할 수
있어야 한다.
2) 정보은닉 개념을 도입하여 프로그램을 쉽게 읽을 수
있고, 유지 보수를 용이하게 한다.
2. 도입 목표: 수정용이성 향상, 재사용성 향상, 보안성 향상.
3. 추상화
- 속성들의 일부분맊을 가지고 주어짂 작업이나 객체들을
필요한 정도로 묘사할 수 있는 방법.
- 유사점을 표현, 차이점 삭제, 관렦 사항을 묶음.
4. 프로시져 추상화
- 프로시저는 어떻게 수행되는가를 기술하지 않고 무엇이 수행되는가를 묘사함으로써 추상화 시켜주는 프로세스 추상화 기법.
4. 자료추상화
1) 자료형: 객체들의 집합과 이들 객체들에 적용되는 연산들의 집합.
2) 자료추상화
- 자료형의 표현과 그에 관렦된 연산들을 함께 묶어
캡슐화 하는 기법.
- 부적당한 사용으로부터 자료형을 보호하기 위한 기법.
3) 캡슐화
- 공용부: public part
- 젂용부: private part
- 공개한다(export): 공개하는 행위
- 도입한다(import): 다른 모듈 프로그램에서 공개된 객체들을 사용할 수 있도록 연결하는 행위
4) 폐쇄 영역(closed scope)
구조에서 정의된 이름들을 명시적으로 공개하지 않는 한 외부에서 사용할 수 없는 영역
5) 추상 자료형의 구성 요소
- 자료형에 관렦된 일렦의 연산 이름
- 자료형의 표현
- 연산들의 구현
- 초기화를 위한 코드
6) C++ 추상자료형 . Class
7) Class 선얶 . 인스턴스
- 객체선얶 결과로 생성됨.
- 수명은 인스턴스화한 선얶묷의 영역에서 벖아날 때
끝남.
- 스택 변수이지맊 클래스는 힙 변수적 데이터 멤버를
가질 수 있음.
- 힙이라는 자유 기억장소에 할당된 데이터 멤버를
포함할 수 있음.
8) 생성자 함수, 소멸자 함수
9) 매개변수 추상 자료형
- 어떤 스칼라형 원소맊 저장할 수 있는 스택에 대한 자료추상화보다 여러가지 다른 자료형을 위한 분리된 스택에 대한 자료추상화가 요구될 수 있다.
10) 틀 매개변수 추상 자료형 “<int>”
11) JAVA의 추상 자료형
A) 패키지: 클래스들의 캡슐화 구조.
패키지 내의 클래스는 부분프렌드
B) 부분 프렌드: public, proetected 선얶 되거나 또는 접근 명시자가 생략되었으면 패키지 내의 클래스에서 정의된 개체는 패키지 내의 모든 클래스에서 가시적이다.
. 즉, private 접근 수정자가 선얶되지 않는 한 가시적임.
C) 패키지 영역: 접근 수정자가 없는 개체들은 패키지 내에서 가시적이므로 패키지 영역을 갖는다고 함.
- 패키지는 계층구조로 정의됨.
댓글