번역되는 언어와 통역되는 언어
컴파일 언어, 인터프리터 언어
프로그래밍 언어는 배포되기 전 다른 형태로 변환되는 컴파일 언어와 작성된 그대로 실행되는 인터프리터 언어로 나뉨
소스 코드를 컴파일 한다는 것은 코드를 실행하기 전에 기계어나 다른 코드로 먼저 ‘번역’ 하는 것임
만약 C 언어로 프로그래밍 하는 경우, C언어로 프로그래밍을 위한 관련 설치 파일을 다운로드 하면 그 안에 C 언어로 작성한 소스 코드를 기계어로 번역해 주는 프로그램이 설치되어 있고, 소스 코드를 다른 언어나 형태로 번역해 주는 프로그램을 컴파일러 라고 부름
컴파일 언어의 소스 코드가 모두 기계어로만 번역되는 것은 아니고, 자바는 컴파일러에 의해 자바 바이트코드로 번역되고, 타입스크립트는 자바스크립트라는 다른 언어로 컴파일 됨
타입스크립트는 자바스크립트가 가진 여러 한계점을 보완해 안정적이고 오류를 발견하기 쉽도록 만든 언어이지만 타입스크립트의 번역 대상인 자바스크립트는 인터프리터 언어임
인터프리터 언어로 작성된 프로그램은 컴파일 과정을 미리 거치지 않고 바로 배포됨
실행할 컴퓨터에 소스 코드를 바로 통역해 주는 프로그램인 인터프리터가 설치되어 있음
인터프리터 : 소스 코드를 바로 실행하는 컴퓨터 프로그램
컴파일 언어와 인터프리터 언어 비교
컴파일 언어로 작성된 프로그램은 이를 실행하거나 배포할 때 컴파일 과정을 거치는데, 프로그램에 따라 컴파일에 많은 시간을 소모하기도 함
실행 중인 프로그램에 업데이트할 내용이 생기면 코드를 수정한 다음 전체를 다시 빌드해서 배포해야 함
이러한 특성으로 컴파일 과정에서 오류를 미리 발견해 배포 후의 문제를 어느 정도 방지할 수 있음
빌드 과정이 번거롭지만 한 번 배포된 후에는 빠르게 실행된다는 것이 컴파일 언어의 장점
인터프리터 언어는 프로그래밍과 배포, 오류 수정이 수월한 대신 프로그램 실행 속도는 컴파일 언어에 비해 느림
프로그램이 과정에서 오류가 잘 발견되지 않는 것도 단점인데, 이는 통합 개발 환경(IDE : Integrated Development Environment)의 발달로 보완된 편임
컴파일 언어는 소스 코드를 작성할 때 변수마다 자료형을 고정하고, 프로그램의 모든 자료형이 컴파일 중에 결정되므로 컴파일러가 자료형을 먼저 검증할 수 있기 때문에 자료형을 고정함
반면 인터프리터언어는 런타임 시 자료형이 부여되어 변수의 자료형이 바뀔 수 있음
컴파일 언어처럼 자료형이 고정된 것을 ‘정적타입’, 인터프리터 언어 처럼 자료형이 고정되어 있지 않은 것을 ‘동적 타입’ 이라고 부름
브라우저나 Node.js 환경에서 작동하는 언어는 자바스크립트임
그러나 자바스크립트는 인터프리터 언어이면서 동적 타입을 할당해주기 때문에 자료형이 고정되어 있지 않음.
프로그래밍을 할 때는 자유롭고 편리하지만, 프로그램의 규모가 커지면 숫자를 지정한 데이터에 실수로 문자를 넣는 등 위험 요소로 작용하게 되는데 이를 보완하기 위해 만들어진 언어가 타입스크립트임
타입스크립트는 정적 타입을 가진 텀파일 언어로 자료형 사용에 엄격하기 때문에 보다 안정적인 프로그래밍이 가능함.
그래서 프로그래밍 할 때는 안정적인 타입스크립트로, 배포할 때는 자바스크립트로 빌드해서 사용함
프로그래밍의 흐름 차이
절차지향, 객체지향 프로그래밍
절차지향 프로그래밍
절차지향과 객체지향은 컴파일 시 소스 코드를 어디서부터 읽느냐에 따라 나뉨
절차지향 프로그래밍은 소스 코드를 위에서부터 차례대로 읽는 방법
소스 코드를 순차적으로 실행하기 때문에 소스 코드의 순서가 굉장히 중요하며, 프로그램 전체가 유기적으로 연결되어 있음
절차지향 프로그래밍은 컴퓨터의 처리 구조와 비슷해 실행 속도가 빠르다는 장점이 있음
그러나 모든 구성 요소가 유기적으로 연결되어 있기 때문에 사소한 문제 하나만 생겨도 시스템 전체가 돌아가지 않음
또한, 실행 순서가 정해져 있기 때문에 소스 코드의 순서가 바뀌면 결과가 달라질 수 있음
객체지향 프로그래밍
코드를 작성할 때 구성 요소를 객체라는 단위로 묶어서 이들의 조합으로 프로그램을 만드는 것
객체지향 프로그래밍은 프로그램을 그저 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 다수의 객체로 만들고 이 객체끼리 서로 상호작용하는 방법
객체 : 프로그램에서 어떤 역할을 수행하는 요소를 데이터와 기능으로 묶은 단위
객체지향 프로그래밍에서는 각 객체의 역할이 나누어져 있고, 사용하고자 하는 부분에서 각각의 객체가 따로 작동함. 하나의 객체가 고장나면 해당 객체만 수리하거나 교체하면 해결 가능
⇒ 객체지향 프로그래밍은 유지 보수도 쉽고 생산성이 좋음
그러나, 모든 객체의 역할과 기능을 이해해야 하기 때문에 설계에 많은 시간이 걸림 처리 속도가 절차지향보다 느리고, 객체지향 언어는 난도가 높은 편 특히 다중 상속이 지원되는 C++이 그러함
객체지향의 반대는 절차지향이 아님! 절차지향은 순차적으로 실행하는 것에 초점, 객체지향은 조직이나 관계에 초점을 주는 것으로, 만드는 과정이 서로 다를 뿐 서로 대립되는 개념이 아님
⇒ 절차지향은 데이터를 중심으로, 객체지향은 기능을 중심으로 진행됨
객체의 설계도 : 클래스
공유되는 스펙 물려주기 : 상속
변수는 위험해!
함수형 프로그래밍
함수형 프로그래밍은 객체지향 언어와 상반되는 개념이 아니고, 많은 언어가 객체지향 프로그래밍과 함수형 프로그래밍 기능을 모두 제공하며, 한 프로그램에 두 방식을 모두 적용할 수 있음
함수형 프로그래밍은 변수 사용을 최소화함으로써 스파게티 코드의 오류를 줄이는 프로그래밍
스파게티 코드 : 소스 코드가 복잡하게 얽혀 있는, 정상적으로 작동하지만 코드의 구조를 파악하기 어려운 코드
변수는 프로그램에서 개발자가 메인 메모리 공간에 올려놓은 값으로, 값이 대입되면 바뀔 수 없는 상수와 달리 변수는 언제든 값을 변경할 수 있음
적절히 사용하면 유용하지만, 프로그램이 복잡해지고 여러 스레드가 돌아가면 변수는 오류의 원인으로 작용할 가능성이 커짐
현대적인 언어들은 배열이나 시간 등을 다룰 때 변수를 사용하지 않고 다양한 작업을 할 수 있는 기능을 제공함
함수형 프로그래밍은 프로그래밍 언어가 제공하는 기능들을 사용해서 어떤 ‘상태 값(변수)’를 두지 않고 기능을 설계함
함수(function) : 특정한 기능을 하는 소스 코드를 따로 빼서 묶은 것 함수를 사용하면 코드를 기능별로 구분해서 코드 분석이 편리해지고 같은 코드를 여러번 사용하는 중복을 줄일 수 있음
함수형 프로그래밍은 외부에 따로 상태값을 주지 않고 내부에서 연쇄적으로 기능을 사용해서 결과를 연산함
⇒ 멀티 스레딩이 많이 이루어지는 환경에서 함수형 프로그래밍은 특히 유용하게 사용 가능
함수형 언어로 불리는, 함수형 프로그래밍을 위해 만들어진 언어는 스칼라, 하스켈, 클로저, F# 등이 있음. 오늘날에는 자바스크립트를 비롯한 대다수 주요 언어들도 자체 기능이나 리액티브엑스(ReactiveX) 같은 라이브러리를 통해 함수형 프로그래밍을 구현함
메모리 직접 관리하시게요?
매니지드 언어, 언매니지드 언어
프로그래밍에서 내가 직접 관리하면 좋지만 그러기 부담스러운 ‘메모리 관리’가 있음
프로그램을 실행하기 위해서는 메모리에 프로세스가 할당되어야 하는데, 메모리를 프로그래밍 언어가 직접 관리하면 매니지드 언어, 개발자가 직접 관리하면 언매니지드 언어라고 함
메모리 관리란 메인 메모리로, 프로그램이 해당 프로세스에 할당된 메인 메모리에 ‘소스 코드’, ‘함수’, ‘변수’, ‘인자’ 등과 같은 값을 올려 놓고 작업 할 때 프로그램을 실행하는 과정임. 더 이상 사용하지 않는 데이터는 바로 치워서 공간을 확보하는 과정이 필요함
C, C++, 어셈블리어는 언매니지드 언어로 C 언어에는 ‘포인터’ 가 있음
포인터는 메모리 관리에 아주 중요한 개념으로, 좌표를 움직여가며 메모리 위의 데이터를 관리할 수 있는 작동 구조임
포인터 : 프로그래밍 언어에서 다른 변수 또는 그 변수의 메모리 공간의 주소를 가리키는 변수
C언어의 포인터는 먼저 만들고자 하는 배열의 크기만큼 메모리 공간을 확보하고, 배열의 값을 다 사용한뒤 이들을 하나하나 직접 치워주는, 다른 프로그래밍 언어에서 고려하지 않아도 될 일을 직접 프로그래밍 해주어야 함
배열 : 여러 개의 데이터를 하나의 변수에 담는 것으로, 프로그래밍에서 배열은 0부터 시작
자바나 파이선 같은 매니지드 언어는 프로그래밍할 때 메모리 관리를 크게 신경쓰지 않지만, 언매니지드 언어에서는 개발자가 메모리 관리를 직접해야 함
C, C++, 어셈블리어 등을 제외하고 오늘날 널리 사용되는 프로그래밍 언어는 대부분 매니지드 언어