프로그래밍 언어론 (chapter1-3)

1.3 프로그래밍 언어에서의 추상화

추상화 : 속성들의 일부분만을 가지고 주어진 작업이나 객체들을 필요한 정도로 묘사할 수 있는 방법을 지원하는 것.

추상화의 종류 : 자료추상화 , 제어 추상화

자료추상화 : 자료 특성 -> 개별적, 구조적, 단위 추상화로 분류

제어추상화 : 알고리즘 -> 기본적, 구조적 추상화로 분류

1.4 계산 전형

컴퓨터의 구조 —> 명령형 언어 -> 비효율. 따라서 함수형 언어와 논리형 언어 등장.

1.5 언어 정의

-> 구문론과 의미론

Q)되부름

장점: 간단하게 정의 가능 단점: 반드시 끝나는 조건 삽입

Q) 되부름보다 반복문이 왜 바람직한 방법일까?

-> ①기억공간 측면과 ②실행시간 측면

되부름을 하게 되면 호출될 때마다 새로운 기억공간을 요구하게 됨. 그렇지 않으면 되부름이 불가능함 (호출과 반환과의 관계 : Last In First Out)

기억공간의 확보 + 정보를 기억하여 환원까지 해줘야 한다. 따라서 실행비용이 추가로 발생.

프로그래밍 언어의 역사

년도 특징 언어
1950 실행의 효율성 중시 FORTRAN, COBOL, ALGOL60, APL, LISP
1960 다양한 언어 PL/I, ALGOL68, SIMULA67, BASIC, FORTRAN IV, FORTRAN66
1970 간결성, 추상화 C, Pascal, Prolog, FORTRAN77, CLU, Eculid, Mesa
1980 새로운 방향, 언어의 논리, 수학적 개념 Ada, Smalltalk, C++, ML, Modular2, Scheme, Common LISP, MIRANDA, SETL, Eiffel
1990 인터넷 대중화, 컴포넌트 개념 도입 JAVA, C#, PHP, HTML, XML

1950년대

  • 환경
    • 수치 계산 위주
    • 고가의 장비 사용
    • 실행의 효율성 중시
  • 특징
    • 기계의존적, 자연 언어 문법과 상이한 구문
  • 언어
    • 어셈블리 언어
    • FORTRAN, LISP, COBOL, ALGOL60, APL
    • 프로그래밍 기법 영향

FORTRAN

  • 최초의 고급 프로그래밍 언어
  • 컴파일러 사용 : 효율적인 기계어 생성
  • 제어 구문 등의 사용으로 이후 언어에 영향

COBOL

  • 레코드 자료 구조 도입
  • 자료 구조와 실행 코드 분리
  • 문서출력의 다양화 제공(PICTURE을 써서)
  • 사무처리를 위해 채책, 문법이 복잡하다는 단점

ALGOL 60

  • 추상화 -> Block 개념 도입 -> ① 부프로그램 ② 기억공간활용 ->한 덩어리로 묶어주는 것 - 캡슐화 한다 -> 이름의 자유도 상승

(부프로그램이란 subprogram, 즉 특정한 일을 여러번 실행할 필요가 있을 때 이를 실행하기 위해 논리적으로 별개의 프로그램으로 작성된 프로그램을 말한다. 되부름될 때마다 샐운 기억공간이 활용되어야 recursive한 프로그램이다.)

  • 스택 기반 실행 환경 도입
  • BNF 형태 최초 사용 (정형화 방법)

LISP

  • 인공지능 표현 언어
  • 리스트 구조와 함수 구조 적용
  • 쓰레기 수집 전략 개념 도입
  • 되부름의 원조

APL

  • 최초의 시분할 시스템 사용
  • 배열과 행렬에 대한 연산 요이
  • 단점 : 제어구조 없음, 그리스 기호 사용, 가독성 낮음

1960년대

언어개발 대중화, 특수 목적 언어 개발,

PL/I

  • IBM만 지원. 다른 회사 언어 지원x -> 사양.
  • 병행성, 기억장소 할당, 예외처리 도입
  • 번역기 작성 난해함. 실행 효율 저하

ALGOL68

  • Algol 60+ 타 언어 기능 + 일관된 구조
  • 완벅한 직교성 제공. 이론적으로 완벽
  • 메뉴얼의 복잡성(개념은 좋지만 구현이 힘들다)

SNOBOL

  • 문자열 처리 언어

BASIC

  • 비 과학자를 위한 수치계산
  • 단순한 언어 구문

1970년대

  • 하드웨어의 발전에 비해 소프트웨어 발전이 더딤
  • 하드웨어와 소프트웨어 비용 역전 추세
  • 언어의 간결성, 일관성을 추구하며 추상화 및 병행성 도입

Q) 구조적 프로그래밍이란 ?

  • 프로세스 지향적인 관점에서 프로그래밍 하는 방법
  • 때론, 절차식 프로그래밍이라고도 함
  • 블록이라는 단위를 이용하여 프로그램 작성
  • goto 문법의 사용 금지
  • 제한된 제어구조 만을 사용(순차구조, 반복구조, 선택구조)
  • 특정 프로그램내에서 하나의 시작점을 갖는 함수는 반드시 하나의 종료점을 갖음

PASCAL

  • 블록 구조 절차 언어
  • one in one out -> 직선형 수행 가능, 판독성 좋아짐(디버깅 유지보수 등 비용절감)
  • 강력한 형 검사
  • ALGOL68에서 생성

C

  • 범용 언어
  • 하드웨어 접근 용이 : 시스템 프로그래밍 가능
  • UNIX 운영체제 개발 언어 사용 -> 대중화 기여(공통으로 쓸 수 있는 운영체제를 만들어보자-> 고급 언어를 통해서만 가능 -> 새롭게 고안 C 언어)

1970년대 중, 후반 언어

  • 자료 추상화, 병행성 증명 등의 매커니즘을 집중적으로 시도
  • 소프트웨어의 위기 : 비용 증가 -> 생산성 향상을 위한 노력 -> 디버깅 시간 증가=> 프로그래밍 언어 간결화 + 추상화 => 디버깅 쉬워지고 신뢰도가 올라감. 유지보수 향상
  • CLU : 추상화 기법
  • Euclid : Pascal의 단점인 이명 개선
  • Mesa : 시스템 프로그래밍 용

1980년대

  • 개인용 컴퓨터 확산
  • 논리 작성용 언어 등장
  • 객체 지향 언어 연구 활봘

ADA

  • 군용 분야, 범용
  • 추상 자료형, 패키지 소프트웨어 요소들의 집합
  • 병렬 프로그래밍 지원
  • 대규모 프로그래밍 지원

c++

  • 추상화 캡슐화를 도입
  • 객체지향 설계 + c언어
  • C언어보다 강력한 형검사
  • 1980년대 등장한 함수형 언어

  • 스킴, Common Lisp, ML, Miranda

1980년대 등장한 기타 언어

  • Prolog(논리형 언어), SETL(, Smalltalk(객체지향 언어의 모범), C++(c언어를 확장한 객체 지향 언어). Eiffel(객체 지향 언어)

1990년대 이후

  • 인터넷 확산
  • 분산 컴퓨팅 기술 개발
  • 큰 규모 라이브러리, API 사용 증대
  • 웹지원 언어, 스크립 언어, 마크업 언어

JAVA

  • 객체지향적, 분산 네트워킹을 지원
  • C++기반 많은 구조 삭제, 일부 구조 변경, 일부 구조 추가
  • C++의 강력함과 유연성 제공, c++보다 규모는 작아지고, 간결하고 신뢰성 증가
  • OS 및 H/W 플랫폼에 독립적, 이식성 높음
  • 인터프리터 방식, 동적
  • 간결성과 신뢰성 제공 원칙

C#

  • 컴포넌트 기반 언어
  • Visual Basic과 C++결합
  • 개방형 언어 구조
  • 컴파일 기법을 활용한 다중플랫포모 지원 방안 적용

1.3 무엇이 좋은 언어를 만드는가? (평가/설계 기준)

  • 주요 언어 설계 목적
    • Fortran - 실행의 효율성
    • Cobol - 영어와 유사한 문법 구조, 프로그램 판독성 용이
    • Algol 60 - 블록 구조 제공으로 알고리즘 작성 용이
    • Pascal - 간단한 명령형 언어, 하향식 설계 증진
  • 설계 기준의 역사적 변천

1950 년대

  • 초기에는 실행의 효율성 중시 ex) Fortran
  • Cobol과 Algol 60의 등장으로 효율성보다 일반적인 원칙 중시

1960년대

  • 복잡성 제어 필요성 인식, 추상화 기법, 언어 규칙과 제한의 감소 필요성

1970년대

  • 간결성과 추상화를 강조
  • 언어 구성에 수학적 정의 도입
  • 프로그램의 정확성 증명 기법을 갖춘 언어 제공 -> 프로그램 신뢰성 증진

1980년대

  • 언어에 논리 또는 수학 개념의 삽입 증진
  • 논리를 프로그래밍 언어 자체에 포함
  • 함수형 언어에 관심, 객체 지향 언어에 관심 증가

좋은 언어의 특징

  • 간결성, 명료성, 단일성,
  • 직교성
  • 응용 프로그램에 자연적
  • 추상화 지원
  • 프로그램의 검증 및 신뢰성
  • 프로그래밍 환경 및 지원
  • 프로그램의 이식성(기계 독립성)
  • 사용 비용(효율성)

간결 명료 일치(단일)성

  • 구문과 의미
    • 구문 : 표기(작성)하는 규칙(방법)
    • 의미 : 구문 구조에 대한 뜻(의미)
      • 정적의미 / 동적의미
    • 간결성
      • 명령문 갯수의 최소화
      • 구문 구조의 단순
    • 독해성 (판독성)
      • 간결하고 암호적인 언어

직교성

  • 정의
    • 모든 가능한 기본 구조의 조합을 통하여 프로그램을 구축 가능
    • 예외적 규칙의 최소화를 통한 개념적 단순화 필요
  • 장점
    • 언어 습득력 증가
    • 쉬운 프로그램 개발
  • 단점

    • 논리적 오류 가능성
    • 비효율 코드 발생

응용 프로그램에 자연적

  • 언어는 표준화된 특성과 개념으로 개발
  • 알고리즘 논리 구조 = 프로그램 구조

추상화

  • 주어진 작업이나 객체를 속성들의 일부분을 가지고 필요한 만큼 묘사할 수 있는 방법을 지원하는 것

프로그래밍 언어의 추상화

  • 데이터 추상화 - 데이터 구조, 데이터 타입(형), 연산 구성
  • 제어 추상화 - 수행 순서 제어
  • 기본적, 구조적, 단위적 추상화

프로그래머의 역할

  • 개발 대상에 대한 개념적인 추상화
  • 프로그래밍 언어를 이용한 구체화된 추상화

프로그래밍 검증 및 신뢰성

프로그래밍 환경 및 지원

  • 프로그램 개발 필요 도구 지원 : 통합개발환경(IDE)

프로그램의 이식성

  • 기계 독립적인 언어 정의를 통하여 보장
  • 기억 장소 할당과 기계 구조와 별갤 정의된 자료형 사용

사용 비용 ( 효율성 )

  • 실행비용(목적코드 효율성)
    • 최적화된 컴파일러, 효율적인 레지스터 할당
  • 프로그램 번역 비용(번역/구현의 효율성)
    • 언어 교육 과정에서의 번역 시간
  • 프로그램 작성, 테스팅 비용(프로그래밍 효율성)
    • 최소한의 시간과 노력으로 설계,코딩,테스트,변경
  • 유지보수비용
    • 비용이 가장 많이 듬, 하드웨어나 운영체제 변경에 의한 프로그램 수정, 프로그램 확장 개선

참고자료

프로그래밍 언어 개념 - 원유헌 저

0%