일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 스마트시티
- 사양
- move앱
- 사용자100명
- 일본대학원
- 명령어
- JMeter
- 스펙정보
- 부자아빠가난한아빠
- gbd-200
- 동시접속
- DevNet
- 일본유학
- ios
- QA
- 200-301
- 5G
- 사양정보
- 韓国ヒップホップ
- 코로나바이러스
- 韓国
- 다음메일
- 성능측정
- 한국판뉴딜
- 리눅스
- 4차산업
- certification
- 환경정보
- 정보처리기사
- ads.txt
- Today
- Total
IT 컴퓨터공학 자료실
초급편 1. 변수 란 무엇인가? 본문
포인터 토대가 된 책
변수 란 무엇인가?
포인터는 사실 변수를 참조하는 방법에 다름 없다. "변수"라는 것 자체의 구체적인 실체에 참고서는 설명 할 수 적지 만,이 토대가 된 책에서는 먼저 변수라는 것이 무엇인지는 점에서 해설하고 가자.
변수는 세 가지 본질적 요소와 하나의 부차적 요소를 가지고있다. 본질적인 요소는 "이름 (변수 이름)」 「값」 「주소」이며, 부차적 요소는"변수 유형 (데이터 객체의 크기) "이다. 이 세 가지 본질적 요소의 취급은, 그 언어가 인터프리터인지, 컴파일러 형인지에 따라 다르다.
인터프리터 언어에서는 변수 "값"은 "변수 이름"이라고 대응을 기록한 데이터베이스를 가지고있는 변수에 대한 참조가 있었을 때에 그 "변수 이름"을 키로 "값"을 검색하고 그 "값"을 사용하여 연산을 수행한다. 마찬가지로 변수의 값을 저장하는 것은 그 데이터베이스를 "변수 이름"에 의해 검색 데이터베이스의 값을 새로운 값으로 갱신. 이 인터프리터의 동작은 직관적으로 알기 쉽다.
그러나 컴파일러에서는 사정은 복잡하다. 컴파일러는 실행 속도를 우선하여 우수한 실행 가능한 프로그램 파일을 만들어내는 것이 임무이다. 이를 위해 인터프리터에서 볼 수있는 '변수 이름'과 '가치'의 대응을 보였다 데이터베이스가 아니라 전체 프로그램에서 데이터만을 모은 특별한 공간 "데이터 세그먼트"(DS)를 만들어 낸다. 초기화 값이 선언되는 경우, 초기 값 역시 기록하여 둔다.
그리고 그 데이터 세그먼트는 데이터를 제외한 프로그램 자체만을 모은 영역 '코드 세그먼트 "(CS) 후 연결해 출력된다. 이것이 "프로그램 파일"이다. 그러나 프로그램 파일의 선두에 어디에서 DS가 시작되는지를 기록한 헤더가 있으며,이를 위해 CS와 DS를 혼동하는 것은있을 수 없다.
당시에 변수는 어떤 취급을받는 것일까. 다음 설명은 이른바 "글로벌 변수"정보 처리 함수 내부에서 정의되는 "자동 변수 '는 약간 사정이 다르다는 것을 전제 해 둔다.
정의 된 전역 변수는 모든 모으고 그것이 CS 위에서 어디에서 사용되고있는 가라는 정보를 동시에 가지고있다. 또한 전역 변수는 부차적 요소로 "변수 타입"을 가지고 있기 때문에 개별 변수에 대한 몇 바이트의 메모리를 절대로 표현 할 수 있는지 이미 알려져있다. 그래서 DS의 크기는 그 합산이며, 그 크기의 메모리를 확보하는 것을 전제로 모든 글로벌 변수를 중복되지 않도록 적당하게 일렬로 세울 수있다. 그러면 변수 이름에 따라 DS의 선두로부터의 상대적인 위치를 정할 수있게되는 것이다.
또한 컴파일이 끝에 가까워지면 CS의 구체적인 크기도 계산된다. 이것은 이전에는 변수를 참조하는 명령은 임시 값을주고 둔다. 그리고 CS와 DS 크기의 쌍방이 이미 정해져 있기 때문에, CS + DS를 메모리에두고 실행하면 DS의 선두 메모리에서의 위치는 이미 정해져있다. 그래서 모든 변수는이 시점에서 프로그램 파일의 선두에서 절대적인 위치를 알 수있는 것이다. 이것이 "주소"이다.
그리고 마지막 마무리로 변수를 참조하는 명령의 임시 값을 실제 주소로 변환한다. 즉, CS를 처음부터보고가 변수를 참조하는 명령을 발견하면, 그 변수 참조 명령의 인수로 주어진 임시 값을 올바른 주소로 다시 갈 것이다.
이 마지막 마무리 프로세스가 컴파일과 잘 구별되고, '링크'로 불린다. 실제로는 여러 소스에서 하나의 프로그램 파일을 만들어내는 것을 잘한다, 링크는 여러 소스에서 모든 변수를 수집하고 완전한 DS를 만들어 여러 소스에서 모든 명령을 수집 하고 완전한 CS를 만들어 내고있는 것이다.
그래서 컴파일 언어는 "변수 이름"결국 모든 "주소"로 변환된다. 변수에 대한 참조 주소 참조에 링크 시점에서 완전한 형태로 변환되는 것이다.
그리고 실제로 프로그램이 시작될 때 프로그램 로더라는 시스템 콜이 프로그램 파일의 내용을 메모리에 붙이는 (매핑). 그때 프로그램 파일에서 참조 된 주소가 잘못 (가상) 메모리에 주소가있다.
'컴퓨터공학 > 포인터' 카테고리의 다른 글
초급편 5. 포인터의 형태 (0) | 2015.06.30 |
---|---|
초급편 4. 주소 가져오기 (0) | 2015.06.30 |
초급편 3. 문자열 처리 (0) | 2015.06.30 |
초급편 2. 유사 어셈블리의 정의 (0) | 2015.06.30 |
초급편, 중급편 목차 : ポインタ虎の巻 (포인터에 대한 글) (0) | 2015.06.30 |