2012-10-04 4 views
-1

범위로는 함수 범위, 클래스 범위, 라이브러리, DLL 등을 의미합니다.범위는 어떻게 작동합니까?

모든 코드가 컴파일러에서 일련의 명령어로 변환되는 경우 고급 언어의 상위 수준 범위가 최저 수준의 코드에 어떤 영향을 미칩니 까?

+2

나는 당신이 무슨 뜻인지 모르겠다. 왜 우리는 범위가 있는지 묻고 있습니까? 또는 언어로 내부적으로 구현되는 방법은 무엇입니까? 스코프는 프로그래머가 편리하게 사용할 수 있습니다. 그것들은 프로그래밍 언어의 일부로 강요되지만, 당신이 옳다. 결국 그것은 기계 명령 (또는 스코프 규칙을 적용하는 VM에서 실행되는 바이트 코드) 일 뿐이다. –

+0

그래서 그들은 프로그램의 디자인과 프로그래밍 과정에서 어떤 용도로 사용합니까? – Apeee

+2

책장의 선반처럼 물건을 규칙적으로 보관합니다. 책은 그 책이 어느 선반에 있는지, 그리고 다른 선반에있는 서적에 관한 것이 아니라 같은 선반에있는 다른 책에 대해서만 알고 있습니다. 모든 책을 거대한 더미에 던지면 어떨지 상상해보십시오. 그들을 관리하는 것은 꽤 어려울 것입니다. 그렇지 않습니까? –

답변

0

범위는 상위 수준 언어 구문 및 메커니즘입니다. 저수준 CPU 명령은 범위와 관련이 없습니다.

+0

구조가 무엇을 의미합니까? – Apeee

1

그 중 하나가 고수준이고 다른 하나는 저수준입니다. CPU 명령어는 범위에 대해 아무 것도 모른다. 그것은 메모리 관리의 문제입니다.

"범위"는 고급 프로그래밍 환경의 일부입니다. 컴파일러는 액세스하려는 항목에 액세스 할 수 있는지 (프로그래밍 언어의 규칙에 따라) 사용자를 확인합니다 (예 : 다른 함수에 대해 로컬 인 변수 x에 액세스). 이것이 버그를 줄이는 수단이라고 말할 수 있습니다.

실행중인 "실제"코드는 범위에 대해 알지 못합니다.

1

각 변수 이름 또는 함수 이름 등은 해당 정보 또는 코드가 저장된 메모리의 위치에 해당합니다. (이것은 약간의 단순화이지만 아이디어를 얻습니다.) 범위는 이름에서 위치로의 매핑을 나타냅니다. 당신이 좋아하는 언어로 사전이나 비슷한 데이터 구조로 생각하십시오.

중첩 된 범위는 일종의 스택으로 작동합니다. 언어 구문이 새 범위를 도입하면 새 매핑이 스택에 푸시됩니다. 변수 이름을 사용하는 경우, 예를 들어 i을 사용하면 컴파일러 또는 인터프리터는 최상위 레벨 매핑에서 찾은 다음 해당 언어 규칙에 따라 위쪽으로 매핑을 찾습니다 (발견되지 않은 경우). 범위가 끝나면 관련 매핑이 스택에서 해제되고 이전 매핑이 다시 적용됩니다.

이 작동 방식에 대한 추악한 내용은 다양 할 수 있습니다. 가장 간단한 경우 컴파일러는 메모리 위치를 직접 참조하는 코드를 생성 할 수 있습니다. 보다 현실적으로 : C 컴파일러는 변수 및 함수 이름을 메모리의 위치에 매핑하는 "심볼 테이블"을 포함하는 실행 가능 객체를 생성합니다. 링커는 다른 모듈의 심볼 테이블에서 한 모듈의 참조를 찾아 모듈 간 참조를 결정합니다. 이름은 절대 위치에 매핑되지 않고 일부 참조 점에서 오프셋됩니다. 이를 통해 라이브러리는 "재배치 가능한 코드"가 될 수 있습니다. 즉, 실행 중에 메모리의 임의의 위치에로드되어 여전히 올바르게 작동 할 수 있습니다. 가상 시스템으로 컴파일되는 언어는 일부 모서리를 줄일 수 있지만 원칙은 동일합니다.