CS

[프로그래밍 언어론] 프로그래밍 언어의 발전 및 동작원리

Grace 2023. 11. 22. 14:38

프로그래밍 언어의 발전

컴퓨터 시스템과 운영체제의 발전

  • 컴퓨터 시스템의 발전
    • 아이디어 시대: 계산 자동화를 위한 상상 속의 기계 설계(튜링 기계)
    • 전자식 컴퓨터 등장: 전자 신호를 통한 계산 기계(모클리와 에커트의 ENIAC)
    • 프로그램 저장 방식의 컴퓨터: 프로그램과 처리기를 분리(EDVAC)
  • 운영체제의 발전
    • 일괄처리 운영체제 등장: 관리자를 대신할 프로그램 등장
    • 시분할 운영체제: 한 컴퓨터를 여러 사람이 사용
    • DOS: IBM 컴퓨터, Apple 등 개인용 컴퓨터 등장(DOS)
    • PC 환경 운영체제 발전: GUI 운영체제와 Linux의 발전

1950년대: 초기 프로그래밍 언어

  • Fortran: 수식과 문장, 제어문의 등장
    • IBM의 존 배커스에 의해 개발됨
    • 과학계산용 언어
  • Algol: 구조화 프로그래밍의 발전
    • 본래이름: IAL(International Algebrain Language)
    • 국제 위원회 ACM-GAMM을 통해 설계된 언어
    • 알고리즘 기술 언어
  • LISP: 초기 함수형 언어
    • MIT의 존 매카시가 설계함
    • 최초의 함수형 언어

1960년대: 프로그래밍 언어의 발전

  • Cobol: 레코드 타입의 소개
    • 미 해군에서 그레이스 호퍼가 이끄는 팀에 의해 개발됨
    • 사무용 언어
  • PL/I: 너무 복잡한 언어 → 모든 언어를 합쳐 보았으나 결과적으로 너무 복잡해짐
  • BASIC: 교육용 언어
  • Simular: 객체지향의 등장

1970년대: 프로그래밍 언어의 단순화

  • Pascal: 차세대 교육용 언어
    • 니클라우스 버트가 개발함
    • 구조화 프로그래밍 지원
  • C: 진정한 시스템 프로그래밍 언어
    • 데니스 리치가 개발함
    • Unix 개발용 시스템 프로그래밍 언어
    • Objective C, C++, Java, C# 등 다양한 언어에 지대한 영향을 끼침
  • Prolog: 선언적 논리 언어 → 최초의 논리 언어
  • Smalltalk: 객체지향 언어의 발전 → 최초로 GUI, 마우스 등을 도입
  • Ada: 안전성을 위한 대장정
    • 미 국방성(DoD) 공모
    • 매우 복잡한 언어
    • 1983년에 첫 번째 Ada 컴파일러 등장
  • ML: 타입 시스템을 갖춘 현대 프로그래밍 언어
    • Meta Language의 약자
    • 강력한 정적 타입 검사, 타입 추론, 패턴 검사, 예외 처리 등
  • Scheme: 간결한 LISP

1980년대: 현대 프로그래밍 언어 등장

  • Common Lisp: 방대한 LISP의 통합
  • Objective-C: C의 탈을 쓴 Smalltalk
    • C를 기초로 한 객체지향 언어의 신호탄
    • Apple의 애플리케이션 작성 언어로 발전
  • C++: 객체지향으로 변신한 C
    • 비얀 스트로스트룹이 발표함
    • 클래스 개념을 C에 도입
  • Perl: 문자열 처리를 위한 언어
    • 래리 윌이 설계함
    • 정규식을 바탕으로 한 강력한 패턴 매칭 기능 포함

1990년대 이후: 프로그래밍 언어 대중화

  • Java: 단순한 객체지향 언어
    • 제임스 고슬링이 이끌었던 개발팀이 개발함
    • 임베디드 시스템 → 웹
    • JVM(Java VIirtual Machine)
  • JavaScript: 웹 프로그래밍 언어
    • Netscape
    • Elm, TypeScript 등 다양한 변종 언어로 발전
  • Python: 빠른 프로토타이핑 언어
    • 귀도 반 로섬이 만듦
    • 스크립트 언어
    • 동적 언어를 추구
  • Haskell: 순수 함수형 언어
    • 국제 위원회가 만든 함수형 언어
    • 모나드가 탑재되면서 점차 인기

프로그램 동작 원리

컴퓨터 구조와 프로그램 동작 원리

  • 컴퓨터 구조
    • 컴퓨터는 CPU와 메모리, 저장장치(HDD) 등이 BUS로 연결되어 있음
    • 모니터, 키보드, 마우스 등 다양한 입출력 장치도 BUS에 연결될 수 있음
  • 컴퓨터 동작 원리
    • 전원을 켜면 저장장치에 있는 운영체제를 메모리로 적재하여 수행
    • CPU는 인출-해석-실행 주기를 반복하며 메모리의 명령어를 실행
  • 프로그램 동작 원리: CPU는 인출-해석-실행 주기를 반복하며 메모리에 적재된 프로그램의 명령어를 수행

프로그래밍 언어 구현이 필요한 이유

  • 기계어: CPU가 이해하고 수행하는 명령어 → 이진수 형태의 명령어를 사람이 이해하는 것이 매우 난해
  • 어셈블리어: 기계어에 거의 일대일 대응하는 형태의 기호 언어, CPU에 종속적 → 이식성이 거의 0
  • 고급 프로그래밍 언어: 사람에 가까운 표현으로 프로그램을 나타냄
    • 특정 기계에 종속적이지 않음
    • 프로그램을 CPU가 알아듣는 기계어로 표현해 주어야 함
  • 소스 프로그램과 목적 프로그램의 간극을 메꾸어야 함
    • 소스 프로그램: 프로그래머가 작성한 프로그램
    • 목적 프로그램: 컴퓨터 하드웨어가 수행할 수 있는 프로그램
  • 인터프리터와 컴파일러
    • CPU가 명령어를 실행하는 것처럼 프로그램도 누군가가 실행해야 함
    • 결국은 CPU가 실행하지만 중간 과정이 다름

인터프리터

  • 프로그래밍 언어로 작성된 고수준의 명령을 해석하여 수행하는 프로그램
  • 인터프리터는 CPU의 인출-해석-실행 주기를 흉내냄

컴파일러

  • 프로그램을 CPU가 수행할 수 있는 형태로 바꾸어서 CPU가 실행함
  • 인터프리터가 하는 해석 과정을 미리 모두 수행하는 방식 → 인터프리터 방식보다 효율적
  • 일반적으로 상용 프로그램은 통상 컴파일 방식을 통해 번역된 후에 판매됨

하이브리드 구현

인터프리터 방식과 컴파일러 방식을 조합한 프로그래밍 언어 구현 방식

  • 중간코드까지 컴파일한 후 인터프리터를 통한 해석
  • 이때 사용되는 인터프리터를 가상기계(VM)라고 부르기도 함

프로그래밍 언어의 평가 기준

프로그래밍 언어의 설계 원칙을 알아야 하는 이유

  • 언어 이해: 내가 사용하는 언어에 대해 더 잘 알게 됨
    • 프로그래밍 언어의 설계 원칙을 파악함으로써 내가 사용하는 언어를 더 잘 알게 됨
    • 프로그래밍 언어의 다양한 구성 요소의 필요성과 사용법을 더 잘 이해하게 됨
  • 언어 학습: 다른 언어를 쉽게 배울 수 있음
    • 일반적인 언어 설계 원칙을 이해하고 나면 다른 언어의 기능도 쉽게 이해됨
    • 객체지향 개념을 알면 모듈 개념도 쉽게 이해할 수 있음
  • 언어 선택: 구현할 언어를 선택해야 할 때, 현명하게 선택할 수 있음
    • 다양한 언어의 기능과 장점을 파악하고 나면 언어를 잘 선택할 수 있음
    • 특히 언어의 강점과 한계는 이후 구현 효율에 지대한 영향을 미침

프로그래밍 언어의 요구사향 및 설계 원칙

  • 프로그래밍 언어가 갖추어야 할 세 가지 덕목
    • 표현 풍부성: 프로그래머의 아이디어를 표현할 수 있어야 함
    • 유지 보수성: 변화에 쉽게 대처할 수 있어야 함
    • 실행 가능성: 컴퓨터에서 실행할 수 있어야 함
  • 프로그래밍 언어 설계 원칙
    • 규칙성
    • 추상화 지원
    • 복잡도 제어

프로그래밍 언어의 평가 기준

  • 작성력: 프로그램 수식이나 문장, 기능을 쉽게 표현할 수 있는 특성
  • 가독성: 작성된 프로그램을 보고 쉽게 이해할 수 있도록 하는 특성
  • 신뢰성: 작성된 프로그램이 오류에 빠지는 가능성을 줄이는 특성
  • 직교성: 언어 기능이 서로 간섭하지 않고 자유롭게 조합될 수 있는 특성
  • 일관성: 유사한 기능을 같은 형태로 나타낼 수 있는 특성
  • 확장성: 사용자가 원하는 새로운 기능을 추가할 수 있는 특성
  • 효율성: 작성된 프로그램이 효율적으로 수행될 수 있도록 하는 특성
  • 유연성: 프로그래머가 표현하고 싶은 내용을 유연하게 수용하는 특성
  • 이식성: 프로그램을 다른 실행 환경으로 이전할 수 있는 특성

프로그래밍 언어의 평가 기준 사이의 절충

언어 평가 기준은 서로 상충되는 측면이 있음

프로그램 사용자 측면 프로그램 개발자 측면
효율성: 검사 비용을 줄여야 함 신뢰성: 더 많이 검사해야 함
가독성: 간단한 기능이 이해하기 쉬움 작성력: 복잡하더라도 많은 기능이 지원되어야 함
안전성: 안전을 위해 더 많은 제약을 가해야 함 유연성: 프로그램 작성 시 제약이 적어야 함

프로그래밍 언어의 선택 기준

  • 해당 프로그래밍 언어를 사용하는 커뮤니티가 활발하고 호의적인 언어
  • 특정 응용 분야가 존재하는 프로그래밍 언어
  • 접해 보지 못한 프로그래밍 패러다임을 지원할 수 있는 프로그래밍 언어