본문 바로가기
카테고리 없음

ㅆㅆ

by boolean 2015. 7. 1.
728x90

제 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) 패키지 영역: 접근 수정자가 없는 개체들은 패키지 내에서 가시적이므로 패키지 영역을 갖는다고 함.

- 패키지는 계층구조로 정의됨.

댓글