본문 바로가기
Computer Science/Computer Architecture

Abstraction과 Software Design

by Gofo 2021. 3. 14.

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을 할 수 있다.

C에서의 hierarchical function abstraction : Bottom-up

 

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을 초래하는 것이다.

Library use in C

 

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$의 특징을 가지게 된다.
    • 즉, 실제 문제를 해결할 수 있게 된 것이다.

Class hierarchy와 inheritance의 예시

 

Object-Oriented Design

Object-oriented의 design은 object와 그들 간의 interations을 모델링 하는 것이다.

아래 사진처럼 OOP에서는 object 단위로 한번에 abstraction이 이루어진다.

Object-Oriented Programming 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 instructionHigh-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(), ...

 

각 하드웨어별 OS의 Interface

댓글