Super Kawaii Cute Cat Kaoani topic0-2 more on abstraction

수업정리/컴퓨터 구조론

topic0-2 more on abstraction

치킨고양이짱아 2023. 2. 1. 17:36
728x90
728x90

3-Terminal Digital Switches

→ 이런 장치를 디지털 스위치라고 한다. 3개의 단자 가지고 있고 제어신호 있느냐 없느냐에 따라 on/off가 결정

→ 컴퓨터는 이런 디지털 스위치로 만들어지기 때문에 디지털 스위치를 '구현 기술'로 볼 수 있다.

  • 디지털 스위치는 전기적 제어신호에 의해 동작해야하기 때문에 기계장치만 있던 시절엔 디지털 스위치가 X
  • relay: 전기 현상을 다룰 수 있게 되면서 최초의 디지털 스위치 relay를 만들었음.

    전자석을 이용해서 기계적인 움직임이 들어감. 속도가 느림

  • 진공관: 개선된게 진공관. 방전현상을 이용해서 디지털 스위치를 만들었음. 훨씬 안정적이고 빠름.

    진공관도 여전히 속도가 느려서 진공관으로 만든 컴퓨터에는 속도의 한계 존재

    (최초의 범용 컴퓨터인 애니악도 진공관으로 만들어졌다.)

  • Transistor: 디지털 스위치로서 최고의 특성을 가짐. 작고 빠르고, 전력소모가 적음, 고장이 잘 안남

    트랜지스터는 같은 실리콘 판 위에 여러래를 많이 만드는 Integrated Circuits 형태로 제작

    트랜지스터는 반도체 기술로 만들어짐.

    (왼쪽 그림이 트랜지스터임을 나타내는 symbol)임

→ Gate-level of abstraction: Digital logic Design

and, or, not gate는 주어진 것이라 생각하고 이걸 사용해서 유용한 abstraction을 만들어가니까

(primitive가 and, or, not gate)

디지털 로직 분야를 gate level of abstraction 이라고 부르기도 한다.

→ Transistor-level of abstraction: 전자공학

전자공학에서는 트렌지스터를 가지고 유용한 자동장치를 만드는 것을 연구한다.

(primitive가 트렌지스터)

그래서 전자공학 분야를 Transistor-level of abstraction 이라고 부르기도 한다.

이렇게 전자공학과 디지털 로직 디자인은 서로 다른 추상화 레벨에서 활동한다.

전자공학의 primitive: 트랜지스터

→ and, or, not gate를 트랜지스터로 만든다. 하지만 트랜지스터 역시 엄청 복잡한 물건을 추상화한거

트랜지스터는 반도체 제조 시설에서 만든다.

반도체 장치는 작게 만들수록 빠르게 동작한다. (신호 움직이는 거리가 속도에 영향주기 때문)

실리콘 판에 반도체 회로를 만들었을 때 누가 더 작게 만들 수 있는가 비교하는 척도를

"최소선폭" (Minimum feature size)


최소선폭이 2배로 줄면(20nm→10nm) 같은 면적에 4배의 트렌지스터를 만들 수 있다.

오늘날 CPU는 너무 속도가 빠르게 발달해서 신호가 움직이는 거리가 CPU의 속도에 영향을 주게 된다.

길이가 2배이면 신호가 가는데도 시간이 2배 걸림. 그래서 작게 만들수록 CPU의 속도가 더 빠르다.

오른쪽 그림 회로도

평면도

색깔별로 다른 물질

→ 서로 다른 물질 각각 하나를 만드는 과정을 반도체 공정

CPU: 20~40 공정 필요

단면도 → NMOS와 PMOS의 형태가 다른 이유는

하나는 신호가 low일때 닫히는거

하나는 신호가 high일때 닫히는거

<ICs(CPU)를 만드는 과정 >

Yield(수율): wafer 하나에 만든 die 중 최종적으로 제대로 작동하는 die의 비율

디지털 로직 디자인의 primitive: and, or, not gate

→ and, or, not gate는 트랜지스터 이용해서 제작

Science and Engineering

과학기술에 종사하는 많은 사람들이 서로 다른 추상화 레벨에서 활동한다.

→ 어떤 과학자들이 소립자 연구를 통해 양성자, 중성자(Proton, neutron) 모델을 만들면

→ 다른 물리학자들은 이걸 이용해서 원자핵(Atomic nucleus)에 대한 모델을 형성

→ 또 다른 물리학자들은 밑에서 제공한 모델을 사용해 전자 궤도(Electron, orbit)에 대한 모델 형성

→ 전자 공학에서 주어진 primitive인 트랜지스터를 사용해 and, or, not gate를 만들고

→ and, or, not gate를 primitive로 해서 디코더, MUX, ALU 등을 만들 수 있다. (Functional)

→ 밑에서 만든 유용한 장치를 발판삼아 CPU와 같이 복잡한 unit을 만들어 Machine Instructions 제공

→ 머신 instruction을 사용해서 자바 컴파일러와 같은 프로그램을 짜서 Java Language를 제공해줄수 있음

Abstractions in Software

소프트웨어는 굉장히 복잡하다. 코드가 매우 길다.

→ 이렇게 소프트웨어가 복잡하다면 이 복잡도를 감당하기 위한 abstraction 메커니즘이 당연히 존재!

Case study: C programming

C 프로그래밍을 예로 든 이유는, C가 small language이기 때문.

  • language의 기능이 그렇게 많지 않다. 최소한의 기능만 가지고 있음
  • 그래서 배우기가 쉽고, 전체 language의 기능을 거의 다 사용하게 된다.
  • 이렇게 minimal한 language인 C를 살펴보면 primitive-composition-abstraction

    비교적 깨끗하게 느낄 수 있다.

  • 핵심 키워드 2개: statement, function

(↔ C++, Java 는 large language)

C(or High-Level) Programming

  • primitive: statements

    variable, constants, operators가 primitive가 아닌 이유: statement가 의미를 갖는 최소 단위이기 때문

    → 어떤 사람들은 이렇게 생각할 수 있음.

    우리가 statment를 컴파일 머신에 돌리면 이것들은 machine instruction으로 바뀐다.

    그럼 머신 instruction이 primitive인거 아닌가?

    → 맞다. 하지만 그건 machine level programming이고 우리가 얘기하는건 high level programming 이다.!

  • High level language에서는 다양한 형태의 statement를 제공한다.

    1) Variable declaration statement

    2) Assignment statement

    3) Arithmetic and assignment statement

    4) Conditional statement

    5) Loop statement

    6) Compound statement

    7) Function call statements → 🌈조금 있다가 자세히 다룰 거임.


1) int a, b, c, d, I, j = 0;

2) a = 3;

3) a = (b*3)-(c/d);

4) if(I>0) x = x*1.1; else x = x*0.9;

5) for 문

6) {multiple statements} → treat as single

7) printf("hello, world\n"); → call OS service

  • statement들이 있으면 high level language에서 algebraic equation을 사용할 수 있음 ex) a = b+c

    (machine level language에서는 이런거 못하지)

  • English like control structure를 가지고 있다. (즉, 머신 레벨 디테일이 감추어져있음. 그래서 high level)
  • statement만 있으면 우리가 large software를 만들 수 있는걸까? → 이러면 설계하기도 힘들고 디버깅하기도 힘들다.

    → 프로그램의 복잡도를 감당하기 위한 패러다임이 필요하다. (function!)

    function이 composition과 abstraction을 위한 메커니즘이다.

  • C 프로그래밍을 Procedural programming paradigm이라고 부른다.
  • C에서는 processing abstraction과 data abstraction이 따로 일어난다.

1. C 프로그래밍의 processing 관점에서의 abstraction

Function: Abstraction Mechanism

  • function은 statement를 사용해서 우리에게 composition과 abstraction을 가능하게 하다.
  • int sum_from_to(int, int)

    이 함수를 한번 정의하면 사용하는 사람 입장에서는 interface만 알고 사용할 수 있음.

    function body(implemenation)은 알 필요 X

    function call은 마치 하나의 single statement처럼 돌아간다. (즉, primitive로 추가된거)

    → 사용자 입장에선 바로 이게 abstraction

  • abstraction을 위한 핵심 메커니즘으로 제공하는게 function이며

    프로그램의 largeness와 complexity를 감당하기 위해 꼭 필요

  • High level 프로그래밍 language는 abstraction 메커니즘을 제공해야한다. 그 중에서 function이 가장 기본적

Hierarchical Function Abstraction

  • hierarchical bottom-up function abstraction

    → 프로그램의 complexity를 다루기 위해 핵심적이다.

  • Design perspective

    → 지금가지는 구현 입장에서 Bottom up으로 설명했다. 하지만 실제 디자인을 할 때는 반대로 설명함 (Top-down)

    → 복잡하니까 쪼개서 정복하는 디자인(Modular design)

    → "dividing and conquering"을 반복한다.

Primitive-Composition-Abstraction

<지금까지 한 이야기 요약>

primitive-coposition-abstraction은 (C뿐만 아니라) high level programming의 기본 패러다임이다.

  • Primitives: statements
  • Composition: build a function using statements
  • Abstraction: function을 만들고 interface를 제공해서 함수를 primitive(statement)로 만드는거

High level programming은 무엇인가?

→ hierarchically하게 abstractions을 빌드하는 과정

→ 이건 프로그래밍 뿐만 아니라 모든 엔제니어링에 공통)

Library(or API)

  • C에서 function 단위의 abstraction이 일어나긴 하지만 소프트웨어에서 function은 너무 단위가 작아서 거래 단위 X
  • Hierarchical abstractions에서 사실 그 단위가 되는 것은 function이 아니라 library

    large scale 프로그램을 작성할 때는 function 단위가 아니라 라이브러리 단위로 이용.

  • Library(or API): 연관된 function들의 모임
  • (Interface) API: 라이브러리의 사용법. (C에서는 헤더파일)

    C에서 헤더파일에는 최소한의 라이브러리 사용법이 담겨있음. (math.h)

  • (Implemenation) compiled code (power.o, sin.o, log.o)
  • Library(or APU)를 이용해서 더 복잡한 라이브러리를 만들고 이걸 이용해서 더 복잡한걸 만들고...

    → 최종적으로 제품을 만든 뒤 사용법을 user들에게 제공

Fundamentals of C programming

  • Procedural programming paradigm

    → C 프로그래밍을 Procedural programming paradigm(절차 지향적 프로그래밍 패러다임)이라고 한다.

    → 여기서는 function이랑 procedure가 같은 의미로 사용된 것

  • C 프로그래밍에서 중요한 3가지의 개념

    1) Statements 2) Functions 3) Libraries

Software Architecture (or program structure)

Software architecture란?

→ 소프트웨어가 갖고 있는 핵심적인 interface들의 모임이다.

Computer Architecture

컴퓨터에서 가장 중요한 인터페이스인 머신 instruction을 설계하는 분야.

machine instructions을 ISA(Instruction set architecture)라 부르기도 한다.

Instruction set 이 컴퓨터 아키텍쳐에서 가장 중요한 인터페이스라는 의미에서...

2. C 프로그래밍의 data 관점에서의 abstraction

Processing vs Data

primitive-composition-abstraction paradigm

: 복잡한 데이터 structure를 좀 더 단순하게 다룰 수 있게 해주는 메커니즘이기도 하다.

  • Primitive: int, double/float, char
  • Composition and abstraction: struct, array, pointer
  • ex) 학생 정보에는 어떤 것들이 들어가야하나 고민하며 struct Student_info를

    채워나가는 과정은 composition.

    복잡한 struct에 Student_info라는 이름을 붙이는 순간 이 data structure는 추상화

    그 이후로는 struct Studnet_info만 가지고 복잡한 structure를 사용할 수 있음

    (recursive하게 추상화하는 것도 가능 - 이 struct가 다른 struct의 component 될 수 O)

3. Size Limit in C programming

C 프로그래밍을 통해서 얼마나 큰 프로그램을 만들 수 있을까? 혹시 그 크기에 제한이 있나?

  • Library code

    라이브러리 헤더를 보면 여러개의 복잡한 데이터 structure가 정의되고

    위에서 정의한 복잡한 데이터 structure 들을 manipulate하는 function 존재.

    (이 function들은 복잡한 데이터 structure들의 포인터를 받아옴)

  • Client code

    client들은 라이브러리를 사거나 다운받아서 header 를 include

    사용법에 정의한 대로 함수를 사용할 때 포인터를 넘김. 그럼 라이브러리는 그에 대한

    프로세싱을 진행해준다.

😀중요한 특징! client code에서는 complex한 데이터 structure를 allocate해서 그 포인터를

이용해 라이브러리 콜을 한다. 라이브러리에서는 넘겨온 포인터를 이용해서 데이터에 자유자재

접근할 수 있다. (즉, data sharing)

💡
데이터 sharing 때문에 디버깅 시 client code와 library code를 둘다 봐야한다.

프로그램이 작을 때는 큰 문제가 안되지만 커질수록 너무나 많은 코드를 디버깅해야해서

data sharing은 software project failure의 중요한 원인이 될 수 있음.

즉, C에서는 라이브러리 use가 data sharing을 전제로 하고, 이는 프로젝트의 사이즈를 제한

Example

C language

  • C언어는 1970년대 초반에, UNIX 커널을 만들기 위해 고안된 언어다. → 그래서 70년대의 기술 반영하고 있음

    → UNIX kernel, C compiler, all UNIX application이 모두 C로 만들어졌다.

  • C는 그때부터 아주 널리 퍼짐. 오늘날 C언어는 커널, 컴파일러, embedded system 분야독점적으로 사용된다.
  • 그 이후로 만들어진 프로그래밍 언어에서 많은 영향을 준 언어이다.
  • 70년대 당시 시스템 프로그래밍은 어셈블리로 이루어져있었는데

    이것을 high level programming으로 바꾸자는 취지로 만들어졌다 보니

    compact하고 fast한 코드를 만드는게 C의 특징임 (executable 파일 사이즈가 작고 코드가 빨리 돈다.)

  • 70년대 당시의 프로그래머들은 컴퓨터 전문가였기 때문에 여러가지를 제안하기보다

    프로그래머들에게 많은 자유를 주었음(unsafe)

  • Million Lines of Source Code

    → 이만큼을 C로 짠다면? data sharing에 의해서 프로젝트 사이즈를 감당하기가 어렵다.

    → 70년대에 만들어졌다보니 비교적 작은 사이즈의 소프트웨어에 적용 가능 (약 100K 정도가 한계)

  • 다른 언어에 비해 비교적 low level language의 특성을 많이 가지고 있어서

    어떤 사람들은 C를 "high level assembly" 하기도 한다.

Why Another Language(C++)

  • C가 프로젝트의 사이즈와 생산성을 제한하는 문제가 1980~90년대 두드러지게 나타남.

    → 소프트웨어 사이즈는 커지는데 개발환경이 이를 뒷받침해주지 못함. 이를 "Software crisis"라고 부른다.

  • 그에 대한 solution으로 90년대에 object oriented approach가 성공적으로 정착하게 되었음

    그 선봉을 선게 C++

OO Programming Paradigm

Functional Programming Paradigm

OOP에 대해 살펴보면서, 아울러서 "Functional programming"에 대해서도 살펴볼거다

Object-Oriented Programming

  • OOP에서는 C가 제공하는 기능 + 추가적인 abstraction 메커니즘 제공

    → 바로 object!

  • Object 안에는 complex한 데이터 structurefunction들을 넣을 수 있음.

    일종의 작은 C 라이브러리라고 생각할 수 있다. 근데 C에서는 data의 abstraction과 processing의 abstraction이

    따로 진행되었다면 OOP에서는 object라는 이름으로 data와 proceessing을 한꺼번에 추상화 할 수 있다.

    즉, object는 function보다 더 큰 추상화 단위. 그렇기 때문에 더 큰 소프트웨어를 다룰 수 있는거.

  • 근데 OOP는 큰 소프트웨어를 감당하기 위한 패러다임이기 때문에 단어 선택도 더 추상적으로

    data → state, function → behavior)

  • Object를 디자인 하는 사람은 public interface를 제공한다.

    → object를 access 할 사람은 public interface 만을 이용해서 object를 사용할 수 있다.

    → 이렇게 Object의 사용을 public interface로 제한함으로써 데이터의 노출을 막고 data sharing이 일어나지 X

  • Hierarchical abstractions을 object library들을 가지고 진행한다.

    → single function이 너무 작았듯이 single object도 너무 작으니까 object library로...

Object-Oriented Programming (내용 정리)

  • Object: state와 behavior를 포함하는 abstraction 단위

    real life object바로 모델링 할 수 있다.

    → 왜? C로 real life object를 모델링한다면, 어떤 data structure와 function이 필요할까..고민해야함

    하지만, OOP의 Object 자체가 real life object를 바로 반영할 수 있기 때문에 설계가 굉장히 직관적으로 된다.

    즉, real life object를 바로 컴퓨터 object로 만들 수 있다.

  • OO design: 실제 세계의 object와 object들간의 interaction을 인터페이스로 만드는 것 (무슨 소린지 모르겠음)
  • real-life object들끼리 서로 relevant한걸 어떻게 모델링할거냐?

    → 실제 세계의 object들은 서로 independent 하지 않음. 서로 연관되어 있다. 이런 연관성을 어떻게 나타내지?

    OOP의 핵심개념인 hierarchy 와 inheritance

Programming Paradigms

컴퓨터 사이언스에서 크게 4가지의 프로그래밍 패러다임을 개발함

  1. Procedural programming (C)
  1. OOP

    C와 OOP를 살펴보면,

    → C 프로그래밍이 실행되는건 sequential processing 느낌 (statement 하나씩 function 하나씩 실행되는 느낌)

    → OOP는 분산 프로세싱(distributed processing) 느낌. bunch of objects가 막 메세지를 서로 주고 받음

  1. Functional Programing : side effect가 없는 Mathematical(or pure) 함수를 사용

    → 이건 C나 OOP처럼 많이 쓰이진 X. but 적합한 응용을 하면 굉장히 생산성 높은 프로그래밍을 할 수 있다.


    C에서의 키워드는 function. C에서의 프로그래밍 패러다임은 procedural programming 패러다임.

    이때의 키워드 function과 procedures는 의미가 같다.

    그런데 functional programming paradigm에서 둘의 의미는 다름

    • Procedures

      → side effect가 있음. (return value 외에 머신의 상태를 바꾸는게 있다.)

      → ex: printf: 스크린에 argument를 프린트해서 머신의 상태를 달라지게 함

      → C의 프로그래밍 패러다임 이름이 procedural programming인 이유가

      C가 side effect가 있는 procedure에 의존을 많이 해서

    • Functions(functional programming): Mathematical(or pure) function (수학적인 함수)

      → arguments와 return value라는 개념밖에 없다.

      → side effect가 없다. (return value 이외에 머신의 상태를 바꾸는게 없다.)


  1. Logic Programing (앞에서 Fact 다 저장하고 query 하던거)

4. OS Abstraction

마지막으로 OS를 abstraction 관점에서 간단히 살펴보자.

Three Major Interfaces in CS

CS에서는 3개의 주요 Interface들을 제공한다.

1) ISA: 머신에 제공하는 instruction set. 더 전공적이게 표현하면 instruction set 아키텍쳐

2) HLL: 컴파일러가 제공하는 high level language

3) API: 운영체제가 제공하는 API라는 인터페이스

→ 파란색으로 되어 있는게 우리가 돈을 주고 살 수 있는 거!

What is OS? (Abstraction Perspective)

하드웨어를 직접 사용하긴 어렵다. 그렇다면? 사용자에게 편리한 사용법(Interface)를 제공하면 된다.

이렇게 사용자에게 하드웨어를 사용할 수 있는 편리한 인터페이스를 제공하는 것이 OS


Uploaded by N2T

728x90
728x90