본문 바로가기

프로그래밍언어론31

[프로그래밍언어론] 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.
[프로그래밍언어론] 12. 블록(Block), 환경(Environment) 블록(Block)과 환경(Environment)이란? 블록 환경을 이해하기 위해서는 먼저 { ... }에 대해 생각해보자. 블록은 시작과 끝 기호로 식별되는 프로그램의 텍스트 영역이다. 블록에는 해당 지역에 대한 로컬 선언이 포함된다. 그러한 선언은 해당 지역 외부에서는 유효하지 않다. 블록은 다양한 방식으로 표현될 수 있다. 일반적으로 블록에 들어가고 나갈 때마다 환경이 변경된다. 블록은 중첩될 수 있다. 블록의 중복은 절대 허용되지 않는다. 마지막으로 열린 블록이 닫힐 때까지 이전 블록을 닫을 수 없다. 언어별 블록 표현 방식 Java if (a > 0 && b > 0) { q = a / b; } Python if a > 0 and b > 0: q = a /b Scheme (define var "PL.. 2023. 10. 10.