360 likes | 627 Views
이름 속성 참조 ( 위치 ). 3.14159. X. 실수. 값. 정적 바인딩 동적 바인딩. < D.W. Barron 의 변수 표기법>. 제 5 장 변수, 바인딩, 식 및 제어문. 변수 ( Variables) 정의 이름 , 속성 ( attribute) 의 집합 , 참조 ( reference), 값 ( value) 의 4요소로 구성 (ISO 정의 ) 실행시간 저장된 값이 변경될 수 있는 객체 (Generally) 식별자 ( identifiers)
E N D
이름 속성 참조(위치) 3.14159 X 실수 값 정적 바인딩 동적 바인딩 <D.W. Barron의 변수 표기법> 제5장변수, 바인딩, 식 및 제어문 • 변수(Variables) • 정의 • 이름, 속성(attribute)의 집합, 참조(reference), 값(value)의 4요소로 구성(ISO 정의) • 실행시간 저장된 값이 변경될 수 있는 객체(Generally) • 식별자(identifiers) • 제한된 길이의 영문자/숫자로 구성된 변수에서 하나의 요소(component)에 해당됨 • 예)X :=3.14159의 의미 • ①이름(식별자) : X • ②속성 : 원주율, 실수 • ③참조(주소) : 값이 저장된 위치 • ④값 : 3.14159 변수의 4가지 요소(Component)
빠른 바인딩 늦은 바인딩 변수, 바인딩, 식 및 제어문 • Binding 개념 • 바인딩 개념 • 기본적인 추상화 메커니즘– 언어 구성자에 이름(name) 또는 식별자를사용하는 것 • 사용된 이름 또는 식별자에 의미를 부여하는 것이 요구됨 • 바인딩이란? • 이름에 어떤 속성을 연결하는 과정. 즉, 프로그램의 기본 단위에 이 단위가 택할 수 있는 여러 속성 중에서 일부를 선정하여 결정하는 행위 • 바인딩 예 • const n = 5 ; 이름 n에는 두개의 속성인 상수와 값 5가 바인딩 • var x : integer ; 이름 x에 변수와 정수라는 두개의 속성이 바인딩 • x := 2 ;변수 x에 새로운 속성으로 값 2가 바인딩 • 바인딩 시간 • 바인딩(속성이 이름에 연결되고 계산되는 과정)이 발생되는 시간 • 바인딩 시간의 종류 • 언어정의시간, 언어 구현시간,번역시간, 실행 시간
변수, 바인딩, 식 및 제어문 언어정의 언어구현(컴파일러작성) 프로그래밍 과정 번역과정 실행과정 • 바인딩 시간의 종류 • 실행 시간 : 프로그램 실행 시간에 발생되는 바인딩(dynamic binding) • 예) 변수 값 배정, 변수와 자료 구조에 기억 장소 할당 등 • ① 모듈 프로그램 실행 시작 시간에 발생하는 바인딩 • 예) 형식 매개 변수와 실 매개 변수간의 바인딩, 지역 변수에 대한 기억 장소 할당 • ② 프로그램 실행 시 사용 시점에서 수시로 발생하는 바인딩 • 예) 배정문에 의해 값을 변수에 저장하는 바인딩 • 번역 시간 : 언어를 번역하는 시점에서 발생되는 바인딩(static binding) • 번역시간컴파일 시간, 링크 시간, 로드 시간 • 예) 변수의 형, 자료 구조의 형과 크기, 레코드 항목들의 형을 확정 • 언어의 구현 시간 : 언어 정의 시 원소들에 특성을 한정하지 않고, 언어를 컴퓨터 상에서 구현할 때 특성의 일부를 확정하는 바인딩 • 예) 정수의 자릿수, 실수의 유효숫자 개수, 수의 기계 내에서의 표기법
변수, 바인딩, 식 및 제어문 언어정의 언어구현(컴파일러작성) 프로그래밍 과정 프로그래밍 과정 번역과정 실행과정 • 바인딩 시간의 종류(계속) • 언어 정의(Design) 시간 : 언어를 정의할 때 확정되는 바인딩 • 예) 언어 구문 정의(반복문, 허용되는 자료 구조, 연산 종류 등) • 혼합형 연산(덧셈, 곱셈)에서 두 피연산자의 형(N, W) 결정에 관한 사항 • 예제 4.1) 배정문 Y := X + 10에서 발생되는 바인딩과 시간 • 변수 x : 현재값(실행) 자료형(코딩,번역), 자료형의 종류(설계) cf) in pascal (번역) • 상수 10 : 표현 방법(구현)과 의미(정의) • 연산자 + : 성질(번역)과 의미(정의) • 배정문 := : 성질(실행)과 의미(정의)
변수, 바인딩, 식 및 제어문 • 바인딩 시간의 중요성 • 언어들 간의 중요하고, 미묘한 차이점은 바인딩 시간의 차이에서 발생 • 예)FORTRAN VS. SNOBOL4 (둘 다수의 배열 허용) • - 큰 배열에 많은 연산이 포함된 문제는 Fortran이 적당 대부분 번역 시간 바인딩, 실행시간에 적은 부분만이 바인딩 (실행시간 효율성) - 배열의 크기나 자료형이 실행 시 변화되는 자료형의 처리는 Snobol4가 적당 실행 중 자료가 입력되는 순간에 바인딩 발생(자료 처리의 적응성) • 빠른 바인딩은 효율성이 증가하고 늦은 바인딩은 적응성(유연성)이 증가 • 바인딩 시간과 언어 구현 • 언어 정의 시 바인딩 시간이 명세화 됨. • 그러나, 반드시 지켜지지 않음( 언어 구현에 따라 늦출 수도 있음) • 따라서, 이미 정의된 언어의 특징들은 가능한 한 빠른 바인딩을 해야 함 • 정의된 언어는 적응성이 확정되었으므로 효율성만 증가시킬 수 있기 때문
주요 언어에서의 식별자 바인딩 시간 컴파일 시간 (프로그램 작성 시간 포함) (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) 호출 시간 (또는 모듈 시작 시간) (1) PL/I: BASED 변수 기억장소(ALLOCATE 문, FREE 문) (2) APL, Lisp, Snobol4: 변수들의 자료형 배정, 기억 장소 할당 (3) 모든 프로그래밍 언어: 배정문 등에서 변수값을 배정 실행 시간 사용 시점 (reference) 변수, 바인딩, 식 및 제어문
변수, 바인딩, 식 및 제어문 • 선언(Declarations) • 바인딩을 구축하는 방법의 하나 • 정의 • 실행 시 사용될 자료의 속성을 언어의 번역기에게 알려 주는 프로그램 문장 • 자료의 속성 • 제한된 자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조하기 위한 첨자 등 • 예 • Algol의 선언문 integer array x[2:10] 생성, 소멸 시기 : 블록 시작과 종료 자료형 : 1차원 배열 원소의 수 : 9 첨자 범위 : 2 ~ 10 원소 자료형 : 정수 배열 이름 : X
변수, 바인딩, 식 및 제어문 • 목적 • 효율적인 주기억 장치 사용과 접근 변수, 배열, 레코드 등에 대한 효율적인 접근 가능 • 효율적인 주기억 장치 경영 • 생성과 소멸 시점을 알 수 있으므로 스택 기반 기억장소 할당 등 수행 가능 • 정적 형 검사(static type checking)가능 형 고정 연산(type specific operation) : 하드웨어 제공 혼합형 연산(mixed operation) : 프로그래밍 언어 제공 정적 형 검사로 혼합형 연산을 형 고정 연산으로 변환 효율성 추구 cf)혼합형 연산의 동적 형 검사 적응성 추구 • 선언문의 예 • real X; • integer Y; • ... • X + Y 번역기 동작(정적 형 검사) 1) 혼합형 연산 발견 2) Y를 실수형으로 변환 (W) 3) 실수형 덧셈코드 생성
변수, 바인딩, 식 및 제어문 • 정적 형 검사 (static type checking) • 모든 변수의 자료형 선언 요구 단점 : 자료 생성, 소멸, 내용 변경 방법에 많은 제약 존재 장점 : 실행 시간 효율이 높음 정적 형 검사 언어 : Fortran, Algol, PL/I, Cobol, Pascal 등 • 동적 형 검사 (dynamic type checking) • 선언문 사용 안함 장점 : 프로그래밍 단순화, 적응성(flexibility)높음 단점 : 프로그램 실행 시간 지연, 자료 표현상의 효율 저하, 복잡한 기억장소 경영 기법 요구 • 동적 형 검사 언어 : Lisp, APL, Snobol 4 • Algol, PL/I, Ada • 약간의 효율성을 상실하면서도 실질적인 큰 적응성을 얻는 선언문을 채택 예 : 배열real array x[m1:n1,m2:n2] 차원수와 자료형 선언 번역시간 : 효율적인 코드 생성 실행시간 : 첨자 범위 결정 • default 선언은 선언문으로 간주됨 • 예 : Fortran의 정수형(I~N), 실수형 선언문(I~N 이외)
배정문(Assignment statements) • 정의 • 변수 내용을 변경시키는 기본 연산 문장 • 각종 배정 연산자 • Algol, Pascal A :=B • APL A B • Basic LET A =B • Cobol MOVE B TO A. • Fortran, PL/I A =B • l-values와 r-values • 배정 연산자의 왼쪽(l-value)과 오른쪽(r-value)을 의미 • 예 : A := B r-value l-value 변수, 바인딩, 식 및 제어문
l-value와 r-value • l-value값이 저장되는 위치(주소, 참조) • r-value저장되는 값(수식, 변수, 상수, 포인터, 배열원소 등) 예 : r-value 자료형 l-value 변수의 주소 변수의 값 변수 i번째 원소 위치 배열 “A[i]” 원소 A[i]의 값 값 3.5 없음 상수 “3.5” P가 저장된 위치 포인터 “P” P가 지적하는위치 변수, 바인딩, 식 및 제어문
Algol 68 • 선언문에서 “ref” 사용하여 l-value 표현 예 :ref int x(* 변수 x를 integer 선언 *) int y(* y는 integer 상수로 선언 *) ref ref real z(* 변수 z는 real값이 들어 있는 위치에 대한 포인터 *) 예 :ref int x, y ref ref int z . . . . x := y + z + 15 (* 이 경우 변수 x에 배정된 값은 45 *) *수식 계산에서 최종 r-value값을 구하는 dereferencing은 자동 처리 y 10 t 20 z 변수, 바인딩, 식 및 제어문 • Bliss • 변수 이름 : l-value뿐임 • r-value는 변수 앞에 점(.) 사용 • A ← .B + .CB, C의 r-value를 더하여 변수 A (A의 l-value)에 저장 • A ← BB의 l-value (B의 주소)를 변수 A에 저장
변수, 바인딩, 식 및 제어문 • 배정문 A := expr에 대한 구현 1)l-value중심 배정 (Fortran, C 등 컴파일러 언어가 사용) • “수식 expr을 계산하고, A의 속성으로 변환 후 배정” • 효율적인 기억장소 경영 • 정적 형 검사 • 빠른 접근 • 효율성 증가 1)r-value중심 배정 (APL 등 인터프리터 언어가 사용) • “수식 expr을 계산하고, A의 속성을 expr의 계산 결과와 동일한 속성으로 • 변환 후 배정하는 기법으로 변환 후 배정” • 동적 형 검사 • 불필요한 변환 없음 • 적응성(flexibility) 증가
배정 연산에 관한 사항 • 이명(alias) • 2개 이상의 변수가 동일한 기억 장소를 참조할 때에 이들 변수 사이의 관계 • X는 Y에 이명(aliasing) - (역도 성립 : Y는 X에 이명) • Fortran의 EQUIVALENCE, Cobol의 REDEFINES, C의 union (기억장소 공유) * 기억 장소 공유가 프로그램의 심각한 오류 발생, 최적화에 방해 • Euclid : 주요 설계 목적으로 aliasing 제거 노력, 완벽하지 못함 • C : 포인터 변수를 이용한 alias 발생 • alias가 매개변수에 의하여 발생되기도 함 (call by reference의 경우) X Y <이명(Aliasing)의 개념> 변수, 바인딩, 식 및 제어문
Argument 평가 순서 • 배정 연산 순위 • 1. a[b←1]←b • 2. A[x]←P(x) • x (인덱스)의 위치가 달라진다? • 3. N1, N2, …, Nk := e1, e2, …, ek • p, q := q, p(서로 값이 교환될까?) • 4. b[I], b[j] := p, q( i = j 일 때 결과는?) • dereferencing : 대부분의 경우 자동, Bliss 언어와 같은 예외도 있음 <해석 방법> 1) b←1, a[b] ← b : b ←1 먼저? 2) a[b] ← b, b←1 : b 먼저? <x가 p(x)에서 변환될 경우> - 배열 A[x]와 함수 P(x) 중 누가 먼저 평가되나? - Pascal, Algol60 A[x]의 l-value먼저 구함 • - l-value와 r-value 중 누가 먼저 평가되나? • (일반적으로 l-value가 먼저 평가됨) • l-value / r-value내에서 평가 순서는? • 대입되는 순서? 변수, 바인딩, 식 및 제어문 b=4일때 a 1) 2) a,b,c = x1+x2, y1+y2, z1+z2;
변수, 바인딩, 식 및 제어문 • 상수 및 변수 초기화(Constant & Initialization) • 상수와 초기화 • 프로그램이 실행되는 동안 값이 변하지 않는 식별자 • 상수 개념 제공 : Pascal, Ada, Fortran 77 • 상수 선언 허용 시 고려사항 단순 변수 또는 구조 변수(record, array) 모두 가능? 상수 값 표현 : 단순상수, 수식 가능, 번역 또는 실행 시 임의의 식 가능 여부 ? 상수 값 배정 시간 : 정적, 동적 배정 가능? 예약된 상수(predefined constant) 제공 여부 ?
변수, 바인딩, 식 및 제어문 • 상수와 초기화의 예 • Pascal • const사용 • 숫자, 스트링, 열거형 값 등 허용 (스칼라 형) • true, false, maxint 등 제공 • const pi = 3.14159; • 변수 선언 시 초기화 미 제공 • Algol68 • 배정 연산자와 상수 선언 연산자의 구별(:=, =) • real root2 := 1.414213변수 선언과 초기화 • real root2 = 1.414213상수 선언
변수, 바인딩, 식 및 제어문 • 상수와 초기화의 예(계속) • 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);상수 선언 • Fortran • DATA문 (변수 초기값 설정) • PARAMETER문 (상수 선언, Fortran77 이후 언어)
변수, 바인딩, 식 및 제어문 • 표현식(Expression) • 표현식(식) • 목적 : 계산될 값을 기술한 문장 • 구성 : 피연산자(상수, 변수, 함수 등)와 연산자로 구성 • 참조 투명성(referential transparency) : 수식 평가는 환경 변화 없이 값만을 생성 • 참조 투명성을 보장하기 위해 副作用(side-effect)제거가 관건 • Cf) 식에 사용된 함수가 변수 값을 변경한다….. 참조투명성 결여 • 연산 순위 : 연산자 순위 기반, 괄호 사용, 결합 법칙 제공 언어에서 제공되는 연산자 순위는 언어에 따라 차이가 남 순위는 implicit (default) or explicit (괄호사용) 가능 • 결합 법칙 : 동 순위 사이에서 발생되며 일반적으로 left-to-right 법칙을 따름 연산 순위는 BNF로 제공하기도 함 수식의 연산 순위를 표현하기 위해서는 추상 구문 트리를(AST) 사용
연산자 우선 순위 (Precedence) • 몇몇 연산자들의 상대적 우선 순위는 표준화 되어 있음 • 각종 언어에서 연산자 순위는 아래 표에서와 같이 서로 다름 ALGOL60 ↑(exp.) ×, /, ÷ +, - <,≤,=, ≥, >, ≠ ¬ (not) ∧ (and) ∨ (or) ⊃ (implies) ≡ (equivalent) PL/1 **, unary +, unary -, ¬(not) *, / +, - ∥ =, <=, >=, >, < ¬=, ¬<, ¬> Fortran ** (exponentiation) *, / +, - .EQ., .NE., .LT., .LE., .GT., .GE. .NOT. .AND. .OR. ADA **(exp.) ×, /, mod, rem +, -, not(unary) +, -, & =, /=, <, <=, >, >= and, or, xor PASCAL not *, /, div, mod, and +, -, or =, <>, <=, >=, <, > , in (set) 변수, 바인딩, 식 및 제어문
ADA의 수식에 대한 EBNF • <expression> ::= <relation> { and<relation> } | <relation> { or<relation> } • | <relation> { xor<relation> } • <relation> ::= <simple_expression> [ <relational_op> <simple_expression> ] • <simple_expression> ::= [ <unary_op> ] <term> { <add_op><term> } • <term> ::= <factor> { <mul_op><factor> } • <factor> ::= <primary>[ <exponen_op> <primary> ] • <primary> ::= <literal> | <aggregate> | <name> | <allocator> | • <function_call> | <qualified_expression> |( <expression> ) • <relational_op> ::= = | /= | < | <= | > | >= • <add_op> ::= + | - | & • <unary_op> ::= + | - | not • <mul_op> ::= * | / | mod | rem • <exponen_op> ::= ** 변수, 바인딩, 식 및 제어문
수식 :not A ** B * C / D > - E + F and G mod H >= I • ADA의 임의 수식에 대한 Parse Tree 예 exp exp = <expression> rel = <relation> s.e = <simple_expression> t = <term> rel rel f = <factor> p = <primary> s.e s.e v = <variable> s.e s.e t t t t t f f f f f f f f p p p p p p p p p v v v v v v v v v not A C / D > - E + F and G mod I H B >= ** * 변수, 바인딩, 식 및 제어문
변수, 바인딩, 식 및 제어문 • 논리 조건 • 적용 순서(applicative order) • operand1 op operand2 평가 순서는 operand1, operand2를 계산한 후, 연산자 op를 적용 단, 논리 연산에서는 이 적용 순서를 바꿀 수 있는 특성이 있음 예:x ≠ 0 or y / x < 1 x가 0이 아니면 무조건 참 x ≠ 0 and y / x < 1 x가 0이면 무조건 거짓, x 값이 0일 때는 값이 거짓으로 결과가 존재하나, 위의 적용 순서를 따르면 y / x에서 overflow 발생 *이 두 경우에서 or와 and의 뒷부분을 연산하지 않기 위해 새로운 연산자 단회로 도입 • 단회로(short circuit) • 부울 수식에서 일부 피연산자만으로 평가하는 기법 예: x cand y = if x then y else false x cor y = if x then true else y ADA - and then, or else사용
변수, 바인딩, 식 및 제어문 • 조건문(Condition Statements) • FORTRAN : GOTO문 요구 판독성 저하 • IF (BCOND) L1 , L2 : BCOND가 참이면 L1, 그렇지않으면 L2로 분기 • 버전업 후 대치 : IF (BCOND) <STMT> : <stmt>는 단일문만 허용( goto 사용 빌미) • IF (ACOND) L1 , L2 , L3 : ACOND가 음수, 0, 양수에 따라 L1, L2, L3로 분기 • Algol 60 : 택일문 처리, dangling else 발생 • if condition then S1 else S2 Fortran 77에서는 dangling else의 해결로 ENDIF사용 • 표 6.5 중첩 if문 구조 • if C1 then S1 • else if C2 then S2 • ........ • else if Cn then Sn • else Sn+1 • endif • endif • endif
변수, 바인딩, 식 및 제어문 • 다중 if의 새로운 구문 형태 • 다수의 endif사용을 줄이고 판독성을 증가시키기 위해 새 구문 형태 도입 • 예)Algol 68의 elif(최초 시도), Ada의 elsif • Ada의elsif사용한 표 6.5 개선 예 • if C1 then S1 • elsif C2 then S2 • elsif C3 then S3 • . . . . . . . . . . . • elsif Cn then Sn • else Sn+1 • endif;
CASE 문 • if-then-else를 확장한 택일문 • Algol-w(Hoare, Wirth) • case <integer expression > of • begin • S1;S2;. . .;Sn • end • Pascal • case <expression> of • <case label list>:<stmt> • . . . • <case label list>:<stmt> • end <integer expression > : (1 ~ n) 정수, 임의 i 이면 Si실행 열거형 도입 <case label list>는 <expression>의 상수 Default case 부재 GOTO를 이용한 case 레이블로 분기 방지 변수, 바인딩, 식 및 제어문 <expression > : 임의의 자료형 허용
변수, 바인딩, 식 및 제어문 • Ada • other절 도입 • expression은 열거형과 부분범위(range)형가능 case thismonth is when Feb|Apr|Jun..Aug => birthday := 4; when Sep => birthday := 1; when others => birthday := 0; endcase; • case문 고려 사항 • 선택자 수식(selector expression)으로 허용된 자료형은 무엇인가? • case 레이블에 허용되는 자료형은 무엇인가? • case문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가? • 레이블간의 상호 배제를 요구하는가? • 레이블간의 상호 배제가 요구되지 않은 경우, 실행을 중복하는가? • 수식으로부터 발생되는 모든 경우들을 처리해야 하는가?
반복문 • 반복 수행 - 컴퓨터 중요 특성, 초기언어부터 사용 • 종류 ① 가장 간결한 형태 (괄호 사용 개념) loop-repeat 문 (구현 예) 탈출 방법 - 조건/무조건 분기문 이용 - 제한적 goto(exit)사용 Bliss-10 (다양한 exit 제공) - exit, exitblock, exitcase, exitcommand, exitselect, exitloop, exitset - goto문제거로 인해 다양한 exit 문이 발생되었다는 인식은 잘못된 것임 단지, goto문은 비 구조적인 문제를 야기하는 요인으로 인식해야 함 Bliss II (label을 사용하므로써 중첩된 scope을 한번에 탈출 가능) exit <label> : <label>은 반복문 몸체, 복합문, case 문 등의 scope 이름 <loop-until 예> loop if not <조건> then exit <statement> repeat 변수, 바인딩, 식 및 제어문 • 반복문(Iterative Statements)
② while 문 시작 부분에서 반복 조건 검사 (0번 이상 반복 가능) <loop-repeat로 표현> loop if not <bcond> then exit <statement> repeat while <bcond> do <statement> end • ③ repeat-until 문 • 마지막 부분에서 반복조건 검사 (1번 이상 반복 가능) <loop-repeat로 표현> loop <statement> if not <bcond> then exit repeat repeat <statement> until <bcond> 변수, 바인딩, 식 및 제어문
변수, 바인딩, 식 및 제어문 ④ for : 반복 제어 변수 사용 반복문 (화려한 역사를 갖음) 예)Pascal, C, Ada, Algol의 for문 • 예)FORTRAN의 DO문 • for 문에서 고려할 점 반복 변수가 택할 수 있는 값들의 자료형은? 초기값, 최종값, 증분값에 수식의 허용여부와 수식 결과의 자료형은? 반복 시 최종값과 증분값은 얼마나 자주 평가되는가? 반복 변수와 최종값은 언제 비교되나? 반복문 내에서 배정문으로 반복 변수가 변경될 수 있나? 반복문 종료 후 반복 변수가 갖는 값은? 반복문 내외로 제어 이동이 허용되나? 반복 변수의 영역(scope)은?
Algol60 (Alogol60 보고서 내용) • 반복 변수와 최종값 먼저 비교 • 초기값, 최종값, 증분값(임의 수식) • 자료형 : 실수형, 정수형, 혼합형 연산 허용 • 최종값, 증분값은 비교 시 매번 재평가 • 보고서의 설명 예 a step b until c • v := a • L1 : if (v - c) * sign(b) > 0 then goto exit ; • <statements> • v := v + b • goto L1; • exit : • 반복문 정상 종료 시 반복 변수 값 정의되지 않음 • goto문 탈출 시 반복 변수 값 유지 • for 문 내부로 제어 이동 시 결과 미정의 for <var> :=<init> step <incr> until <final> do <stmt> 변수, 바인딩, 식 및 제어문
Pascal의 for문 for <var>:=<init> to <final> do <stmt> 또는for <var> :=<init> downto <final> do <stmt> Algol 68의 for문 [for <var>] [from <E1>] [by <E2>] [to <E3>] [while <E4>] do <Stmt> od 변수, 바인딩, 식 및 제어문 • Pascal • 변수의 초기, 최종값은 동일 자료형(스칼라형, 실수형 제외) • 초기, 최종값은 시작 전 한번만 계산 • 변수와 최종값 비교 먼저 • 종료 후 반복 변수의 값 미정의 • 반복문 변수 열거형 사용 • 증분값 : to, downto DO 30 I=2,KZ=RAN(iseed) 30 F(I)=Z*(FMAX-FMIN)+FMIN • Fortran II의 DO 문(최초의 반복문) • DO 문 몸체가 적어도 한번 수행 • 초기값, 증분값, 최종값 : 정수형 상수나 변수 • 반복문 수행 후 반복 변수의 값에 대해서는 언급 없음 • Algol68의 For 문 • E1, E2, E3 : 정수 수식, 한번만 평가 (Algol 60은 임의 수식, 매번 평가) • 반복 변수 영역 : 몸체부 국한(Ada도 동일)
변수, 바인딩, 식 및 제어문 • Java, C에서의 for문의 구성 • expr들의 실행 순서 ② ⑤ ① for ( ) <expr1>; <expr2>; <expr3> ⑥ ③ ④ <stmt>
변수, 바인딩, 식 및 제어문 • GOTO문 • GOTO 문 • 레이블(Label)을 사용하는 제어의 모든 문장을 지칭 • 직접적 순서 제어, 기계어 특성 표현, 효율적 실행 보장, 사용 편리, 타 제어문 없이 모든 알고리즘 표현 가능 • 레이블 사용에 따른 분류 1)번역시간 레이블을 태그로만 사용 - 번역 시 레이블을기계어 코드의 분기 위치로 번역(Fortran, Basic) 2)실행시간 레이블을 제한된 자료 항목으로 간주 - 레이블 값을 읽거나 계산할 수 없음 - 레이블 변수, 레이블 배열, 비지역 레이블 참조, 레이블 매개변수 등 사용 가능 -Algol은 비지역 레이블, 형식 매개변수 참조 등으로 인해 1)처럼 수행하지 못함 3)실행시간 일반 자료 항목으로 간주(Snobol4, APL) - 실행시간에 레이블을 읽거나 계산할 수 있도록 허용 - 실행시간 레이블 이름과 코드테이블이 필요 …. READ X …. GOTO X
변수, 바인딩, 식 및 제어문 • GOTO문의 장단점 • 장점 • GOTO문 제어구조를 하드웨어가 제공 • GOTO문 제어구조의 완벽한 범용성 (모든 알고리즘 표현 가능, 他 순서 제어문은 편의 제공일 뿐) • 단점 • 프로그램 질 저하 유도 • 판독성 저하(비구조적) • 프로그램 유지보수의 난해성 • GOTO문의 잔존 여부 : 論亂의 대상 • Fortran, Basic의 산술 if문은 GOTO문 개념이 논리 IF문보다 더 많이 포함 • pure LISP,Bliss : GOTO문 사용 금지 • Pascal : 제한적 사용 • Java : GOTO 예약어가 있지만 지원하지 않음 • GOTO문 제거는 다양한 순서 제어문을 요구 (택일문, 반복문, 되부름 등)
Programming Languages- The end of Chapter 5 -To Be Continue ...