컴퓨터 성능이 좋아지면서 이제 효율성보다는 정확성에 조금더 무게가 실리는 추세다. 어쨌든 그래도 언어는 컴퓨터에 의존한다. 언어를 만들때, 컴퓨터 자체의 성능, 컴퓨터에서 지원되는 언어의 실행 모델 (가상 컴퓨터), 언어로 구현하는 계산 모델들이 요소가 된다.
컴퓨터의 주요 부품을 6개로 나누어 볼 수 있다. 이들 모두 프로그래밍 언어의 주요 기능/측면들과 밀접한 연관이 있다.
하드웨어적으로 볼때 CPU 내부의 인터프리터는 작업을 처리하고, 기계어를 추출해서 디코딩 후 지정된 조작을 호출하고, 캐시 메모리와 램에 있는 데이터로 조작을 완료하고 램과 외부 환경에 데이터를 전송한다. 램에는 프로그램과 처리된 데이터들이 들어가게 된다.
프로그래밍 언어는 기본적으로 번역기를 통해 기계언어로 변경되어 작동한다. 현실적으로 볼때 저급 기계 언어를 사용하는 컴퓨터에 프로그래밍을 고급 언어로 진행하고, 이제 어떻게 고급 언어 프로그램이 실행될지 고려하는 것이 중요하다. 이를 실현하기 위해선 번역 (컴파일)과 소프트웨어 에뮬레이션 두가지 방법이 있다.
고차원 언어에서 번역기를 통해 등가한 기계 언어로 번역 후 하드웨어에서 직접 실행하는 방식이다.
발상을 전환해서 호스트 컴퓨터에 우리가 원하는 고차원 언어를 기계어로 사용하는 컴퓨터를 시뮬레이션 할 수 있다. 이를 소프트웨어 에뮬레이션이라고 한다.
컴파일과 에뮬레이션 방식의 차이점은, 컴파일시 번역기는 프로그램 문을 물리적 입력 순서대로 한번씩만 처리하고, 후자는 논리적으로 흐름 처리를 진행해 일부문은 반복되어, 일부문은 무시되어 처리될 수 있다. 프로그래밍 언어들은 보통 둘을 합쳐서 같이 사용한다.
컴파일 시 원래 프로그램에 대한 정보가 사라진다는 단점이있고, 시뮬레이션은 디코딩 대가가 높다는 단점이 있다.
전에는 효율을 높이기 위해 기계언어로 프로그래밍을 했는데, 지금은 그런 미친짓은 하지 않는다. 가상 머신의 개념을 주로 사용해서 계층들로 나눠 상층부에 기능을 제공한다.
위는 브라우저의 예신데, 프로그램 실행시의 런타임 데이터 구조와 알고리즘이 컴퓨터를 정의한다. 이를 언어 구현에 의해 정의된 가상 컴퓨터라고 한다.
프로그램의 구성 요소가 구체적으로 결정되는것을 바인딩이라고 하는데, 이 결정을 처리하는데 걸리는 시간이 바인딩 시간이다. 이 바인딩 시간을 몇가지로 구별해볼 수 있다.
변수의 값에 대한 바인딩, 변수가 특정 위치에 저장될지 결정하는 바인딩 등이 런타임에 일어난다. 여기에서 더 세분화 할 수 있다.
크게 세가지로 나뉜다.
수의 표현과 산술 작업의 표현과 관련된 디테일은 하드웨어에 의해 결정된다.
한 언어로 작성된 프로그램은 구현 시 고정된 특성을 사용하는 경우 반드시 해당 언어의 다른 구현에서 실행될 수 있는 것은 아니며 실행하더라도 다른 실행 결과가 있을 수 있다.
언어를 분석하고 비교할때 자주 하는 질문이, 번역시 바인딩을 할것인지 아니면 실행시 바인딩을 할것인지다.
ML과 Fortran을 예로 들면, ML의 대다수의 바인딩은 런타임에 일어나고, Fortran에서는 컴파일 할 때 일어난다. 때문에 큰 배열과 대량 산술이 필요한 문제는 Fortran이 더 적합한데, ML에서는 실행 시 바인딩을 만들고 제거하는데 시간이 더 많이 들고 후자에서는 컴파일때 딱 한번만 하기 떄문이다. 반대로 문자열 처리에서는 ML이 더 나은데, Fortran은 문자열 크기와 변수 유형이 컴파일 시 결정되어야 하기 때문이다.
보통 언어들은 그래서 바인딩 시간을 지정할 수 있다.