본문 바로가기

공부/프로그래밍언어론

계산 전형 (computational paradigm)

프로그래밍 언어는 컴퓨터의 연산을 모방하고 추상화하는 데서 비롯되었다.

따라서 컴퓨터의 구조가 언어설계에 영향을 미치는 것은 지극히 당연하다.

프로그래밍 언어는 명령의 순차적 실행, 기억장소 위치를 표현하는 변수의 사용,
변수의 값을 변경하기 위한 배정문의 사용을 특징으로 할 수 있다. 이러한 언어를
명령형 언어(imperative L.) 또는 절차적 언어(procedural L.)라고 한다.

 

명령형 언어(imperative L.), 절차적 언어(procedural L.)

- 특징

  • 명령의 순차적 실행
  • 변수 사용
  • 배정문 사용

- 문제점

  • 폰 노이만 병목현상 발생
    계산이 순차적 명령에 의해서 실행되야 하는 것이 이유
  • 많은 자료의 동시 계산, 비결정적 계산, 순서에 의존하지 않는 계산 등에 비효율적
    대표적인 예: C, Ada, Pascal, Fortran, Basic 등 대부분 언어

위의 비효율적인 문제를 극복하기 위한 대표적인 두 가지 프로그래밍 언어 형태가 있는데,
함수개념에 기반을 둔 함수형 언어(functional L.),
기호 논리학에 기반한 논리형 언어(logical L.)가 바로 그것이다.

 

함수형 언어(functional L.), 적용형 언어(applicative L.)

함수형 언어에서는 계산의 기술이 함수들의 평가 즉, 알려진 값들을 함수들에 적용하는

것에 기반을 둔다. 따라서 이러한 언어를 적용형 언어(applicatvie L.)라고도 한다.

 

함수형 프로그래밍 언어는 함수의 평가와 함수 적용을 기본으로 한다.

 

- 특징

  • 함수의 평가 및 호출 방법을 제공
  • 변수, 배정문이 없음
  • 반복 연산은 재귀적 함수 이론에 의해 기술됨(수학적 이론)
    반복문에 의해 기술되지 않는다.

다음의 예는 Modula-2를 사용하여 최대 공약수를 구하는 문제를

각각 절차형과 함수형으로 프로그래밍한 예이다.

PROCEDURE gcd (u,v : INTERGER;
                             VAR x : INTERGER);
VAR y, t : INTERGER
BEGIN
   x := u ; y := v ;
   LOOP
      IF y <= 0 THEN
         EXIT
      END ;
      t := y;
      y := x MOD y;
      x := t;
   END;
END gcd;

 

PROCEDURE gcd (u,v : INTERGER) : INTEGER;
BEGIN
   IF v = 0 THEN
      RETURN u;
   ELSE
      RETURN gcd (v, u MOD v);
   END;
END gcd;

요즘 안 쓰이는 언어라서 그런지 modula-2 언어에 대한 정보는 대부분이 영어였다.
교수님도 그냥 대충 언급하고 넘어가기도 했고, 나도 이것까지 공부하려면 막막하기에

이 포스팅에 나오는 예시들은 그냥 이런게 있다... 하고 넘어가면 될듯하다.

 

다음의 예는 절차형 언어를 사용한 함수형 프로그래밍 예이다.

// Modula-2 (최대공약수)
PROCEDURE gcd (u,v : INTERGER) : INTEGER;
BEGIN
   IF v = 0 THEN
      RETURN u ; //return문으로 값을 되돌려준다.
   ELSE
      RETURN gcd (v, u MOD v);
   END;
END gcd;

 

// Java (최대공약수)
int gcd (int u, int v) {
   if ( v == 0)
      return u ; //return문으로 값을 되돌려준다.
   else
      return gcd (v, u % v);
}

다음은 함수형 언어를 사용한 함수형 프로그래밍 예이다.

// Lisp
define
(gcd u v) (if ( = v 0) u (gcd v (remainder u v ))))
//괄호 안의 첫 번째 항목인 함수를 평가하면서 실행된다.

 

논리형 언어(logical L.), 선언적 언어(declarative L.)

논리형 언어는 기호 논리학에 근거를 두고 있다. 논리형 언어에서는 계산을
실행하기 위한 순서를 기술하는 대신에 무엇을 하려고 하는가를 기술함으로써
프로그램 하게 된다.

순수한 논리형 프로그램은 반복이나 선택문을 필요로 하지 않으며, 계산의 내용만을
선언하듯이 기술한다. 따라서 논리형 언어는 선언적 언어(declarative L.)라고도 불린다.

 

- 특징

  • 기호 논리학에 근거
  • 계산의 실행 순서(how) 대신 무엇을 하려고 하는가(what)를 선언
  • 반복이나 선택 개념 불필요

- 최대 공약수 (gcd)에 대한 논리적 기술

  • v = 0이면 u와 v의 gcd는 u이다.
  • v > 0이면 u와 v의 gcd는 v와 u mod v의 gcd와 같다.

다음은 위의 논리적 기술에 대한 논리형 언어인 Prolog의 예이다.

gcd(U,V,U) :- V=0.
gcd(U,V,X) :- V>0,
                    Y is U mod V,
                    gcd(V,Y,X).

 

객체 지향 언어(object-oriented L.)

최근에는 많은 주목을 받고 있는 객체 지향 언어라는 프로그래밍 언어 유형이 있다.

상태를 의미하는 기억 장소와 상태를 변경할 수 있는 연산의 잡한인 객체에 기반을

둔 언어라고 할 수 있겠다.

객체는 클래스의 선언으로 그룹화된다.

클래스의 선언은 C나 Pascal에서의 구조형 자료를 선언하는 방법과 유사하다.

객체는 다시 특정 예를 생성하는데 이를 클래스의 인스턴스라고 한다.

객체 지향의 방법을 처음 소개한 언어는 Simula 67이다.

 

다음은 Java로 최대 공약수와 최소 공배수를 구하는 클래스를 선언한 객체 지향

프로그램이다.

// 객체 지향 언어 (object oriented L.) 예
// Java로 작성된 최대공약수 선언부
class GcdLcm { // 클래스 GcdLcm 선언
   public int gcd, lcm;
   int x, y;
   GcdLcm (int num1, int num2) {
      x = num1;
      y = num2;
      gcd = gcdf (x, y);
      lcm = x * y / gcd;
   }
   int gcdf (int a, int b) {
      if (b == 0)
         return a;
      else
         return gcdf (b, a % b);
   }
}
class Main { // 클래스 GcdLcm 테스트 프로그램
   public static void main (String[] args) {
      GcdLcm g1, g2 = new GcdLcm (1000, 100);
      g1 = new GcdLcm (18, 27);
      System.out.println (“g1.gcd :” + g1.gcd + “g1.lcm :” + g1.lcm);
      System.out.println (“g2.gcd :” + g2.gcd + “g2.lcm :” + g2.lcm);
   }
}

GcdLcm 클래스 사용 예

  • GcdLcm 클래스의 객체 g1, g2 정의
    GcdLcm g1, g2;
  • g1의 기억 장소 할당
    g1 = new GcdLcm (18, 27);
  • g1이 갖는 값을 참조
    a = g1.gcd;
    b = g1.lcm;

 

'공부 > 프로그래밍언어론' 카테고리의 다른 글

1950년대: 최초의 프로그래밍 언어  (0) 2020.04.25
디지털 컴퓨터 이전의 언어  (0) 2020.04.25
언어 정의  (0) 2020.04.24
프로그래밍 언어에서의 추상화  (0) 2020.03.28
프로그래밍 언어란?  (0) 2020.03.22