Skip to content

Instantly share code, notes, and snippets.

@Curookie
Last active October 15, 2018 15:51
Show Gist options
  • Save Curookie/2beae444d65c44348596bd545e21705b to your computer and use it in GitHub Desktop.
Save Curookie/2beae444d65c44348596bd545e21705b to your computer and use it in GitHub Desktop.
프로그래밍 기초 개념
인터프리터(interpreter, 해석기)
프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다.
원시 코드를기계어로 번역하는 컴파일러와 대비된다. 인터프리터는 다음의 과정 가운데 적어도 한 가지 기능을 가진 프로그램이다.
1. 소스 코드를 직접 실행한다.
2. 소스 코드를 효율적인 다른 중간 코드로 변환하고, 변환한 것을 바로 실행한다
3. 인터프리터 시스템의 일부인 컴파일러가 만든, 미리 컴파일된 저장 코드의 실행을 호출한다
4. 인터프리터는 고급언어로 작성된 원시코드 명령어들을 한번에 한 줄씩 읽어들여서 실행하는 프로그램이다
컴파일러(Compiler, 해석기, 번역기)
특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 프로그램을 말한다.
원래의 문서를 소스 코드 혹은 원시 코드라고 부르고, 출력된 문서를 목적 코드라고 부른다.
목적 코드는 주로 다른 프로그램이나 하드웨어가 처리하기에 용이한 형태로 출력되지만 사람이 읽을 수 있는 문서
파일이나 그림 파일 등으로 옮기는 경우도 있다. 원시 코드에서 목적 코드로 옮기는 과정을 컴파일(compile)이라고 한다.
컴파일러는 소스 프로그램을 읽어서 즉시 결과를 출력하는 인터프리터와는 구분된다.
링커(Linker)
컴파일된 코드를 컴파일러가 제공하는 라이브러리 및 다른 코드들과 연결하는 것을 말한다
링커는 퍼즐처럼 조각난 프로그램을 하나로 묶는 역활을한다.
1) 컴파일러 장점
컴파일러는 컴파일 하는 과정이 복잡하고 그 시간이 많이 걸리게 된다. 한번 컴파일 하면 그대로 사용이 가능하여
반복 작업을 할 경우 처리 시간이 매우 빠르다.
컴파일 하는 과정에서 단계별로 주기억장치안에 들어 가기 때문에 기억장소의 크기가 조정이 가능하다.
전체 실행 시간 면에서 매우 효율적이다.
컴파일러는 매번 번역할 필요가 없다.
2) 컴파일러 단점
한 줄의 입력 시 프로그램이 때론 몇 백 개의 기계어로 번역되기 때문에 그 프로그램은 큰 기억용량을 요구한다.
특히 입출력 명령은 입출력 형식을 위한 코드 외에 기계 상태 파악코드로 인해 큰 기억 장치가 요구된다.
3) 인터프리터 장점
프로그램이 될 때까지 원시 언어의 형태를 유지하기 때문에 기억 장소가 따로 필요하지 않다.
4) 인터프리터 단점
원시 프로그램을 직접 실행하기 때문에 이 실행에 필요한 소프트웨어가 항상 기계 안에 상주하면서 원시 프로그램의 명령들을 받아서 치리해야 한다.
만일 반복을 하게 되면 그때마다 원시 프로그램을 해석하고 처리해야 하기 때문에 많은 시간이 걸리기도 한다.
인터프리터의 시행 시간은 컴파일러 방법에 비해 비효율적이다.
실행순서를 맞쳐줘야한다. (실행 시간 설정을 해놔야한다.)
5) 컴파일러 언어, 인터프리터 언어 예시
컴파일러 언어 : Fortran, Algol, PL/1, Pascal, Cobol, C, C++, JAVA, C#
인터프리터 언어 : Lisp, Snobol4, APL, Prolog, Python
유저모드와 커널모드란.
커널에서 중요한 자원을 관리하기 때문에, 사용자가 그 중요한 자원에 접근하지 못하도록 모드를 2가지로 나눈 것입니다.
유저모드
: 유저(사용자)가 접근할 수 있는 영역을 제한적으로 두고, 프로그램의 자원에 함부로 침범하지 못하는 모드 입니다.
: 우리는 여기서 코드를 작성하고, 프로세스를 실행하는 등의 행동을 할 수 있습니다.
: 간단하게 유저 어플리케이션 코드가 유저모드에서 실행된다. 라고 말할 수 있습니다.
커널모드
: 모든 자원(드라이버, 메모리, CPU 등)에 접근, 명령을 할 수 있습니다.
: 유저모드와는 비교가 안되게 컴퓨터 내부에서 모든 짓? 을 할 수 있다고 생각하면 되겠습니다
★ 메모리 구조
Code
우리가 작성한 소스 코드가 들어간다.
또한 상수도 여기에 들어간다고 한다.
물론 컴파일 된 기계어가 들어갈 것이다.
프로그램이 끝날 때까지 메모리에 계속 적재돼있는 놈들이다.
Data
전역 변수, static 변수 등등이 저장된다.
프로그램이 끝날 때까지 메모리에 계속 적재돼있는 놈들이다.
Stack
지역 변수, 매개 변수, 리턴 값 등등이 저장된다.
함수 호출 시 생성되고, 함수가 종료되면 시스템에 반환된다.
프로그램이 자동으로 사용하는 임시 메모리 영역이다.
또한 이름에서 보듯이 Stack 자료구조를 이용해 구현한 것 같다.
컴파일 시에 크기가 결정된다.
Heap
프로그래머가 할당/해제하는 메모리 공간이다.
malloc() 또는 new 연산자를 통해 할당하고,
free() 또는 delete 연산자를 통해서만 해제가 가능하다.
Java에서는 가비지 컬렉터가 자동으로 해제하는 것 같기도 하다.
이 공간에 메모리 할당하는 것을 동적 할당(Dynamic Memory Allocation)이라고도 부른다.
런타임 시에 크기가 결정된다.
Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클 수록 Stack 영역이 작아진다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment