인간이 컴퓨터에게 일을 시키는 과정
자연어 → 프로그래밍 언어로 소스코드 작성 (programming)
→ 컴파일러/인터프리터 사용~ 소스코드 프로그램을 기계어 프로그램으로 변환
→ 실행 → 기계어 → 💻 work
Compiler : 사전에 소스 코드를 프로그램으로 일괄 변환해 두었다가 실행시 프로그램을 처리하는 방법
(A 언어에서 B 언어로 번역, 보통 고급언어 → 기계어 번역)
Interpreter : 실행하면서 소스코드를 변환하는 방법 (통역)
고급 프로그래밍 언어 중 거의 대부분이 인터프리터 언어. JS, SQL, Python, Ruby 등..
컴파일러 언어보다 설계가 쉽다. 인터프리터는 자체적으로 실행기능이 없기 때문에, 목적 프로그램(.exe)을 만드는 곳만 컴파일러 언어를 사용하고 대부분 코드를 인터프리터 언어로 짜는 식으로 결합하는 경우가 많다.
비교
컴파일러는 프로그램에 수정 사항이 발생하면 소스코드를 다시 컴파일해서, 수정시 컴파일이 시간 단위가 될 수 있음
인터프리터는 수정시 소스코드를 수정해서 실행시키면 됨 → 수정이 빈번히 발생되는 용도의 프로그래밍에 많이 사용
저수준 언어
고수준 언어 : 저수준 언어의 단점을 보완하기 위해 소스코드를 기계어로 변환하는 메커니즘을 탄생시킴
프로그래밍 패러다임 : 언어가 설계된 사고방식에 따라 분류
procedure : 실행할 일련의 처리 (routine, method, function)
object : 데이터와 조작을 하나로 묶은 것
명령형 imperative programming : input, state에 따라 output이 다름 (How)
절차적 procedural : procedure 호출의 개념을 바탕으로 함
ex) ALGOL, Fortran, Ada, BASIC, COBOL, C
객체지향 : object의 개념을 바탕으로 함 → 연산은 object에게 내부 procedure 중에 하나를 수행하라고 요청
ex) Simula67, C++, C#, Java, JavaScript, Pascal, Python, Ruby, Objective-C,...
특징
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 객체들의 모임으로 파악
유지보수 쉬움, 직관적 코드 분석
기본 구성요소
- Class : 같은 종류의 집단에 속하는 attribute와 behavior를 정의하는 OOP의 기본적인
user defined data type
- Object : Class의 Instance (실제로 메모리상에 할당된 것).
고유의 attribute를 가지며, Class에서 정의한 behavior를 공유 가능 (메모리 경제성)
- Method, Message : Object의 attribute를 조작하는 데 사용되며,
Object간의 통신은 Message를 통해 이루어진다.
특징
- 자료추상화, inheritance, 다형성 (오버라이딩, 오버로딩)
둘 다 코드 재사용, 모듈화 가능
선언형 프로그래밍 : state가 output에 개입하지 않음 (What)
스크립트 언어 : 작은 크기의 프로그램을 손쉽게 작성하기 위해 사용되는 프로그래밍 언어
ex) JavaScript, VBScript, PHP, Perl, Ruby, Phyton, ...
매크로 : 수작업을 자동화할 목적으로 사용되는 프로그램
ex) VBA (Visual Basic for Application: Word, Excel 조작)
WSH (에디터, 브라우저 조작),
스크립트 언어는 손쉽게 실행할 수 있다는 특징을 살리기 위해 interpreter 형식으로 처리할 수 있지만, 웹앱처럼 자주 실행되는 것을 생각하면 컴파일 해두는 것이 속도 면에서 유리하다.
JIT(Just In Time) 컴파일 방식
- 겉보기엔 순서대로 변환하면서 실행하는 것처럼 보이는 언어라도 실제로는 내부에서 컴파일처리를 하는 경우
- 처음 실행할 땐 처리에 시간이 걸리지만, 두 번째 이후로는 실행 속도가 빨라진다.
- 최근의 JVM, .NET, V8(node.js)에서는 JIT컴파일을 지원한다.
예시) 자바 프로그램 코드 → (자바 컴파일러) → 바이트코드로 변환
실제 바이트코드를 실행하는 시점에서 (JIT) 바이트코드를 → (JVM, JIT컴파일러) → 기계어로 변환
바이트코드 byte codes : 기계어에 가까운 중간코드, 이식성이 뛰어남
일반적인 인터프리터 언어는 바이트코드나 소스코드를 최적화 과정 없이 번역해서 성능이 낮다.
반면 정적으로 컴파일하는 언어는 실행전에 무조건 다양한 플랫폼에 맞게 컴파일을 해야해서 시간이 오래 걸린다.
JIT는 바이트코드 컴파일러가 시간이 많이 소요되는 최적화를 미리 해주기 때문에 바이트코드에서 기계어 번역을 훨씬 빠르게 진행한다.