티스토리 뷰
이 포스트는 「"Concepts of programming languages" by Sebesta, 10th edition.」 을 참고하여 작성했습니다.
Chapter 1 주제
- Reasons for studying
- Programming domains
- Launguage Evaluation Criteria
- Influences on Language Design
- Language Categories
- Language Design Trade-Offs
- Implementation Methods
- Programming Environments
Reasons for Studying Concepts of Programming Languages
1. 아이디어를 표현하는 능력을 기르기 위해
2. 적절한 프로그래밍 언어 사용의 배경지식을 기르기 위해
3. 새로운 언어의 습득 능력을 기르기 위해
4. 구현의 중요성에 대해 이해하기 위해
5. 프로그래밍 언어의 효율적인 사용을 위해
프로그래밍 언어론을 학습하는 이유는 위와 같다.
Programming Domains
•Scientific applications : 1950s and 1960
–큰 숫자의 부동소수점 계산과 배열의 사용을 위함.
–Fortran
•Business applications : 1960
–10진수와 Characters를 사용하여 레포트를 생산하기 위함(워드 자료 등)
–COBOL
•Artificial intelligence : 1959
–Symbols rather than numbers manipulated; use of linked lists
–LISP
•Systems programming
–효율적인 프로그램 제작을 위함
–C
•Web Software
–Collection of languages: markup language(e.g., XHTML), scripting (e.g., JavaScript, PHP), general-purpose (e.g., Java)
Language Evaluation Criteria (언어 평가 기준)
언어의 평가 기준에는 크게 Readability,Writability,Reliability,Cost가 있다.
짧게 요약하자면
Readability란 이해하고 읽기 쉬운것을 말한다.
Writability란 프로그램을 작성하는것이 쉬운 것을 말한다.
Reliability란 신뢰성을 말한다.
Cost란 프로그램을 제작하는 전체적인 비용을 말한다.(훈련 비용, 작성 비용, 컴파일링, 실행 등)
각각의 기준을 세부적으로 살펴 보겠다.
Readablity
-Overall simplicity : 특징과 구조가 관리 가능해야 한다. 연산자 오버 로딩 등이 너무 복잡해서는 안된다.
-Orthogonality : 기능들이 겹치지 않아야 한다. 동일한 작업을 수행하는 기능들이 많다면 직교 성이 낮다 보고 그렇지 동일한 기능을 하나의 명령어를 이용해 수행한다면 직교 성이 높다고 본다.
-Data types : 미리 정의된 적절한 데이터 형식이 있어야 한다.(ex. boolean type) 만약 bool타입이 없다면 check=1이 true를 의미하는지 정수 1을 의미하는지 헷갈릴 것이다.
-Syntax considerations : 특별한 단어를 사용하여 구문을 묶어준다.(ex. if, while, for 등) 또한 { } 등을 사용하여 가독성을 높일 수 있다.
Writability
-Simplicity and orthogonality : 규칙들의 조합이 너무 많으면 복잡해지며 작성하기 어려워진다. 적절한 개수의 규칙이 필요하다.
-Support for abstraction : 여러가지 추상 자료형 및 라이브러리 제공해야 한다. (ex. sort, binary tree 등)
-Expressivity : 특별한 연산을 수행할때 편리한 방법이 존재해야 한다.(ex. count=count+1 은 count++과 같다)
Reliability
-Type checking : type을 테스트하여 에러를 방지해야 한다.
-Exception handling : 적절한 예외처리를 통하여 런타임 에러를 방지해야 한다.
-Aliasing : Alias를 남발한다면 Reliability가 낮아질 수 있다.(ex. 포인팅)
-Readability and Writability : 프로그램을 만들 때 알고리즘의 자연스럽지 않은 접근은(비정상적인 코딩) 신뢰성을 떨어뜨린다.
Cost
-언어를 배우는데 걸리는 시간 및 비용
-프로그램을 작성하는데 걸리는 시간
-컴파일 시간
-실행 시간
-FREE 한 컴파일러의 존재 유무
-유지보수 비용
-신뢰성이 낮을수록 높은 비용을 불러온다.
Others
-Portability(이식성) : 작성된 프로그램이 다른 방식으로 구현하는 것이 쉬운지
-Generality(범용성) : 활용의 범위가 넓은지
-Well-definedness
Influences on Language Design
프로그래밍 언어는 폰 노이만 구조로 알려진 컴퓨터 구조와 프로그래밍 디자인 방법론에 영향을 많이 받았다.
폰노이만 컴퓨터는 데이터와 프로그램이 메모리에 저장되어 있으며 메모리는 CPU와 분리되어 있고 메모리에서 명령과 데이터를 CPU로 전송하는 구조를 가진다.
폰노이만 구조의 컴퓨터는 Fetch-execute-cycle이라는 구조를 가진다.
Program counter(PC)를 초기화하고 아래의 과정을 반복한다.
1.PC로부터 명령을 가져온다.
2. 다음 명령을 가리키기 위해 PC를 증가시킨다.
3. 명령을 해석한다.
4. 명령을 실행한다.
프로그래밍 언어는 위와 같은 폰 노이만 구조의 영향을 많이 받았으며 더불어 프로그래밍 방법론의 영향을 받았다.
1950년대와 1960년대에는 간단한 프로그램이 주를 이뤘기에 기계의 성능이 크게 중요하지 않았다.
그러나 1960년대 후반부터 사람들은 성능을 중요시하기 시작했고 이때부터 구조화된 프로그램과 Top-down방식의 정제된 프로그램을 제작하기 시작했다.
1970년대 후반에는 Process-oriented 프로그래밍이 data-oriented프로그래밍으로 변화했으며 1980년대 중반에는 Object-oriented programming(객체지향 프로그래밍)이 등장했다.
객체지향 프로그래밍이란 data abstraction+inheritance+polymorphism을 말한다.
Language Categories , Language Design Trade-Offs
Language Categories에는 크게 Imperative, Functional, Logic, Markup/programming hybrid가 있다.
Imperative의 주요 특징은 변수, 대입문, 반복 등이 있으며 스크립팅 언어, 비주얼 언어, 객체지향 언어 등이 포함되어 있다. 예로는 C, JAVA, Perl, Js, C++ 등이 있다.
Language Design Trade-Offs
Reliability vs cost of execution : 신뢰성을 올리고자 한다면 cost는 증가할 것이다.
Readability vs writablity
writability(flexibility) vs reliability : C의 포인터는 매우 flexible하나 자칫하면 신뢰성을 떨어뜨릴 수 있다.
Implementation Methods
구현 방식에는 크게 Compilation, Pure interpretation , Hybird implementation systems가 있다.
Compilation은 모든 소스코드를 한 번에 기계어로 번역하는 것을 말한다. C, C++, Ada, Cobol 등이 해당된다.
Pure interpretation은 interprter에 의해 한 줄씩 인터 프리팅 되는 것을 말한다. 웹 기반의 스크립팅 언어가 주를 이룬다.(js, php 등)
hybrid implementation systems는 compiler와 interpreters를 둘 다 사용한다. JAVA가 해당된다.
일반적인 컴퓨터 시스템에서의 계층구조는 아래 그림과 같다.
C는 compiler JAVA는 JVM 등 각각의 언어마다 기계어로 번역하여 실행하는 방법은 다르다.
Compilation은 HLL(High-Level-Language)을 기계어로 한 번에 번역한다. 번역하는 시간은 느리지만 실행시간은 매우 빠르다. 컴파일 과정은 크게 lexical 분석, syntax 분석, semantics 분석의 단계를 거친다. 그 과정을 그림으로 나타내면 아래와 같다.
중간에 존재하는 intermediate code generator를 통해 HLL이 어셈블리 코드로 번역되며 그 후 Code generator를 통해 기계어로 번역된다.
Pure interpretation은 별도의 translation(번역) 과정이 없다.
또한 Interprter에 의해 run-time에러가 즉시 표시되기에 구현이 더 쉽다는 장점이 있다.
그러나 compilation에 비해 실행 속도는 느리며 상황에 따라 더 많은 공간을 요구한다.
Hybrid implementation systems는 앞서 설명한 compilation과 pure interpretation을 섞은 것과 같다.
HLL을 intermediate language(중간 언어)로 번역하여 interpretation이 더 쉽게 한다.
예를 들어 JAVA는 byte code를 먼저 생성 후 Interprter에 의해 실행되는 Hybrid 구현 형태이다.
이 외에도 preprocessor, just in-time implementation systems 등을 이용하기도 한다.
프로그래밍 환경에는 크게 UNIX, VS(Visual studio), NetBeans 등이 있다.
Summary
이번 챕터를 통하여 프로그래밍 언어론을 배우는 이유, 프로그래밍 언어론의 평가 기준, 프로그래밍 언어론에 영향을 끼친 요소, 프로그래밍 언어의 구현 방법(compilation, interpretation 등)에 대해 살펴보았다.
- Total
- Today
- Yesterday
- 동적계획법
- 컴퓨터 구조
- 백트래킹
- 자바스크립트
- ReactNative
- nest.js
- 구현
- node.js
- dfs
- nestjs
- 재귀
- 벨만포드
- nodeJS
- 그래프
- 예외처리
- 그리디
- Computer Architecture
- 투포인터
- 알고리즘
- 시뮬레이션
- 컴퓨터 통신
- BFS
- 스레드
- java
- 중앙대학교
- boj
- typeORM
- 백준
- 세그먼트 트리
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |