프로그래밍 언어론 6-1-2강(3). Assignments(할당) - Orthogonality(직교성)

[프로그래밍 언어론]

2019. 11. 10. 15:05

 

[Orthogonality(직교성)]**

: 여러 특성들을 다른 특성들과 관계없이(독립적) 특성들이 어떤 조합이든 사용될수 있고, 이 특성들이 모두 이치에 맞고, 주어진 특성의 의미가 일치함을 의미한다.

: 즉, 언어의 제어구조와 데이터 구조 생성을 위해 적은 수의 기본 구조(특성)들을 조합되어 사용된다.

: 일반적인 언어 디자인의 목표는 언어들의 여러특징들을 최대한 orthogonal 하게 만들고자 한다.

 

 

 

[Algol 68에서 직교성]

: 주요 디자인 목표로 orthogonality를 만든 첫번째 언어

: expression-oriented라 불린다 (statement에 대한 독립된 개념 없음)

: 임의의 표현은 다른 언어들에서 statement를 부르는 문맥으로 나타날 수 있다.

= statement라 생각한게 expression 형태로 보여진다.

begin
  a := if b < c then d else e;  //statement라 생각한게 expression 형태로 보여짐
  a := begin f(b); g(c) end;
  g(d);
  2 + 3
end

line2) if...then...else 구조의 값은 조건 값에 따라 "then" 부분의 값 또는 "else" 부분의 값이다.

line3) 두번째 assignment 오른쪽의 "statement list"의 값은 최종 "statement"의 값, 즉 g(c)의 반환값이다.

: 모든 서브루틴이 반환 값을 호출하기 때문에, 절차(precedures)와 함수(functions)를 구별할 필요 없다.

line4) g(d)에 호출되는 반환값은 폐기된다.

: 최종적으로 전체 코드 실행 결과 값은 5 (2 + 3)이다.

 

 

 

[C에서의 직교성]

: C는 statement와 expression을 구분하지만, statement의 클래스들중 하나가 표현식의 값을 계산하고 버리는 "expression statement"이다.

(이 특성이 표현식을 statement가 필요한 문맥 어디서든 나타날수 있게 해준다)

# C언어의 expression statement 예시

x = (y + 3);        /* x가 expression y+3의 값으로 할당된다. */
x++;         
x = y = 0           /* x와 y가 동시에 0으로 초기화된다 */
proc(arg1, arg2);   /* 함수가 void 반환 호출 */
y = x = (f(x) + 3);

: statement는 표현식 문맥에서 일반적으론 사용되지 못한다.

: C가 selection과 sequencing에 대해서 특별한 표현식 양식을 제공한다.

: Algol 60은 "if...then...else"를 statement이자 expression으로 동시에 정의한다.

 

 

 

[다른언어에서 assignment]

- 두언어 둘다 표현식내의 assignment(할당)를 허용한다. (algol 60은 :=을 사용 / C는 =를 사용해 할당한다.)

- C는 ==를 이용해 동일함을 테스트할수있다.

- C에서 booelan 값으로 기대되어지는 문맥에서, int로 강제화 할수있는 것들을 전부 허용한다.

if (a == b) { /*a = b면 수행 */ }
if (a = b) { /* b를 a에 할당하고 결과값이 zero가 아니면 수행 */ }

- C++에서도 동일하게 작동하는데, 여기서는 숫자, 포인터, 정수타입등에 자동형변환을 지원하기에 문제가 발생한다.

- JAVA와 C#는 int를 boolean 문맥에 허용하지 않음으로써 이 문제를 해결( if(a=b) 허용 X)

 

 

 

[C에서의 직교성의 문제점]

void func(int b);

int a=3;
func(a);

typedef struct {int a, b} S;  //구조체 값을 전달할 수 있어야 직교성 성립
void func(S s);
S a = { 1, 2 };

/* 구조체 처리에대해 일관성이 없다 (되는거 안되는거 따로 존재) */
func(a);     /* ok */
func({1,2}); /* not ok */
a = {3,4};   /* not ok */

S f(void) {
  return {3, 4};  /*not ok (구조체 직접반환 불가능) */
  
  
S s1 = {3, 4};    /*이런건 가능*/
...
  return S        /*이런건 가능*/

: 순수한 C에서 구조체에 다양한 선언들을 넣을수있지만, 함수를 넣는것은 불가능 하다. (C언어는 기본적으로 value model 이다)

: JAVA 변수 선언 객체 x는 primitive 타입(value model 방식)을 제외한 어떤 클래스 타입에든 할당될 수 있다.

: ' switch or case'를 가지고 있는 대부분의 언어들이 해당 구조에서 사용될수있는 타입을 int나 다른 단순타입들로 제한한다.