4 - 서브루틴과 함수 (+ 컴파일러)

2025. 3. 27. 18:40·컴퓨터 과학/프로그래밍 기초

초기에는 명령코드와 메모리의 위치를 가져와서 레지스터에 넣으면서 기계어 코딩을 했을 것이다.

 

하지만 작업을 하면서 이미 작성한 기능을 다른 프로그램에 가져가서 써야하는 일이 있었을 것이고

동일한 내용의 코드를 작성해야 하는 일이 있었을 것이다.

(전쟁 비용 예시에서 더하는 것을 2번 했던 것처럼)

 

하지만 그런 경우 기능을 옮기려고하는 프로그램의 RAM 위치를 계산해서 코드를 전부 새롭게 짜야했고, 같은 프로그램에서 동일한 내용의 코드를 복사하려고 하더라도 단순 복사가 아니라 RAM 의 위치를 모두 계산해서 코드를 새롭게 작성해야했다. 이는 매우 귀찮고 어려운일이었을 것이다

 

이 문제를 해결하기 위해서 한 가지 아이디어를 가져올 수 있다

 

아무런 영향을 받을 것 같지 않게 '멀리 떨어진' 위치에서 동일하게 쓰일 코드를 작성하면 어떨까?

-> 프로그램의 메인루틴에서 멀리 떨어진 위치에 서브루틴을 작성하는 것. 이게 서브루틴이다.

 

하지만 서브루틴은 여러 문제점이 있었다.

 

1. 호출한 곳과 서브루틴간의 데이터 공유 문제

2. 서브루틴 안에서만 사용하는 데이터의 메모리 낭비 문제

3. 서브루틴에서 다른 서브루틴을 호출하거나, 서브루틴에서 다시 동일한 서브루틴을 호출하는 경우

 

이러한 문제점들을 '스택 포인터' 라는 '개념' 을 통해서 해결했다

 

메모리에 스택 포인터가 사용할 영역을 정해두고, 메인 루틴에서 전달받는 데이터, 서브루틴에서만 사용하는 데이터, 서브루틴 종료 이후에 돌아갈 메모리 위치를 모두 '스택 포인터' 에 대해서 '상대적인' 위치로 저장하는 방식으로 코딩을 하는 것이다. 그리고 서브루틴 종료시에는 다시 메인루틴으로 돌아가도록 하면서 이런 문제를 해결했다.

 

이 스택 포인터라는 개념에서 중요한 것은 '절대적'인 위치를 '상대적' 인 위치로 변경했다는 점이다.

 

예를 들어 메모를하고 책갈피를 꽂아놓은 것을 생각해보자. 내가 특정 메모를 했는데 그걸 몇p 에 했다고 할 수 있지만, 책갈피에서 몇 페이지 떨어진 곳에서 했다고 표시할 수 있는 것과 마찬가지다

 

혹은 책에서 글을 쓸 때 해당 단어가 140 페이지, 33 번째 줄, 1 번째 글자부터 시작한다고 표시하고 찾을 수 있다. 하지만, 만약에 책의 내용이 길어지거나 짧아지개 개정이 된다면, 해당 단어를 찾을 때 몇 페이지, 몇 번째 줄, 몇 번째 글자에 단어가 위치했는지 내용이 수정될 때마다 계산해서 바꿔줘야하지만, 책의 3단원 1페이지 12번째 줄 1번째 글자라고 만 해놓으면 책의 1, 2 단원이 짧아지든, 길어지든 상관없는 것이다. 

 

하지만 이 방법도 아주 만능은 아닌 것이다. 왜냐하면 스택 포인터가 정해진 스택 영역의 범위를 넘어가면 스택 '오버플로우' 가 일어나기 때문이다.

 

이렇게 서브루틴의 단점을 해결한 '스택 프레임' 이라는 기법이 생겨나면서 우리는 반복적이고 귀찮은 작업들을 손쉽게 해결할 수 있게 되었다.

 

다시 처음으로 돌아가서, 같은 기능을 하는 코드를 위해서 RAM 을 다 계산해서 똑같은 코드를 중복으로 짤 필요가 없어진 것이다!!

 

즉, 이렇게 RAM 의 위치를 계산할 필요가 없어지면서, 이 편한 기능을 좀 더 확장하고 싶다는 생각이 들었다

 

이런 일들을 자동으로 하게 해주는 자동화 프로그램에 대한 아이디어가 떠올랐고, 이것이 '컴파일러' 가 되었다.

즉, 사람이 쓰는 말을 기계어로 알아서(RAM 의 위치를 크게 신경쓰지 않아도) 바꿔주는 프로그램을 만들게된 것이다

'컴퓨터 과학 > 프로그래밍 기초' 카테고리의 다른 글

3- 초기 프로그래밍의 변수  (0) 2024.12.17
2- 컴퓨터의 구조와 핵심  (0) 2024.12.17
1-컴퓨터의 계산(저장, 연산 그리고 제어)  (0) 2024.12.17
0-컴퓨터란?  (1) 2024.11.10
'컴퓨터 과학/프로그래밍 기초' 카테고리의 다른 글
  • 3- 초기 프로그래밍의 변수
  • 2- 컴퓨터의 구조와 핵심
  • 1-컴퓨터의 계산(저장, 연산 그리고 제어)
  • 0-컴퓨터란?
로그랩
로그랩
coding-journal-by-log 님의 블로그 입니다.
  • 로그랩
    로그의 코딩노트
    로그랩
  • 전체
    오늘
    어제
    • 분류 전체보기 (42)
      • 컴퓨터 과학 (5)
        • 프로그래밍 기초 (5)
        • 네트워크 (0)
        • 운영체제 (0)
      • 자료구조 & 알고리즘 (0)
      • 알고리즘 문제풀이 (13)
        • 백준 (13)
      • 디자인 패턴 & 아키텍처 (0)
      • 프로그래밍 언어 (2)
        • JAVA (0)
        • JvaScript (0)
        • C 언어 (2)
        • C++ (0)
      • 웹 프로그래밍 (1)
      • 백엔드 (0)
        • 스프링 (0)
        • 전자정부 프레임워크 (0)
        • Mybatis (0)
      • 프론트엔드 (0)
        • ajax (0)
        • react (0)
      • GIS 프로그래밍 (5)
        • OpenLayers (0)
        • GeoServer (1)
        • Qgis (0)
        • PostGIS (0)
        • uDIg (4)
      • 수학 (0)
      • 컴퓨터 설정 (14)
        • vim & neovim (8)
        • 개발환경 (4)
        • 윈도우 설정 (2)
        • 맥 설정 (0)
      • 일상 (1)
        • 책 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오블완
    백준 10172 c++
    함수란
    vim
    백준 1998년생인 내가
    neovim
    백준 ??!
    백준 10869 c++
    티스토리챌린지
    2025 정처기 실기
    VsCode Vim
    백준 2557 c++
    백준 10998 c++
    백준 1000 c++
    솔브닥 클래스1
    백준 10869 c++
    백준 1008 c++
    서브루틴이란
    vim 단축키
    백준 11382 c++
    2025 정처기
    백준 a - b
    백준 18108 c++
    백준 a + b
    백준 10430 c++
    백준 1001 c++
    solved.ac 클래스1
    백준 a * b
    백준 10926 c++
    솔브닥 클래스 1 올클
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
로그랩
4 - 서브루틴과 함수 (+ 컴파일러)

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.