본문 바로가기

전체 글74

[프로그래밍언어론] 17. 범위 규칙 구현(Scope Rule Implementation) 범위 규칙 구현 정적 범위 규칙 구현 정적 링크(Static Link) 디스플레이(The Display) 동적 범위 규칙 구현 연관 목록(association lists) 중앙 참조 테이블(Central Referencing Table) 정적 범위 규칙 구현 정적 범위 규칙 구현에는 단순히 스택을 사용하는 것보다 더 많은 관리가 필요하다. foo 프로시저에서 변수 x는 C가 아닌 블록 B의 x를 참조한다. 단, foo에 동적 링크로 연결된 활성화 레코드는 Block C이다. 따라서 블록을 즉시 둘러싸는 블록에 대한 링크가 하나 더 필요하다. 정적 링크(점선)를 사용하여 둘러싸는 블록을 가리킨다. 정적 범위를 관리할 때는 동적 링크 대신 정적 링크를 사용한다. 정적 링크 다음 구조의 예를 고려해보자 블록 .. 2023. 10. 11.
[프로그래밍언어론] 16. 동적 관리(Dynamic Management) 동적 관리 정적 관리로는 충분하지 않다. 모든 프로그램 구성 요소가 런타임 전에 결정될 수는 없기 때문이다. 동적 메모리 관리를 위해 스택과 힙을 사용할 수 있다. 스택을 통한 동적 관리 활성화 레코드(activation record)=프레임(Frame) : 활성화된 프로시저(or 인라인 블록)에 할당된 각 메모리 공간 활성화 레코드는 컨텍스트 스위칭을 하기 전에 함수 상태를 기록하고 복원하기 위한 것이다. 메인 함수를 호출하는 순간 메인 함수의 활성화 레코드가 생성된다. 런타임 스택(runtime stack) : 활성화 레코드가 포함된 스택 활성화 레코드에는 무엇이 있을까? 인라인 블록의 활성화 레코드는 프로시저에 비해 훨씬 간단하다. 대부분 프로시저를 고려한다. 인라인 블록의 활성화 레코드에 대한 정.. 2023. 10. 11.
[프로그래밍언어론] 15. 정적 관리(Static Management) 정적 관리 정적 메모리 관리는 프로그램 실행 전에 컴파일러에 의해 수행된다. 정적으로 할당된 개체는 고정된 메모리 영역에 위치한다. 이러한 개체는 전체 프로그램 실행 동안 해당 위치에 유지된다. 정적으로 할당할 수 있는 것 전역 변수 : 전체 프로그램에서 사용 오브젝트 코드 : 컴파일러에 의해 생성된 기계 명령어 상수 : 해당 값이 컴파일 시간 동안 결정될 수 있는 경우에만 해당 컴파일러에서 생성된 테이블 : 프로그램의 런타임 지원에 사용 재귀가 없다면(without Recursion) 재귀가 없으면 둘 이상의 프로시저를 동시에 활성화할 수 없다. 따라서 프로그래밍 언어의 다른 구성요소를 정적으로 처리하는 것이 가능하다. 예) 지역 변수, 인수, 임시 값, 반환 값 및 반환 주소. 동일한 지역 변수는 스.. 2023. 10. 11.
[프로그래밍언어론] 14. 스택(Stack), 힙(Heap) 메모리 관리 메모리 관리는 인터프리터의 주요 기능 중 하나이다. 프로그램이 실행되는 동안 다양한 정보가 생성되어 메모리에 로드되거나 저장된다. 예) 지역 변수의 값, 표현식의 임시 값, 함수의 인수 및 반환 값 등. 따라서 프로그래밍 언어에서 이러한 메모리 액세스를 처리하는 방법을 결정하는 것이 필요하다. 서브프로그램(Subprogram) 서브프로그램은 프로시저, 함수, 루틴, 서브루틴과 동의어이다. 실행을 위해 호출할 수 있는 프로그램의 일부 모두 서브프로그램의 개념을 표현하기 위해 사용 일부 언어에서는 의미가 다를 수 있지만 동일한 것으로 간주한다. 이 과정에서는 대부분 프로시저/함수를 같은 의미로 사용한다. 이론적으로 둘 사이의 차이점은 함수가 반환 값을 갖는 하위 프로그램이라는 것 스택(Stack.. 2023. 10. 11.
[프로그래밍언어론] 13. 가시성 규칙(Visibility Rules), 범위 규칙(Scope Rules) 가시성 규칙(Visibility Rules) 비공식적인 개념이다. 이름의 가시성을 결정하고 특정 블록에서 어떤 바인딩을 사용할 수 있는지 결정하는 규칙. 블록의 로컬 선언은 해당 블록과 해당 블록 내의 다른 모든 블록에 표시된다. 블록에 동일한 이름의 새 선언이 있는 경우 이 새 선언은 이전 선언을 숨긴다. 0: { int a = 1; 1: { int b = 2; 2: { int b = 3; int c = a + b; printf("%d\n", c); } 3: { int d = a + b; printf("%d\n", d); } } } 블록 0~3이 있다. 현재 블록이 변경되면 환경도 변경된다. 따라서 동일한 이름이 다른 개체에 연결될 수 있다. 변수 c의 값 : 4 변수 d의 값 : 3 먼저 블록 0에 .. 2023. 10. 10.