귀하의 질문은 여러 가지 문제에 대해 신중한 구분이 필요하기 때문에 여러 가지면에서 흥미 롭습니다. 그러나 당신의 비전은 본질적으로 올바른 것 같습니다. 내 답변을 편견을 피하기 위해이 답변을 대부분 작성하기 전에 참조를 읽지 않았습니다.
첫째, 귀하의 진술 Variables are symbolic names for memory
addresses
은 거의 정확하지만 개념과 일반적인 구현을 혼동합니다. 변수는 실제로 변경할 수있는 값을 포함 할 수있는 컨테이너입니다. 일반적으로,이 컨테이너는 컴퓨터에 메모리 공간의 블록으로 구현되며, 변수는 정보가 많거나 적은 표현이 필요한 객체를 포함 할 수 있으므로 주소 와 크기가 특징 입니다.
그러나 나는 구현 기법과는 별도로 언어의 의미론에 대해 더 추상적 인 관점을 고려할 것입니다.
따라서 변수는 추상적 관점에서 컨테이너 일뿐입니다. 이러한 컨테이너에는 이름이 필요하지 않습니다. 그러나 언어에는 종종 식별자를 연관시켜 명명 된 변수가 있으므로 변수의 사용은 식별자로 표시 할 수 있습니다. 변수는 실제로 다양한 앨리어싱 메커니즘을 통해 여러 식별자를 가질 수 있습니다. 변수는 더 큰 변수의 하위 부분 일 수도 있습니다. 예는 배열 변수의 셀로, 배열 변수와 셀의 인덱스를 지정하여 이름을 지정할 수 있지만 앨리어싱을 통해 식별자와 연결될 수도 있습니다.
의미 적으로로드 될 수있는 다른 단어를 호출하지 않도록 의도적으로 다소 중립적 인 단어 컨테이너 를 사용하고 있습니다. 실제로 는 wilipedia에 설명 된 참조 개념과 비슷 하며 종종 메모리 주소와 혼동됩니다. 단어 포인터 자체 는 종종 메모리 주소로 이해되지만, 대부분의 고급 언어를 고려할 때 의미가 있다고 생각하지 않으며, 부적절하게 부적절하기 때문에 참조하는 토론 논문에서 부적절 할 수 있습니다 (주소가 사용될 수는 있지만). 특정 구현을 참조하십시오. 그러나 C와 같은 언어에는 구현 개념 및 기계 아키텍처에 훨씬 더 가까운 언어에 적합합니다.
실제로, 구현 레벨에서 변수 또는 값을 보면, "머신 레벨 포인터"의 몇 가지 복잡한 간접 시스템이있을 수 있지만, 사용자에게 보이지 않는 추상적 인 관점이 있습니다. 개발할 수 있습니다. 대부분의 프로그래밍 언어의 경우 사용자는 구현에 대해 걱정하거나 알 필요가 없습니다. 구현에 따라 구현 언어가 크게 다를 수 있습니다. 명시 적으로 이진 코딩과 거의 직접적인 관련이있는 어셈블리 언어를 대체하는 고급 언어로, 기계 아키텍처에 의도적으로 가까운 C와 같은 일부 언어의 경우에는 사실이 아닐 수 있습니다. 상황.
언어 사용자가 알아야 할, 때로는 그보다 더 작아야하는 것은 값과 관련 작업, 포함 할 수있는 위치, 이름과 연결될 수있는 방법, 명명 시스템 작동 방법, 새로운 방법 값의 종류 등 정의
따라서 또 다른 중요한 개념은 식별자와 명명입니다. 엔터티 (값)의 이름 지정은 식별자를 값 (일반적으로 선언)과 연결하여 수행 할 수 있습니다. 그러나 다른 명명 된 값에 연산을 적용하여 값을 얻을 수도 있습니다. 이름을 재사용 할 수 있으며 사용 컨텍스트에 따라 주어진 식별자와 관련된 항목을 결정하는 규칙 (범위 지정 규칙)이 있습니다. 정수 (예 : 정수)와 같은 일부 도메인 값의 이름을 지정하기 위해 리터럴이라고하는 특수 이름도 있습니다.612) 또는 부울 (예 : true )입니다.
변하지 않는 값과 식별자를 연관시키는 것을 보통 상수라고합니다. 리터럴은 그런 의미에서 상수입니다.
"값 컨테이너"는 값으로 간주 될 수 있으며 식별자와의 연관은 일반적으로 "순진한"의미의 변수입니다. 따라서 변수가 "컨테이너 상수"라고 말할 수 있습니다.
이제 식별자를 값과 연결 (일정한 선언)하거나 변수에 값을 할당하는 것, 즉 컨테이너 상수로 정의 된 컨테이너에 값을 저장하는 것의 차이점이 무엇인지 궁금 할 것입니다. 본질적으로 선언은 구문 엔티티 인 식별자를 의미 엔티티 인 값과 연관시키는 표기법을 정의하는 오퍼레이션으로 볼 수 있습니다. 할당은 상태를 수정하는, 즉 컨테이너의 값을 수정하는 순수한 의미 론적 작업입니다. 어떤 의미에서, 선언은 의미 론적 엔티티에 대한 명명 메커니즘을 제공하는 것 외에 의미 론적 효과가없는 메타 개념이다.
실제로, 할당은 프로그램이 실행될 때 동적으로 발생하는 의미 론적 연산 인 반면, 선언은보다 구문적인 특성을 가지며 일반적으로 실행과 관계없이 프로그램의 텍스트에서 해석됩니다. 이것이 정적 범위 지정 (즉, 텍스트 범위 지정)이 일반적으로 식별자의 의미를 이해하는 자연스러운 방법 인 이유입니다.
결국, 포인터 값은 컨테이너의 또 다른 이름이고 포인터 변수는 컨테이너 변수, 즉 다른 컨테이너를 포함 할 수있는 컨테이너 (일정한) 컨테이너라고 할 수 있습니다 (일부에서 부과하는 게임에 제한이 있음) 유형 시스템).
코드와 관련하여 [pointers] might indicate the entry point
to a section of code and can be used to call that code
. 실제로 이것은 사실이 아닙니다. 코드 섹션은 종종 (무상 또는 구현 관점에서) 단독으로 무의미합니다. 높은 수준의 관점에서 볼 때 코드에는 일반적으로 식별자가 포함되어 있으며 이러한 식별자는 선언 된 정적 컨텍스트에서 이러한 식별자를 해석해야합니다. 그러나 본질적으로 동적 (런타임) 현상 인 재귀로 인해 동일한 정적 컨텍스트가 중복 될 수 있으며 정적 컨텍스트의 적절한 동적 인스턴스에서만 코드를 실행할 수 있습니다. 이것은 약간 복잡하지만 그 결과 올바른 개념은 코드 조각과 식별자를 해석 할 환경을 연결하는 클로저 개념이라는 것입니다. 클로저는 올바른 의미 론적 개념, 즉 적절하게 정의 가능한 의미 론적 가치입니다. 그런 다음 클로저 상수, 클로저 변수,
함수는 일반적으로 일부 엔티티 (상수 및 변수)를 정의하거나 초기화하기위한 일부 매개 변수가있는 클로저입니다.
이 메커니즘의 사용에 대한 많은 변형을 건너 뜁니다.
클로저는 명령형 또는 기능적 언어로 OO 구조를 정의하는 데 사용할 수 있습니다. 실제로, OO 스타일 (아마도 이름 이전)에 대한 초기 작업은 그렇게 이루어졌습니다.
내가 빨리 훑어 본 참고 문헌은 유능한 사람이 작성한 흥미로운 것으로 보이지만 다양한 언어와 기본 계산 모델에 대한 상당한 경험이 없으면 쉽게 읽을 수 없습니다.
그러나 일관된 견해를 유지하는 한 많은 것들이 보는 사람의 눈에 있습니다. 관점이 다를 수 있습니다.
이것이 귀하의 질문에 대답합니까?
추신 : 이것은 긴 답변입니다. 그 중 일부가 부적절하다고 생각되면 어떤 부분인지 명시하십시오. 감사합니다.