환경과 런타임 정보

환경과 런타임 정보 (Environment and Runtime Information)

system-type 같은 프로시저는 실행 중인 Racket의 운영체제, 빌드 모드, 머신 정보를 알려줘요. 설치 도구는 크로스 설치를 지원하기 위해 cross-system-type를 대신 사용해야 해요.

출처: Racket Reference

본문

15.8 환경과 런타임 정보

(or/c 'os 'os* 'arch 'word 'so-find 'platform
      'vm 'gc 'link 'machine 'target-machine
      'so-suffix 'so-mode 'fs-change 'cross)

procedure

(system-type [mode]) → (or/c symbol? string? bytes? exact-positive-integer? vector? #f)
  mode : = 'os

실행 중인 Racket에 대한 운영체제, 빌드 모드, 또는 머신 정보를 반환해요. (설치 도구는 크로스 설치를 지원하기 위해 cross-system-type을 대신 사용해야 해요.)

'os 모드에서 가능한 심볼 결과는 다음과 같아요.

  • 'unix
  • 'windows
  • 'macosx

'os*'arch 모드가 도입되기 전에는 (system-library-subpath #f)로 이 정보를 다소 간접적으로 얻을 수 있었어요.

'os* 모드에서 결과는 'os 모드와 비슷하지만, 일반적인 'unix 분류 대신 'linux'freebsd 같은 특정 운영체제로 세분화돼요.

'arch 모드에서 결과는 아키텍처를 나타내는 심볼이에요. 가능한 결과에는 'x86_64, 'i386, 'aarch64, 'arm(32비트), 'ppc(32비트)가 있어요.

'word 모드에서 결과는 Racket이 32비트 프로그램으로 실행되는지 64비트 프로그램으로 실행되는지에 따라 32 또는 64예요.

'so-find 모드에서 결과는 플랫폼별 공유 객체(즉 동적 라이브러리)를 찾고 관리하는 관례를 식별하는 심볼이에요. 가능한 결과에는 'natipkg(네이티브 라이브러리가 보통 Racket 패키지를 통해 공급됨을 뜻함)와 'system(운영체제를 통해 관리됨을 뜻함)이 있어요. 다른 패키지 관리자와 함께 사용할 Racket 빌드는 'natipkg'system이 아닌 심볼을 보고할 수 있어요.

'platform 모드에서 결과는 'os*, 'arch, 'so-find의 조합과 같은 정보를 담아 플랫폼을 나타내는 문자열이에요. 'so-find 모드가 'os*의 기본값(Windows와 Mac OS는 'natipkg, 그 외는 'system)이면 생략돼요. 같은 문자열의 경로 형태는 (system-library-subpath #f)로 반환돼요.

'vm'gc 모드 결과에 대한 자세한 내용은 Racket 가상 머신 구현(Racket Virtual Machine Implementations)을 보세요.

'vm 모드에서 가능한 심볼 결과는(구현(Implementations)도 참고):

  • 'racket
  • 'chez-scheme

'gc 모드에서 가능한 심볼 결과는(구현(Implementations)도 참고):

  • 'cgc(system-type 'vm)'racket일 때
  • '3m(system-type 'vm)'racket일 때
  • 'cs(system-type 'vm)'chez-scheme일 때

'link 모드에서 가능한 심볼 결과는:

  • 'static (유닉스)
  • 'shared (유닉스)
  • 'dll (윈도우)
  • 'framework (Mac OS)

Racket의 향후 포트에서 'os, 'os*, 'arch, 'vm, 'gc, 'link 결과 목록이 확장될 수 있어요.

'machine 모드에서 결과는 문자열이고, 플랫폼별 형식으로 현재 머신에 대한 추가 세부 정보를 담아요.

'target-machine 모드에서 결과는 실행 중인 Racket의 네이티브 바이트코드 형식에 대한 심볼이거나, 머신 독립 형식 외에 네이티브 형식이 없으면 #f예요. 결과가 심볼이면 compile-target-machine?는 그 심볼에 적용될 때 #t를 반환해요. current-compile-target-machine도 함께 보세요.

'so-suffix 모드에서 결과는 현재 플랫폼에서 공유 객체에 사용되는 파일 확장자를 나타내는 불변 바이트 문자열이에요. 바이트 문자열은 마침표로 시작하므로 path-replace-suffix의 두 번째 인자로 적합해요.

'so-mode 모드에서 결과는 외부(foreign) 라이브러리를 기본적으로 "로컬" 모드로 열어야 하면(대부분의 플랫폼처럼) 'local, "글로벌" 모드로 열어야 하면 'global이에요.

'fs-change 모드에서 결과는 네 원소의 불변 벡터예요. 각 원소는 #f 또는 심볼이며, 심볼은 속성의 존재를, #f는 속성의 부재를 나타내요. 가능한 심볼은 순서대로:

  • 'supportedfilesystem-change-evt가 파일시스템 변경 이벤트를 만들어 파일시스템 변경을 모니터링할 수 있음; 이 심볼이 벡터의 첫 번째가 아니면 다른 모든 벡터 원소는 #f
  • 'scalable — 파일시스템 변경 이벤트가 소비하는 자원이 파일 디스크립터 제한이 아닌 사용 가능한 메모리에 의해서만 실질적으로 제한됨; 이 속성은 Mac OS와 BSD 계열 유닉스에서 #f
  • 'low-latency — 파일시스템 변경 이벤트의 생성과 확인이 실질적으로 즉시 일어남; 이 속성은 Linux에서 #f
  • 'file-level — 파일시스템 변경 이벤트가 파일의 디렉터리가 아닌 파일 수준에서 변경을 추적할 수 있음; 이 속성은 Windows에서 #f

'cross 모드에서 결과는 크로스 플랫폼 빌드 모드(-C 또는 --cross 인자로 racket에 전달; 명령줄(Command Line) 참고)가 선택되었는지 보고해요. 가능한 심볼은:

  • 'infer(system-type)(cross-system-type)이 같은 심볼을 보고하는지에 따라 크로스 플랫폼 모드를 추론
  • 'force — 현재와 대상 시스템 타입이 같아도 크로스 플랫폼 모드 사용, 현재와 대상 실행 파일이 다를 수 있기 때문

package base 6.8.0.2에서 변경: 'vm 모드 추가. 6.9.0.1에서 변경: 'cross 모드 추가. 7.1.0.6에서 변경: 'target-machine 모드 추가. 7.9.0.6에서 변경: 'os*'arch 모드 추가. 9.0.0.8에서 변경: 'so-find'platform 모드 추가.

procedure

(system-language+country) → string?

현재 사용자의 언어와 국가를 식별하는 문자열을 반환해요.

유닉스와 Mac OS에서 문자열은 다섯 글자예요: 언어용 소문자 ASCII 두 글자, 밑줄, 국가용 대문자 ASCII 두 글자. Windows에서 문자열은 임의로 길 수 있지만, 언어와 국가가 밑줄로 구분되어 영어(모두 ASCII 글자나 공백)로 표현돼요.

유닉스에서 결과는 LC_ALL, LC_TYPE, LANG 환경 변수를 그 순서대로 확인해 결정돼요(환경 변수 값이 소문자 ASCII 두 글자, 밑줄, 대문자 ASCII 두 글자로 시작하고 뒤에 아무것도 없거나 마침표가 오면 그 결과를 사용해요). Windows와 Mac OS에서는 시스템 호출로 결과를 결정해요.

procedure

(system-library-subpath [mode]) → path?
  mode : (or/c 'cgc '3m 'cs #f) = (system-type 'gc)

상대 디렉터리 경로를 반환해요. 이 문자열은 시스템별 파일 경로를 만들 때 사용할 수 있어요. 예를 들어 Racket이 Sparc 아키텍처의 Solaris에서 실행 중이면 하위 경로는 "sparc-solaris"로 시작하고, i386 아키텍처의 Windows용 하위 경로는 "win32\\i386"으로 시작해요.

선택적 mode 인자는 관련 가비지 컬렉션 변형을 지정하며, (system-type 'gc)의 가능한 결과 중 하나인 'cgc, '3m, 'cs 중 하나예요. #f일 수도 있는데, 이 경우 결과는 가비지 컬렉션 변형과 무관하고, 그 문자열 형태는 (system-type 'platform)의 결과와 같아요.

설치 도구는 크로스 설치를 지원하기 위해 cross-system-library-subpath를 대신 사용해야 해요.

package base 7.0에서 변경: 'cs 모드 추가.

procedure

(version) → (and/c string? immutable?)

현재 실행 중인 Racket 버전을 나타내는 불변 문자열을 반환해요.

procedure

(banner) → (and/c string? immutable?)

Racket의 시작 배너 텍스트(또는 GRacket 같은 임베딩 프로그램의 배너 텍스트)를 위한 불변 문자열을 반환해요. 배너 문자열은 줄 바꿈으로 끝나요.

parameter

(current-command-line-arguments) → (vectorof (and/c string? immutable?))
(current-command-line-arguments argv) → void?
  argv : (vectorof string?)

Racket이 시작할 때(시스템의 플래그로 취급된 명령줄 인자는 제외하고) 명령줄 인자로 초기화되는 파라미터예요.

유닉스와 Mac OS에서 명령줄 인자는 바이트 문자열로 Racket 프로세스에 제공돼요. 인자들은 bytes->string/locale과 인코딩 오류 문자로 #\uFFFD를 사용해 문자열로 변환돼요.

parameter

(current-thread-initial-stack-size) → exact-positive-integer?
(current-thread-initial-stack-size size) → void?
  size : exact-positive-integer?

새로 생성된 스레드의 지역 변수에 얼마나 많은 공간을 예약할지에 대한 힌트를 제공하는 파라미터예요. 계산이 실제로 사용하는 공간은 JIT 컴파일에 영향을 받지만, 그 외에는 플랫폼 독립적이에요.

(and/c vector?
       (not/c immutable?))

procedure

(vector-set-performance-stats! results [thd]) → void?
  results :
  thd : (or/c thread? #f) = #f

results의 원소를 현재 성능 통계로 보고하도록 설정해요. thd#f가 아니면 특정 스레드별 통계 묶음이 보고되고, 그렇지 않으면 (현재 place 내의) 다른 전역 통계 묶음이 보고돼요.

전역 통계의 경우 벡터의 시작부터 최대 12개 원소가 설정돼요. results에 n < 12인 n개 원소가 있으면, n개 원소가 처음 n개의 성능 통계 값으로 설정돼요. 보고되는 통계 값은 results 안에 설정되는 순서대로 다음과 같아요.

  • 0: current-process-milliseconds가 반환하는 값과 같은 값.
  • 1: current-milliseconds가 반환하는 값과 같은 값.
  • 2: current-gc-milliseconds가 반환하는 값과 같은 값.
  • 3: 현재 place 안에서 시작 이후 수행된 가비지 컬렉션 횟수.
  • 4: 시작 이후 수행된 스레드 문맥 전환 횟수.
  • 5: 시작 이후 처리된 내부 스택 오버플로우 횟수(BC 전용; CS는 0).
  • 6: 현재 실행 예정인 스레드 수(즉 실행 중이고, 일시 중단되지 않았고, 동기화로 인해 예정 해제되지 않은 스레드).
  • 7: 시작 이후 컴파일된 코드에서 읽은 문법 객체 수(BC 전용; CS는 0).
  • 8: 수행된 해시 테이블 검색 횟수(BC 전용; CS는 0). 이 카운터가 fixnum의 최댓값에 도달하면 가장 음의 fixnum으로 오버플로우돼요.
  • 9: 이중 해싱을 사용해 해시 검색을 완료하기 위해 검색된 추가 해시 슬롯 수(BC 전용; CS는 0). 이 카운터가 fixnum의 최댓값에 도달하면 가장 음의 fixnum으로 오버플로우돼요.
  • 10: current-memory-use가 보고하지 않는 머신 코드용으로 할당된 바이트 수(BC 전용; CS는 0).
  • 11: 가비지 컬렉션 직전의 최고 할당 바이트 수.

스레드별 통계의 경우 벡터에 최대 4개 원소가 설정돼요.

  • 0: 스레드가 실행 중이면 #t, 그렇지 않으면 #f(thread-running?과 같은 결과).
  • 1: 스레드가 종료되었으면 #t, 그렇지 않으면 #f(thread-dead?과 같은 결과).
  • 2: 스레드가 현재 동기화 가능한 이벤트에 블로킹되어 있거나(일부 밀리초 동안 잠들어 있거나) #t, 그렇지 않으면 #f.
  • 3: 스레드의 연속(continuation)에 현재 사용 중인 바이트 수(BC 전용; CS는 0).

package base 6.1.1.8에서 변경: 전역 통계에 벡터 위치 11 추가.

더 알아보기