스코프 모드
선택한 언어나 버전에는 이 주제가 없어 같은 영역의 시작 페이지를 표시합니다.
여기서부터 고급 과정입니다. 앞에서는 기본 동작과 표준 라이브러리로 프로그램을 만들었습니다. 이제 필요한 함수나 블록에서 기능을 선택해 원본 변경과 최적화 범위를 직접 제어합니다. 참조의 세부 규칙은 다음 장 복사·이동·참조에서 이어서 배웁니다.
스코프 모드는 특정 함수나 블록에서 사용할 기능을 명시하는 방법입니다. explc와 opt는 서로 다른 목적을 가집니다.
무엇을 어디에 표시하나
섹션 제목: “무엇을 어디에 표시하나”| 표시 | 위치 | 목적 |
|---|---|---|
#![explc] | 적용할 함수 바로 앞 | 명시적 참조를 사용하는 함수 |
#scope[explc] { ... } | 함수 안의 블록 | 해당 블록에서 명시적 참조 사용 |
#scope[opt] { ... } | 함수 안의 블록 | 선택한 최적화 옵션을 적용할 코드 표시 |
let mut은 변수를 바꿀 수 있게 합니다. explc는 명시적 참조를 쓸 수 있게 합니다. 둘 중 하나가 다른 하나를 대신하지 않습니다.
블록 안에서 원본 변경하기
섹션 제목: “블록 안에서 원본 변경하기”다음을 scope_modes.xen으로 저장하세요. append_shared는 참조 매개변수를 받으므로 함수 앞에 #![explc]를 씁니다. main에서는 참조를 만들어 전달하는 부분만 #scope[explc]로 감쌉니다.
#![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.xenxen run scope_modes.xen[1, 2, 3]10호출 뒤 벡터에 3이 추가돼 있습니다. 값을 넘겨 독립 사본을 변경하는 경우와 달리 &mut values는 호출자의 원본을 가리킵니다. 이후 합계 계산은 별도의 opt 블록에 표시했습니다.
함수 전체에서 명시적 참조를 쓴다면 main 바로 앞에도 #![explc]를 적을 수 있습니다. 표시를 블록에 둘지 함수에 둘지는 명시적 참조가 필요한 범위에 맞춰 정하세요.
호출되는 함수의 설정은 호출자로 전달되지 않음
섹션 제목: “호출되는 함수의 설정은 호출자로 전달되지 않음”다음은 의도적인 오류입니다. xen check 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);}passing references requires #![explc]append_shared에 표시가 있어도 main의 &mut values는 별도로 허용해야 합니다. 위의 성공 예제처럼 호출 부분을 #scope[explc]로 감싸거나 main 앞에 #![explc]를 붙이면 됩니다. 참조가 들어오는 함수와 참조를 만드는 호출자를 각각 확인하세요.
explc를 켜도 대여 규칙은 유지됩니다. 공유 참조를 사용하는 동안 원본을 변경하거나 이동할 수 없고, 가변 참조를 사용하는 동안 같은 값에 다른 경로로 접근할 수 없습니다. 임시 값을 바로 빌리거나 참조를 반환·구조체에 저장하는 것도 지원하지 않습니다.
opt 블록을 옵션과 함께 실행하기
섹션 제목: “opt 블록을 옵션과 함께 실행하기”같은 프로그램을 최적화 끄기·켜기로 각각 실행하세요.
xen run scope_modes.xen --opt=offxen run scope_modes.xen --opt=basicxen run scope_modes.xen --opt=basic --opt-reportxen 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 상세 레퍼런스
섹션 제목: “bb 상세 레퍼런스”bb는 원시 메모리, volatile·원자 연산, 시스템 호출, C 외부 함수와 인라인 어셈블리를 허용합니다. API, 타깃 지원과 호출자 책임은 저수준 레퍼런스에 정리되어 있습니다. 일반적인 파일·입출력·경로 작업에는 표준 라이브러리를 사용하세요.
규칙은 스코프 모드 레퍼런스, 옵션은 CLI 레퍼런스에서 확인할 수 있습니다.