[PL] 3. 프로그래밍 언어 설계 원칙

Jimin·2022년 4월 18일
0

1. 효율성 (efficiency)

  • 효율성의 기준에 따른 분류

    • 목적 코드의 효율성
    • 번역의 효율성
    • 구현의 효율성
    • 프로그래밍 효율성

  • 목적 코드의 효율성
    : 번역기의 효율적 실행 모드 생성 → 최적화

  • 번역의 효율성
    : 적절한 크기의 번역기로 빠르게 번역할 수 있는 것

  • 구현성
    : 번역기의 효율적인 구현 문제

  • 프로그래밍 효율성

    • 프로그래밍 작성의 단순성, 용이성 문제
    • 언어의 표현성, 추상화 메커니즘과 관련

2. 일반성, 직교성, 획일성

1) 일반성

* 일반성이 갖는 문제점

→ 일반성은 다른 원칙들을 거스르는 위험한 원칙!
  • 언어의 간결정 저하
  • 언어의 판독성 저하
  • 언어의 신뢰성 저하
    ex) c언어 포인터 (일반성 제공): 자바는 포인터를 불허하며 다른 방법을 지원하며, 파스칼에서는 포인터가 본질적으로 제한됨.

2) 직교성 (Generality)

→ 2개 이상 기능이 같이 동작할 때 문제가 없어야 함.
: 같은 언어의 구성자가 문맥이 다르다고 다르게 행동해서는 안된다는 것이 관점임.

* Algol 68의 중요 설계 목표 → 직교성 보장

  • 매개변수 전달 기법
    C: 배열 - callby reference, 이외 모든 자료형 - call by valude 방식 → 직교성의 문제도 발생

3) 획일성 (Uniformity)

: 언어 구조들의 외모와 행동에서의 조화에 중점을 둠.

  • ex) 세미콜론(;): Modula-2, Pascal에서 문장 구분자와 선언 종결자로 사용 (c언어에서는 종결자로만 사용)

4) 프로그래밍 언어의 기타 설계 원칙

  • 간결성: 직교성, 일반성, 획일성은 간결성을 보장 못 함 (ex. Algol 68)
    • 구성자의 수가 적다고 언어가 간결한 것은 아님
      → 과다한 단순성: 언어 사용에 방해, 표현력이 부족, 많은 제한 발생

  • 표현력: 복잡한 과정이나 구조를 표현하는데 용이함을 의미

    • 표현력은 강하지만 단순하지 않은 언어: Lisp, Prolog, Algol 68
    • 표현력이 강하면서 단순한 언어: C언어
      → 구조는 전달력과 필연적 관계가 아님!

  • 정확성: 언어에 대한 정확한 정의, 언어의 행위가 예측 가능한 정의의 존재 여부

    • 정확한 언어 정의, 언어와 번역기의 신뢰도에 영향을 미침

  • 안정성: 프로그래밍 오류를 줄이고, 오류 발견 용이한 언어 목표
    • 언어의 신뢰성과 정확성에 밀접한 관계
    • 언어 설계 시 자료형, 형 검사, 변수 선언을 도입

  • 기존 표기나 규칙과의 일관성
    • 언어 설계 시 표준화된 특성과 개념을 갖도록 해야 함
    • Algol 68: 표준화된 표기를 잘 따르지 않은 언어 (ex. type 대신 mode 사용)

  • 확장성
    • 사용자가 언어의 특성을 쉽게 부가하도록 허용하는 기법
    • 확장성을 가진 언어의 예: Lisp
    • 명령형 언어는 함수형 언어보다 언어 확장이 어려움
    • 추상화 개념 (자료 추상호, 제어 추상화)은 확장성 지원

4. 프로그래밍 언어의 기타 설계 원칙

1) 제약성, 부분성: 일부의 언어 지식과 언어 구조만 가지고도 효과적인 프로그램 작성 가능

  • 언어 제한성의 장점
    • 프로그래머는 언어의 효과적인 사용을 위해 언어 전체를 배울 필요 없음
    • 번역기 작성자가 언어 일부분만을 선택하여 구현, 사용 가능(부분 언어 지원)
  • 성공적인 언어 설계를 위한 충고
    • 신뢰성: 프로그램의 신뢰성을 위해 진단 컴파일러 또는 점검 컴파일러 사용
    • 효율적인 번역
      • 초기 고급 언어: 분리 컴파일 제공, 효율적 번역 가능, 오류 유발

0개의 댓글