콘텐츠로 이동
Xen / docs

문서 검색

한국어 · v0.1.0-demo.2

검색어를 입력하세요.

    EN
    Xen / learn v0.1.0-demo.2

    스코프 모드

    이 장은 복사·이동·참조를 읽었다고 가정합니다. 스코프 모드는 특정 함수나 블록에서 사용할 기능을 명시하는 방법입니다. explc와 opt는 서로 다른 목적을 가집니다.

    표시위치목적
    #![explc]적용할 함수 바로 앞명시적 참조를 사용하는 함수
    #scope[explc] { ... }함수 안의 블록해당 블록에서 명시적 참조 사용
    #scope[opt] { ... }함수 안의 블록선택한 최적화 옵션을 적용할 코드 표시

    let mut은 변수를 바꿀 수 있게 합니다. explc는 명시적 참조를 쓸 수 있게 합니다. 둘 중 하나가 다른 하나를 대신하지 않습니다.

    다음을 scope_modes.xen으로 저장하세요. append_shared는 참조 매개변수를 받으므로 함수 앞에 #![explc]를 씁니다. main에서는 참조를 만들어 전달하는 부분만 #scope[explc]로 감쌉니다.

    scope_modes.xen
    #![explc]
    fn append_shared(values: &mut Vec<Int>) {
    values.push(3);
    }
    fn main() {
    let mut values = [1, 2];
    #scope[explc] {
    append_shared(&mut values);
    }
    println(values);
    let mut total = 0;
    #scope[opt] {
    for value in 1..5 {
    total = total + value;
    }
    }
    println(total);
    }
    터미널 창
    xen check scope_modes.xen
    xen run scope_modes.xen
    scope_modes.stdout
    [1, 2, 3]
    10

    호출 뒤 벡터에 3이 추가돼 있습니다. 값을 넘겨 독립 사본을 변경하는 경우와 달리 &mut values는 호출자의 원본을 가리킵니다. 이후 합계 계산은 별도의 opt 블록에 표시했습니다.

    함수 전체에서 명시적 참조를 쓴다면 main 바로 앞에도 #![explc]를 적을 수 있습니다. 표시를 블록에 둘지 함수에 둘지는 명시적 참조가 필요한 범위에 맞춰 정하세요.

    호출되는 함수의 설정은 호출자로 전달되지 않음

    섹션 제목: “호출되는 함수의 설정은 호출자로 전달되지 않음”

    다음은 의도적인 오류입니다. xen check scope_error.xen으로 확인하세요.

    scope_error.xen
    #![explc]
    fn append_shared(values: &mut Vec<Int>) { values.push(3); }
    fn main() {
    let mut values = [1, 2];
    append_shared(&mut values);
    }
    scope_error.stderr
    passing references requires #![explc]

    append_shared에 표시가 있어도 main의 &mut values는 별도로 허용해야 합니다. 위의 성공 예제처럼 호출 부분을 #scope[explc]로 감싸거나 main 앞에 #![explc]를 붙이면 됩니다. 참조가 들어오는 함수와 참조를 만드는 호출자를 각각 확인하세요.

    explc를 켜도 대여 규칙은 유지됩니다. 공유 참조를 사용하는 동안 원본을 변경하거나 이동할 수 없고, 가변 참조를 사용하는 동안 같은 값에 다른 경로로 접근할 수 없습니다. 임시 값을 바로 빌리거나 참조를 반환·구조체에 저장하는 것도 지원하지 않습니다.

    opt 블록을 옵션과 함께 실행하기

    섹션 제목: “opt 블록을 옵션과 함께 실행하기”

    같은 프로그램을 최적화 끄기·켜기로 각각 실행하세요.

    터미널 창
    xen run scope_modes.xen --opt=off
    xen run scope_modes.xen --opt=basic
    xen run scope_modes.xen --opt=basic --opt-report
    xen build scope_modes.xen --opt=basic --opt-cache=.xen-opt-cache -o scope-modes

    처음 두 명령의 표준 출력은 앞의 예제와 같습니다. --opt-report는 적용 정보를 표준 오류에 따로 출력합니다. 보고서의 줄 수나 내부 식별자를 프로그램의 출력 계약으로 사용하지 마세요.

    build, run, test의 기본 옵션은 --opt=basic입니다. 최적화 대상은 #scope[opt]로 표시한 코드이고, 표시하지 않은 코드는 영향을 받지 않습니다. --opt-report와 --opt-cache는 basic이 필요하며 check에서는 사용할 수 없습니다. check는 실행 결과나 성능을 확인하는 명령이 아닙니다.

    이 작은 예제는 표시 위치와 실행 방법을 익히기 위한 것입니다. 블록에 opt를 붙였다는 사실만으로 속도 향상을 단정하지 마세요.

    bb는 원시 메모리와 운영체제 호출을 위한 저수준 기능입니다. 이 릴리스에 포함된 사용자 문서에는 자세한 문법·API·보장 범위가 정의돼 있지 않습니다. 따라서 여기서는 실행 가능한 사용법을 제시하지 않습니다. 파일·입출력·경로 작업은 표준 라이브러리를 사용하세요.

    규칙은 스코프 모드 레퍼런스, 옵션은 CLI 레퍼런스에서 확인할 수 있습니다.

    성공 예제에서 #scope[explc] 블록을 없애고 호출만 남긴 뒤 검사해 보세요. 다음에는 main 앞에 #![explc]를 붙여 수정하세요. 최적화 옵션을 바꿔도 참조 사용 오류를 해결할 수 없는 이유를 설명해 보세요.