제 4 장 변수, 영역, 수명 변수 바인딩 영역 기억장소 할당과 수명 변수와 그 환경 변수 초기화 상수와 변수.

Slides:



Advertisements
Similar presentations
Copyright © 2015 Pearson Education, Inc. 6 장 : 프로그래밍 언어.
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Copyright © 2006 The McGraw-Hill Companies, Inc. 프로그래밍 언어론 2nd edition Tucker and Noonan 5 장 타입 “ 타입은 컴퓨터 프로그래밍의 효소이다 ; 프로그래밍은 타입을 통해 소화할만한 것이 된다.” 로빈.
프로젝트 구성. 프로젝트 델파이 프로그램의 기본 단위 즉, 델파이로 만드는 프로그램을 구성하 는 모든 파일들의 집합 구성파일 확인 –View 메뉴 -> Project Manager 메뉴 – 프로젝트 파일 (DPR 확장자 ) – 폼 관련 파일 (FRM 확장자 ) – 소스.
Chapter 7 서브프로그램. Introduction 서브 프로그램의 명시 형식 인자전달 방법 ▫ Call by value ▫ Call by value result ▫ Call by reference ▫ Call by name 구현 방법 2.
8장 프로그래밍 언어 8.1 프로그램이란? 8.2 프로그램 언어의 역사 8.3 프로그램 설계 절차
Vision System Lab, Sang-Hun Han
제 3 장 변수와 자료형.
제 1장 C 언어의 소개.
제 3장 프로그래밍 언어 설계 3.1 설계 기준의 역사적 변천 3.2 효율성 3.3 일반성, 직교성, 획일성
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
제 4장 프로그래밍 언어의 구문과 구현 기법 4.1 언어 구문 4.2 프로그래밍 언어 구현 기법.
제 7 장 문장 구조화 제어문 지정문 조건문 반복문 GOTO 문 비결정적문.
C 프로그래밍.
데이터 구조 - 소개 순천향대학교 컴퓨터공학과 하 상 호.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
10장 예외 처리 프로그래밍 언어론 10.6 Pascal과 C의 에러 처리 10.1 설계 주제 10.2 PL/I의 예외 처리
제 6 장 데이터 타입 6.1 데이터 타입 및 타입 정보 6.2 타입의 용도 6.3 타입 구성자 6.4 사례 연구
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
제7장 제어구조 I – 식과 문장.
10장 객체-지향 프로그래밍 II ©창병모.
바인딩, 메모리 관리 SANGJI University Kwangman Ko
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
프로그래밍언어론 2nd edition Tucker and Noonan
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
Part 08 함수 ©우균, 창병모 이 슬라이드는 부산대학교 우균이 작성하였습니다. 오류나 수정할 사항 있으면 연락 주세요.
Chapter 6 – 변수, 바인딩, 식 및 제어문 Outline 6.1 변수 6.2 바인딩 6.3 선언 6.4 배정문
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
Chapter 9 – 부 프로그램 Outline 9.1 개요 9.2 매개변수 평가와 전달기법 9.3 형식 매개변수 명세
Ch2-2. VHDL Basic VHDL lexical element VHDL description
장. 문법 구조(Syntax) 컴퓨터공학과 권기태 프로그래밍언어론.
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
프로그래밍 서울대학교 통계학과 2009년 2학기 컴퓨터의 개념 및 실습 (
DataScience Lab. 박사과정 김희찬 (월)
제 2 장 변수와 상수.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
adopted from KNK C Programming : A Modern Approach
Chapter 2 Lexical Elements, Operators, and the C System
제 10장 부 프로그램 10.1 개요 10.2 매개 변수 평가와 전달 기법 10.3 형식 매개 변수 명세
6장 데이터 타입(2) 순천향대학교 컴퓨터공학부 하 상 호.
프로그래밍 보고서 작성법 순천향대학교 컴퓨터공학과 하 상 호.
자전거를 배우려면 안장에 올라가 페달을 밟아라.
운영체제 (Operating Systems) (Memory Management Strategies)
Java의 정석 제 2 장 변수(Variable) Java 정석 남궁성 강의
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
6장 데이터 타입(2) 순천향대학교 컴퓨터공학부 하 상 호.
함수와 변수 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
[CPA340] Algorithms and Practice Youn-Hee Han
프로그래밍 원리 Chapter 04 자료 처리와 연산자 신한대학교 IT융합공학부 박 호 균.
Signature, Strong Typing
6장 데이터 타입(3) 순천향대학교 컴퓨터공학부 하 상 호.
프로그래밍언어론 2nd edition Tucker and Noonan
제 5장 변수, 바인딩, 식 및 제어문 5.1 변수 5.6 표현식 5.2 바인딩 5.7 조건문 5.3 선언 5.8 반복문
제 1 장. 자료구조와 알고리즘.
Chapter 4 변수 및 바인딩.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
9장 부프로그램(2) 순천향대학교 컴퓨터공학부 하 상 호.
Signature, Strong Typing
Signature, Strong Typing
자바 5.0 프로그래밍.
Signature, Strong Typing
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
Signature, Strong Typing
Signature, Strong Typing
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 02. C언어 기반의 C++ 2.
배열, 포인터, 함수 Review & 과제 1, 2.
제 8장 영역과 수명 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 주요 언어에서의 영역 8.4 변수의 수명
Presentation transcript:

제 4 장 변수, 영역, 수명 변수 바인딩 영역 기억장소 할당과 수명 변수와 그 환경 변수 초기화 상수와 변수

<D.W.Barron의 변수 선언> 4.1 변수(Variables) 4.1 변수(Variables) 정의 이름, 형 속성, 주소(참조), 값(value), 영역, 수명의 6요소로 구성 이름 속성들 값 주소(참조) <D.W.Barron의 변수 선언> 식별자(identifier) : 제한된 길이의 영문자/숫자로 구성된 변수의 한 요소(component)

변수(Variables)(2) 주소: 변수와 관련된 첫 번째 메모리 셀 변수의 이름: 변수를 참조하기 위해 사용하는 일련의 문자들 주소: 변수와 관련된 첫 번째 메모리 셀 영역: 변수의 이름이 이해되고 참조될 수 있는 프로그램의 부분 수명: 실행 시간에 그 이름에 관련된 값을 보유할 기억 장소가 배정되어 있는 시간 형: 변수에 할당될 수 있는 가능한 값

변수(Variables)(3) x 정수 예) var X: integer; X :=2의 의미 - ① 이름:X - ② 속성 : 정수 - ③ 주소 : 값이 저장된 위치 - ④ 값 : 2 x 정수 2 주소 이름 속성

별명(aliasing) Alias : 동일한 기억 장소를 함께 사용하고 있는 다른 이름 변수 하나의 값 변화-> 동일장소 사용하는 다른 변수의 값 변화 -> 별명의 효과(aliasing effect) 초기 언어 : 효율적 기억 장소 사용을 위해 별명 허용 예 : Fortran의 EQUIVALENCE, Pascal의 가변 레코드, C의 union 별명(aliasing) type intptr = ^integer; var x, y: intptr; begin new(x); x^ := 10; y := x; y^ := 20; writeln(x^); end;

4.2 바인딩 시간 바인딩(binding) 개념 바인딩이란 ? - 이름에 어떤 속성을 관련시키는 일련의 작업 즉, 프로그램의 기본 단위에 이 단위가 택할 수 있는 여러 속성 중에서 일부를 선정하여 결정하는 작업 바인딩 예 - constant num = 5 ; 이름 num에는 두개의 속성인 상수와 값 5가 바인딩 - int x = 100 ; 이름 x에 변수와 정수라는 두개의 속성이 바인딩 - x = 2 ; 변수 x에 새로운 속성으로 값 2가 바인딩

바인딩 시간 (2) 바인딩 시간의 종류 바인딩 시간 - 바인딩이 발생되는 시간 - 바인딩 시간의 종류 : 언어정의시간, 언어 구현시간, 번역시간, 실행 시간 빠른 바인딩 늦은 바인딩 바인딩 시간의 종류 (1) 실행 시간 - 프로그램 실행 시간에 발생되는 바인딩 동적 바인딩(dynamic binding) 예) 변수값 배정, 변수와 자료 구조에 기억 장소 할당 등 ① 서브 프로그램이나 블록 실행 시작 시간에 발생하는 바인딩 예) 형식 매개 변수와 실매개 변수간의 바인딩 지역 변수에 대한 기억 장소 할당 ② 프로그램 실행시 사용 시점에서 수시로 발생하는 바인딩 예) 지정문으로 값을 변수에 저장하는 바인딩

바인딩 시간 (3) 바인딩 시간의 종류 (계속) (2) 컴파일 시간 - 언어를 번역하는 시점에서 발생되는 바인딩 정적 바인딩(static binding) (번역시간 - 컴파일 시간, 링크 시간, 로드 시간) 예) 변수의 형, 자료 구조의 형과 크기, 레코드 항목들의 형을 확정 (3) 언어의 구현 시간 -언어 정의시 원소들에 특성을 한정하지 않고, 언어를 컴퓨터 상에서 구현할 때 특성의 일부를 확정하는 바인딩 - 예) 정수의 자리수, 실수의 유효숫자 개수, 수의 하드웨어에서의 표현법

바인딩 시간(4) 바인딩 시간의 종류 (계속) (4) 언어 설계 시간(언어 정의 시간) - 언어를 정의할 때 확정되는 바인딩 - 예) 언어 구문 정의(반복문, 허용되는 자료 구조, 연산 종류 등) 혼합형 연산(덧셈, 곱셈)에서 두 피연산자의 형 결정에 관한 사항 지정문 Y := X + 10 에서 발생되는 바인딩과 시간 변수 x : 현재값(실행 시간), 자료형(컴파일 시간), 자료형의 종류(언어 설계 시간) 상수 10 : 표현 방법(언어 구현 시간)과 의미(언어 설계 시간), 적재(컴파일 시간) 연산자 + : 성질과 의미(언어 설계 시간), 덧셈의 종류(실수 or 정수: 컴파일 시간) 지정문 := : 성질과 의미(언어 설계 시간) 평가 순서 : 언어 설계 시간 (or 언어 구현 시간) 지정문 x := y;의 바인딩 시간과 수행되는 작업은? (p. 108)

바인딩 시간(5) 바인딩 시간의 중요성 언어들 간의 중요하고, 미묘한 차이점은 바인딩 시간의 차이에서 발생 예) - 큰 배열에 많은 연산이 포함된 문제는 Fortran이 적당 실행시간에 적은 부분만이 바인딩 (실행시간 효율성) - 배열의 크기나 자료형이 실행시 변화되는 자료형의 처리는 Snobol4가 적당 실행중 자료가 입력되는 순간에 바인딩 발생(자료 처리의 융통성) 정적(빠른) 바인딩은 효율성이 증가하고 동적(늦은) 바인딩은 융통성이 증가 컴파일러 언어, 명령형 언어: 정적 바인딩(실행 시간 바인딩을 제외한 모든 바인딩) 인터프리터 언어, 함수형 언어: 동적 바인딩 PL/I은 프로그래머가 바인딩 시간 선택 가능

바인딩 시간 (6) 주요 언어에서 식별자의 바인딩 시간 번역 시간 바인딩 (정적 바인딩: static binding) 컴파일 시간 (프로그램 작성 시간 포함) (1) Fortran, Algol, PL/I, Pascal, Cobol 등 컴파일러 언어 : 대부분의 변수형 확정 (2) 상수값의 기계 내부 표현이 확정됨 번역 시간 바인딩 (정적 바인딩: static binding) (1) Fortran:COMMON 문에 주어진 이름의 상대 주소 확정 (2) Fortran, Algol, PL/I 등: 부프로그램 이름에 관한 상대 주소 확정 Linkage edit 시간 (1) Fortran, Cobol: 모든 변수의 기억 장소 할당 (2) PL/I: 정적 변수로 선언된 변수의 기억 장소 할당 (3) Algol, Pascal: 전역(global) 변수의 기억 장소 할당 (4) Fortran: DATA 문에서 정의된 값을 변수에 배정 적재 시간 (load time) (1) 실매개 변수를 형식 매개 변수에 연결 ① by value: 실매개 변수값을 지역 변수에 배정 ② by reference: 실매개 변수를 형식매개 변수로 사용할 수 있도록 주소를 배정 ③ by name: 사용할 때 주소와 해당 값을 계산할 수 있는 thunk 루틴의 주소 확정 (2) Algol, Pascal: 지역 변수에 대한 기억 장소 할당(활성 레코드가 만들어짐) (3) PL/I: AUTOMATIC 변수에 대한 기억 장소 할당 실행 시간 바인딩 (동적 바인딩: dynamic binding) 호출 시간 (또는 모듈 시작 시간) 실행 시간 사용 시점 (reference) (1) PL/I: BASED 변수 기억장소(ALLOCATE 문, FREE 문) (2) APL, Lisp, Snobol4: 변수들의 자료형 배정, 기억 장소 할당 (3) 모든 프로그래밍 언어: 지정문 등에서 변수값을 배정

선언(Declarations) 선언문(Declarations) - 실행시 사용될 자료의 속성을 언어의 번역기에게 알려주는 프로그램 문장 자료의 속성 자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조하기 위한 첨자 등 예 Javal의 선언문 int [ ]x = new int[10] 생성, 소멸 시기 : 블록 시작과 종료 자료형 : 1차원 배열 원소수 : 10 첨자 범위 : 0 ~ 9 원소 자료형 : 정수 배열 이름 : X

선언(Declarations) (2) 번역기 동작(정적 형 검사) 선언문의 목적 (1) 주기억 장치 사용과 접근 방법의 효율성 (변수, 배열, 레코드 등의 효율적인 접근 가능) (2) 주기억 장치 경영의 효율성 (생성과 소멸 시점을 알므로 스택 기반 기억 장소 할당 등을 수행 가능) (3) 정적 형 검사(static type checking) 가능 형 고정 연산(type specific operation) : 하드웨어 제공 혼합형 연산(mixed operation) : 프로그래밍 언어 제공 정적 형 검사로 혼합형 연산을 형 고정 연산으로 변환 효율성 추구 cf> 혼합형 연산의 동적 형 검사 융통성 추구 선언문의 예 float X; int Y; ... X + Y 번역기 동작(정적 형 검사) 1) 혼합형 연산 발견 2) Y를 실수형으로 변환 3) 실수형 덧셈코드 생성

선언 (3) 정적 형 검사 (static type checking) 모든 변수의 자료형 선언 요구 단점 : 자료 생성, 소멸, 내용 변경 방법에 많은 제약 존재 장점 : 실행 시간 효율이 높음 정적 형 검사 언어 : Java, C, Fortran, Algol, Pascal 등 동적 형 검사 (dynamic type checking) 선언문 사용 안함 장점 : 프로그래밍 단순화, 유연성(flexibility) 높음 단점 : 프로그램 실행 시간 지연, 자료 표현상의 효율 저하, 복잡한 기억 장소 경영 기법 요구 동적 형 검사 언어 : Lisp, APL, Snobol 4 Algol, Java - 약간의 효율성을 상실하여 실질적인 큰 융통성(유연성)을 얻는 선언 예) 배열 real array x[m1:n1,m2:n2] 차원수와 자료형 선언 번역시간 : 효율적인 코드 생성 실행시간 : 첨자 범위 결정

4.3 영역(scope) 영역(Scope) 식별자 수명(Extent 또는 Life time) - 변수의 이름이 모두 동일하게 사용되는 프로그램의 부분 - 식별자의 효력을 나타낼 수 있는 영역을 통제하는 방법 즉, 식별자의 사용이 허락되는 프로그램의 범위 식별자 변수, 상수, 레이블, 자료형, 서브프로그램 등의 이름 수명(Extent 또는 Life time) - 프로그램 실행 중에 참조된 변수의 값이 기억장소를 할당 받아 존재하는 시간 - 실행시간에 식별자의 값을 보유할 기억장소가 배정되어 있는 시간 즉, 식별자의 기억장소 할당부터 해제까지의 기간

영역 (2) 식별자 영역 제공의 간결한 방법 ALGOL 60 - 모든 식별자를 전 프로그램에서 사용가능(전역 변수화) 모든 프로그램에서 모든 식별자 공유 문제점 식별자 사용의 복잡화(단위 프로그램내의 식별자 요구) 식별자 혼돈 프로그램 결합시 문제점 발생 ALGOL 60 begin-end 사용 블록 구조(지역 식별자 선언 가능) 1) 블록 입구 - 기억장소 할당 2) 블록 출구 - 기억장소 해제 블록끼리는 nested 또는 disjoint 복합문(compound statement)과 구별 ALGOL60 integer x 1) 컴파일 시간 2) 실행시간 x integer

정적 영역과 동적 영역 정적 영역 규칙(static scope rule) - 식별자의 사용 영역을 블록의 정적 내포관계로 결정(컴파일러 언어) 1) 지역변수 - 현재 블록에서 선언된 변수, 형식매개변수 2) 비지역 변수 - 현재 블록에서 사용되나 바깥 블록에서 선언된 변수 3) 전역 변수 - 모든 블록에서 사용 가능한 변수 참고 1) 자유변수(free variable) - 현재 블록에서 선언되지 않고 사용되는 변수 - 해결책  불허  lexical scope  dynamic scope 참고 2) 영역 구멍(hole-in-scope) - 내포된 블록사이에 동일 지역변수를 선언하면, 바깥 블록의 지역변수는 내부 블록 구간에서 사용할 수 없는 현상

정적 영역과 동적 영역(2) 동적 영역 규칙(dynamic scope rule) - 식별자의 사용 영역을 프로그램의 실행 순서에 의해 결정(인터프리터 언어)

정적 영역과 동적 영역(3) 정적 영역 규칙(Algol) a:begin integer i, j; real x, y; 2 3 4 5 6 7 · · · 9 10 11 12 13 14 15 16 17 18 · · · 19 end a; b:procedure test(integer a, b) begin boolean i; x := i * j + y; end b; c:begin integer x, y; real i, j; end c; d:begin boolean j; call test(x, y); end d; <각 변수 영역 라인 번호> i j integer boolean real 1, 2, 8, 18~19 3~7 9~17 1~8, 18~19 11~15 9~10, 16~17 변수 선언된 자료형 x y integer real 9~17 1~8, 18~19 변수 선언된 자료형

정적 영역과 동적 영역(4) 정적 영역 규칙을 따른 변칙 현상(anomaly): 영역 구멍(hole – in –scope) : a에서 선언된 x처럼 전역 선언이 지역선언 때문에 보이지 않을 때 영역과 선언의 가시성(visibility)에 약간의 차이를 갖는다. 가시성: 프로그램에서 특정 언어 구성자를 참조할 수 있는 부분 C++는 영역 해결 연산자(scope resolution operator) ::에 의해 접근 가능 Ada와 Java는 영역 한정자(scope qualifier) . 에 의해 접근 가능 예) Ada에서 a. x 블록 c에서 a의 x를 볼 수 있다. : 선택에 의한 가시성

정적 영역과 동적 영역 (5) 예제: 영역규칙 적용 예 실행과정 program scope; 1) scope 실행 예제: 영역규칙 적용 예 program scope; var a, b : integer; begin a :=p; q; end scope function p : integer; var a : integer; a :=0; b :=1; p :=2 end p; procedure print; write(a); write(b); writeln(p) end print; procedure q; var b, p : integer; a :=3; b :=4; p :=5; print end q; 실행과정 1) scope 실행 2) 함수 p 호출, 실행 a=0 (지역변수) b=1 (비지역변수, scope) p=2 (함수 이름) => scope의 a에 2 저장 3) 프로시져 q 호출, 실행 a=3 (비지역변수, scope) b=4 (지역변수) p=5 (지역변수) 4) 프로시져 print 호출, 실행 ① 정적 영역 규칙 a : scope, b : scope, p : 함수 p 결과 : 3, 1, 2 ② 동적 영역 규칙 a : scope, b : 함수 q, p : 함수 q 결과 : 3, 4, 5

각 언어에서의 영역 FORTRAN 지역변수 - 서브 프로그램(SUBROUTINE 또는 FUNCTION) 내에 선언된(명시적/묵시적) 변수 전역변수 - COMMON 문으로 선언 예) C THIS IS THE MAIN PROGRAM COMMON /A/ X, Y, Z(10) COMMON GD, IRED, TEMP . . . END X, Y, Z(10)은 A2와 공유 GD, IRED, TEMP는 A1과 공유 SUBROUTINE A1(P, Q) COMMON GD, IRED, TEMP . . . END SUBROUTINE A2(P, Q) COMMON /A/ X, Y, Z(10) . . . END

각 언어에서의 영역(2) PL/I ALGOL 60의 후계자 BEGIN..END 도입(블록 개념) 모든 변수들을 반드시 명시적으로 선언하지 않아도 되는 묵시적 선언가능 -> 변수가 선언되지 않고 사용되면 그 변수가 사용된 프로시져 문에서 묵시적으로 정의된 것으로 간주 문제점 발생 다음의 예: 블록에서 사용되는 대부분의 변수들이 지역 변수로 사용되기를 원했지만, 그와는 반대로 기대하지 않았던 결과를 초래

각 언어에서의 영역(3) PL/1 영역 문제 PEC :PROCEDURE A :BEGIN; ··· B : BEGIN; END PEC; A :BEGIN; ··· B END A; : BEGIN; J = X; ① ··· C D END B; ① J : 프로시져 PEC에서 묵시적 선언 간주 ② J : B, C에서 각각 지역변수로 오해 ③ J의 해석: X라고 생각하나 비지역 변수라서 X가 아닌 Y 값을 가짐 묵시적 선언 => 변수 선언의 혼동 초래 : BEGIN J = Y; ② ··· END C; :/* 여기서 J를 사용 */ ③

각 언어에서의 영역(4) ALGOL 68 Pascal begin ... end 블록 개념 일반화 영역 블록 - 모든 문맥 시작 기호와 문맥 마침 기호 사이 선언문 블록 입구에서 선언 블록 끝에서 해제 => 영역 : 블록 단위 예) if - fi, then-else, else -fi, begin-end 등 Pascal begin ... end 도입(복합문 개념) - 영역 단위인 블록 아님 선언 - 프로시져, 함수 시작부 => 프로시저/함수가 영역 단위 프로시져 내포 가능 정적 영역 규칙 if then else fi

각 언어에서의 영역(5) 예) Pascal 영역 문제 호출 구조(recursion 가능) 1) A 는 A, B, D 호출가능 2) B 는 A, B, C 호출가능 3) C 는 A, B, C 호출가능 4) D 는 A, B, D 호출가능 * A는 직접 C를, B는 D 호출 불가 변수 영역 - 정적 영역 규칙 예) B에서 선언된 변수 B : 지역변수 C : 비지역 변수 A,D: 알 수 없음 procedure A procedure B procedure C procedure D

각 언어에서의 영역(6) C, C++, Java에서의 영역 A lgol과 같은 블록 개념의 언어 begin-end대신에 중괄호 ( { ,} )를 사용하여 영역을 정의 { int a = 2 ; /* outer block a */ print f ( “%d \n”, a) ; /* 2 is printed */ int a = 5 ; /* inner block a */ printf (“%d\n”, a) ; /* 5 is printed */ } /*back to the outer block */ printf (“%d\n”, ++a) ; /* 3 is printed */ } { int a_outer = 2 ; printf ("%d\n", a_outer) ; int a_inner = 5 ; printf ("%d\n", a_inner) ; } printf("%d\n", ++a_outer) ; 동등하다.

각 언어에서의 영역(7) void p(void) { int a, b, x ; /* 블럭 p */ · · · float x, y, z ; /* 다른 블럭 */ y = 1.5 ; /* 지역 변수 y */ a = 2 ; /* 비지역 변수 a 즉 p의 a */ x = b * z ; /* 지역 변수 x, z, 비지역 변수 b */ } 다른 블럭에서 x, y, z : 지역변수 블록 p에서 a, b : 비지역 변수 p의 x : 영역 구멍 상태

각 언어에서의 영역(8) C에서는 모든 함수 전체를 영역으로 하는 외부 영역 (external scope) 이 존재. 외부 영역만이 전역 영역을 갖는다. int i, j ; float x , y ; /* i, j, x, y는 전역 변수 */ void main (void) { int i, k ; /* i, k는 main 함수에 지역적임 */ float a, b, c ; /* a, b, c는 main 함수에 지역적임 */ · · · }

각 언어에서의 영역(9) C++, Java 블록 구조를 통한 영역의 개념의 장점 변수 선언이 어느 부분에서나 나타날 수 있다. (영역 : 선언문부터 함수 끝까지) For문의 초기화식에 제어 변수가 새로 정의되는 것을 허용 C++의 초기 버전에서 이 변수의 영역은 그 정의 부분부터 그 블록의 끝까지 였지만, 표준 버전에서 그 영역은 Java처럼 for 문으로 제한 블록 구조를 통한 영역의 개념의 장점 ①지역성(locality)을 높여준다. 변수를 사용할 프로그램 근처에 선언 ②운영 체제하에서 작은 working set이 요구된다. 크기가 작은 기억장소 요구 ③표준 패키지를 사용자 프로그램에 결합시켜 하나의 프로그램을 만들기 쉽다. 사용자 프로그램 안에 사용된 어떤 식별자도 표준 패키지에서 사용된 식별자와 충돌 없음 ④프로그램의 구성을 단계적으로 세분화하는데 도움이 된다.

4.4 변수의 수명(Extent) 수명(Extent 또는life time) 변수가 기억장소를 할당받은 기간 X int 기억장소 할당에 관해서는 별도의 복사물(제8장 기억장소 할당) 및 강의 노트(ch04-1.ppt) 참고!!!

변수의 수명(2) FORTRAN ALGOL 60 정적 기억 장소 할당 => 변수 수명 = 프로그램 수명 블록 단위 할당/해제 => 변수 수명 : (블록 시작 ~ 블록 종료) own 변수(static 변수) => 변수 수명 : (주 프로시져 시작 ~ 주 프로시져 종료) 참고) 변수 영역 : (블록 시작 ~ 블록 끝) 초기화는 첫 번째 진입시 한 번(진입 여부 검사 코드를 작성)

변수의 수명(3) 동적 수명 예) 실행 시간에 기억 장소 할당 Pascal - new() ~ dispose() PL/1 - ALLOCATE() ~ FREE() 힙(heap) 기법 이용: 스택의 원리로 처리할 수 없는 객체들을 생성할 수 있도록 사용 가능한 기억 장소들의 집합 스택 사용 힙 사용

4.5 변수와 그 환경 참조 환경(reference environment) 특정 문장에서 가시적인 객체 이름의 모임 Pascal 프로그램과 해당하는 참조 환경의 예 program scopex; 참조 환경 var i, j: integer; ... procedure first(); var a, b: integer; ... scopex의 i, j; first의 a, b procedure inner() var i, a: real; begin ... inner의 i, a; first의 b; scopex의 j end inner ... first의 a, b; scopex의 i, j end first ... scopex의 i, j end scopex

4.6 상수 및 변수 초기화 변수 초기화 상수와 초기화(Constant & Initialization) 정적 변수는 기억 장소의 바인딩과 초기화가 동시에 가능 동적 변수의 초기화는 실행 시간에 이루어짐 Fortran DATA COUNT /0/, AVERAGE /100.0/ Ada AVERAGE: REAL := 0.0; C 정적 변수는 블록 실행시 오직 한 번만 초기화되어 그 값이 유지 자동(동적) 변수는 블록의 매번 호출시 마다 초기화 상수와 초기화(Constant & Initialization) 프로그램이 실행되는 동안 값이 변하지 않는 식별자 상수 개념 제공 : Pascal, Ada, Java, ANSI C, C++

상수 및 변수 초기화(2) 상수 표기법 : 참조 없이 값만을 보유 상수 허용 시 고려사항 ① 단순 자료형 또는 구조 자료형(record, array) ② 상수 값 표현 : 번역 시간이나 실행 시간에 평가되는 수식 가능 여부 ③ 상수 값 배정 시간 (정적: 프로그램 실행 전 한 번 or 동적: 상수가 정의된 블록을 시작할 때마다 매번) ④ 미리 정의된 상수 제공 여부 이름 속성들 값

상수와 변수 초기화 예 Pascal const 사용 숫자, 스트링, 열거형 값 등 허용 (스칼라 형) true, false, maxint 등 내장된 상수 제공 const pi = 3.14159; Algol 68 지정 연산자와 상수 선언 연산자의 구별(:=, =) real root2 := 1.4142135 변수 선언과 초기화 real root2 = 1.4142135 상수 선언

상수와 변수 초기화 예 (2) Ada constant (모든 자료형에 사용 가능) 구조적 자료형의 초기화 X:constant INTEGER :=17; 상수 선언 Y:INTEGER :=17; 변수 선언과 초기화 구조적 자료형의 초기화 type NATURAL is 1 . . N; type ROSTER is array (NATURAL) of INTEGER; LINEUP:ROSTER (1 . . 100); 배열 선언 LINEUP:= ( 1 . . 50 => 1 , 51 . . 100 => -l ); 배열 지정문 LINEUP: ROSTER (1 . . 100) := ( 1 . . 50 => 1 , 51 . . 100 => -l ); 배열 선언과 초기화 LINEUP: constant ROSTER (1 . . 100) := ( 1 . . 50 => 1 , 51 . . 100 => -l ); 상수 선언

상수와 변수 초기화 예 (3) C언어 #define문으로 기호 상수를 선언하였으나, ANSI C 표준에서 상수 선언 도입 예 ) const float pi = 3.1415926 ; 초기값 선언은 배열까지도 가능 예) int a [2][3] = {{1, 2, 3}, {4, 5, 6}} ; int a [2][3] = {1, 2, 3, 4, 5, 6} ; int a [ ][ ] = {{1, 2, 3}, {4, 5, 6}} ; 동일한 선언

상수와 변수 초기화 예 (4) Java 예약어로 const는 확보하였으나, 기억 장소 속성으로 상수를 선언 예) static final float pi = 3.1415926 ; 초기값 선언 (C언어와 비슷) 변수 선언에서 초기값 부여 가능 . 예) int i = 100 ; 배열 선언 객체로 취급하여 생성문 new 사용이 요구 int [ ] ia = new int [3] ; int [ ] ib = { 1, 2, 3 } ; 첫 선언 : 정수 배열 ia선언과 생성만을 의미. 두 번째 선언 : new가 없어도 정수 배열 ib 선언 및 생성과 초기값이 주어진다.