검사를 통과한 프로그램도 실행 과정에서 값과 출력, 실패 결과를 생성합니다. 사용자에게 노출되는 출력문, 연산된 값, 컬렉션 순서, 명시적인 실행 오류부터 살펴봅니다.
정상 값 관찰하기
다음 코드를 runtime-behavior.tpz로 저장합니다.
let 값들 = [10, 20]
print("int: {7 / 2} {-7 % 3}")
print("float: {1.5 + 1.5}")
print("safe: {값들.get(9)}")topaz run runtime-behavior.tpz로 실행하면 다음과 같이 출력됩니다.
int: 3 -1
float: 3.0
safe: Noneprint는 string만 전달받습니다. 문자열 보간은 호출 전에 정수,
부동소수점 수, Option 값을 출력 가능한 문자열로 변환합니다. Prelude에는
공개된 println 헬퍼 함수가 따로 없습니다. 따라서 여기 제시된 print
인터페이스를 그대로 사용합니다.
int는 부호 있는 64비트 정수입니다. 정수 나눗셈은 0 방향으로
절삭하며, 나머지 연산 결과는 피나눗수의 부호를 따릅니다. 실행 중 정수
오버플로나 0으로 나누기가 발생하면 값을 자동으로 순환시키지 않고 실행 오류를
발생시킵니다. float는 IEEE-754 binary64 규격을 따르므로 10진 실수 연산이
아닌 부동소수점 연산 규칙을 적용받습니다.
값들.get(9)는 None을 반환합니다. 값이 존재하지 않는 상황을 정상적인 상태로 다루는
안전한 조회 API이기 때문입니다.
계약 위반 관찰하기
이 동작을 직접 인덱싱하는 경우와 비교해 봅니다.
두 번째 코드는 intentional-fault.tpz로 저장하세요.
let 과제들 = ["Run first program", "Build application"]
print(과제들[2])topaz run intentional-fault.tpz는 0이 아닌 코드로 종료하면서 문제가
생긴 소스 위치를 보여 줍니다.
error[TPZ4001]: index 2 is out of bounds for an array of length 2
--> intentional-fault.tpz:2:7
|
2 | print(과제들[2])
| ^^^^^^
실행 오류는 None, Err, 그 밖의 반환값이 아닙니다. 실행 오류가 나면
평가가 중단됩니다. 접미 ?, 선택 연산자, concurrent로는 포획할 수
없습니다. 언제 계산해도 오류가 발생하는 상수 산술 연산은 실행 전 검사 단계에서
거부될 수 있습니다. 실행 오류는 런타임에 유효하지 않은 조건에 도달했을 때
발생합니다.
관찰 가능한 실패 형식 선택하기
| 상황 | 사용할 형식 또는 예상 결과 |
|---|---|
| 값이 없는 상태가 정상인 경우 | get이 None을 반환하는 방식의 Option |
| 호출자가 실패 원인에 대응할 수 있음 | Ok 또는 Err를 담은 Result |
| 실행 코드가 런타임 계약을 위반함 | 실행 오류 및 0이 아닌 프로세스 종료 |
| 실행 전에 소스가 잘못됨 | topaz check의 정적 진단 |
배열 직접 접근, 런타임 정수 나눗셈·나머지 연산에서 제수가 0인 경우,
정수 오버플로, 런타임에 결정되는 길이가 0인 범위, 음수 정수 지수, 런타임 매칭
실패(match)는 명시된 실행 오류 원인입니다. 값이 없는 상황이 작업의
일부라면 안전한 라이브러리 연산을 먼저 사용하세요.
안정적으로 유지되는 것
문자열 비교는 유니코드 스칼라 순서를 그대로 사용하며, 암묵적인 정본화는 수행하지 않습니다. 배열은 요소 순서를 유지합니다. Map 키 스냅샷은 키가 삽입된 순서를 따릅니다. 컬렉션 연산은 각 계약에 명시된 순서를 지킵니다. 명목 값은 정본 표시 방식이 요구될 때 생성자 식별성을 유지합니다.
구현체마다 내부 표현은 다를 수 있습니다. 하지만 사용자에게 보이는 결과는 동일해야 합니다. 결과를 맞출 수 없는 타깃은 그 프로그램을 명확히 거부해야 합니다. 이 규칙이 백엔드 내부 헬퍼 함수를 공개 토파즈 API로 만들지는 않습니다.
의도적으로 정하지 않은 것
호스트 정수의 자동 순환, 호스트 해시 순서, 로케일 의존 숫자 형식, 암묵적 유니코드 정규화, 포획 가능한 실행 오류, 프로세스 종료 후의 리소스 정리, 주변 파일 시스템·네트워크 권한, 성능 보장을 추측해서는 안 됩니다. 동시 작업 순서와 출력이 섞이는 순서도 의도적으로 정하지 않았습니다.
값 수준의 선택은 Null·Option·결과·fault에서 이어 확인해 보세요. 시간 초과와 순서 경계는 동시성에서 다룹니다. 표준 헬퍼 함수에 대한 자세한 정보는 코어 라이브러리에서 확인하세요.