약 5분

Language Design Issues

Language Design Issues
Photo by Merve Sehirli Nasir / Unsplash

프로그래밍 언어의 역할?

: 사람, 기계와의 의사소통!

  • 컴퓨터가 알아들을 수 있게 | Man-Machine Interface
  • 다른 사람이 알아들을 수 있게 | Man-Man Interface

프로그래밍은 "쓰기"가 강조되는 분야.

하지만 "읽기"도 무시해서는 안 됨! -> 가독성이 중요함

프로그래밍 언어를 학습하는 이유?

  • 효과적인 알고리즘 개발을 위한 능력 향상
  • 프로그래밍 언어를 더 잘 이해하여 효과적으로 사용
  • 유용한 프로그래밍 언어의 기능 사용법을 익히기 위해
    • Class
    • Co-routine
    • ...
  • 상황에 맞는 언어를 선택하기 위해
  • 새로운 언어를 쉽게 배우기 위해
    • 프로그래밍 언어들 간에는 많은 유사성이 있음
    • 새로운 언어를 학습하는 시간을 절약할 수 있음!

아는 만큼 보인다. 아는 만큼 쓸 수 있다

프로그래밍 언어의 분류

  • 문제 영역에 따른 분류
    • 사무
    • 과학 계산
    • 인공지능
    • ...
  • 패러다임에 따른 분류
    • 절차지향
    • 함수형
    • 객체지향
  • 계산 모델에 따른 분류
    • 명령형 - 폰 노이만 컴퓨터 구조 기반
    • 함수형 - 순환 함수 이론 기반
    • 논리형 - 연역적 논리 기반

프로그래밍 언어의 변천사

  • 초창기: 컴퓨터 가격 >>>> 프로그래밍 비용
    • 프로그램의 수행 효율이 굉장히 중요했음!
  • 현대: 컴퓨터 가격 << 프로그래밍 비용
    • 클래스, 상속, 캡슐화, 예외 처리 등 고급 개념들이 프로그래밍 언어에 도입됨
    • 고성능의 컴파일러가 효율적인 기계어 번역을 도와줌
  • 1950년대: 일괄 처리 환경 (Batch)
    • 고가의 메인프레임, 한 번에 하나의 프로세스만 처리 가능
    • FORTRAN, ALGOL, LISP
  • 1960년대: 시분할 환경 (Time Sharing)
    • 메인프레임에 여러 대의 터미널이 붙음. 멀티프로세싱
    • COBOL, BASIC
  • 1970~: 마이크로 컴퓨터의 등장 및 보급 (Personal Computer)
    • Pascal, C, Smalltalk

좋은 언어의 조건?

: 베스트셀러 != 좋은 책, 성공한 언어 != 좋은 언어

  • 명료성 (Clarity), 간결성 (Simplicity), 일관성 (Unity)
    • 간단하고 명확해야 배우기 쉽다!
  • 다양한 응용 분야를 지원 (via Language Features)
    • 필요한 것을 바로 지원하거나, 없으면 직접 만들 수 있도록
  • 직교성 (Orthogonality)
    • 여러 기능들을 예외 없이 임의로 조합할 수 있는가?
    • 즉, 기능들의 독립성이 보장되어 있는가?
    • 함수형 언어는 함수에 관한 한 직교성을 지원함
  • + 추상화 지원, 테스트 용이성, 이식성, 언어의 비용 등등

프로그래밍 언어의 비용?

  • 프로그램 작성 비용 (Cost of Program Creation)
  • 프로그램 번역 비용 (Cost of Program Translation) - 기계어로의 번역
  • 프로그램 수행 비용 (Cost of Program Execution)
  • 프로그램 유지보수 비용 (Cost of Program Maintenance)

프로그래밍 언어의 패러다임

패러다임(Paradigm): 한 시대를 지배하는 개념, 총체적인 틀

프로그래밍 언어에서의 패러다임: A general model for Problem Solving

명령형, 절차지향 (Imperative / Procedural Languages)

  • 계산 모델: 상태 전이 기계 (State Transition Machine)
    • 초기 상태에 입력이 있고, 상태 전이를 거친 최종 상태에 출력이 존재함
  • 특징: 상태를 변경하는 명령문 중심의 언어
  • 예시: FORTRAN, COBOL, C

함수형 (Functional / Applicative Languages)

  • 계산 모델: 입력값을 받아 출력값을 내는 함수
    • (순수 함수형 언어는) 변수가 없고, 대입 연산도 없다
    • 출력값은 입력값과 무관함
  • 특징: 함수 합성(Function Composition)을 활용함
    • 심지어는 자기 자신을 자신과 합성할 수도 있음 (재귀함수)
    • 원하는 함수를 작성하는 것이 주된 프로그래밍 작업
  • 예시: LISP, Scheme, Haskell, ML

객체지향 (Object-Oriented Languages)

  • 계산 모델: 객체들 간의 상호작용
    • 주로 명령형 패러다임의 언어 위에 구현됨
  • 특징: 유일한 신원을 갖는 객체들로 프로그램을 구성함
    • 클래스들은 IS-A 관계를 통해 계층 구조를 가질 수 있음
    • 객체는 클래스의 실체(Instance)
    • 객체는 속성(Property)과 동작(Behavior)을 가짐
      • 속성은 데이터(data, imperative concepts)
      • 동작은 메서드(method, applicative concepts)
  • 예시: Smalltalk, C++, Java

구조화 프로그래밍

: goto 사용을 지양하고, 흐름을 따라가기 쉽도록 깔끔하게 짜 보자

  • 배경: 막짠 코드(Spaghetti Code)는 이해하고 디버깅하기 어렵다
  • 이론적 기반: Böhm-Jacopini theorem
    • 순차, 선택, 반복 세 가지 구조로 모든 프로그램을 작성할 수 있다
    • 순차(Sequence): 한 작업 후에 다른 작업을 하는 것
    • 선택(Selection): 조건에 따라 둘 중 하나를 선택해 실행하는 것
    • 반복(Iteration): 조건을 만족하는 동안 같은 작업을 반복하는 것

언어 표준

: 표준과 구현은 1:1 대응이 아니다!!

  • 언어 표준: 문서 (언어의 설계도)
  • 언어 구현: 컴파일러, 인터프리터
  • 표준화를 담당하는 기관들: ISO, IEEE, ANSI, ...
  • C99처럼 사실상 표준이나 마찬가지인 것들도 존재
    • de facto standard

국제화

: i18n이라고도 함! (internationalization을 보면, i와 n 사이에 18개의 문자가 있음)

  • 관련 주제들: 문자 세트(Unicode와 같은 charset), 날짜 표기, 통화 단위, 미터법, ...