0. 튜토리얼

이정진·2024년 12월 30일

Nodejs

목록 보기
1/1

본격적인 이야기에 들어가기 전에 언어의 발전 과정을 간단히 알아보려고 한다.
프로그래머가 많이 활용하는 C언어부터 시작하자.

개인적으로 C언어를 알지 못하고는 다른 언어의 기본적인 이해는 불가하다고 생각한다. 특히, 인터프리터 언어는 포인터 개념의 집합체이기에 더욱 그렇다.

(C언어를 제외하고는 직접적으로 메모리에 접근하지 않기에 포인터가 아니지 않나?라는 반박이 생길 수도 있겠다. 하지만 컴퓨터에서 일어나는 모든 과정은 메모리에 일정 공간을 차지하고 그 메모리 주소를 찾아가는 일련의 과정이기에 필자는 해당 과정을 모두 포인터의 개념이 적용된 것으로 본다.)

컴파일 언어

C/CPP

C와 CPP를 묶는 이유는 두 언어는 동일한 언어이기 때문이다. cpp는 간단히 말해 c언어의 확장판이다.

마치 메이플스토리1이라는 게임이 메이플스토리2라는 게임으로 업데이트된 것과 동일한 개념이라고 이해하면 좋다.

그렇다면 어떤 cpp에 추가된 기능은 무엇일까? 클래스(class)이다.

구조체와 클래스 간의 개념적인 차이는 privatepublic이라는 접근 제어이다. 이를 바탕으로 MethodFunction이 구분된다.

두 언어에서 가장 중요한 개념은 포인터(pointer)이다.

컴퓨터 언어를 활용한다는 것은 결국 메모리를 다루는 일이다. 메모리를 다루기 위해서는 당연하게도 해당 메모리의 주소를 알아야 수행하고자 하는 일을 할 수 있을 것이다. 그리고 활용하고자 하는 메모리의 주소를 가리키는 것이 포인터라는 개념이다. 즉, 변수를 선언하고 그것을 활용하는 것, 인스턴스(instance)를 생성하고 해당 인스턴스를 활용하는 것 모두 포인터라는 개념 하에 동작한다. 자판기에서 콜라를 뽑아서 가져오라고 해놓고 자판기가 어디있는지 알려주지 않으면 어떻게 콜라를 가져오겠는가..

Java

C/CPP는 포인터를 통해 빠른 동작을 가진 강력한 언어가 되었지만 그만큼 위험성이 높은 언어가 되기도 했다. 해당 위험성을 줄이기 위해 등장한 언어가 JAVA이다.

JAVAJVM(Java Virtual Machine) 특히, GC(Garbage Collector)을 통해 이런 위험을 관리했다.

C에서 사용자가 직접 할당한 메모리는 반드시 해제해줘야 한다. 만약 이를 해제하지 않는다면 메모리 누수가 발생한다. GC는 이를 해결하기 위해 사용하지 않는 메모리를 자동적으로 해제시켜주는 아주 편리한 기능이다. 이는 JAVA 이후의 대부분의 언어에서 활용된다.

인터프리터 언어

우선 "인터프리터 언어"interpreter란 통역을 의미한다. 통역은 번역과는 다르게 외국어를 듣는 즉시 한글로 바꿔주게 된다. 같은 의미로 인터프리터 언어는 코드 한 줄을 차례차례 통역하는 것이다. 빌드의 과정을 거쳐 기계어로 번역하는 컴파일 언어와는 다르게 인터프리터 언어를 빌드의 과정을 거치치 않는다.

따라서 인터프리터 언어에서 에러가 발생되면 런타임에러가 터지게 된다.

추가로 인터프리터 언어에서 변수를 선언하게 되면 해당 데이터를 담을 메모리가 할당되고 해당 메모리 내의 값을 참조하는 방식으로 (이것은 포인터의 개념이 적용된 것이다.) 동작한다.

python에서 아래의 코드를 실행해보자.

a = 10
b = 10
# a와 b의 메모리 주소 출력
print(f'a의 메모리 주소: {id(a)}')
print(f'b의 메모리 주소: {id(b)}') # 두 메모리 주소는 동일
# 자료형 출력
print(f'a의 자료형: {type(a)}') # <class 'int'> 

C에서 아래의 코드를 실행해보자.

#include <stdio.h>
int main() {
    int a = 10;
    int b = 10;
    // a와 b의 주소 출력
    printf("a의 주소: %p\n", (void*)&a);
    printf("b의 주소: %p\n", (void*)&b); //두 메모리 주소를 다르다.
    //종료
    return 0;
}

python은 값은 동일한 메모리를 참조하기에 동일한 값이 출력되는 것을 알 수 있으며 C언어는 변수 별로 다른 메모리를 할당하기에 다른 값을 출력하는 것을 볼 수 있다. 추가적으로 <class 'int'>에서 class는 객체를 참조하기에 class가 붙는다.

이후의 인터프리터를 너무나 다양하기에 공부하며 같이 다루겠다.

0개의 댓글