예약어(reserved word) : 프로그래밍 언어에서 특별한 용도로 사용하고자 미리 지정한 단어 - 프로그램의 구성요소를 구별하게 해주는 역할 => 라벨, 서브 프로그램 이름, 변수에 연관되어 다른 변수나 서브 프로그램 등과 구별 - 식별자의 최대길이는 언어마다 각각 다르며 허용길이를 넘어서면 나머지 문자열은 무시됨 - FORTRAN, COBOL, HTML 등의 언어는 대소문자를 구별하지 않음 - C 및 C++는 대소문자 구별 - FORTRAN의 경우는 예외로써 예약어를 변수로 사용 가능 - 예약어 사용의 장점 1 프로그램의 가독성을 향상 컴파일러가 구문분석을 보다 빠르고 정확하게 처리 - 예약어 사용의 단점 1 프로그래머는 모든 예약어를 숙지하여, 변수 선언 시에 예약어를 제외하여야 함 예약어 추가시 기존 프로그램에서 사용하였던 변수 중 예약어와 중복된 변수 수정 필요 - 설계 특징 1 식별자 최대길이는 몇 글자인가? 사용할 수 있는 문자의 집합은 무엇인가? 3 대소문자를 구분하는가? 4 키워드를 식별자로 사용할 수 있는가? 예) sum이라는 변수에 선언문과 배정문을 실행하였을 때, 변수의 속성 - 기억장치의 한 장소를 추상화한 것 - 기억장소 이외에 저장하는 값의 해석 방법, 값의 타입, 가능한 연산 등이 정의되어야 함 - 일반적으로 변수는 이름, 주소, 영역, 수명, 값, 형 등의 속성을 가짐 - 변수와 연관된 식별자(identifier)는 다른 변수와 구별하는 데 사용 1 변수 X의 주소 - 변수 X와 연관된 기억장소의 주소를 의미 변수 X의 형(type) - 변수 X에 할당될 수 있는 값의 종류를 결정 3 변수 X의 영역 - 변수 X가 사용될 수 있는 프로그램의 부분 4 변수 X의 수명 - 변수 X와 연관된 기억장소가 할당되어 있는 시간을 의미 var sum: integer; sum := 0; D. W. Barron의 표기법에 따라 변수 sum을 표현 참조 이름: sum 유형: 정수 값: 0 일반적인 속성 속성 (attribute) 값 속성 결정시간 이름 (name) sum 컴파일 시간. 유형 (type) 정수형 컴파일 시간. 주소 (address)? 프로그램 적재시간 (loading time) 값 (value) 0 실행시간.
프로그래머가 프로그램을 작성할 때 고려하는 일반적인 것 특이한 속성도 결정되어야 함 - 정수형의 내부 표현방법 1 프로그래밍 언어 설계시간이나 구현시간에 결정 C 언어에서 정수형은 구현된 컴퓨터에 따라 다르게 표현 => 16bit 컴퓨터에서는 16bit로, 3bit 컴퓨터에서는 3bit로 - 정수형 변수에서 표현 가능한 최대값과 최소값 1 일반적으로 프로그래밍 언어 구현시간에 결정 => 일부 언어에서는 기계 독립성을 높이기 위해 언어 설계시간에 정의 FORTRAN에서 정수형은 -3,768부터 3,767사이의 값(16bit표현, 15-1 ~ - 15 )을 표현 - 정수형 변수에서 가능한 모든 연산 1 언어 정의시간에 결정 배정연산 (:= or =), 사칙연산(+, -, *, /), 나머지연산(% or mod) 및 비교연산(>=, ==) 등 - 프로그램 실행시에 사용할 데이터 속성에 관한 정보를 컴파일러나 인터프리터에게 알려주는 문장 - 프로그래밍 언어에서의 역할 1 보다 효율적인 주기억장치 사용과 액세스가 가능: 변수들의 크기, 유형에 관한 정보를 제공 보다 효율적인 주기억장치 관리가 가능: 생성 및 소멸 시기에 관한 정보를 제공 3 컴파일 시간에 변수의 형 검사가 가능: 의미없는 수식에 대한 정보를 제공 - 일부 언어에서는 묵시적으로 변수를 선언 1 FORTRAN 변수의 첫 글자가 I에서 N사이의 문자로 시작하는 경우는 정수로, 그 외에는 실수로 간주 BASIC 정수변수는 %로, 문자열변수는 $로 끝나며, 그 외에는 실수 변수 3 Perl 변수명의 맨 앞에 $를 붙여 scalar형 표시, 배열은 변수명 앞에 @를 붙여 표시 (예 : Perl의 변수 $sum은 scalar 형으로서, 정수, 실수, 문자열을 포함) - 바인딩이란 프로그램 요소에 지정 가능한 속성 값을 지정하는 것 - 바인딩 시간(binding time)이란 바인딩이 발생하는 시간 - 바인딩과 바인딩 시간은 프로그래밍 언어 설계시에 매우 중요한 포인트 - 바인딩은 언어 설계시간, 언어 구현시간, 컴파일 시간, 적재시간 및 실행시간에 발생 예) min := min + 5; binding되는 속성 binding time 변수 min의 가능한 변수 유형 언어 설계 시간 변수 min의 유형(type) 컴파일 시간 변수 min이 가질 수 있는 값의 범위 언어 설계시간 or 구현시간 변수 min의 주소값 프로그램 적재 시간 변수 min의 값 언어 실행 시간 연산자 + 의 의미의 집합 언어 설계 시간 연산자 + 의 연산 종류 컴파일 시간 5의 내부적 표현 컴파일 시간, 언어 설계 시간 정적 바인딩 - 프로그램이 실행되기 전(주로 컴파일 할 때)에 바인딩이 발생하는 것 - 수치 계산을 목적으로 개발된 언어에서 많이 사용 - 효율성 중시 - 컴파일시에 대부분의 속성을 지정하여, 실행시간의 오버헤드를 줄이고자 함이 목적 - 컴파일 언어에서 사용 1 컴파일 언어는 명시적인 선언 요구 컴파일시간에 더 많은 에러를 찾아내고 보다 효율적인 실행코드를 발생 요구 동적 바인딩 - 실행시간 중에 일어나기 때문에 프로그램 실행 지연 - 문자열처리나 인공지능처리 언어인 LISP, Perl, Prolog 등에서 많이 사용 - 융통성, 편리성 중시 - 인터프리터형 언어에서 사용 1 인터프리터형 언어는 명시적인 선언을 요구하지 않음 실행시간에 변수의 값을 지정할 때까지 변수의 형을 바인딩 하지 않음
예) 인터프리트 언어 Perl의 융통성 변수는 선언할 필요가 없음 정수 값이 지정된 변수에 문자열을 배정 가능 - 변수의 내용을 변경하는 기본 연산 - 프로그램에서 가장 일반적인 연산문 중에 하나 - 여러 가지 언어의 배정문 프로그래밍 언어 배정문 형식 Pascal, Ada X := Y; C, C++, Perl, Java X = Y; FORTRAN, BASIC X = Y COBOL MOVE Y TO X. APL X Y - 문장 A := B;에서 l-value와 r-value 1 연산자(:=)의 왼쪽에 있는 변수(l-value or left-value)는 주소를 사용함 연산자(:=)의 오른쪽에 있는 변수(r-value or right-value)는 값을 사용함 - 자료의 l-value와 r-value 예) C에서 다음 두 가지 배정문의 의미 1 모든 변수들은 l-value와 r-value를 가진다. 10과 같은 상수는 r-value만을 갖는다. 3 C의 정수 포인터 int *ip; 변수 ip의 l-value는 ip 자신의 주소 r-value는 다른 변수의 l-value 4 배열 A에서 A[i] l-value는 배열 A에서 i번째 요소의 주소 r-value는 그 주소에 저장된 값 case 1 int a=1, b=; a = b; <case 1>의 실행결과 a : 1 b : <case >의 실행결과 case (right??) int *a=1, *b=; a=b; a : b : a : 1 b : b : <case >에서 a=b; 대신에 *a=*b;를 수행하면 결과는 다음과 같다. a 1 a b b
- 둘 이상의 이름으로 하나의 변수를 참조할 때를 말함 - C나 Pascal에서 포인터 변수를 사용하여 이명 생성 - FORTRAN의 EQUIVALENCE, COMMON문에 의해서 이명 생성 - 프로그램의 해독성(readability)을 해치며, 유지보수를 어렵게 만듦 - 변수 X의 영역은 변수이름 X가 동일한 의미를 갖는 프로그램의 일부분을 의미 - 변수 X가 X의 영역에서 참조 가능하면 가시적(visible) - 변수 X가 X의 영역이 아니거나 동일한 이름을 가진 변수에 의해 가려지면 비가시적(invisible) - Hole-in-scope: 지역변수에 가려서 전역변수가 비가시적인 경우 - 변수의 영역이 프로그램의 실행순서와는 무관하게 프로그램 블록의 포함관계에 따라 결정 - 명령형 언어 대부분은 정적 영역 규칙을 사용 - 블록내의 모든 비 지역변수는 자신을 둘러싸고 있는 가장 가까운 블록에서 선언된 변수를 참조 - APL, SNOBOL4와 같은 언어는 동적 영역 규칙을 사용 - 함수를 호출하는 순서에 기반을 둔 것(실행시간에 결정) - 비지역변수를 참조할 때 자신을 호출한 함수의 정의를 사용 블록 참조 가능한 변수 및 함수이름 {main} a, b, Large {Large} a, b, x, y, Large, sub1 {sub1} a, b, x, y, z, Large, sub1
- 변수의 수명 : 변수가 메모리에 할당되는 시간부터 역할을 마치고 저장공간이 반환될 때까지 - C, PASCAL과 같은 블록구조의 언어에서 변수의 영역과 수명은 일치 1 정적 영역 규칙 사용한 결과 sub1의 print(x)의 결과는 동적 영역 규칙 사용 sub1은 x에 대한 선언이 없으므로, sub1을 호출한 sub의 정의 사용 sub에서 x:=4의 값을 지정하였으므로, print(x)의 결과는 4 - 변수를 선언함과 동시에 값을 배정하는 것 - FORTRAN은 DATA문을 사용하여 변수를 초기화 - 많은 언어에서 변수를 선언함과 동시에 값을 배정 - 기억장소 바인딩 종류에 따라 변수는 정적 변수, 스택-동적 변수, 힙-동적 변수로 분류 - 정적 변수(static variable): 프로그램 실행 전에 메모리에 위치하고 종료시까지 바인딩이 유지되는 변수 - 스택-동적 변수(static-dynamic variable): 변수의 유형은 정적으로 바인딩되지만 기억장소 할당과 회수는 동적으로 이루어지는 변수 - 힙-동적 변수(heap-dynamic variable): 기억장소 할당과 회수가 명시적인 명령어에 의해서 힙이라 는 메모리에서 동적으로 이루어지는 변수 분류 장점 단점 예제 정적 변수 실행의 효율성이 높음 재귀 호출 불가 기억 장소 공유 불가 실행의 효율성이 정적 스택-동적 변수 재귀 호출 가능 변수에 비해 떨어짐 힙-동적 변수 실행 중 수시변환 가능 프로그램이 복잡해짐 global variables static variables local variables malloc(), free() new, delete