본문 바로가기

Project

Compile,Interpreter 언어 와 자바

 컴퓨터 언어를 나누는 큰 한가지 기준이 있는데 그것은 언어의 해석이 컴파일시간에 일어나는가
실행시간이 일어나는가입니다.

 전자의 경우는 언어를 실행 이전에 해석하여 최적화를 함으로서 성능을 끌어 올릴수 있고 ,
실행 이전에 기본적인 문법 에러를 미리 확인할수 있습니다.
 반면 후자의 경우는 언어를 실행시간에 해석하여 언어적 자유를 확보할 수 있습니다.
(*이것 이외에도 보안,확장,transaction등 많은 이슈가 있지만 원리적인 측면에서 분류한다면 이렇지
않을까합니다.)

 컴파일 언어인 자바와 C는 먼저 Type기반의 언어입니다. 이것은 사용할 데이타의 형을 미리 파악해두어
stack,heap에 적재될 데이타의 최적화를 이룰수 있습니다.
(*좀더 정확히말하자면 데이타(data)와 연산자(operator)의 최적화입니다.)
 하지만 그 대신 항상 사용할 데이터의 구조를 지정하지 않으면 안됩니다. 또 사용할 데이터의 형과
적재될 데이터의 형은 같지 않으면 안됩니다.


  반면 인터프리터 언어인 php,smalltalk,ruby등의 언어는 데이터의 형을 지정하지 않아도 됩니다.
var (variant)타입의 데이터 형은 어떤 데이터형이든지 대입하여 사용할수 있습니다.
 이것은 연산에 많은 처리및 속도가 걸리는 대신 많은 장점을 가져오게 됩니다.

 데이터의 형이 지정되어 있지않기 때문에  변수의 생성을 동적으로 조작할수 있습니다.
사실 이것이 기존 컴파일 언어로 구현될수 없는 내용인데, Lexical Closure라고 불리는 이 기능은 실제 적재될 시점에 데이터의 범위를 판단할수 있습니다. 이것을 이용하면 좀더 간단한 표현으로 구현하려는 기능을 구현 할
수 있기 때문에 좀더 높은 추상화 수준에서 사고를 가능하게 합니다. 즉 process에 치중할수 있게됩니다.

 자바는 기존 interpreter언어와 중간적 입장을 취하고 있는데 그 중 하나가 Object타입입니다.
 미리 알지 못하는 데이터를 이용하기 위해 java는 C보다는 조금 발전된 object타입을 이용합니다.
이것은 모든 객체(데이타)는 Object타입으로 메칭될수 있기에 사용하기 위한 데이터의 형을 몰라도
컴파일이 가능 하기 때문에 프로그래밍에 조금 더 자유로울수 있습니다.
 또다른 중간적 입장은 이전에 말한 Reflection도 그중 하나입니다.

Java 는 Interpreter언어보단 제약이 있지만 C언어에서 구현할수 없는 기능을 JVM을 통해 구현하고 있습니다.