바인딩과 바인딩 시점

+가 덧셈이라는 것은 누가, 언제 정했을까?

바인딩

이름에 속성을 묶는 것

바인딩(binding)은 프로그램의 개체(entity)와 그 속성(attribute)을 잇는 것입니다. 변수에 타입이 정해지는 것, 변수에 값이 들어가는 것, 기호 +가 덧셈을 뜻하게 되는 것이 모두 바인딩입니다.

이 강에서는 바인딩이 이루어지는 것을 '묶인다'고 적습니다.

1강 되짚기

실행까지 다섯 때

언제 묶이는지 보려면 '때'부터 알아야 합니다. 언어는 설계된 뒤 구현됩니다. 내가 쓴 소스는 컴파일로 실행 전에 기계어가 되고, 로드로 메모리에 올라간 뒤 실행됩니다.

컴파일은 실행 전에 소스를 기계어로 통째로 번역하는 일이고, 그 일을 하는 프로그램이 컴파일러입니다(1강). 인터프리터는 번역 없이 소스를 한 문장씩 바로 실행하는 프로그램입니다.

바인딩 시점

묶이는 때는 다섯

바인딩이 이루어지는 때가 바인딩 시점(binding time)입니다. 앞 장의 다섯 때마다 묶이는 것이 다릅니다.

static 변수는 실행 내내 같은 칸을 쓰는 변수이고, 지역 변수는 함수 안의 변수입니다. 5편에서 봅니다.

정적과 동적

정적은 실행 전, 동적은 실행 중

실행 전에 이루어지고 실행 중에 바뀌지 않는 바인딩이 정적 바인딩(static binding)입니다. 실행 중에 이루어지거나 실행 중에 바뀔 수 있으면 동적 바인딩(dynamic binding)입니다.

시간을 그린 그림에서는 실행 전을 노란색, 실행 중을 청록색으로 칠합니다.

절충

일찍 묶으면 빠르고, 늦게 묶으면 유연합니다

바인딩 시점이 이를수록 실행 전에 준비를 마칠 수 있어 효율적이지만, 실행 중에 바꿀 수 없어 유연성이 낮습니다. 늦을수록 그 반대입니다. 1강에서 본 절충입니다.

절충은 하나를 얻으려 다른 하나를 내주는 것입니다. 쐐기의 두께는 실제 비율이 아닙니다.

변수 하나를 보면

속성마다 묶이는 때가 다릅니다

함수 f 안에서 만든 지역 변수 count를 보면, 타입은 컴파일할 때 묶이고, 메모리 칸은 함수가 불릴 때, 값은 대입문이 실행될 때 묶입니다. 같은 변수라도 속성마다 바인딩 시점이 다릅니다.

예시 코드입니다. 다음 편부터 타입, 메모리 칸, 스코프를 차례로 봅니다.

다음 편

먼저 타입입니다. 실행 전에 묶일까요, 실행 중에 묶일까요?

4편타입은 언제 정해질까? 4강 목록