프로그래밍 언어의 발전
컴퓨터 시스템과 운영체제의 발전
- 컴퓨터 시스템의 발전
- 아이디어 시대: 계산 자동화를 위한 상상 속의 기계 설계(튜링 기계)
- 전자식 컴퓨터 등장: 전자 신호를 통한 계산 기계(모클리와 에커트의 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)라고 부르기도 함
프로그래밍 언어의 평가 기준
프로그래밍 언어의 설계 원칙을 알아야 하는 이유
- 언어 이해: 내가 사용하는 언어에 대해 더 잘 알게 됨
- 프로그래밍 언어의 설계 원칙을 파악함으로써 내가 사용하는 언어를 더 잘 알게 됨
- 프로그래밍 언어의 다양한 구성 요소의 필요성과 사용법을 더 잘 이해하게 됨
- 언어 학습: 다른 언어를 쉽게 배울 수 있음
- 일반적인 언어 설계 원칙을 이해하고 나면 다른 언어의 기능도 쉽게 이해됨
- 객체지향 개념을 알면 모듈 개념도 쉽게 이해할 수 있음
- 언어 선택: 구현할 언어를 선택해야 할 때, 현명하게 선택할 수 있음
- 다양한 언어의 기능과 장점을 파악하고 나면 언어를 잘 선택할 수 있음
- 특히 언어의 강점과 한계는 이후 구현 효율에 지대한 영향을 미침
프로그래밍 언어의 요구사향 및 설계 원칙
- 프로그래밍 언어가 갖추어야 할 세 가지 덕목
- 표현 풍부성: 프로그래머의 아이디어를 표현할 수 있어야 함
- 유지 보수성: 변화에 쉽게 대처할 수 있어야 함
- 실행 가능성: 컴퓨터에서 실행할 수 있어야 함
- 프로그래밍 언어 설계 원칙
- 규칙성
- 추상화 지원
- 복잡도 제어
프로그래밍 언어의 평가 기준
- 작성력: 프로그램 수식이나 문장, 기능을 쉽게 표현할 수 있는 특성
- 가독성: 작성된 프로그램을 보고 쉽게 이해할 수 있도록 하는 특성
- 신뢰성: 작성된 프로그램이 오류에 빠지는 가능성을 줄이는 특성
- 직교성: 언어 기능이 서로 간섭하지 않고 자유롭게 조합될 수 있는 특성
- 일관성: 유사한 기능을 같은 형태로 나타낼 수 있는 특성
- 확장성: 사용자가 원하는 새로운 기능을 추가할 수 있는 특성
- 효율성: 작성된 프로그램이 효율적으로 수행될 수 있도록 하는 특성
- 유연성: 프로그래머가 표현하고 싶은 내용을 유연하게 수용하는 특성
- 이식성: 프로그램을 다른 실행 환경으로 이전할 수 있는 특성
프로그래밍 언어의 평가 기준 사이의 절충
언어 평가 기준은 서로 상충되는 측면이 있음
프로그램 사용자 측면 | 프로그램 개발자 측면 |
효율성: 검사 비용을 줄여야 함 | 신뢰성: 더 많이 검사해야 함 |
가독성: 간단한 기능이 이해하기 쉬움 | 작성력: 복잡하더라도 많은 기능이 지원되어야 함 |
안전성: 안전을 위해 더 많은 제약을 가해야 함 | 유연성: 프로그램 작성 시 제약이 적어야 함 |
프로그래밍 언어의 선택 기준
- 해당 프로그래밍 언어를 사용하는 커뮤니티가 활발하고 호의적인 언어
- 특정 응용 분야가 존재하는 프로그래밍 언어
- 접해 보지 못한 프로그래밍 패러다임을 지원할 수 있는 프로그래밍 언어
'CS' 카테고리의 다른 글
[프로그래밍 언어론] 구문론과 의미론 (1) | 2023.11.22 |
---|---|
[프로그래밍 언어론] 프로그래밍 언어 패러다임 (1) | 2023.11.22 |
[프로그래밍 언어론] 프로그래밍 언어 소개 (1) | 2023.11.22 |
[컴퓨터과학개론] 자료구조 (1) | 2023.11.19 |
[컴퓨터과학개론] 컴퓨터와 데이터 (0) | 2023.11.19 |