mshrimp   6년 전

현재 BOJ에서는 Scheme 인터프리터로 SCM을 사용하고 있는데, 좋은 Scheme 인터프리터 / 컴파일러와 비교했을 때 성능 차이가 상당히 큽니다. SCM에서 실행했을 때 10초 정도 소요하는 코드가 MIT scheme 이나 Gambit Scheme, Chez Scheme에서는 1초도 소요하지 않는 코드란 점에서 지금 인터프리터는 꽤 느린 편입니다.
그리고 이 글에서도 건의한 내용인데, 런타임 에러 로그를 본 것은 아니라 100% 확신할 수 없지만 현재 인터프리터에서는 입력을 다 받지 않고 종료하면 에러가 나고, 이를 수동으로 처리할 기본 procedure도 현재 인터프리터 구현에서는 제가 아는 한 없습니다.
마지막으로, Windows SCM 기준으로 2^30 범위를 넘어가는 정수가 float으로 자동변환되고, 큰 정수의 경우 SQRT (제곱근) 가 제대로 동작하지 않는데, 이럴 경우 큰 숫자를 이용하는 문제를 풀기 어려울 것이라고 생각됩니다.

+추가 : 다른 언어의 스트링 포매팅 기능을 하는 format procedure도 없어서 문제 7510 같은 출력을 하기에 너무나도 불편합니다.

이러한 이유로, 지금의 SCM 인터프리터 대신 다른 인터프리터를 사용하고 추가 시간을 줄였으면 합니다. 참고로 인터프리터/컴파일러를 교체할 경우 구현된 함수가 달라 재채점 시 런타임 에러가 나는 소스가 있습니다.

Chez Scheme
제작년까지만 해도 상용 컴파일러였으나 오픈소스로 전향했습니다. 속도가 가장 빠릅니다.
실행 : chez-scheme --script ~~~.scm

Chicken Scheme Compiler

가장 활성적인 커뮤니티를 가진 스킴입니다. 먼저 Scheme 코드를 C 코드로 변환하고 GCC로 컴파일합니다. C 코드로 변환한 후 C 채점 방식을 그대로 적용하면 채점 시스템과의 호환성도 높을 것으로 보입니다.

C 코드 생성 : chicken ~~~.scm -optimize-level 3 -output-file ~~~.c

C 코드 생성 + 컴파일 : csc ~~~.scm

#참고 링크

Gambit Scheme Compiler
이것도 빠른 Scheme Compiler입니다. 먼저 C 코드로 변환하고 GCC로 컴파일합니다.
컴파일 : gsc -exe ~~~.scm
(C 코드만 생성 : gsc ~~~.scm)
실행 : ./~~~

인터프리터도 있습니다.
실행 : gsi ~~~.scm

MIT/GNU Scheme
실행 : mit-scheme --quiet --load ~~~.scm

댓글을 작성하려면 로그인해야 합니다.