본문 바로가기

STUDY LOG

💻 IT 프로그래밍 개발을 위한 얕고 넓은 배경지식 (2)

728x90
반응형

IT 프로그래밍 개발을 위한 얕고 넓은 배경지식 (2)

 

프로그램(컴파일, 컴파일러)프로그래밍 언어의 분류(컴파일 방식, 메모리 관리 방식, 타입, 패러다임)에 대한 배경지식을 공부하며 새롭게 배운 내용들을 작성해보았습니다. 자신이 공부하고 있는 프로그래밍 언어가 어떤 컴파일 방식에 따라 어떻게 구분되는지 쉽게 알아볼 수 있는 포스팅입니다.

 

프로그램

 

프로그램이란 사용자의 명령에 반응하는 소프트웨어를 의미합니다.

소프트웨어가 프로그램을 포함하는 상위 개념이지만,

최근에는 소프트웨어=프로그램=앱 동의어로 취급되는 것 같습니다. 

 

프로그램 자체는 코드(명령어)의 집합으로 이루어져 있습니다.

우리가 일반적으로 "코딩" 이라고 부르는 것은 개발자들이 코드를 작성하고,

컴퓨터가 이해할 수 있는 언어로 변환할 수 있게 만들어주는 과정을 의미합니다.

 

 

 

윈도우의 작업관리자를 실행하면, 현재 생성된 프로세스 목록을 확인할 수 있습니다.

 

 

프로그램을 실행하면 '프로세스' 라는 것이 생성됩니다.

 

프로세스(Process)는 컴퓨터 전문 용어라기 보다는, 영어 단어 그대로

'어떤 일이 진행되어가고 있는 흐름, 일을 처리하는 과정 또는 순서'를 의미합니다.

 

우리가 특정 프로그램을 실행하면 (포토샵, 워드 등)

이 프로그램에서 프로세스가 생성되어 메모리에 적재됩니다.

 

윈도우의 작업관리자를 실행하면,

현재 생성된 프로세스 목록과 점유하고 있는 메모리 비율을 확인할 수 있습니다.

 

 

 

IT 프로그래밍 개발을 위한 얕고 넓은 배경지식 (1)

컴퓨터 컴퓨터는 하드웨어+소프트웨어+펌웨어의 구성체를 말합니다. 소프트웨어 소프트웨어는 컴퓨터의 시스템을 구성하는 주요 요소 중 하나입니다. 응용 프로그램과 데이터처럼 컴퓨터의 하

y-oni.tistory.com

 

 

요리로 비교하자면, "라면" 이라는 프로그램을 실행하면

"라면 끓이기"와 같은 프로세스가 생성되며, 냄비에 물을 올리고 불을 켜고,

봉지를 뜯는 등 프로그램에 내장되어 있는 여러가지 기능들을 사용할 수 있게 되는 것입니다.

 

이렇게 프로세스는 프로그램의 실행 정보, 프로그래머가 짠 코드,

그리고 실행되면서 쓰이는 갖가지 데이터들로 구성되어 있습니다.

 

 

 

프로그래밍

 

프로그래밍이란,

컴퓨터에게 명령을 내리고 의사소통을 할 수 있게 해 주는 코드를 작성하는 행위를 의미합니다.

사람이 원하는 작업을 프로그래밍 언어로 작성하여 컴퓨터가 수행할 수 있도록 시킵니다.

 

프로그래밍 언어는 A하면 A-1하고, B하면 B-1 한다 등의

치밀한 논리 연산의 집합으로 이루어져 있기 때문에,

수학적인 언어의 일종으로 보는 시각도 있습니다.

 

그래서 "수학을 잘 해야 프로그래밍을 잘 한다" 라는 인식이 생긴 것 같습니다.

 

하지만 프로그래밍은 수학적인 연산 능력을 필요로 한다기보다는,

수학에서 해답을 찾아가는 논리적인 추론방식과 사고력을 중요시하는 분야라고 생각합니다.

 

프로그래밍 언어는 컴퓨터의 어느 부품이 읽을까요?

프로그램의 실행과 연산을 담당하는 CPU 입니다.

 

CPU는 이진수, 즉 0과 1만 읽을 수 있습니다.

우리가 자연어로 "컴퓨터를 켜고 크롬을 열어라" 코드를 짜도, CPU는 이해할 수 없습니다.

따라서 우리가 작성한 명령어를 컴퓨터가 이해할 수 있는 언어로 번환해주는 과정이 필요합니다.

 

 

 

 

컴파일

 

 

프로그래머가 작성한 코드의 원본을 "원시코드" 혹은 "소스코드"라고 부르고,

출력된 문서를 "목적 코드"라고 부릅니다.

 

목적 코드는 주로 다른 프로그램이나 하드웨어가 이해할 수 있고,

처리하기 용이한 형태로 출력됩니다. 

 

원시 코드에서 목적 코드로 옮기는 과정을 "컴파일(Compile)"이라고 합니다.

 

특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로

옮기는 번역 프로그램을 "컴파일러(Compiler)" 라고 합니다.

 

엄밀히 말하면, 꼭 영어를 0,1로 변환하는 것 뿐만 아니라

어떤 프로그래밍 언어로 쓰여진 코드를 다른 종류의 언어로 바꾸는

행위 전부를 컴파일이라 부른다고 할 수 있습니다. 

 

개발자들이 특정 언어로 작성한 코드의 집합은 컴파일을 통해

컴퓨터 하드웨어(CPU)나 소프트웨어가 이해할 수 있고, 실행 가능한 코드로 변환됩니다.

 

 

 

컴파일 방식

 

 

컴퓨터 프로그램을 만드는 방법은 3 가지가 있는데,

인터프리트 방식, 정적 컴파일 방식, 동적 컴파일 방식으로 나눌 수 있습니다.

 

이 중 인터프리트 방식은

실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며,

반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 미리 번역합니다.

 

컴파일-컴파일러, 인터프리트-인터프리터 입니다.

컴파일러가 번역기라면, 인터프리터는 통역기의 개념입니다.

 

 

 

 

 

✔ 일반적인 인터프리트 방식은 바이트코드나 소스코드를

최적화 과정 없이 번역하기 때문에 성능이 낮습니다.

반면, 정적컴파일 방식은 실행 전에 무조건 컴파일을 해야 하기 때문에

다양한 플랫폼에 맞도록 컴파일 하려면 시간이 오래 걸립니다.  

 

 

✔ 정적 컴파일 방식은 프로그램을 실행하기 전, 소스코드를 기계어로 미리 변환합니다.

 

 

✔ 동적 컴파일 방식은 소스 코드를 중간 언어인 바이트코드로 변환합니다.

바이트코드는 기계어는 아니지만 가상 머신에 의해 기계어로 손쉽게 변환될 수 있는 코드입니다.

동적 컴파일 방식은 바이트코드를 읽어 빠른 속도로 기계어를 생성할 수 있습니다.

 

이런 기계어 변환은 코드가 실행되는 과정에서 실시간으로 일어나며,

전체 코드의 필요한 부분만 변환합니다.

 

기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없습니다.

실행 과정에서 컴파일을 할 수 있도록 만들어졌기 때문에 정적 컴파일러만큼 빠르면서

인터프리터 언어의 빠른 응답속도를 추구하기 위해 사용합니다. 

 

 

 

 

프로그래밍 언어의 분류

 

프로그래밍 언어는 크게 4가지 분류로 나눌 수 있습니다.

 

✔ 컴파일 방식에 따른 분류

✔ 메모리 관리 방식에 따른 분류,

✔ 타입에 따른 분류

✔ 패러다임에 따른 분류 입니다.

 

 

컴파일 방식

컴파일 방식에 따른 프로그래밍 언어는 크게 3가지로 분류할 수 있습니다.

AOT, JIT, 인터프리터 입니다. 응? C, 파이썬, 자바로 나누는거 아니었어?

앞서 말씀드렸던 각 언어를 컴파일 하는 방식에 따라 구분되며,

우리가 C언어, 파이썬, 자바 등의 이름으로써 접하게 되는 것입니다.

 

 

 

AOT(Ahead-Of-Time)

 

C/C++, 파스칼, Haskell 등

 

AOT 컴파일 언어, 혹은 정적 컴파일(Static Complie)언어라고 합니다. 

프로그램을 실행하기 전, 소스코드를 "미리" 컴파일 합니다.

빠른 시작 시간과 일관된 성능이 중요한 분야에서 이용되는 컴파일 언어입니다.

 

 

 

인터프리터

 

비주얼 베이직, bash, awk 등

 

소스 코드를 한 줄씩 읽고 한 줄씩 실행합니다.

대체로 AOT 컴파일 언어나 JIT 컴파일 언어에 비해 성능과 유연성이 낮은 편입니다.

장점은 구현이 단순하고, 구현체의 절대적인 크기가 작다는 점입니다. 

 

 

JIT(Just-In-Time) 

 

Java, Python, PHP, JavaScript, C#, Ruby 등

 

바이트코드를 생성하는 1차 컴파일러,

그리고 1차 컴파일러가 생성한 바이트코드를 실행하는 가상머신(VM)으로 이루어져 있습니다. 

 

최근에 많이 사용되는 언어들은 기본 구현체가 JIT 컴파일러입니다.

 

보통 인터프리터 방식의 언어들이 성능 향상을 목적으로 JIT 컴파일을 도입하는 경우가 많은데,

JIT 컴파일러는 같은 코드를 매 번 해석하는 대신 처음 실행될 때 인터프리트를 하면서

 

자주 쓰이는 코드를 코드 캐시 공간에 캐싱한 뒤,

이후에는 이미 캐싱되어 있는 코드를 가져다 쓰기 때문에

인터프리터의 느린 실행 속도를 개선할 수 있습니다.

 

 

따라서 'JIT 컴파일러' 보다는 'JIT 인터프리터'가 더 정확한 표현이라고도 합니다. 

기본적으로 미리 컴파일을 마치고 실행되는 AOT 방식에 비해서는 어느 정도의 시간이 소요됩니다.

 

 

AOT(Ahead-Of-Time)와 JIT(Just-In-Time) 컴파일 언어의 차이점은 

원시 코드를 곧바로 기계어로 컴파일하느냐,

미리 해석되어 있는 바이트코드를 기계어로 재차 컴파일 하느냐의 차이입니다.

 

JIT와 AOT의 "Time"은 Runtime, 즉 실행 시간을 의미합니다.

 

 

 

 

메모리 관리 방식

 

메모리 관리 방식에 따른 프로그래밍 언어는 크게 2가지로, 비관리 언어와 관리 언어로 분류합니다.

 

비관리 언어(Unmanaged Language)

주로 포인터를 이용한 메모리 직접 접근이 가능한 언어입니다. C, C++, Assembly 등이 있습니다.

메모리에 직접 액세스 할 수 있으므로 프로그래머의 최적화 실력에 따라 높은 퍼포먼스를 낼 수 있지만,

메모리 관리를 제대로 하지 않을 시 프로그램이 망가질 가능성이 큽니다.

 

관리언어(Managed Language)

동적 할당된 메모리의 해제가 가비지 컬렉터(Garbage Collector)에 의해 자동으로 이루어지며,

상대적으로 생산적은 높지만 메모리에 직접 액세스할 수 없으므로 성능 면에서 손실이 있습니다.

 

대표적으로 Java, C#, Python, Go 등이 있습니다.

 

 

 

타입

 

 

타입에 따른 프로그래밍 언어의 분류는 크게 2가지로, 정적 타입과 동적 타입이 있습니다.

타입이 컴파일하는 시점에 결정되는지, 프로그램 실행 시간에 결정되는지에 따라 나뉘게 됩니다.

 

정적 타입 언어

 

자료형(Type)이 고정되어 있는 언어로,

정수형으로 정의한 1은 계속 정수형 1로 남아있는 종류의 언어를 이야기합니다.

1을 실수형 1.0으로 바꾸려면 형 변환(Type Casting)을 해 줘야 합니다.

 

C, C++, Java, C# 등이 여기에 해당됩니다.

 

동적 타입 언어

 

타입이 실행 시간에 결정되는 언어로, 예를 들어 정수형 1을 정의했어도

그걸 처리할 함수가 문자열을 받아들이도록 설계되어 있다면

자동으로 정수형 1을 문자 "1"로 바꿔줍니다. Python, JavaScript, Ruby 등이 여기에 해당됩니다.

찬반 논쟁이 뜨겁지만, 일반적으로 정적 타입 시스템을 지원하는 언어는 

프로그래머로 하여금 보다 정밀한 코드 구현을 요하지만, 

그렇기 때문에 대부분의 일상적 프로그래밍 오류를 미연에 방지할 수 있습니다. 

 

"컴파일 되면 버그는 없다" 라는 말이 구전처럼 내려온다고 합니다.

 

 

 

패러다임

 

 

패러다임에 따른 프로그래밍 언의 분류는 크게 3가지로,

절차적 언어, 객체 지향 언어, 선언형 언어로 나뉩니다.

각 패러다임을 간단하게 살펴보면 다음과 같습니다.

 

 

 

절차적 언어(명령형 언어)

 

프로그램이 "어떤 방법"으로 할 것인지에 중점을 두는 언어입니다.

프로그래머가 실행될 알고리즘과 로직을 명시하여 단계 단계 밟아가며

문제를 해결하도록 짜는 프로그래밍 언어입니다.

 

고리즘은 명시하고, 목표는 명시하지 않는 특징이 있습니다.

 

C,포트란,알골,BASIC,에이다 등이 있습니다.

 

 

 

객체 지향 언어

 

데이터와 데이터를 처리할 메소드를 한 데 묶어 객체를 만들고,

객체들을 조립하는 것을 목표로 한 언어들을 이야기합니다.

 

프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위,

즉 "객체"들의 모임으로 파악하고자 하는 언어입니다.

 

각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있습니다.

 

C++,C#,자바,델파이,파이썬,펄,루비,스위프트 등이 있습니다.

 

 

 

선언형 언어

 

명령형 언어와 대비되는 프로그래밍 언어를 통칭합니다.

프로그램이 "어떤 방법"으로 해야 하는 지를 나타내기보다 "무엇"을 할지에 중점을 두는 언어입니다.

프로그래머가 어떤 방법으로 답을 계산해야 하는지를 정의하지 않고,

관계를 정하거나 서로의 관계를 묻는 질문을 하기 때문에 선언형입니다.

 

 

목표는 명시하고, 알고리즘은 명시하지 않는 것이 선언형 언어의 특징입니다.

 

예를들면 HTML은 순서대로 일어나는 사건이 없기 때문에 진정한 선언형 언어라 할 수 있습니다.

SQL은 어떤 방법으로 자료를 찾아야 하는지가 주어지지 않고,

원하는 자료의 기준만 주어지는 특수한 목적의 선언형 언어입니다.

 

얼랭(Erlang)은 선언형 언어 중 함수형 언어가 효율적으로 산업 현장 등에서 사용되는 유명한 사례입니다.

 

 

 

 

 

 

 

 


다음 포스팅에서는 네트워크에 대해서 작성해보도록 하겠습니다. 읽어주셔서 감사합니다.

 

[이전 글]

 

IT 프로그래밍 개발을 위한 얕고 넓은 배경지식 (1)

컴퓨터 컴퓨터는 하드웨어+소프트웨어+펌웨어의 구성체를 말합니다. 소프트웨어 소프트웨어는 컴퓨터의 시스템을 구성하는 주요 요소 중 하나입니다. 응용 프로그램과 데이터처럼 컴퓨터의 하

y-oni.tistory.com

 

👀 구경해볼만 한 추천 IT 제품

로이체 무선 키보드

 

"파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있습니다"

 

728x90