[혼공컴운] 1주차 Chapter 01~03

yeon·2024년 1월 7일
0

기본 미션

p.51의 확인 문제 3번 풀고 인증하기

  1. 다음 설명의 빈칸에 들어갈 알맞은 내용을 써보세요.
    프로그램이 실행되려면 반드시 (        )에 저장되어 있어야 합니다.
    정답: 메모리

p.65의 확인 문제 3번 풀고 인증하기

  1. 1101(2)의 음수를 2의 보수 표현법으로 구해 보세요.
    1101
      ↓ (모든 0과 1 뒤집기)
    0010
      ↓ (1 더하기)
    0011

정답: 1101(2)를 음수로 표현한 값은 0011(2) 입니다.

선택 미션

p.100의 스택과 큐의 개념을 정리하기

스택 (stack)

  • 한쪽 끝이 막혀 있는 통과 같은 저장 공간
  • LIFO (Last In First Out) 자료 구조: 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식 (후입선출)

큐 (queue)

  • 양쪽이 뚫려 있는 통과 같은 저장 공간
  • FIFO (First In First Out) 자료 구조: 가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식 (선입선출)

내용 정리

1-1. 컴퓨터 구조를 알아야 하는 이유

  • 문제 해결을 위한 다양한 실마리를 찾을 수 있음
  • 개발한 프로그램의 성능과 용량, 비용을 고려할 수 있음

1-2. 컴퓨터 구조의 큰 그림

컴퓨터가 이해하는 정보

  • 데이터: 컴퓨터가 이해하는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보. 명령어를 위해 존재하는 일종의 재료
  • 명령어: 컴퓨터를 작동시키는 정보
    (컴퓨터는 명령어를 처리하는 기계임)

컴퓨터의 4가지 핵심 부품

  • 중앙처리장치 (CPU): 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품
  • 주기억장치 (메모리): 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
  • 보조기억장치: 전원이 꺼져도 보관할 프로그램을 저장하는 부품
  • 입출력장치: 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품

메모리

  • 프로그램이 실행되기 위해서는 반드시 메모리에 저장되어 있어야 함
  • 메모리는 현재 실행되는 프로그램 (프로세스)의 명령어와 데이터를 저장
  • 메모리에 저장된 값의 위치는 주소로 알 수 있음

CPU

  • CPU는 메모리에 저장된 값을 읽어 들이고, 해석하고, 실행하는 장치
  • CPU 내부에는 ALU, 레지스터, 제어장치가 있음
  • ALU는 계산하는 장치, 레지스터는 임시 저장 장치, 제어장치는 제어 신호를 발생시키고 명령어를 해석하는 장치

시스템버스
: 컴퓨터의 네 가지 핵심 부품들이 서로 정보를 주고받는 통로

  • 주소 버스, 데이터 버스, 제어 버스로 구성되어 있음
  • 메인보드 내부에는 시스템 버스를 비롯한 다양한 버스가 있음
  • CPU가 메모리에 값을 저장할 때 주소 버스, 데이터 버스, 제어 버스를 모두 사용할 수 있음

2-1. 0과 1로 숫자를 표현하는 방법

  • 비트: 0과 1로 표현할 수 있는 가장 작은 정보 단위
  • 바이트, 킬로바이트, 메가바이트, 기가바이트, 테라바이트는 비트보다 더 큰 정보 단위
  • 워드(word): CPU가 한 번에 처리할 수 있는 데이터 크기 (x64 CPU는 64비트 워드 CPU)
  • 이진법은 1을 넘어가는 시점에 자리 올림을 하여 0과 1만으로 수를 표현하는 방법
  • 이진법에서 음수는 2의 보수로 표현 가능
    - 2의 보수: 어떤 수를 그보다 큰 2^n에서 뺀 값
  • 십육진법은 15를 넘어가는 시점에 자리 올림하여 수를 표현하는 방법
    - 이진수와 십육진수 간의 변환이 쉽기 때문에 이진수와 더불어 십육진수가 많이 사용됨

2-2. 0과 1로 문자를 표현하는 방법

  • 문자 집합은 컴퓨터가 인식할 수 있는 문자의 모음으로, 문자 집합에 속한 문자를 인코딩하여 0과 1로 표현할 수 있음
  • 아스키 문자 집합에 0부터 127까지의 수가 할당되어 아스키 코드로 인코딩됨
    - 문자 표현을 위해 사용되는 비트 7비트, 1비트는 패리티 비트로 오류 검출을 위해 사용
  • EUC-KR은 한글을 2바이트 크기로 인코딩할 수 있는 완성형 인코딩 방식
  • 유니코드는 여러 나라의 문자들을 광범위하게 표현할 수 있는 통일된 문자 집합이며, UTF-8, UTF-16, UTF-32는 유니코드 문자의 인코딩 방식

3-1. 소스 코드와 명령어

  • 고급 언어: 사람이 이해하고 작성하기 쉽게 만들어진 언어
  • 저급 언어: 컴퓨터가 직접 이해하고 실행할 수 있는 언어
  • 저급 언어는 0과 1로 이루어진 명령어로 구성된 기계어와 기계어를 사람이 읽기 편한 형태로 번역한 어셈블리어가 있음
  • 컴파일 언어: 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 언어
  • 인터프리터 언어: 인터프리터에 의해 소스 코드가 한 줄씩 저급 언어로 변환되어 실행되는 언어

컴파일 언어와 인터프리터 언어

  • 컴파일 언어는 한 줄이라도 소스상에 오류가 있다면 실행될 수 없음
  • 일반적으로 컴파일 언어가 인터프리터 언어보다 빠름
  • 인터프리터는 인터프리터 언어로 작성된 소스 코드를 한 줄씩 저급 언어로 변환하여 실행함
  • 컴파일러는 컴파일 언어로 작성된 소스 코드 전체를 목적 코드로 변환함

Java는 컴파일 언어일까? 인터프리터 언어일까?
Java의 경우 저급 언어가 되는 과정에서 컴파일과 인터프리트를 동시에 수행

  • 프로그래머가 작성한 프로그램은 텍스트 파일
    - 확장자가 java
    - [Workspace 이름] > [Project 이름] > src
    - 메모장으로 열면 텍스트 형식 (인간이 읽을 수 있는 형태)

  • 자바 소스 코드를 컴파일하면 실행 파일 생성
    - 확장자가 .class
    - [Workspace 이름] > [Project 이름] > bin
    - 메모장으로 열면 이진 형식 (인간이 읽을 수 없는 형태)

  • 실제로 실행되는 것은 클래스 파일

컴파일 과정
1. 자바 컴파일러는 자바 언어로 작성된 프로그램을 가상 컴퓨터의 기계어가 들어 있는 파일(바이트 파일)로 변환
2. 자바 가상 기계(JVM: Java Virtual Machine)라는 특수한 가상 컴퓨터 S/W가 바이트 코드를 한 줄씩 읽어서 해석한 후에 실행

두 단계로 나누어서 컴파일하고 실행하는 이유
: 응용 프로그램들을 다시 컴파일하지 않아도 모든 컴퓨터에서 실행되도록 하기 위해서
JVM만 가지고 있다면 어떤 바이트 코드도 다시 컴파일할 필요없이 JVM 위에서 실행할 수 있음. 동일한 바이트 코드 파일이 윈도우, 리눅스, Mac OS에서 변경없이 실행 가능


3-2. 명령어와 구조

  • 명령어: 연산 코드와 오퍼랜드로 구성
  • 연산 코드: 명령어가 수행할 연산을 의미
  • 오퍼랜드: 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치를 의미
  • 주소 지정 방식: 연산에 사용할 데이터 위치를 찾는 방법

연산 코드

  • 데이터 전송 (MOVE, STORE, LOAD, PUSH, POP...)
  • 산술/논리 연산 (ADD, INCREMENT, AND, COMPARE...)
  • 제어 흐름 변경 (JUMP, HALT, CALL, RETURN...)
  • 입출력 제어 (READ, WRITE, START IO, TEST IO...)

주소 지정 방식

  • 즉시 주소 지정 방식
    : 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
    - 표현할 수 있는 데이터의 크기가 작아지는 단점
    - 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문에 다른 주소 지정 방식들보다 빠름
  • 직접 주소 지정 방식
    : 오퍼랜드 필드에 유효 주소를 직접적으로 명시
    - 표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식보다 커짐
    - 표현할 수 있는 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소에 제한이 생길 수 있음

  • 간접 주소 지정 방식
    : 유효 주소의 주소를 오퍼랜드 필드에 명시
    - 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 더 넓어짐
    - 두 번의 메모리 접근이 필요하기 때문에 앞의 주소 지정 방식들보다 일반적으로 느림

  • 레지스터 주소 지정 방식
    : 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시
    - CPU 외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르기 때문에, 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있음
    - 표현할 수 있는 레지스터 크기에 제한이 생길 수 있음 (직접 주소 지정 방식과 비슷한 문제를 공유)

  • 레지스터 간접 주소 지정 방식
    : 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시
    - 간접 주소 지정 방식보다 빠름

정리

  • 즉시 주소 지정 방식: 연산에 사용할 데이터
  • 직접 주소 지정 방식: 유효 주소 (메모리 주소)
  • 간접 주소 지정 방식: 유효 주소의 주소
  • 레지스터 주소 지정 방식: 유효 주소 (레지스터 이름)
  • 레지스터 간접 주소 지정 방식: 유효 주소를 지정한 레지스터

0개의 댓글