Univ Study/프로그래밍 언어 개념: 3개의 글

프로그래밍 언어개념 과제2

Posted by Patchman
2010.02.15 16:05 Univ Study/프로그래밍 언어 개념

C 언어의 Binding Time에 대해서 예기해 보도록 하겠습니다.

작성되는 순서는 바인딩이 가장 먼저 일어나는 순서로 적어 나가도록 하겠습니다.

 

1. Definition Time Binding

언어에 대한 Design의 시기라고 할 수 있으며, Statement의 구조, Control Structure의 구조 등에 대해서 정의하게 됩니다. 예를 든다면, 문자(Char)의 의미(meaning)를 정의하거나 배열 변수의 크기에 대한 정의가 여기서 이루어지게 됩니다.

 

2. Implementation Time Binding

C 언어에 대한 Compiler를 만드는 단계라고 볼 수 있습니다.

각 Type의 유효자리(Integer 의 유효자리), 숫자표현 방식 등에 대한 것이 이곳에서 이루어지게 됩니다.

 

3. Translation Time Binding

번역시간에는 네 가지로 구분할 수 있는데, 첫 번째로 일어나는 것은 프로그래머에 의한 바인딩입니다. 프로그래머는 변수의 형, 문장 구조 등에 대해 많은 결정을 내려야 하게 됩니다. 이때 Program Creation Binding이 발생하게 됩니다. Compile Time에서는 Variable의 상대주소를 갖게 되고, Linkage Edit Time에서는 Sub Program의 상대주소를 얻게 됩니다. 그 다음에 Binding이 Load Time때 발생하는데 C언어에서 함수 밖에서 선언하는 변수 즉, 전역 변수(Global Variable)의 Location을 결정해 주는 Binding이 발생하게 됩니다. 즉 각 부 프로그램을 위해 지정된 메모리 내에서 변수에 주소를 할당하게 되고 실제 주소를 할당하는 작업이 이곳에서 수행 되게 됩니다.

 

4. Execute Binding

실행 시간에서는 크게 두 가지로 나누어지게 되는데 Sub Program(method)에서의 시작시점에서 지역 변수(local variable)의 Location이 결정 되게 됩니다. C언어의 경우 저장 장소에 대한 형식 매개변수와 실제 매개변수의 바인딩은 부 프로그램의 시작에만 일어나도록 되어 있습니다. 이 시기에 Location이 일어나게 되면, 예를 들어 함수에 int Array[i][j]; 라는 문장이 있을 경우 i, j 변수에 할당된 값을 배열의 Size로 가지게 되기 때문에 프로그래머가 필요로 하는 원하는 사이즈의 크기를 배열에 할당할 수 있게 됩니다. 그리고 두 번째는 임의 시점에서의 Binding입니다. 임의 시점에서는 변수의 Value, Type, Location이 일어나게 된다. 배정문을 통해서 변수에 값을 Binding 하는 수행이 있을 수 있겠습니다.

 

C언어에서의 Binding에 대해서 평가해 본다면, 변수의 Location을 Runtime에 하기 때문에 재귀함수(Recursion)의 사용이 가능하고, 또 사용함으로써 코드를 깔끔하게 할 수 있습니다. 하지만 Fortran이나 Cobol과 같은 Load Time에 변수의 Location이 일어나는 언어보다는 효율성이 떨어질 수 있지만 융통성은 더 좋다고 볼 수 있고, LISP, SNOBOL, APL과 같은 Interpreter언어들보다 융통성은 떨어질 수 있지만 효율성면에서는 더 우수하다고 볼 수 있습니다.


저작자 표시 비영리 변경 금지
신고

프로그래밍 언어개념 과제1

Posted by Patchman
2010.02.15 16:04 Univ Study/프로그래밍 언어 개념


1. For a language that is heavily used on your local computer system, evaluate the reasons for its success according to the list of criteria given in Section 1.3.1. Should the list be extended?

 

로컬 컴퓨터 시스템에서 많이 사용되고 있는 C 언어에 대하여 Section 1.3.1에 주어진 기준에 따라 평가하면 다음과 같다.

 

먼저 지금까지 설계, 구현, 사용되다가 사라진 수백 가지의 언어와 비교 했을 때, 지금도 여러 분야에서 다양한 목적으로 사용되고 있는 C 언어는 성공적인 언어라 할 수 있다. 또한 C 언어의 성공의 외적인 요인을 찾으라면 UNIX 운영체제의 성공을 예로 들 수 있을 것이다. 성공적인 언어란, 곧 좋은 언어의 특징을 많이 가지고 있는 언어라고도 말할 수 있는데 좋은 언어의 특징으로는 [ 단순,간단,명료성 / 직교성 / 응용분야 / 적응성 / 추상화 지원 / 검증의 용이성 / 프로그램 환경 / 이식성 / 비용 ] 등을 들 수 있으며, 성공적인 언어인 C를 평가하기 위해 좋은 언어의 특징 중, [언어구조 명료 / 직교성 / 추상화 지원] 과 연관해 평가 하겠다.

 

명료성 - C 언어에서는 #define, typedef 문 등을 사용하여 변수나, 상수, 구조체 등의 선언과 이름을 명료하게 할 수 있다. #define, typedef 를 통한 사용자 정의 데이터 타입은 프로그램의 작성과 테스트, 이해, 변경을 쉽게 하는 요인으로 작용하며, 반복문, 루프에서 사용하는 변수나 배열의 색인은 보통 i,j 와 같인 간단한 이름으로 선언하여 명료성을 높인다.

 

직교성 - C 언어는 직교성 측면에서 부족한 면을 보인다. 예를들어 C 언어 함수 반환값의 자료형 으로는 배열형이 제외되며, 매개변수 전달방식에서 Ada 언어는 모든 자료형에 call by value, result, value-result 허용하여 직교성을 보장하지만, C 언어에서는 배열은 call by reference 방식을 취하는 반면, 이외의 모든 자료형에서는 call by value 방식을 취해 직교성을 보장하지 못한다.

 

추상화 지원 - 추상화중 데이터 추상화의 가장 기본적인 형태는 int, char, float 같은 데이터 타입이다. 개발자는 정수 연산의 값의 범위나 진법, 보수 형태의 치환 등을 일일이 프로그램해 넣을 필요없이 그저 선언만 해주면 된다. 또한 C 언어 에서는 typedef struct 같은 추상 데이터 타입, 사용자 정의 데이터 타입을 통해 데이터 구조를 원하는 데로 추상화하여 쓸 수 있다. 그러나 이렇게 전통적 언어에서의 추상화 방식은 데이터와 프로세스를 별도로 추상화함으로써 추가적인 작업의 가능성이 많고 내부 메커니즘이 철저하게 숨겨지지 못하여 진정한 추상화라고 볼 수 없다. 객체지향 언어에서는 클래스를 이용함으로써 데이터와 프로세스를 함께 추상화의 구조에 넣어 보다 완벽한 추상화를 실현한다.

 

위에서 명시한 3가지 특징 외에도 C 언어에는 유연성, 확장성, 이식성 등 많은 특징을 가지고 있다. 또한 추상화 특징에 명시된 것과 같이, C언의 단점인 추상화 지원을 보완하기 위해 데이터와 프로시저를 하나의 단위로 묶는 클래스의 개념과, 객체지향설계가 도입된 C++ 언어가 만들어지게 된 것이다.



2. Consider the following simple language. a and b represent names of integer variables. Each statement may have a label as a prefix. Statements in the language are as follows:

a=b Assign a the value of b

a=a+1 Add 1 to a

a=a-1 Subtract 1 from a

if a=0 then goto L If a=0, transfer control to statement L

if a>0 then goto L If a>0, transfer control to statement L

goto L Transfer control to statement L

halt Stop execution

For example, the program that computes a = a + b can be given by

L: a=a+1

b=b-1

if b>0 then goto L

halt

 

Write the following programs in this language:

 

Given a and b, compute x = a + b

 

L: a=a-1

b=b+1

if a>0 then goto L

x=b

halt

 

a와 b의 합을 x에 넣기 위해, 조건문을 통해 a가 0이 될 때까지 a의 값은 1씩 감소시키고, b의 값은 1씩 증가 시킨다. 결과적으로 a가 0이 될 때 b의 값은 a+b의 값이 되고, b의 값을 x에 넣고 halt(Stop execution)를 실행 해 프로그램을 종료한다.

 

 

3. Features in C allow the same meaning to be expressed many ways. How many different statements can you write in C that add 1 to a variable X (i.e,. equivalent to X =X + 1)? Discuss the advantages and disadvantages of this aspect in the design of C

 

① x = x + 1 - 할당 연산자 = 로 수식 x + 1 을 x 에 할당 한다.

 

② x += 1 - 할당문과 이항 산술 연산자의 기능을 동시에 사용하게 해주는 복합 할당 연산자(compound assignment operators)를 사용한다

 

③ ++x - 단항연산자(unary)의 선행모드(prefix mode)를 사용한다

 

④ x++ - 단항연산자(unary)의 후행모드(postfix mode)를 사용한다

 

⑤ p = &x;

(*p)++; ; - 포인터를 이용하는 방법으로 x의 주소 번지 값을 변수 p에 할당하여 x의 - 값을 참조하여 증가시키는 방법을 사용한다

 

 

4. Early computers were designed as electronic calculators to solve numerical problems. Speculate on what programming languages would be like if these early machines were developed for a different purpose (e.g., word processing, robot control, game playing).

 

만일 초기의 컴퓨터가 사람의 패턴에 관련한 언어로서 개발되었다고 가정 한다면, 프로그래밍 언어에는 매우 다양한 경우가 발생하게 될 것이고, 예외처리 역시 매우 어렵게 될 것이다. 또한 추상화 지원이 뛰어난 언어가 더욱 빨리 개발되고 발전했을 것이다. 하지만 기계의 특성과 구조적, 물리적인 이유에서 수리적인 문제해결과 표현 방법 없이 프로그래밍 언어가 있기는 힘들다고 생각한다.

 

 

5. Suppose a new language design provides three basic data types: integer, real. and character. It also provides the ability to declare arrays and records of data. Arrays have elements of the same type and records have elements of mixed types. Use the concept of orthogonality to critique the following two variants of this new design:

 

(a)Elements of arrays and records may be of any of these basic data types and may themselves also be arrays or records(e. g., an element of a record may be an array).

 

a 의 변형에 따르면, 레코드 형이 요소가 되는 배열과 배열형의 요소가 혼합된 레코드가 가능 하다. 아래의 두 가지 경우의 혼합 역시 가능하다. 즉 다양한 조합이 가능하고 언어의 특징을 결합할 수 있는 직교성이 높다고 할 수 있다.

 

- 레코드 배열

[0]

[1]

[2]

Real

Integer

Real

Integer

Real

Integer

- 배열 레코드

Character[5]

Real[3]

- 혼합

[0]

[1]

[2]

Character[3]

Real[8]

Character[3]

Real[8]

Character[3]

Real[8]

 

(b) Elements of arrays and records may be of type integer or real. Arrays of characters are called strings and get special treatment. Record elements may be of type character. Records may have arrays as elements, but arrays may no have records as elements. Arrays may not have arrays as elements, but multidimensional arrays are provided to get the same effect.

 

b 의 경우는 a 의 경우보다 직교성이 조금 떨어진다고 생각 된다. 배열은 레코드를 가질 수 없다는 제약이 있고, Primitive Data Type에서 문자의 배열은 String이라는 예외 처리가 있기 때문이다. 그리고 다차원 배열과 배열을 요소로 가지는 배열은 비슷한 의미가 아닌가 생각된다. 하지만 Java 언어의 경우 String을 non primitive type 즉, Object Type으로서 제공한다. 실제의 사용성과 유용성을 고려한다면 String으로 따로 분류하는 것이 편리하게 사용될 수 있다고 생각한다.

 

 

저작자 표시 비영리 변경 금지
신고

바인딩(Binding), 바인딩 타임(Binding Time)

Posted by Patchman
2010.02.15 16:03 Univ Study/프로그래밍 언어 개념


1. early binding : 정적 바인딩이 맞습니다.

 

2. late binding : 동적 바인딩이 맞고요..

 

바인딩은 교과서에 나와있는 의미대로 본다면 값을 할당하는것입니다.

어디에? 어떤값을?

 

일반적으로 프로그래밍 언어를 구성하는 것은 변수, 프로시저 인데, 변수라고 하는것에는 그 나름대로의 특징이 있지요.

 

예를들면 변수이름, 변수값, Data Type, Life Time 등등...

 

이런 각각의 특징에 특정 값을 할당하는것을 바인딩이라 합니다.

 

바인딩은 바인딩 되는 시점이 총6개가 존재하는데

 

1. 프로그래밍 언어 만들때 (정의할때)

2. 컴파일러 만들때

3. 컴파일때

4. 링크때

5. 메모리에 로드시에

6. 실행시에

 

그중 실행시에 바인딩되는것을 동적 바인딩이라 하며, 나머지 5개의 경우 정적 바인딩이라 합니다.

 

아래와 같은 선언문이 있다면,

 

int a = 1;

 

 

변수 a 에 관하여

 

1) Data Type 은 int 라는 것이 바인딩되며, 컴파일시에 할당되므로 정적 바인딩

2) 변수명 a 는 컴파일시에 할당되므로 또한 정적바인딩

3) 값 1 은 실행시에 할당되므로 동적바인딩 이라 합니다.

 

1. 바인딩 개념

 

(1) 바인딩의 정의

프로그램 작성시 2개의 정보를 연관시켜 묶는다(Bind)는 의미

프로그램 내에서 식별자(Identifier)를 그 대상과 관련짓는 것

변수, 배열, 라벨, 절차 등의 명칭, 즉 식별자와 그 값을 연결시키는 것

 

(2) 바인딩 시간(Binding Time)

프로그램에서 변수들이 갖는 속성이 완전히 결정되는 시간

이름에 속성이 연결되는 시간

 

 

2. 바인딩 시간의 종류

 

(1) 실행 시간 : 동적 바인딩(Dynamic Binding)

바인딩이 프로그램 실행중 그 순간의 상태에 따라 이루어지며, 늦은 바인딩이라고도 함

변수에 값을 바인딩하거나 변수에 저장 장소를 바인딩 하는 것

 

① 모듈의 시작 시간

부프로그램(Subroutine)이나 블록(Block)을 시작할 때 바인딩이 일어나도록 하는 경우가 많음

C나 Pascal에서 저장 장소에 대한 형식 매개 변수(Formal Parameter)와 실 매개 변수 (Actual Parameter)의 바인딩은 부프로그램의 시작에서만 일어나도록 함

지역 변수들에 대한 기억 장소 할당

 

② 실행시 임의의 시간

프로그램 실행중 임의의 시간에 바인딩이 일어날 수 있음

거의 모든 언어에서 배정문(Assignment Statement)을 통해 변수의 값을 바인딩 하는 경우

LISP와 ML 같은 일부 언어에서는 메모리에 대한 이름의 바인딩을 임의의 시점에서 일어 나도록 함

 

 

(2) 번역 시간 : 정적 바인딩(Static Binding)

바인딩 실행 전 컴파일, 링크(Link), 로드(Load) 시간에 이루어지며 정적 바인딩이라 함

변수의 형, 자료 구조의 형과 크기, 레코드의 각 항목들의 형들을 확정, 변수에 대한 기억 장소를 바인딩하는 것

 

① 프로그래머에 의해서 선택된 바인딩

프로그래머는 프로그램 작성시 번역 시간 동안 바인딩해야 하는 변수의 형, 문장구조 등 에 대해 미리 결정함

 

 

② 번역기에 의해서 선택된 바인딩

프로시저에 할당된 저장소 안에 있는 자료 객체의 상대적 위치나 배열의 저장 방법과 크 기 등은 언어 번역기가 결정함

 

③ 적재기(Loader)에 의해서 선택된 바인딩

메모리에 프로그램을 실행할 컴퓨터의 실제 주소를 할당

FORTRAN의 기억 장소 할당도 Load 시간에 행해짐

 

 

(3) 언어 정의 시간

 

① 한 언어의 특징은 그 언어가 정의된 시점에서 대부분 확정됨

② 자료 구조, 프로그램 구조 등과 같은 특징은 언어를 정의할 때 고정됨

허용된 자료 구조, '+'와 '*' 등 연산의 종류 등

 

 

(4) 언어 구현 시간

 

① 언어에서 정수의 자릿수, 실수의 유효 숫자 개수 등이 바인딩 되는 시간

integer type 변수의 길이(16 bit or 32 bit) 등

② 언어 구현 시간의 바인딩을 최소화하여 특정 기종에 구애받지 않는 호환성을 갖도록 함

 

 

 

초기 바인딩과 후기 바인딩의 장단점은 효율성과 편리성에 의해서 서로 상충된다. 수행 시간이 주요 관건인 언어(FORTRAN, Pascal, C)에서는 가능한 한 바인딩이 번역 시간에 이루어지도록 설계되었다. 그러나 LISP, ML과 같이 편리성이 중요한 언어에서는 대부분 바인딩을 실행 시간까지 지연시켜서 자료에 의존할 수 있도록 하였다. 효율성과 편리성을 모두 중요시한 Ada와 같은 언어에서는 바인딩 시간을 선택할 수 있도록 하였다.

 

 

 

 

 

 

 

 

 

 

 

 

* 자료형의 명세와 구현

[명세]

- 속성

- 값

- 연산

[구현]

- 저장방법

- 연산의 구현

 

 

* 선언의 목적

1. 저장 방법에 대한 선택 : 선언이 언어번역기에게 자료형과 자료 객체의 속성에 대한 정보를 제공한다면, 번역기는 그 자료 객체에 대해 번역된 프로그램의 수행 시간과 필요한 저장소를 절감할 수 있는 최선의 저장 방법을 결정할 수 있다.

 

2. 저장소 관리 : 선언에 의해 제공된 자료 객체의 수명에 관한 정보는 프로그램 수행중에 효율적으로 저장소를 관리할 수 있도록 해준다.

 

3. 다항적 연산

 

 

* 강성 형(Strong typing)

프로그램 안에 있는 모든 형 오류가 정적으로 발견될 수 있으면 그것을 강성 형 언어라 부른다. 안전한 형을 가진 모든 연산에 대해 결과가 올바른 형이라는 것을 정적으로 d라 수 있으며 동적인 검사가 필요하지 않다. 분명히 모든 연산이 안전한 형이면 그 언어는 강성 형 언어이다.

완전하게 강성 형인 언어는 거의 없다. 예를 들어 C에서 X와Y가 short형이면 X+Y와 X*Y는 short 정수의 계산 허용 범위를 벗어날 수도 있으며, 형 오류를 일으킬 수도 있다. 완전한 강성 형은 아니지만 한 단계의 형 변환으로 제한하면, 강성 형에 비슷하게 접근 할 수 있다.

 

*모호성

A(I,J) 와 같은 경우 FORTRAN구문에서 함수 호출을 위한 구문과, 2차원 배열을 참조하는 구문으로 모두 쓰일 수 있다.

두 실행 순서 중 어느 것인지가 불확실 하기 때문에 위의 문장의 모호하다.

모호성의 문제를 해결하기 위해 begin....end / if....end if 와 같은 구분문자 짝을 사용한다.

 

*묵시적(암시적) 인수(Implicit arguments)

프로그램에서의 연산은 인수를 이용하여 호출된다. 그러나 전역변수 혹은 다른 비지역변수를 통하여 암시적인 매개변수에 접근하는 경우가 있다. 연산의 결과에 영향을 미치는 모든 자료를 완벽하게 결정하는 것은 암시적인 인수 때문에 힘들다

 

*부수효과(Side effect)

어떤 연산이 덧셈의 결과로서의 합을 반환할 때, 그 값은 프로그래머 혹은 시스템이 정의한 다른 자료 객체의 값을 변경시킬 수도 있다. 그러한 암시적인 결과를 부수효과라 한다. 함수는 결과를 반환할 뿐만 아니라, 입력 인수도 변경시킬 수 있다. 부수효과는 많은 연산의 일부분이다. 특히 자료 구조를 변경하는 경우에 대헤서는 더욱 그러하다. 따라서 이러한 부수효과는 연산의 영역을 정확하게 명시하는 것이 힘들다.

 

*쓰레기(Garbage)

자료 객체에 대한 모든 접근 경로가 없어지고 자료 객체가 계속해서 존재할 때 그것을 쓰레기라 한다. 그 자료 객체는 프로그램의 다른 곳에서 접근할 수가 없기 때문에 더 이상 사용이 불가능하고, 그 자료 객체에 대한 바인딩은 그대로 남아있기 때문에 그 공간은 다시 사용할 수 없다. 메모리가 한정되어 있기 때문에 쓰레기를 자꾸 만들어 가는 것은 귀찮은 문제를 야기시킨다.

 

*허상참조(Dangling reference)

허상 참조는 관련된 자료 객체의 수명이 다한 후에도 접근 경로가 존재하는 경우를 말한다. 원래 접근 경로는 자료 객체의 위치로 이끌어 주는 역할을 한다. 객체의 수명이 다하면, 이공간은 후에 다른 객체를 위해 사용이 가능해야 한다. 그러나 그 공간을 다시 사용할 수 없다고 해서 현재의 접근 경로를 없애는 것이 아니면 허상참조로 계속해서 존재한다.

허상참조는 무결성에 해를 끼치기 때무에 기억장치 관리에 심각한 문제를 야기시킨다.

 

*포인터

포인터 자료 객체는 다른 메모리 공간의 주소를 포함하고 있는 메모리 위치로 나타낸다. 그 주소는 포인터에 의해 지정된 자료 객체를 나타낸 공간의 기준 주소이다. 포인터 값을 위한 두 가지 저장 방법이 존재한다.

1.절대주소 : 포인터 값이 자료 객체의 메모리 공간의 실제 주소이다.

2.상대주소 : 포인터 값은 자료 객체가 저장될 수 있는 힙 블록의 기준 주소로부터의 변위를 나타낸다(base+offset)

저작자 표시 비영리 변경 금지
신고