카테고리 없음

프로그래밍 언어의 개념 3탄

seungdols 2015. 1. 3. 19:14

번역기

  1. 컴파일러 : 고급언어 = 실제 기계어에 가까운 저급언어로 변환
  2. 어셈블러 : 어셈블리어를 준기계어 형태로 변환
  3. 링커 : 여러 프로그램을 묶음 = 로드 모듈 생성
  4. 로더 : 로드 모듈을 실제 실행 가능한 기계어로 번역 = 주기억 장치에 로드
  5. 프리 프로세서 : 전처리기
  6. 크로스 컴파일러

동적 타입 체크
실행시
정적 타입 체크
컴파일시
예외: Union(C/C++)
스트롱 타입
타입 에러 체크가 항상 되는경우
모든 연산의 피연산자의 형식이 컴파일/실행시간에 결정되며, 강제 형변환이 스트롱 타입의 성격을 약화시킨다.

Name Type Equivalence
: 같은 타입 / 같은 선언문에 있는 경우

Structure Type Equivalence
: 같은 구조의 경우 = 구현/판단이 어려움

바인딩 
: 어떤 객체에 속성을 연관시키는 과정

바인딩 시간에 따라 정적 바인딩, 정적 바인딩으로 나뉨.

정적 바인딩: 실행전에 일어나고, 실행시간에는 변하지 않는다.

동적 바인딩: 실행시간에 일어나고, 실행시간에 변한다.

바인딩 시간을 세분화하면 다음과 같다.

  • 언어 정의 :  언어 구문, 언어의 피연산자 타입 결정
  • 언어 구현 :  타입의 값 범위 지정, 표기법등
  • 번역 : 변수 타입 , 크기
  • 링크 : 라이브러리 프로그램 Call
  • 적재 : 전역 변수에 메모리 주소를 바인딩
  • 실행 : 배정문등 변수에 값을 바인딩
동적 바인딩의 단점
: 프로그램의 신뢰성이 떨어지며, 실행시 메모리 낭비, 실행마다 체크가 필요하므로 속도가 떨어진다.
정적 바인딩의 단점
: 프로그램 수정시 코드를 재컴파일 후 로드 하는 시간이 오래 걸린다.

선언의 목적

  1. 메모리 사용과 접근 방법의 효율성 = 계산의 최적화로 인해 메모리 사용이 줄고 실행시간이 줄어든다.
  2. 메모리 사용의 효율성 = 생성 소멸 시기를 안다면, 스택 기반 저장소를 활용한다.
  3. 정적인 타입 체크
정적인 검사 = 컴파일러
모든 형의 선언 요구
자료 생성, 소멸,수정등에 제약
실행시간이 효율적이다.

동적인 검사 = 인터프리터
선언문이 없다.
실행시간 지연, 자료표현의 효율 저하, 메모리 낭비
프로그래밍의 단순화, 유연성 증가

블록 : 일련의 문장 집합으로 자체적인 선언을 가질 수 있는 프로그램의 단편
{ } 보통 대괄호를 블록으로 함...

영역: 식별자의 효력이 나타나고, 사용 가능한 범위

정적 영역 규칙
: 이름에 해당 하는 변수를 찾을 떄 자신을 포함하는 블록에서 찾고 없다면, 바깥 블록에서 찾는 규칙

동적 영역 규칙
:식별자의 영역이 실행 시간에 확정되며, 외향 구조에 의존하지 않으며, 부프로그램들의 호출 순서에 기반한다.

전연변수를 사용한다면 식별자 사용이 복잡하며, 단위 프로그램들의 식별자가 충돌함
= 그래서 지역화가 필요로 했기에 지역화를 보장하기 위해 블록 구조가 탄생하게 되었다.

데이터 타입에서 중요한 부분을 알아보자!!

데이터 타입은 기본 데이터 타입과 사용자 정의 데이터 타입으로 구분 된다.

- 수치 타입 
기계에 의존적이며, 연산을 빠르게 하도록 구현된다.
그러나 호환성 문제가 있다.
그래서 각 수치 타입의 상수를 제공한다. (MAX, MIN)
오버 플로우 문제와 비부호 정수 타입, 부동 소수점 타입에 대한 표준이 필요로 하다.

- 문자열 타입
C, C++에서는 기본 타입이 아니다.

문자열을 어떻게 분류 할까?
1. Static Length String : 정적 길이를 가진다.
Java, COBOL, C++, C#
2. Limited dynamic length String : 널문자를 붙여 파악한다.
C, C++
3. Dynamic length String : 길이를 초과하면 알아서 새로 할당한다.

-구조적 데이터 타입
여러 데이터를 묶어서 하나의 단위로 처리하는 데이터 타입을 말한다.
예로 배열, 레코드, 공용체라고 한다.

1. 배열
첫 번째 원소의 상대적 위치로 식별한다.

1차원 배열은 거의 비슷하나 2차원 배열부터 언어마다 갈린다.

Row-Major 저장
행 우선

 1

 2

 5

 3

 6


이런 배열이 있다면 메모리상에 저장하는 방식은


1 

 4

 2

이런 식으로 저장된다. 메모리 상에서!!!!


Column - Major저장
열 우선


1 

 2

 3

 4

열 우선 저장은 이런식으로 메모리상에 저장된다.


주소값 구하는 공식 

배열 A[n][m]에서 A[i][j] 주소는 

행 우선의 경우 base + ( m * (i-a) + (j-a)) * size

열 우성의 경우 base + ( n * (j-a) + (i-a)) * size로 구할 수 있다.


배열 타입의 Index 결정 방식


  1. Static    정적으로 범위가 고정
    • static int a[100];
  2. Fixed-Stack dynamic - 범위는 정적으로 고정 할당은 선언문에서 되어 효율성 증가
    • int a[100];//local variable
  3. Stack dynamic - 범위가 동적으로 결정/메모리 할당도 동적(실행시간에 됨)
    • stack에 할당
  4. Fixed heap dynamic - 동적 할당 후 크기가 고정
    • 동적/할당 후 크기는 고정 stack이 아닌 Heap 메모리 사용
    • C/C++ : malloc / free for arrays
    • C++ : new & delete
    • Java / C# : new
    • C# : Class2[] c2 = new Class2[20];
  5. Heap-dynamic - 할당 크기 모두 동적으로 변화
    • C# : List<String> stringList = new List<String>();
- 레코드 타입
: 집합체의 원소를 이름으로 식별하느 이질형 데이터형의 모임

- 공용체 타입
: 모든 필드가 같은 메모리를 공유하면서 필요에 따라서 한 필드만 사용

-튜플
:여러 종류를 하나로 묶는데 이름이 없다.
파이썬에서 사용된다.

-포인터 타입
변수가 임의의 객체를 참조하기 위해 메모리 주소를 값으로 갖는 타입
= 기억장소를 동적관리를 위해 생겨 남.

포인터의 2가지 문제점
1. Dangling Pointer
이미 메모리가 반환된 영역을 가리키는 포인터
2. 접근 불가능한 포인터
가비지의 발생 그러나 메모리 회수 불가 = 메모리 누수 

자료형의 적법성

1. Name equivalence
선언 또는 이름 사용
2. Structural equivalence
구성 요소가 모두 같으면 동일하다
3. declaration equivalence

자료형 이름을 재선언하여 사용할 경우 동일하다

반응형