성장通

개발배경지식2) 프로그램과 프로그래밍 본문

컴퓨터 공학 기본/개발배경지식

개발배경지식2) 프로그램과 프로그래밍

백악기작은펭귄 2021. 11. 3. 15:07

프로그램

프로그래밍 언어에 의해 짜인 코드가 컴파일되어 컴퓨터가 이해할 수 있는 형태로 바뀌어진 코드의 집합을 프로그램이라고 한다.

이러한 프로그램을 실행하게 되었을 때를 프로세스라고 한다.


프로세스

프로세스는 실행되고 있는 프로그램을 의미한다.

프로그램이 실행되면 이 프로그램은 메모리 위에 올라가게 되고, 이를 운영체제가 중재하는 역할을 한다고 이전 포스팅에서 언급한 바 있다.

이때 프로그램이 메모리에 올라가는 형태가 바로 프로세스이며, 이는 프로그램의 실행 정보, 코드, 그리고 실행되면서 사용되거나 생성되는 데이터 등으로 구성되어있다.

이 내용이 많을 경우 '무거운 프로그램'이라고 지칭하곤 한다.

작업관리자에서 실행되고 있는 프로세스를 확인하고 제어할 수 있다.

실제 프로그램은 코드로 이루어져 있으며, 이러한 코드를 작성하는 행위를 프로그래밍이라고 한다.

그리고 이러한 프로그래밍을 가능하게 하는 특수한 언어를 프로그래밍 언어라고 한다.


프로그래밍 언어

실제로 컴퓨터가 이해하는 언어는 0과 1로 이루어진 기계어뿐이다.

하지만 이것을 사람이 직접 작성하기에는 무리가 있기에, 중간에 컴파일러라는 것이 존재하고, 이것이 우리가 사용하는 고급언어인 프로그래밍 언어를 저급 언어인 기계어 혹은 어셈블리어 등으로 변환시켜준다.

고급언어의 일종인 Java
저급언어의 일종인 기계어와 어셈블리어

컴파일된 결과물이 항상 기계어 혹은 어셈블리어인 것은 아니다. 보통의 고급언어인 C, C++ 등은 저 레벨 언어이기 때문에 컴파일된 결과물이 CPU 하드웨어에서 바로 해석되고 실행되지만, Java, Python 등 하이레벨의 인간친화적인 언어의 경우, 컴파일을 통해 바이트코드로 변환되어 따로 소프트웨어에서 해석을 하게 된다.


용어 정리

  • 컴파일
    • 위에서 언급했듯이 일부 하이레벨의 고급언어의 경우 바이너리 형태가 아닌 바이트코드를 형성하기도 하는데, Java의 경우 JVM(Java Virtual Machine)에서 실행 가능한 바이트코드 형태의 클래스 파일을 생성한다.
    • 개발자가 작성한 소스코드를 바이너리 형태의 Object File로 변환하는 과정으로, 고급언어를 컴퓨터가 이해할 수 있는 기계어로 변환하는 과정이다.
  • 빌드
    • 소스코드를 실행할 수 있는 소프트웨어 산출물로 만드는 행위
    • 컴파일 또한 빌드의 부분집합적인 개념으로, 빌드는 이를 포함하여 소스코드를 즉시 실행 가능한 형태로 만드는 행위 전반을 일컫는다.
  • 빌드 툴
    • 전처리(Preprocessing), 컴파일(Compile), 패키징(Packaging), 테스팅(Testing), 배포(Distribution) 등의 빌드와 관련된 기능을 제공해주는 도구 소프트웨어로, 대표적으로 Ant, Maven, Gradle 등이 있다.
  • 링크
    • 프로젝트를 진행하다 보면, 소스파일이 여러 개 생성되고, A라는 소스파일에서 B라는 소스파일에 존재하는 함수(메서드)를 호출하는 경우가 있다. 따라서 A와 B를 연결해주는 작업이 필요한데 이 작업을 링크라고 한다. Java의 경우, JVM이 프로그램 실행 도중 필요한 클래스를 찾아서 클래스 패스에 로드해주는데 이는 동적 링크의 예이다.
    • 링크는 정적 링크(static link)와 동적 링크(dynamic link)가 있는데, 정적 링크란 컴파일된 소스파일을 연결해서 실행 가능한 파일을 만드는 것이고, 동적 링크란 프로그램 실행 도중 프로그램 외부에 존재하는 코드를 찾아서 연결하는 작업을 말한다.
    • 이때 A와 B 소스파일 각각을 컴파일만 하면 A가 B에 존재하는 함수를 찾질 못하기 때문에 호출할 수가 없다.
    • 여러 개로 분리된 소스파일들을 컴파일한 결과물들에서 최종 실행 가능한 파일을 만들기 위해 필요한 부분을 찾아서 연결해주는 작업
  • IDE
    • 코딩을 하는 코드 편집기, 컴파일해주는 컴파일러, 디버깅을 해주는 디버거 등을 하나의 프로그램 내부에 모아둔 것으로, 대표적으로 VSCode, Pycharm 등이 있다.