[PL] Chapter 5

subin·2024년 4월 29일

PL/프로그래밍언어

목록 보기
4/9
post-thumbnail

Names

  • 변수의 issue
    • 대소 구분 하는가?
    • 예약어/키워드인가
  • 변수 길이
    • python만 제약 없음, 다른 것들은 모두 제약 있음
  • 대소 구분
    • 대소구분하면 readability 떨어짐
    • C기반 언어들은 변수 대소구분, 다른 문자들은 안함
  • special words
    • readability에 도움을 줌
    • keyword : 구문의 일부, 특별한 의미를 가짐 ⇒ 의미
    • reserved word: 이미 예약된 언어, 사용자가 정의하는 이름에서 사용 불가
    • keyword의 대부분은 예약어임 (전부는 아님, java에서 goto는 예약어지만 키워드는 아니다. java는 goto에서 쓰이지 못한다.)

Variables 변수

💡 변수는 memory cell의 추상화(abstraction)
  • 변수의 6가지 속성
    • Name
    • Address: 메모리주소
    • Value
    • Type
    • Lifetime: memory에 올라올때~쫓겨날때까지의 시간
    • Scope
  • Address
    • 변수는 실행될때마다 address가 달라질 수 있음.
    • 만약 다른 변수가 같은 메모리 주소에 접근하려 한다면 → aliases
    • aliases는 c,c++에서 포인터를 통해 생성됨, reliability와 readability 떨어트림.
  • Type
    • 변수값의 범위를 결정
  • Value
    • 위치에 따라 의미 달라짐
    • l-value: 변수의 l값은 주소
    • r-value: 변수의 r값은 값
    • abstract memory cell은 int a; 에서 a 변수 자체를 의미

binding

속성이 결정되는 것
a name(변수, 함수등)에 the thing it names(코드, 클래스와 같은 실제 값)으로 연결하는 것.

  • binding time
    • binding이 이루어지는 시점
  • 가능한 binding times
    • language design time (연산)
    • language implementation time (c에서 int type변수 size 결정)
    • compile time (c, java 변수 타입 결정)
    • load time (c, c++ static 변수를 메모리셀에 바인딩)
    • runtime (nonstatic한 로컬 변수를 메모리셀에 바인딩)

Static binding

  • 런타임 전에 첫 발생하고, 프로그램 실행 내내 변하지 않았다면 static binding임

⇒ binding이 실행시점 이전

Dynamic binding

  • 실행 중에 첫 발생되고, 프로그램 실행 도중 바뀐다면 dynamic binding임

⇒ binding이 실행 시점

Explicit/Implicit Declaration

  • 명시적 선언(Explicit Declaration): 변수의 타입을 선언문에 명시된 타입으로 바인딩한다.
    • static binding과 연관
  • 묵시적 선언(Implicit Declaration): 변수명이나 대입할 값으로부터 정해지는 타입으로 변수의 타입을 바인딩한다. → writability는 + , reliability는 -
  • Dynamic Type binding : 편하지만 공간, 시간적 비용은 높아진다. (Python)
    • Advantage: flexibility
    • Disadvantages: high cost, compiler가 type error detection 하는 것이 어렵다.
  • storage bindings&lifetime
    • allocation: 가능한 cells들 중 cell을 얻는 것
    • deallocation: cell을 다시 가능한 cells 로 돌려놓는 것
    • lifetime: process 시작~끝
  • Static binding: 실행 전에 메모리 셀은 bound하고, 실행 내내 같은 메모리 셀에 바운드된채로 있는 것
    • c, c++의 static 변수, 함수들
    • 몇번 호출했는지 기억, 이전 상태 기억
    • python은 static 키워드가 없어서, static 변수가 없다.
  • Stack dynamic: static이 아니면 다 dynamic 붙음, heap만 implicit/explicit 구분
    • 내가 사용할 문장이 실행 될 때 (런타임에)메모리를 할당
    • history 기억x
    • c의 static 아닌 local 변수들, java method들
    • 여러번 호출하면 할당, 할당해제 반복으로 무리
  • Explicit Heap dynamic
    • 프로그래머가 명시한 것에 따라 할당/해제
    • 오직 포인터와 참조에 의해서 일어난다
    • c++ 의 new, delete 객체, 자바의 모든 객체 (자바는 모든 객체를 heap에 저장)
  • Implicit heap-dynamic
    • 할당과 해제가 할당문에 의해 이루어진다
    • 효율적으로 쓰지 않으면 메모리 낭비, 에러 디텍션이 힘들다

Scope

변수 int a; 선언 시, a변수를 읽거나 쓸 수 있는 코드 영역

  • static scope: c, c++, java, python 모두 해당
    • 변수 범위: 그 변수가 선언된 블록 안
    • c/c++ → 같은 이름의 변수 생성 시 블록으로 구분, java → 허용 안됨
    • local 변수와 non local 변수로 구분
    • non local : function이나 block 바깥 쪽에 선언된 변수. global 변수
    • python에서 전역변수 사용은 가능하지만 수정을 불가능하다. 전역변수에 대입하면 자동으로 지역변수가 생기기 때문이다.
    • 상태를 stack 형태로 유지, 관리
  • dynamic scope: call chain을 따른다.
    • 유지 보수가 어렵다
    • writability 떨어진다
    • 유일한 장점: 파라미터 패싱 편리함

Constants

  • 주소 공간은 항상 static binding
  • c, c++ → #define, java → final
  • python → a=10 선언하고 값 안바꾸면 된다. 값을 바꾸면 변수가 됨
  • value에 대한 binding은 expression만 아니면 static

0개의 댓글