Computer Science/프로그래밍언어론

Chapter1 Language Design Issues

윤재에요 2023. 4. 18. 20:22

프로그래그래밍 언어의 역할

  • 자연어: 의사소통의 위해
  • 프로그래밍 언어: 프로그램작성을 위해 (컴퓨터가 알아듣도록, 다른사람이 이해하도록

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

  • 효과적인 알로리즘 개발을 위한 능력 향상
    • 통상 언어의 모든 기능을 알지 못함
    • 언어에서 제공하는 여러 기능을 활용하여 알고리즘 개발
    • 잘못 사용하면 수행속도가 느려지고, 자원낭비, 논리적 오류(ex. recursion, objected oriented)
  • 프로그래밍언어를 더 잘 이해하여 효과적 사용
    • 내부(어떻게 구현되어 있는지)를 잘 알면 언어에 대한 이해도가 높아져 프로그램 작성 늘력 증가
    • ex) 속도 증가, 서브프로그램 호출, 배열의 메모리 배정
  • 유용한 프로그래밍 요소 사용법을 익히기 위해
    • Class,Recursion, Co-routine 등
  • 더 적합한 언어를 선택하기 위해
    • 어떤 언어를 선택하면 코딩 부담(개발비용,시간 등) 을 줄일수 있을까?
  • 새로운 언어를 쉽게 배우기 위해
    • 프로그래밍 언어들은 많은 유사한 특징이 존재
    • 새로운 언어를 학습하는 시간 절약
  • 새로운 언어를 쉽게 설계하기 위해
    • 인터페이스 설계, 컴파일러 구현 등에 프로그래밍 언어의 개념이 적용

프로그래그래밍 언어의 분류

1. 해결하려는 문제 영역(domain)에 따른 분류

2. 프로그래밍 패러다임(스타일)에 따른 분류

  • 절차언어(Imperative) : FORTRAN, Pascal, C, ...     
    • f(x) + g(h(z,y),i(j,k) 의 경우 a=f(x) , b= h(z,y) , c= i(j,k) , d= g(b,c) , e= a+d 순으로 저장해나가며 연산
  • 함수형 언어(functional) : LISP, Scheme, ML, Haskell, ...
    • f(x) + g(h(z,y),i(j,k) 의 경우 j,k계산하여 i / z,y계산하여 h / x->f / i,g 계산하여 f와 다하여 결과, 저장하지 않고 함수의 output이 바로 input이 된다.
  • 모듈 기반 언어: Modula-2, Ada, ...
  • 객체 지향 언어: Smalltalk, C++, Ada, Java, ...
  • 지네릭(generic) 프로그래밍 언어: Ada, ML, C++,...
  • 선언적 언어(룰기반): Prolog,...

3. 계산모델(Computational model)에 따른 분류

  • 명령형 언어: von Neumann 컴퓨터 구조를 기반으로 함
  • 함수형 언어: 순환 함수 이론을 기반으로 함
  • 논리 언어: 수학적 논리(연역 논리)를 기반으로 함

 

프로그래밍 언어의 목표 변천사

  • 초창기: 1950년대 중반~1960년대
    • 언어와 하드웨어가 밀착되어 있던 시기: 대표적인 예로 go to statement
    • 컴퓨터값이 고가이므로 프로그래머의 인건비가 상대적으로 저가였던 시기
    • 프로그램 수행 효율이 매우 중요했음
  • 현재
    • 컴퓨터 값이 저렴하고 프로그래밍 비용이 고비용
    • 고성능 컴파일러가 효율적인 변역을 도와 줌
    • 고급 개념이 프로그래밍 언어에 도입됨 : 클래스, 상속, 캡슐화, 예외 처리, assertion 등

 

소프트웨어 아키텍처의 발전

  • 1950년대: 일괄처리 환경(batch)
    • 고가의 메인 프레임
    • 하나의 프로세스만 처리가능 ( 컴퓨터 하나에 단말기가 여러개 붙어 있고 시간을 분배하여 돌라가면서 사용)
  • 1960년대: 대화형(time-sharing) 환경
    • 메인프레임에 여러 터미널
    • 다중 프로세싱
  • 1970년대: 미니 컴퓨터와 마이크로컴퓨터의 등장
  • 1980년대: PC의 보편화
    • 윈도우 기반의 GUI 보급
  • 1990년대: 클라이언트-서버 컴퓨팅
    • Networking, The Internet, the World Wide Web
  • 2000년대: Embedded, Ubiquitous, Cloud, ...

 

일괄처리 환경(batch)

  • IBM704: 1950년대 후반, 전세계 4대, 4K word core memory
  • 오퍼레이터만 들어갈 수 있음
  • 80-columm punched cards: 카트한장이 코드라인한개정도
  • Language: Fortran, ALGOL, LISP

시분할 환경 (time sharing)

  • IBM7094: 1963년 개발, 1964~1968 동안 사용됨, 36bit 머신
  • Language: COBOL, PL/I, APL, BASIC

미니 컴퓨터, 마이크로 컴퓨터

  • 미니 컴퓨터: PDP 11(DEC)
  • 마이크로 컴퓨터: Apple 2, Apple Lisa, Macintosh
  • OS: UNIX, Apple Dos
  • Language: Pascal, C, Smalltalk

좋은 언어의 조건

  • 명료성(clarity) : 명확해야 배우기 쉽다
  •  
  • 간결성(simplicity): 간결해야 배우기 쉽다
  • 일관성(unity)
  • 직교성(orthogonality)
    • 몇개의 다른 기능을 임의로 조합할 수 있는 기능( 예외없이)
    • 기능들의 독립성이 보장되어 있다는 의미
    • 함수형 언어는 함수에 관한 한 직교성 지원
    • 객체지향 언어는 언어에 따라 다음
  • 자연스러운 응용 분아 지원(language features)
    • 필요한 것을 바로 지원하도록
    • 없으면 만들 수 있도록
  • 추상화 지원
    • Algorithms+Data Structures = Program
    • Controll Abstraction + Data Abstraction
  • 프로그램 테스트의 용이성 
    • 검증(vertification)
    • 테스트: Desk Checking(읽어 검증), Field Test(여러테스트셋)
  • 프로그래밍 환경
    • 잘 정리된 문서, 개발 환경, 테스트 도구 등
  • 프로그램 이식성
    • 지원하는 플랫폼이 다양한가
  • 비용

 

프로그래밍 언어의 비용

  • 프로그래밍 언어를 이용하여 프로그램을 개발하고 이를 관리하는 데 드는 비용
  • 프로그램 수행 비용
  • 프로그램 번역 비용
  • 프로그램 작성 비용
  • 프로그램 관리(유지보수) 비용

프로그래밍 패러다임

  • 패러다임 이란?
    • 한시대를 지배하는 총체적인 틀 또는 개념
    • 프로그래밍 패러다임: 문제 해결의 일반적인 모델
  • 프로그래밍 패러다임과 계산 모델
    • 언어가 지원하는 패러다임과 계산모델은 밀접한 관련이 있지만 정확히 일대일 대응 관계인 것은 아님
    • 명령형 언어: 폰노이만 모델
    • 함수형 언어: Recursive Function Model
    • 논리 언어: Deductive Reasoning Model
    • 객체지향 패러다임은 명령형 언어로 지원하는 것이 대부분이지만 함수형 언어로 지원할 수도 있다
  • 명령형 언어
    • 계산모델: 상태전이 기계(state transition machine, 입력은 초기상태에 있고 상태전이를 계속한 후 최종상태에 원하는 출력이 있음
    • 특징: 상태를 변경하는 명령문 중심의 언어
    • 구문:s1;s2;s3 ...
    • FORTRAN, COBOL, C, Pascal
  • 함수형 언어
    • 계산모델: 입력 값을 받아서 출력 값을 내는 함수
    • 출력 값은 입력 값과 아무 연관성이 없음
    • 변수도 없고 대입 연산도 없음
    • 함수 합성이 주요 프로그래밍 작업
    • 자신을 자신에 합성할 수도 있움 -> 재귀함수
    • 원하는 함수를 작성하는 것이 주요 프로그래밍 작업
    • 구문: P1(P2(P3(X))) , Greates(A,B,C) = Greater(Greater(A,B),C)
    • LISP,Scheme,ML,Haskell
  • 규칙기반 언어
    • 계산모델: 논리규칙에 입각한 추론
    • 입력: 명제의 조합
    • 출력: 추론 결과 얻은 명제 또는 명제의 일부
    • 문제의 여러 특성을 논리 규칙으로 설정하는 것이 주요 프로그래밍 작업
    • 엄밀히 말하면 규칙의 순서는 고려되지 않아야 하지만 사실상 순서를 중요시함
    • 구문: 'Goal <-Hypotheses'의 목록
    • 예: Prolog
  • 객체지향 언어
    • 계산모델: 실 세계 내의 객체들의 움직임
    • 특정 계산 모델을 가정하고 있지 않지만, 주로 명령형 패러다임의 언어에 구현됨
    • 유일한 신원을 갖는 객체들로 프로그램을 구성
    • 객체는 속청과 행위(행태)를 갖고 있음
    • 속성은 데이터로 구현되고 행위는 메소드로 구현됨
    • 객체는 클래스의 실체임
    • 클래스는 IS-A 관계를 통해 계층을 이룰 수 있음
    • 예: Smalltalk, C++, Java

구조화  프로그래밍

  • 출현 배경: 프로그램의 흐름 구조를 이해하기 어렵다, GO TO 논란과 관련 있음
  • 모든 흐음 제어 구조는 다음 세가지 구조로 표현 가능
    •  선택구조
    • 반복구조
    •  순차구조
  • 하향식 설계 밥법
  • 프라임 프로그래밍: 시작과 끝이 하나
    • 시작 ------------------끝
    • 반대:  시작--------끝------시작----끝--시작----시작---끝---끝

스파게티 코드와 구조화 코드

 

언어 표준화의 배경

  • ex) 다음 문장의 의미는? i= 1&&2+3|4;
  • 위문제에 답하기 위해서는 아래방법들이 있다
    • 언어 메뉴얼을 본다
    • 언어 표준을 본다
    • 실행해본다
  • 대부분 3번 방법을 택하지만 답을 확신할수없다.

언어 표준과 언어 구현

  • 언어 표준: 문서(언어 설계도)
  • 언어 구현: 컴파일러, 인터프리터
  • 표준=구현1=구현2 가 되기를 바라지만 다 다르게 구현한다.

표준화 기구

  • 언어 표준화를 담당하는 곳
    • ISO - International Standards Organization
    • IEEE - Institute of Electrical and Electrocis Engineers
    • ANSI - American National Standatds Institue
  • 이들 기구의 주요 담당 업무
    • 표준을 정의할 워킹그룹 결성(자원자로 이루어짐)
    • 새로운 표준안에 포함될 기능들 제시
    • 표준안에 대한 투표
    • 워킹그룹에서 통과된 표준안은 상위 기구에 상정
    • 표준안 공표 및 새로운 표준안 검토( 대략 5-10년 주기로 검토함)

언어 표준화 시기

  • 표준화시기
    • 너무 빠르면 구현된 것이 없으므로 언어에 대한 경험을 축적할 수 없음
    • 너무 느리면 여러 다른 버전이 존재할 수 있음
    • 적절하면 가장 좋지만 그런 예가 별로 없음
  • 언어표준화의 예
    • C-C89,c90,c95,c99,c11
    • LIST-1990
    • ML- 없음 그러나 SML이 사실상의 표준
    • Smalltalk - 없음
    • Prolog- 없음

프로그래밍 환경

  • 프로그래밍 환경
    • 프로그램 작성, 테스트에 사용되는 환경
    • 프로그램 수행 환경과는 구별됨
  • 프로그래밍 환경과 프로그래밍 언어
    • 프로그래밍 환경은 프로그래밍 언어의 사용층에 지대한 영향을 미침
    • 프로그래밍 환경은 프로그래밍 언어 설계에서 영향을 미치기도 함
      • 분리 컴파일
      • 테스트 및 디버깅

 

분리 컴파일

  • 분리 컴파일 시 공유되어야 하는 정보
    • 서브 프로그램 호출 정도
    • 공유되는 변수의 타입
    • 공동으로 사용해야 할 타입의 정의
  • 분리컴파일 지원을 위한 방법
    • 옵션1: 필요한 것을 다시 선언하도록 함
    • 옵션2: 특정 순서로 컴파일 되도록함(specification이 먼저오도록)
    • 옵션3: 관련 정보를 라이브러리 형태로 참조할 수 있도록 함
  • 용어 구분
    • 분리 컴파일: 인터페이스 정보를 필요로 할 수 있음
    • 독립 컴파일: 각 컴파일 단위가 독립적

테스트 및 디버깅

  • 테스트 및 디버깅 지원 방법
    • 실행순서따라가기(execution trace) : Prolog,List 등 대화형 언어
    • 중단점 설정(breakpoints) : 수행 순서가 명확한 명령형 언어의 경우
    • 조건 점사(assertion) : 프로그램 수행 도중 만족해야할 조건 검사
      • 예: assert(X>0 and A=1) or (X=0 and A>B+10)
      • Assertion은 배포 버전에서는 제거될 수 있도록 설계됨, 테스트코드 따로 관리하거나 주석처리해두기만 하기도함