고수준 언어, 저수준 언어가 고급, 저급의 개념이 아니다. 저수준 언어, 고수준 언어의 정의는 상대적이다.
저수준 언어
- 컴퓨터가 이해하기 쉬운 언어에 가깝다.
- 0과 1로만 이루어졌다.
- 기계어
- 컴퓨터가 바로 이해할 수 있으므로 변환 과정이 필요 없다.
기계어
- 네이티브 코드라고도 부른다.
- 2진수, 0과 1
- 원조 저수준 언어
- 모든 프로그래밍 언어는 이 기계어로 번역되어야 한다.
고수준 언어
- 인간이 이해하기 쉬운 언어에 가깝다.
- 인간이 사용하는 언어로 이루어졌다.(for, while, if…)
- 어셈블리어, c, c++, java, c#
- 컴퓨터가 이해하는
기계어
로 변환하는 과정이 필요하다.
어셈블리어
- 사람이 읽기에 조금 더 편하기 때문에 엄밀히 말하면 고수준 언어이다.
- 대부분 기계어랑 일대일로 대응한다. 그렇기 때문에 저수준 언어라고 하기도 한다.
고수준 프로그래밍 언어
어셈블리어는 기계어보다는 사람에게 친숙하지만 여전히 불편하다. 그래서 보다 사람에게 친근한 고수준 프로그래밍 언어
가 나왔다. e.g. int addResult = 3 + 4; 3과 4를 더한 후 addResult에 저장한다.
- 사람이 쓰는 말에 매우 가까워졌다.
- 어셈블리어처럼 기계와어 일대일 대응은 불가능하다.
- c, c++, java, c#, javascript 등.
- 메모리를 누가 관리하는지에 따라 매니지드 언어, 언매니지드 언어로 나뉜다.
컴파일 언어
- 소스 코드 -> 컴파일러 -> 기계어 -> 실행
- 소스 코드를 기계가 이해할 수 있는 기계어로 바꿔준다.
- c, c++
- 오프라인 컴파일러가 고수준 언어를 네이티브 코드로 컴파일
- 다양한 최적화 가능
- 플랫폼(e.g. mac OS, 32비트 윈도우, 아이폰)마다 다른 exe 파일을 컴파일 해야한다.
JIT 컴파일 언어
- 컴파일 언어와 인터프리터 언어의 중간단계
- 소스코드 -> 컴파일러 -> 중간언어 코드(기계처럼 보이게 프로그램을 짜고, 그 프로그램이 이해하는 코드) -> JIT 컴파일러 -> 기계어 -> 실행
- c#, java, WASM(webAssembly)
- 오프라인 컴파일러가 소스 코드를 중간 언어로 컴파일
- 플랫폼 별로 VM(가상 머신, vitual machine)를 설치해야 함.
- 프로그램 실행 중 VM이 중간 언어를 기계가 이해하는 언어로 바꿔서 실행.
- java, c#은 플랫폼에 종속적이지 않고 VM에 종송적이다.
인터프리터 언어
- 소스 코드 -> 인터프리터 언어 -> 기계어 -> 실행
- 컴파일 단계가 없다
- javascript, python, lua, php
- 실행 중에 고수준 언어를 네이티브 코드로 바꿔서 실행한다.
- 실제로 실행하기 전까지 코드의 문제를 잡아낼 수 없다.
강한 타입, 약한 타입 언어
변수선언(변수 용도)와 관련이 있다.
- 약한 타입: 변수형을 선언한 후 변수형을 변경할 수 있다 e.g. javascript
- 강한 타입: 변수형을 선언한 후 변수형을 변경할 수 없다 e.g. c, c++, c#(약한타입도 지원), java 등
상용 코드를 작성할 때는 강한 타입 언어들이 일반적으로 더 낫다.
매니지드 언어, 언매니지드 언어
- 누가 메모리의 수명(라이프사이클)을 관리하는지가 핵심
- 프로그램에서 큰 데이터를 사용하려면 운영체제(OS)로부터 독점적으로 사용할 메모리를 확보해야 한다.
- 데이터를 다 사용한 뒤에는 OS에 메모리는 반환해야 한다.
매니지드 언어: 프로그래머가 책임지고 메모리를 반환한다.
언매니지드 언어: 프로그래밍 언어가 더 이상 메모리를 사용 안 하는 상황을 판단하여 메모리를 반환해 준다.
매니지드 언어가 실수가 적고 편하지만 효율적이지는 않다. 언매니지드 언어를 배우면 하드웨어 지식을 쌓을 수 있다.
성능이 중요하지 않은 프로그램을 만들 때
매니지드 언어를 많이 사용한다. e.g. java, c#, javascript, lua
성능이 중요한 프로그램을 만들 때
언매니지드 언어를 많이 사용한다. e.g. c, c++
언매니지드 언어를 배워야 하는 이유
- 메모리 동작원리
- CPU 동작원리
- 컴퓨터처럼 생각하는 방법
- 매니지드 언어에서 지원하는 모든 마법같은 기능들의 동작원리
프로그래밍 패러다임 - 절차적 언어
- 가장 단순한 형태의 프로그래밍 언어
- 함수를 실행하면 결과가 바로 반횐된다.
- 그 결과를 저장하고 싶으면 별도의 공간에 보관한다
- 기능과 자료저장의 분리
- 순서에 따라 코드를 실행한다.
- 대표적인 언어: c언어
프로그래밍 패러다임 - OOP 언어
- 사람에게 직관적
- 기능과 자료를 하나의 개체(object)에 합쳤다.
- 물체의 개념
- 오역으로 인해 주로 객체하고 부른다.
- 가장 널리 쓰이는 프로그래밍 패러다임
- 사람에게 매우 직관적이다.
- 복잡한 프로그램의 구조를 잡기 쉽다.
프로그래밍 패러다임 - 함수형 언어
- 절차적 언어랑 비슷하게 함수가 있다.
- 그러나 상태의 변화가 없다(불변성)
C
- 강한 타입 언어
- 매니지드 언어
- OOP
References
실무 프로그래밍 입문(C#)