티스토리 뷰

/* 본 포스팅은 kocw의 유상미 교수의 '객체지양언어2' 강의를 듣고 정리한 내용임을 미리 알려드립니다. 유상미 교수의 본 강의 링크는 'http://www.kocw.net/home/search/kemView.do?kemId=1192791' 이며, kocw 사이트에서 따로 객체지향언어2나 교수 이름으로 검색하시면 만나볼 수 있습니다. */


# 컴퓨터, 프로그램, 언어


 컴퓨터는 CPU, 메모리 등으로 결합된 하드웨어와 프로그램과 같은 소프트웨어로 구성되어 있다. 컴퓨터를 사용한다는 건 프로그램을 실행한다는 것과 동일한 의미이다. 프로그램은 컴퓨터의 중앙처리장치(CPU)가 처리하는 일련의 명령들과 데이터로 구성되어 있다.


 프로그래밍 언어는 크게 저급 언어(low-level language)와 고급 언어(high-level language)로 나눌 수 있다. 저급 언어는 컴퓨터 처리에 용이(즉, 컴퓨터와 친하다)하며 고급 언어는 인간 친화적이다. // 인간 친화적이란 말은 사람이 이해하기 쉽게 구성되어 있다는 뜻이다. 0과 1만으로 이루어진 것보다 print와 같은 문장으로 출력을 할 수 있으니 인간 친화적이라 할 만한다.


 1세대 부터 지금의 5세대에 이르기까지의 과정을 살펴 보면, 흔히 말하는 0과 1로만 구성된 기계어를 작성한 시대가 1세대, 기계어에 1:1로 대응하도록 기호화한 언어인 어셈블리어를 사용하던 시대가 2세대이다.


 1~2세대에 사용하던 언어를 가리켜 저급 언어라 칭한다. 지금과 같은 고급 언어는 C, 포트란, 베이직, 코볼 등으로 일컬어지는 3세대부터 비주얼베이직, 델파이 파워빌드 등으로 구성됐던 4세대 언어에 이어 자바, C#, C++ 등에 해당하는 5세대 언어까지를 일컫는다.


출처: http://www.atmarkit.co.jp/fcoding/articles/gauche/01/gauche01a.html


 위 그림을 살펴 보면, 초기 고급 언어 중 포트란(FORTRAN)은 수치 계산 분야에 많이 사용되었고 코볼(COBOL)은 사무처리 분야에서 많이 사용되었다. ALGOL 언어는 C, Pascal, Simula 언어에 많은 영향을 미쳤다. 이 중 C++은 기존의 Simula의 객체지향 개념의 영향을 받아 제작된 객체지향 언어다.


 1980년대부터 C언어의 함수지향 개념의 한계를 넘기 위한 새로운 소프트웨어 개발 연구가 진행되면서 객체지향개념이 등장하게 되었다. 오늘날의 C++, Java, C# 등은 대표적인 객체지향언어로 사랑받고 있다. Java의 경우 객체지향개념과 함께 Lisp이란 언어의 Garbage Collection 이란 개념을 가지고 있다.


 Lisp 언어가 있는 아래의 언어를 살펴 보면, Simula의 객체지향의 영향을 받은 Smalltalk 언어가 있다. 또한 최근에 초보자가 쉽게 작성할 수 있다 하여 사랑 받는 Python이 있다. 중간 기준선 위 아래로 구분된 건 동적언어냐 정적언어냐에 따라 구분할 수 있다. // 위쪽이 정적 언어이다.



# 인터프리터 컴파일러


 프로그래밍 언어를 이용해서 작성된 프로그램을 소스코드 또는 소스 파일이라고 칭한다. 이 코드는 인간이 이해하기 쉬운 형태로 작성되어 있기 때문에 컴퓨터가 처리할 수 있는 언어로 변환을 해야 한다. 이런 변환 과정을 번역이라고 하는데, 번역을 하는 방식엔 인터프리터 방식과 컴파일러 방식이 있다.


 인터프리터 방식은 소스코드 전체가 아닌, 코드를 한 줄씩 읽어와서 컴퓨터가 처리할 수 있는 형태로 시물레이션 하여 해석하고 실행하는 방식이다. 컴파일 방식은 컴파일러라 불리는 번역기를 이용하여 전체 소스코드에 대한 오류를 체크하고 이를 기계어와 유사한 중간 코드로 생성하는데 이 파일을 목적파일 이라고 한다. 이렇게 생성된 목적파일은 이후 링커와 로더에 의해 .exe 형태의 실행파일로 생성되어 컴퓨터가 처리할 수 있게 된다.


 위 둘 방식의 가장 큰 차이는 목적파일을 생성하는가에 있다. 각각 처리방식에서 메모리 할당을 할 때 인터프리터 방식의 언어는 주로 동적할당을 하고 컴파일방식의 언어는 주로 정적할당을 한다. 메모리 할당을 정적으로 하면, 효율성이 좋고 동적할당을 위주로 하면 유연성이 좋으며 프로그래밍하기 쉽다는 장점이 있다. 위 두 방식 중 어떤 걸 택했느냐에 따라 각각 정적 언어, 동적 언어로 분류한다.


 앞에서 살펴 본 언어들을 컴파일 언어와 인터프리터 언어로 분류하면, 앞의 동적언어와 정적언어의 분류방식 그림과 같다. 하나 다른 것이 있다면 Java 자체는 컴파일 언어로 분류되어 있다는 점이다. 그러나 Java는 동적 언어의 장점을 수용하고 있는 언어인데, 이것은 자바 언어를 이해하는데 매우 중요한 특징을 가진다. 


 C#이나 Go도 비슷한 방식으로 처리된다. Go는 2009년에 구글이 개발하여 공식 발표한 언어인데 이 언어 또한 컴파일 언어의 효율성과 동적 언어의 쉬운 프로그래밍을 목표로 개발 되었다. 문법적으로는 C와 유사하고, GarbageCollection 기능을 가지고 있다.

'Develop Story > Common sense' 카테고리의 다른 글

알고리즘(algorism)과 알고리듬(algorithm)  (1) 2017.08.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday