항해99 5기 CS Study - 5장 컴퓨터 아키텍처와 운영체제

ne_ol·2022년 1월 31일
0
post-thumbnail

2. 프로시저, 서브루틴, 함수

  • 프로그래머들이 피하고 싶은 것: 똑같은 코드를 두 번 이상 작성하는 것
    => 이를 해결해줄 수 있는 함수 (or 프로시저 or 서브루틴; 프로그래밍 안에서 동일한 의미) 는 코드를 재사용하는 주요 수단!!
  • JavaScript 함수/함수 호출하기
/함수
function cube (x) { //x라는 parameter 값을 받는 cube 라는 함수 
  return (x*x*x) //x 값의 세제곱을 반환
}

/호출하기
y = cube (3) 
  • 함수를 호출하여 함수를 실행하고 다시 원래 자리로 돌아올 방법이 필요 => 돌아오기 위해서 함수로 들어간 위치 = '프로그램 카운터의 값' 기억 필요

  • 함수 호출 흐름

  1. 100 번지: 프로그램 시작
  2. 101 번지: 함수에서 돌아올 주소 (105번지) 설정
  3. 102 번지: 101번지에서 설정한 주소 값을 200번지에 저장
  4. 103 번지: 함수 파라미터 값 전달
  5. 104 번지: function cube 호출 (분기)
  6. 200 번지: 함수 산출값을 저장되어 있던 주소로 반환 (간접 분기)
  7. 105 번지: 함수 산출값 받기
  8. 300~ 번지: 함수 명렁어

3. 스택

  • 재귀: 자기 자신을 호출하는 함수
    • 핸드폰의 JPEG 압축을 통한 사진 크기 감소
    • 재귀적 분할로 압축하기 (그림 5-3을 4등분으로 나누고 검사하는 과정을 1픽셀 단위 조각까지 반복)

우리말이나 영어 등의 언어로 간결하게 적은 코드인 '의사 코드'로 작성된 분할 함수 subdivide는
정사각형의 왼쪽 아래 꼭지점의 x, y 좌표와 size를 파라미터로 취한다.

그림 5-3를 subdivide 함수로 그리는 방법
회색: 검사 영역이 분할이 필요한 경우, 흰색/검은색: 모든 색이 흰색/검은색으로 같을 경우

  • 그림 5-4
    • 트리라고 부르며, 수학에서는 유향 비순환 그래프 (Directed Acyclic Graph) 라고 불리는 구조
    • 각 노드에서 4개의 가지가 뻗어나감 => 쿼드트리: 공간 데이터 구조에 속함
    • 화살표 방향으로 읽기 때문에, 순환이 없다
    • 루트: 맨 윗부분
    • 노드: 화살표가 뻗어나가는 (사각형) 부분
    • 잎 노드 (leaf node): 화살표가 뻗어나가지 않는 부분 => 나뭇가지의 끝에 달린 나뭇잎처럼 트리의 맨 마지막에 달려있다
    • 흰색/검은색 사각형 => 40개 <<< 64 Pixel => 저장 Data 少 => 압축!
  • 재귀적 함수의 한계
    • 반환값 저장 위치 1곳 -> 이미 들어 있던 반환값을 덮어써서 되돌아갈 위치를 잃어버리기 때문에 자기 자신을 호출 불가
    • 해결책
      • 스택
        • 함수 호출 시: 반환 주소를 접시에 넣어서 접시 더미 맨 위에 Push! (=쌓아올린다)
        • 함수 호출에서 반환 시: 접시 더미 맨 위의 접시를 보고 반환 주소를 결정하고 접시 제거! (Pop)
        • 여러 반환 주소 저장을 가능케 한다
        • 함수에서 호출 지점으로 다시 돌아갈 때, 어떤 주소를 사용할지 결정 가능케 한다
        • aka LIFO 구조 (late in, first out)
        • Forth나 PostScript와 옛날 HP 계산기 몇 가지는 스택 기반 언어
        • 한국어/일본어도 스택 기반 언어
        • 스택 오버플로: Push할 공간 X
        • 스택 언더플로: 빈 스택에서 Pop
        • 한계 레지스터: 소프트웨어가 항상 스택 오버플로를 검사하지 않아도 되도록 돕는다
      • 스택 프레임: 함수가 호출될 때마다 스택에 저장되는 데이터 모음

각 함수 호출이 반환 주소와 지역 변수를 포함하는 새로운 스택 프레임을법 만들고 있다.

profile
개발되는 중입니다.

0개의 댓글