다음 이전 차례

9. 컴퓨터 언어는 어떻게 작동하는가?

우리는 이미 어떻게 프로그램이 작동하는가애 대해 이야기했다. 모든 프로그램은 컴퓨터가 이해할 수 있는 기계어로 만들어 져야만 실행 가능하게 된다. 하지만 사람이 이런 기계어를 직접 다루는 것은 쉽지 않다 ; 이런 일은 해커들에 있어서도 매우 드문 일이고 고도의 기술을 요구하는 것이다.

최근 직접 커널에서 하드웨어 인터페이스를 지원하는 몇몇 프로그램을 제외한 대부분의 유닉스 코드들은 고급언어(high-level language)으로 작성된다. ('고급'이라는 말은 역사적으로 기계어와 아주 작은 차이를 갖는 '저급' 어샘블러언어와 구별하기 위해 사용되기 시작한 것이다.)

고급 언어에는 몇가지 종류가 존재한다. 이것에 대해 이야기하기 위해서는, 먼저 프로그램의 소스 코드(인간이 만든, 편집 가능한 것)가 기계어로 번역되고, 컴퓨터는 그 기계어를 실행시킴으로서 프로그램이 수행된다는 생각을 가지고 있어야 한다.

9.1 컴파일 언어

가장 보편적으로 이야기되는 컴퓨터 언어가 바로 컴파일언어이다. 컴파일 언어는 (논리적인) 컴파일러라는 특별한 프로그램을 이용하여 기계어로 이루어진 실행 가능한 바이너리 파일을 만든다. 한번 실행 파일이 만들어지면, 다시 소스코드를 볼 필요없이 파일을 실행시킬 수 있다. (대부분의 소프트웨어는 컴파일된 바이너리 파일로 배포되고, 소스코드는 볼 수 없다.)

컴파일 언어는 우수한 성능을 보이며 서로 다른 운영체계에서도 실행이 가능하지만, 또한 그만큼 작성하기가 힘들다.

유닉스는 C언어로 작성되어 있는데, C언어(그리고 그 변종인 C++)는 컴파일 언어 가운데 가장 중요한 것이다. FORTRAN은 공학이나 과학 계통에서 아직 많이 쓰이고 있지만, 오래된 언어이기 때문에 좀 원시적이다. 유닉스 시스템에서는 그 이외의 다른 컴파일 언어는 잘 사용되지 않는데, 유닉스 이외의 운영체계에서는 COBOL이 경제/제정 분야에서 널리 사용되고 있다.

그 이외에도 많은 컴파일 언어가 존재하지만, 대부분은 사멸되었거나 제한된 연구에만 이용되고 있다. 만약 당신이 컴파일 언어를 사용하는 새로운 유닉스 개발자가 되고자 한다면 C나 C++과 친해야 한다.

9.2 인터프리터 언어

인터프리터 언어은 소스코드를 읽고 그 내용을 통해서 계산이나 시스템 호출이 가능하도록 해주는 인터프리터 프로그램에 의존한다. 소스 코드는 실행될 때마다 매번 번역되어야 하며, 그 때마다 인터프리터가 필요하게 된다.

인터프리터 언어는 컴파일 언어보다 좀 느리고 운영체계나 하드웨어의 접근이 제약을 받기도 한다. 하지만, 인터프리터 언어는 프로그래밍하기가 훨씬 쉽고, 컴파일 언어보다 코드 상의 에러가 미치는 영향이 작다는 장점도 있다.

셸을 포함하여 bc(1), sed(1), awk(1)와 같은 많은 유닉스 유틸리티들이 효율적인 작은 인터프리터 언어이다. 베이직이나 티클(Tcl)도 일반적으로는 인터프리터 언어에 속한다. 역사적으로 가장 중요한 인터프리터 언어는 LISP(그리고 그 계승자들에 의한 발전)가 될 것이다. 오늘날은 Perl이 대중적으로 서서히, 그러나 폭넓게 성장해가는 인터프리터 언어이다.

9.3 P-코드 언어

1990년부터 컴파일과 번역(interpretation)이 같이 사용되는 잡종 언어가 점점 중요하게 되었다. P-코드 언어는 컴파일 언어와 같이 소스코드를 실행 가능한 간단한 바이너리 파일로 만들어주지만, 바이너리 파일은 기계어로 구성되지는 않는다. 대신에 거짓코드(pseudocode 혹은 p-코드)로 구성되게 되는데, 이것은 실제 기계어에 비해 간단하지만 더 강력한 기능을 발휘할 수 있다. 프로그램이 실행될 때에는 p-코드가 번역되게 된다.

P-코드는 컴파일된 바이너리 파일과 거의 같은 속도로 실행 가능하다. (p-코드 인터프리터는 매우 간단하고 작지만, 빠르다) 하지만 p-코드 언어는 그 성능이 유동적이고 인터프리터의 성능에 좌우될 수 있다.

중요한 p-코드 언어에는 Python과 자바가 포함된다.


다음 이전 차례