profile image

L o a d i n g . . .

반응형

학습개요

  • 프로그래밍 언어가 어떻게 발전되어 왔는지
  • 프로그래밍 언어의 발전 과정에서 무엇을 배워야 하는지
  • 프로그래밍 언어는 컴퓨터에서 어떻게 동작하는지
  • 좋은 프로그래밍 언어란?
  • 좋은 프로그래밍 언어를 만드는 프로그래밍 언어의 특성
  • 프로그래밍 언어를 현명하게 선택하는 방법

 

학습목표

  1. 프로그래밍 언어의 발전 과정을 이해하고, 프로그래밍 언어 발전에 지대한 영향을 끼친 주요 언어의 특징을 설명할 수 있다.
  2. 컴퓨터 구조와 프로그래밍 언어의 동작 원리를 이해하고 프로그래밍 언어의 구현 방법을 설명할 수 있다.
  3. 프로그래밍 언어가 갖추어야 할 세 가지 요구사항을 이해하고 프로그래밍 언어의 평가 기준을 설명할 수 있다.
  4. 프로그래밍 언어의 평가 기준 중 서로 상충되는 평가 기준을 살펴보고 기타 프로그래밍 언어의 다양한 특성을 설명할 수 있다.

 

학습내용

프로그래밍 언어의 발전

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

  • 컴퓨터 시스템의 발전
    • 프로그래밍 언어란 컴퓨토ㅓ에서 동작하기 때문에!
    • 아이디어 시대: 계산 자동화를 위한 상상 속의 기계 설계(튜링기계) - 이론, 기계로 존재하지는 않았음
    • 전자식 컴퓨터의 등장: 전자 신호를 통한 계산 기계(에니악, 콜로서스) - 하드웨어, 소프트웨어 같은 개념은 없었음, 하드웨어만
    • 프로그램 저장 방식의 컴퓨터: 프로그램과 처리기를 분리(에드박) - 하드웨어, 소프트웨어의 구분
  • 운영체제의 발전
    • 최초에는 운영체제가 없었음, 에드박이 있으면 OMR 같은 데 펀칭해서 입력하면 하드웨어적으로 수행됨. 사람이 중간에서 관리.
    • 일괄처리 운영체제: 관리자(operator)를 대신할 프로그램 등장
    • 시분할 운영체제: 한 컴퓨터를 여러 사람이 사용. 1초 동안은 A, 2초 동안은 B... 반복해서 나눠서 동작.
    • DOS: IBM 컴퓨터, Apple 등 개인용 컴퓨터(PC) 등장
    • PC 환경 운영체제 발전: GUI 운영체제와 Linux의 발전
  • 1950년대: 초기 프로그래밍 언어
    • Fortran: 수식과 문장, 제어문의 등장
      • IBM의 존 배커스(John Backus)에 의해 개발됨
      • 과학계산용 언어(Formula Translation)
    • Algol: 구조화 프로그래밍의 발전
      • 본래 이름: IAL(International Algebraic Language)
      • 국제 위원회 ACM-GAMM을 통해 설계된 언어
      • 알고리즘 기술 언어
      • 제어 구조화에 집중되어 있다. 문장들의 묶음 ⇒ 복합문의 개념! 추후 블록 사용.
    • LISP: 초기 함수형 언어
      • MIT의 존 매카시(John McCarthy)가 설계함
      • 최초의 함수형 언어
  • 1960년대: 프로그래밍 언어의 발전
    • Cobol: 레코드 타입의 소개
      • 미 해군에서 그레이스 호퍼(Grace Hopper)가 이끄는 팀에 의해 개발됨
      • 사무용 언어 ⇒ 레코드 타입
      • 레코드 - 다양한 타입을 하나로 묶어서 처리할 수 있음
    • PL/I: 너무 복잡한 언어
      • 모든 언어를 합쳐 보았으나 결과적으로 너무 복잡해짐
    • BASIC: 교육용 언어
      • Beginner's All-purpose Symbolic Instruction Code
    • Simula: 객체지향의 등장
      • 시뮬레이션 언어
      • 최초의 객체지향 언어
  • 1970년대: 프로그래밍 언어의 단순화
    • Pascal: 차세대 교육용 언어
      • BASIC + 구조화 프로그래밍 지원
    • C: 진정한 시스템 프로그래밍 언어
      • 시스템 ⇒ 운영체제를 만들 수 있는 언어
      • Unix 개발용 시스템 프로그래밍 언어
      • Objective-C, C++, Java, C# 등 다양한 언어에 지대한 영향을 끼침
    • Prolog: 선언적 논리 언어
      • 최초의 논리 언어
      • 논리 ⇒ 참, 거짓을 따질 수 있음
    • Smalltalk: 객체지향 언어의 발전
      • 최초로 GUI, 마우스 등을 도입
      • 객체 ⇒ 무엇을 저장할 것인지, 어떠한 동작을 할 것인지.
    • Ada: 안전성을 위한 대장정
      • 미 국방성(DoD) 공모
      • 매우 복잡한 언어로 1983년에 첫 컴파일러 등장
    • ML: 타입 시스템을 갖춘 현대 프로그래밍 언어
      • 강력한 정적 타입 검사, 타입 추론, 패턴 검사, 예외 처리 등
    • Scheme: 간결한 LISP
      • MIT 학생들의 기초 프로그래밍 언어
  • 1980년대: 현대 프로그래밍 언어 등장
    • Common Lisp: 방대한 LISP의 통합
      • 함수형 언어 패러다임과 객체지향 패러다임을 동시에 지원
    • Objective-C: C의 탈을 쓴 Smalltalk
      • C를 기초로 한 객체지향 언어의 신호탄
      • Apple의 애플리케이션 작성 언어로 발전
    • C++: 객체지향으로 변신한 C
      • 클래스 개념을 C에 도입
    • Perl: 문자열 처리를 위한 언어
      • 정규식을 바탕으로 한 강력한 패턴 매칭 기능 포함
  • 1990년대: 프로그래밍 언어의 대중화
    • Java: 단순한 객체지향 언어
      • 원래 목적은 임베디드 컴퓨팅이었으나, 웹 브라우저에 탑재되면서 인기!
      • JVM(Java Virtual Machine)
    • JavaScript: 웹 프로그래밍 언어
      • Netscape
      • Elm, TypeScript 등 다양한 변종 언어로 발전
    • Python: 빠른 프로토타이핑 언어
      • 스크립트 언어 ⇒ 덩치가 있는 게 아니라, 가볍게 줄 단위로, 실시간으로.
      • 동적 언어를 추구 ⇒ 실제 동작을 하면서 많은 일들을 동적으로 해 줄 수 있음. 유연성이 좋다.
      • 다중 패러다임 언어 ⇒ 객체지향도 추가되면서 발전되고 있음.
    • Haskell: 순수 함수형 언어
      • 모나드(monad)가 탑재되면서 점차 인기
      • Scala에 영향을 줌

 

프로그램 동작 원리

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

  • 컴퓨터 구조
    • CPU와 메모리, 저장장치 등이 BUS로 연결
    • 다양한 입출력 장치도 BUS에 연결될 수 있음

  • 컴퓨터 동작 원리
    • 전원: 운영체제 적재(저장장치 → 메모리) → 수행
      • 저장장치에 있는 OS가 메모리로 적재하게 됨.
      • 전원이 켜진 컴퓨터는 OS가 알아서 관장한다.
    • CPU는 인출-해석-실행 주기를 반복하여 메모리의 명령어를 실행
      • 인출: 메모리에 들어 있던 OS의 특정 명령어를 CPU로 가져온다.
      • 해석: CPU가 이런 명령어구나, 해석을 하게 된다.
      • 실행: MOVE라는 명령어라면 CPU는 레지스터의 값을 옮기면 되는구나, 이렇게 처리해 준다.
    • 이 과정을 계속 반복하면서 OS가 가지고 있는 기능을 수행하게 된다.
  • 프로그램 동작 원리
    • A 프로그램을 메모리에 적재 → OS가 프로그램한테 관장을 넘겨 주고, 프로그램이 CPU에게 명령어를 보내 주고...
    • 동일하다.

 

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

  • 기계어
    • CPU가 이해하고 수행하는 명령어
    • 이진수 형태의 명령어를 사람이 이해하는 것이 매우 난해
  • 어셈블리어
    • 기계어에 거의 일대일 대응하는 형태의 기호 언어
    • CPU에 종속적 → 이식성이 거의 0(Zero)
  • 고급 프로그래밍 언어
    • 사람에 가까운 표현으로 프로그램을 나타냄
    • 특정 기계에 종속적이지 않음
    • 프로그램을 CPU가 알아듣는 기계어로 표현해 주어야 함
  • 프로그램의 종류
    • 소스 프로그램: 프로그램머가 작성한 프로그램
    • 목적 프로그램: 컴퓨터 하드웨어가 수행할 수 있는 프로그램

 

프로그래밍 언어의 구현 방법

  • 구현 방법
    • 프로그래머가 고급 프로그래밍 언어를 사용해서 프로그램을 작성한다.
    • 소스 프로그램을 직접 수행하지는 못한다.
    • 씨피유는 목적 프로그램을 가지고 하드웨어가 실행한다.
    • 이때 중간 과정에 컴파일러. 소스 → 목적으로 번역해 준다.
    • 인터프리터는 소스 프로그램을 해석하고, 바로 수행해 준다.
  • 인터프리터
    • 프로그래밍 언어로 작성된 고수준의 명령을 해석하여 수행하는 프로그램
    • 인터프리터는 CPU의 인출-해석-실행 주기를 흉내냄
    • 인터프리터가 소스 프로그램 한 줄을 해석하고, 기계어를 하드웨어가 실행할 수 있도록.
    • 컴퓨터가 하는 역할과 매우 유사하다.
    • 만들어진 가상의 컴퓨터 정도로 개념을 잡아두자.
  • 컴파일러
    • 프로그램을 CPU가 수행할 수 있는 형태로 바꾸어서 CPU가 실행
    • 전체를 기계어 덩어리(목적 프로그램)로 완성시키고, CPU는 그걸 실행시키면 된다.
    • 인터프리터가 하는 해석 과정을 미리 모두 수행(효율적)
    • 상용 프로그램은 컴파일 방식으로 번역된 후 판매
  • 하이브리드 구현
    • 인터프리터 방식과 컴파일러 방식을 조합한 방식
    • 중간코드까지 컴파일한 후, 인터프리터를 통해 해석
    • 이 인터프리터를 가상기계(VM)라고 부름
    • 장점 - 고급 언어를 직접 인터프리터로 돌리는 것보다 효율적, 중간 코드는 하드웨어와 관계없이 만들어 낼 수 있기 때문에 다른 CPU 환경이어도 이 인터프리터만 있으면 실행할 수 있다프로그램 동작 원리

 

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

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

  • 요구사항
    • 표현 풍부성(expressiveness): 프로그래머의 아이디어를 표현할 수 있어야 함
    • 유지 보수성(maintainability): 변화에 쉽게 대처할 수 있어야 함
    • 실행 가능성(exrcutability): 컴퓨터에서 실행할 수 있어야 함
  • 설계 원칙
    • 규칙성(regularity): 언어의 기능이 잘 조합될 수 있어야 함
      • 일반성(예를 들면 비교 연산자. 5 > 2... 단, C에서는 구조체를 비교할 수 없음 → 일반성이 부족하다)
      • 직교성
      • 일관성
    • 추상화 지원(support of abstraction): 실세계의 대상을 추상화하여 나타낼 수 있고, 이를 대상으로 어떤 연산을 수행할 수 있어야 함
      • 데이터 추상화
      • 제어 추상화
      • 추상 데이터 타입 정의
    • 복잡도 제어(complexity control): 복잡한 대상 및 처리 방법을 제어할 수 있어야 함
      • 캡슐화
      • 모듈화

 

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

  • 작성력: 프로그램 수식이나 문장, 기능을 쉽게 표현할 수 있는가
  • 가독성: 작성된 프로그램을 보고 쉽게 이해할 수 있도록 하는가 (기계어는 가독성이 없음)
  • 신뢰성: 작성된 프로그램이 오류에 빠지는 가능성을 줄이는가
  • 직교성: 언어 기능이 서로 간섭하지 않고 자유롭게 조합될 수 있는가 (충돌나지 않고 잘!)
  • 일관성: 유사한 기능을 같은 형태로 나타낼 수 있는가 (C++ 클래스의 시작과 끝 {};, struct 등은 {} 이렇게 끝내도 된다.)
  • 확장성: 사용자가 원하는 새로운 기능을 추가할 수 있는가
  • 효율성: 작성된 프로그램이 효율적으로 수행될 수 있도록 하는가
  • 유연성: 프로그래머가 표현하고 싶은 내용을 유연하게 수용하는가
  • 이식성: 프로그램을 다른 실행 환경으로 이전할 수 있는가 (Java의 JVM - 운영체제 등 다 달라도 JVM만 있으면 가능함)

 

프로그래밍 언어의 평가 기준과 요구사항

 

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

  • 모든 걸 만족하는 언어는 존재하지 않음, 나에게 필요한 것을 고르면 된다

 

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

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

 

학습정리

  1. 저장 프로그램 방식의 에드박이 등장하면서 프로그램이라는 개념이 등장하게 되었다.
  2. 1950년대 초기 프로그래밍 언어로 Fortran은 수식 계산, 변수, 대입문, 함수, 제어문의 초기 형태를, Algol은 제어 구조 개념을, LISP는 함수형 언어 개념을 소개하였다.
  3. 1960년대 발표된 Cobol은 레코드를 통한 자료 구조 개념을 제시하였다. BASIC은 교육용 언어로서 큰 인기를 끌었으며 Simula는 객체지향 개념을 처음 소개하였다.
  4. 1970년대 가장 영향력이 높은 프로그래밍 언어는 C이다. Pascal은 구조화 프로그래밍의 교육용 언어로 자리잡았고, 그 외 다양한 패러다임의 언어가 등장하였다.
  5. 1980년대에는 객체지향 개념이 더욱 견고해지고 다양한 언어 표준이 이루어졌다.
  6. 1990년대에는 Java와 JavaScript, Python을 필두로 하여 프로그래밍 언어의 대중화가 시작되었다.
  7. 인터프리터는 고급언어 프로그램으로 작성된 문장을 하나씩 읽어서 수행한다. 컴파일러는 고급언어 프로그램을 기계어로 미리 번역한다. 하이브리드 구현은 고급언어 프로그램을 중간 코드 형태로 컴파일하고 이 중간 코드를 가상기계 상에서 해석한다.
  8. 프로그래밍 언어의 요구사항을 효과적으로 지원하기 위해 따라야 하는 프로그래밍 언어 설계 원칙으로는 규칙성, 추상화 지원, 복잡도 지원 등을 들 수 있다.
  9. 프로그래밍 언어의 평가 기준 중 대표적인 것으로 작성력, 가독성, 신뢰성, 직교성, 일관성, 확장성, 효율성, 유연성, 이식성 등을 들 수 있다.
  10. 프로그래밍 언어를 선택할 때는 언어 사용 커뮤니티가 활발하고 호의적인지, 언어의 특정 응용 분야가 있는지, 새로운 프로그래밍 패러다임을 지원하는지 등을 고려해야 한다.

 

 

해당 포스트는 방송통신대학교의 '프로그래밍 언어론' 강의를 들으며 개인 공부 목적으로 메모하였습니다.

반응형
복사했습니다!