바인딩과 바인딩 시점
+가 덧셈이라는 것은 누가, 언제 정했을까?
바인딩
이름에 속성을 묶는 것
바인딩(binding)은 프로그램의 개체(entity)와 그 속성(attribute)을 잇는 것입니다. 변수에 타입이 정해지는 것, 변수에 값이 들어가는 것, 기호 +가 덧셈을 뜻하게 되는 것이 모두 바인딩입니다.
이 강에서는 바인딩이 이루어지는 것을 '묶인다'고 적습니다.
1강 되짚기
실행까지 다섯 때
언제 묶이는지 보려면 '때'부터 알아야 합니다. 언어는 설계된 뒤 구현됩니다. 내가 쓴 소스는 컴파일로 실행 전에 기계어가 되고, 로드로 메모리에 올라간 뒤 실행됩니다.
컴파일은 실행 전에 소스를 기계어로 통째로 번역하는 일이고, 그 일을 하는 프로그램이 컴파일러입니다(1강). 인터프리터는 번역 없이 소스를 한 문장씩 바로 실행하는 프로그램입니다.
바인딩 시점
묶이는 때는 다섯
바인딩이 이루어지는 때가 바인딩 시점(binding time)입니다. 앞 장의 다섯 때마다 묶이는 것이 다릅니다.
static 변수는 실행 내내 같은 칸을 쓰는 변수이고, 지역 변수는 함수 안의 변수입니다. 5편에서 봅니다.
정적과 동적
정적은 실행 전, 동적은 실행 중
실행 전에 이루어지고 실행 중에 바뀌지 않는 바인딩이 정적 바인딩(static binding)입니다. 실행 중에 이루어지거나 실행 중에 바뀔 수 있으면 동적 바인딩(dynamic binding)입니다.
시간을 그린 그림에서는 실행 전을 노란색, 실행 중을 청록색으로 칠합니다.
절충
일찍 묶으면 빠르고, 늦게 묶으면 유연합니다
바인딩 시점이 이를수록 실행 전에 준비를 마칠 수 있어 효율적이지만, 실행 중에 바꿀 수 없어 유연성이 낮습니다. 늦을수록 그 반대입니다. 1강에서 본 절충입니다.
절충은 하나를 얻으려 다른 하나를 내주는 것입니다. 쐐기의 두께는 실제 비율이 아닙니다.
변수 하나를 보면
속성마다 묶이는 때가 다릅니다
함수 f 안에서 만든 지역 변수 count를 보면, 타입은 컴파일할 때 묶이고, 메모리 칸은 함수가 불릴 때, 값은 대입문이 실행될 때 묶입니다. 같은 변수라도 속성마다 바인딩 시점이 다릅니다.
예시 코드입니다. 다음 편부터 타입, 메모리 칸, 스코프를 차례로 봅니다.
다음 편