High-Level Programming
Digital logic design에서 primitive는 AND, OR, NOT이었지만,
C를 포함한 high-level programming에서의 primitive는 statements이다.
Primitive
Variable, constant, operation, expression, data type 등 더 작은 구성 요소들이 있다.
그러나 의미를 가지는 가장 작은 구성 요소(atom)은 statement이다.
즉, statement 이상부터 의미를 갖기 때문에 statement을 primitve로 보는 것이다.
Machine instruction도 의미를 가지고 statement보다 더 작지만, 이는 machine level에서의 관점이고 지금은 high-level에서의 관점이기 때문에 무시한다.
Abstraction
프로그램의 크기와 복잡도를 다루기 위해 필수적이다.
High-level programming language는 abstraction mechanism을 반드시 제공해야 한다.
Function abstraction은 가장 기본적인 추상화이다.
Procedual programming과 Object-oriented programming에 따라 패러다임이 다르다.
C Language
UNIX OS에서 실행하기 위해서 design되었다.
그래서 UNIX kernel, C compiler, UNIX application들은 모두 C로 이루어져있다.
이후의 언어들에도 큰 영향을 끼쳤으며 현재는 가장 인기있는 범용 언어이다.
kernel, compiler, embedded system 분야에서는 거의 독점적으로 사용되고 있다.
Compat하고 fast한 코드를 작성하는 것에 중점을 두었고, 프로그래머의 자유도가 높다.
소프트웨어의 최대 크기는 약 100,000줄의 코드로, 현재의 기준에서는 비교적 작은 프로젝트에 적용이 가능한 언어이다.
특징
- C는 C++이나 java에 비해 작은 언어이다.
- 비교적 적은 공간에서 작동한다.
- 배우기 쉽기 때문에 언어 전체를 이해하고 사용하기 쉽다.
- Primitive-composition-abstraction을 명확히 볼 수 있다.
- 모든 high-level language는 C의 기능들을 다 포함한다.
- Procedual programming paradigm(절차지향적 패러다임)을 가진다.
- function과 procedure가 같은 의미로 사용된다.
C의 statement
컴파일러가 다양한 statement을 지원한다.
- 변수 선언 : int a, b, c, d = 0;
- 할당 : a = 3;
- 수학 계산 및 할당 : a = (b * 3) - (c / d);
- 조건문 : if(i > 0) x = x * 1.1;
- 반복문 : while(ture) {...}
- Compound : {...}
- Function call : printf("HI");
특징
- Machine-level programming과는 달리, 쉽게 algebraic equation을 사용할 수 있다.
- English-like control structure을 가졌기 때문에 machine-level detail을 고려하지 않고 단순히 타이핑 하면 된다.
- Function을 제공한다.
Function
- 단순히 main function 안에서 긴 코드를 작성한다면, 읽기도 어렵고 유지보수도 어렵다.
이를 위해 복잡도를 줄이기 위한 패러다임을 제공한다. - Function을 통해서 composition and abstraction을 할 수 있다.
- 같은 코드를 위치에 상관 없이 여러번 사용할 수 있다. 따라서 재작성 할 필요가 없다.
C에서의 Abstraction Mechanism
C에서는 statement abstraction과 data의 abstraction이 따로 이루어진다.
Processing 관점에서 C program은 function 단위로 composition-abstraction된다.
그러나 실제 사용에서는 큰 프로그램을 제작하기 때문에 libraray 단위로 abstraction된다.
Abstraction in Processing
Function의 interface와 implementation
Function call은 하나의 abstract operation 처럼 보인다.
Function은 다른 function안에서 primitive로써 recursive하게 사용될 수 있다.
- Interface
- 예시 : <pre>int sum_from_to (int, int)</pre>
- return type, function's name, arguments들을 확인할 수 있기 때문에 implementation을 몰라도 함수 사용이 가능하다.
- Implementation
- function의 body로, body는 statements로 이루어져있다.
- 예시 : <pre>{...}</pre>
Hierarchical Function Abstraction
C에서는 function을 통해 hierarchical abstraction을 수행하게 된다.
Composition과 abstraction을 통해 bottom-up 방식으로 abstraction을 할 수 있다.
Design의 관점에서 보면 조금 달라진다.
설계할 때는 큰 기능(함수, function)을 어떻게 나눌 것인지 생각해야하기 때문에 top-down 방식으로 추상화가 이루어진다.
이 때 dividing and conquering을 이용하게 되고, 이를 modular design(decomposition)이라 한다.
Software Design
Software design은 라이브러리/API의 단위로 composition-abstraction을 수행한다.
참고 : Library, API
- Library
- Collection of related functions
- API (Application Program Interface)
- Library의 사용법(Interface)이다.
- C에서는 헤더파일(*.h)에 저장되어 있다.
Abstraction in Data
C에서는 data abstraction와 processing의 abstraction이 별개로 진행된다.
Data abstraction도 hierarchical/recursive하게 일어난다.
Data 관점에서의 abstraction은 다음과 같다.
- Primitive : int, double, float, char
- Composition and abstraction mechanism : struct, array, pointer
Object-Oriented Language
배경 : C에서의 문제
Library를 사용하기 위해서는 interface와 implmentation이 필요하다.
헤더파일(*.h)을 interface로, comiled code를 implementation으로 볼 수 있다.
따라서 아래 사진과 같이 사용할 수 있다.
그런데 client에서 <pre>f1($d1, ...);</pre>을 해서 라이브러리에 접근하게 되면, 라이브러리에서 client의 data에 접근할 수 있게 된다.
이는 프로그램의 크기가 커지면 client와 library의 코드를 모두 디버깅해야하므로 복잡성과 디버깅에 문제를 야기하고, 프로젝트의 크기에 제한을 생기게한다.
결국 software project failure을 초래하는 것이다.
Object-Oriented Programming (OOP)
라이브러리 사용에서의 문제점과 프로젝트 크기의 제한 때문에 다른 언어의 필요성이 대두되었다.
이에 개발된 것이 object-oriented approach(객체지향)이다.
OOP는 C의 메커니즘에서 object(객체)라는 개념을 추가로 제공한다.
사용자는 public 키워드에만 접근할 수 있도록해서 라이브러리의 문제를 해결하였다.
또한, C는 data와 processing의 abstraction을 따로 하지만 OOP에서는 이를 object abstraction으로 한번에 처리할 수 있다.
Object란?
- state와 behavior(data와 function)로 구성된다.
- Real-life object (은행 계좌, 직급 등)을 모델링할 수 있다.
- C에서는 data와 function의 제한 때문에 real-life을 반영하기 힘들다.
- 반면 OOP에서는 Class hierarchy와 inheritance을 이용해서 real-life를 쉽게 모델링할 수 있다.
- 하위 계층 class는 상위 계층의 class 속성 + $\alpha$의 특징을 가지게 된다.
- 즉, 실제 문제를 해결할 수 있게 된 것이다.
Object-Oriented Design
Object-oriented의 design은 object와 그들 간의 interations을 모델링 하는 것이다.
아래 사진처럼 OOP에서는 object 단위로 한번에 abstraction이 이루어진다.
Functional Programming Paradigm
C에서는 function과 procedual을 같은 의미로 보았지만, functional programming paradigm은 이 둘을 다르게 본다.
- Function : Functional Programming
- 여기서의 functoin은 수학적인(mathmetical) function을 의미한다.
- Mathmetical function (= pure function)
- argument와 return value 만 존재한다.
- side-effect가 없다.
- Procedual
- Side-effect가 있을 수 있다.
- Side-effect
- value를 return 하는 것 외에 machine의 상태를 바꾸는 것이다.
- 예를 들어 printf 함수의 경우 call을 하면 스크린의 상태도 변경시킨다.
만약 할당을하게 되면 메모리의 상태를 변경시킨다.
Programming Paradigm
여러 programming paradigm 중 어떤 것을 사용할지는 해결하고자하는 문제에 따라 달라진다.
적합한 응용에 적용하면 생산성이 높아진다.
- Procedual Programming Paradigm
- 예 : C
- sequential processing
- statement 하나 실행하고 다음 statement 실행하고... 이러한 순차적인 느낌이 많이 남.
- Object-Oriented Programming Paradigm
- distributed processing의 느낌이 많이 난다.
- bunch of objects sending/receiving message
- Functional Programming Paradigm
- Logic Programming Paradigm
Computer Architecture
Architecture란 Set of key interface라는 의미이다.
Software Architecture
Program structure이라고도 하며, 소프트웨어가 가지는 핵심적인 interface들의 집합이다.
소프트웨어가 어떤 모듈들로 구성되어 있고 그것들의 interface들을 알 수 있다.
또, 큰 라이브러리에서 작은 라이브러리로 어떻게 hierarchical 하게 이루어졌는지 볼 수 있다.
Computer Architecture
컴퓨터에서 가장 핵심적인 인터페이스는 Machine instruction과 High-level language이다.
특히 Machine instruction은 machine이 제공하는 인터페이스이며, 제공되지 않으면 컴퓨터가 작동하지 않기 때문에 컴퓨터에서 가장 중요한 interface이다.
ISA (Instruction Set Architecture)란, 수 백개의 machine instruction이 모여진 것으로, 하드웨어와 소프트웨어 사이의 인터페이스이다.
Computer라는 machine은 ISA라고 볼 수 있다.
OS Abstraction
Abstraction을 제공함으로써 하드웨어를 사용하기 쉽게 해주고, 공유자원의 사용관리 및 보호하는 역할을 한다.
특히, 모든 사용자들이 사용하기 쉽도록 GUI와 여러 유틸리티를 제공한다.
각 하드웨어에 대해 제공하는 interface은 다음과 같다.
- Processor
- 역할 : program execution
- Abstraction : process_create(), process_kill(), ...
- Memory
- 역할 : storage
- Abstraction : file_copy(), delete_folder(), file_rename(), ...
- I/O device
- 역할 : connectivity
- Abstraction : Socket("naver.com", 80), monitor_write(), ...
'Computer Science > Computer Architecture' 카테고리의 다른 글
Program Execution (0) | 2021.03.18 |
---|---|
Data : type, storage, and C's data type (0) | 2021.03.17 |
Abstraction과 Hardware Design (0) | 2021.03.14 |
Transistor와 반도체 제조 공정 (0) | 2021.03.14 |
Digital Logic : Combinational Logic, Sequential Logic (0) | 2021.03.13 |
댓글