치킨(계획 구현)

Chicken (Scheme implementation)
치킨 스킴
Chicken Scheme logo and wordmark.svg
치킨 스킴 로고
Chicken 5.0.0.png
MacOS에서 실행되는 치킨 5.0.0 인터프리터
패러다임멀티패러다임: 기능, 필수, 메타
가족리스프
설계자펠릭스 빙켈만
개발자치킨팀
처음 등장한2000년 7월 20일; 21년(2000-07-20)[1]
안정된 릴리스
5.3.0 / 2021년 11월 18일, 7개월 전(2021-11-18)
타이핑 분야동적, 잠재성, 강성
범위어휘
구현 언어스킴, C
플랫폼IA-32, x86-64, ARM, MIPS, SPARC64, 전원PC
OS크로스 플랫폼: Windows, Linux, macOS, FreeBSD, NetBSD, OpenBSD, Solaris, AIX, Haiku, Android, iOS
면허증.BSD
파일 이름 확장자.scm
웹 사이트www.call-cc.org Edit this at Wikidata
영향을 받다
리스프, 스킴

치킨(CHICKEN)은 프로그래밍 언어, 특히 프로그래밍 언어 스킴의 사투리를 구현하고 스킴 소스 코드를 표준 C로 컴파일하는 컴파일러 및 인터프리터입니다.대부분 R5RS에 준거하고 있으며, 표준에 대한 많은 확장 기능을 제공합니다.새로운 R7RS 표준은 확장 라이브러리[2]통해 지원됩니다.치킨BSD 라이선스로 이용할 수 있는 무료 오픈 소스 소프트웨어입니다.대부분 Scheme에서 구현되며, 성능을 위해 또는 C 프로그램으로의 임베딩을 쉽게 하기 위해 C에 있는 일부 부품도 있습니다.

초점

치킨의 초점은, 「실용적이고 휴대성이 뛰어난 스킴 시스템」이라는 슬로건으로부터 금방 알 수 있습니다.

치킨의 주요 초점은 실제 소프트웨어 작성을 위한 Scheme의 실용적인 적용이다.스킴은 컴퓨터 사이언스 커리큘럼과 프로그래밍 언어 실험에서의 사용으로 잘 알려져 있지만 비즈니스와 [3]산업에서는 거의 사용되지 않았다.치킨 커뮤니티는 다양한 작업을 수행하기 위해 많은 도서관 세트를 생산해 왔다.Chicken wiki(치킨 프로그램을 실행하는 소프트웨어도 Chicken 프로그램입니다)[4]에는 Chicken으로 작성된 소프트웨어 목록도 포함되어 있습니다.

치킨의 또 다른 목표는 휴대하는 것이다.중간 표현으로 컴파일하면 이 경우 휴대용 C(Gambit Bigloo와 마찬가지로)로 작성된 프로그램을 Linux, macOS, 기타 Unix 계열 시스템, Windows, Haiku 및 모바일 플랫폼 iOS [5] Android와 같은 일반적인 인기 운영 체제용으로 컴파일할 수 있습니다.또한 다양한 임베디드 시스템 플랫폼에서 사용할 수 있는 크로스 컴파일 프로그램 및 [6]확장 기능도 내장되어 있습니다.

설계.

많은 Scheme 컴파일러와 마찬가지로 치킨은 표준 C를 중간 표현으로 사용합니다.Scheme 프로그램은 Chicken 컴파일러에 의해 C로 변환되고 C 컴파일러는 C 프로그램을 타깃 컴퓨터 아키텍처의 머신 코드로 변환하여 실행 가능한 프로그램을 생성합니다.C는 보편적으로 이용 가능하기 때문에 이 목적에 도움이 됩니다.

치킨의 디자인은 스킴을 C로 컴파일하기 위한 혁신적인 전략을 개략적으로 설명한 헨리 베이커의 1994년 논문에서[7] 영감을 얻었다.Scheme 프로그램은 C 함수로 컴파일됩니다.이러한 C 함수는 리턴 스테이트먼트에 도달하지 않고 완료하면 새로운 계속을 호출합니다.이러한 연속은 C 함수이며 다른 C 함수에 추가 인수로 전달됩니다.컴파일러에 의해 계산됩니다.

이것이 지금까지의 연속 통과 스타일의 정수입니다.Baker의 새로운 아이디어는 Scheme 에 C 콜스택을 사용하는 것입니다.따라서 자동 변수 생성, 가변 크기 배열 할당 등의 일반 C 스택 작업을 사용할 수 있습니다.스택이 가득 차면(스택 포인터가 스택의 맨 위에 도달하면) 가비지 컬렉션을 시작할 수 있습니다.사용된 디자인은 원래 C. J. Cheney가 고안한 복사 가비지 컬렉터로,[8] 모든 라이브 연속물과 다른 라이브 오브젝트를 힙에 복사합니다.이 경우에도 C 코드는 C 스택프레임을 복사하지 않고 Scheme 객체만 복사하기 때문에 C 실장에 대한 지식이 필요하지 않습니다.

전체적으로 Scheme 힙은 C 스택과 가비지 컬렉터에 필요한 2개의 힙으로 구성됩니다.이 어프로치에 의해, 많은 동작에 대해서 C스택의 속도를 얻을 수 있어 C함수에의 단순한 콜로서 계속을 사용할 수 있습니다.또한 Baker의 솔루션은 Scheme 언어 표준에 의해 요구되는 점근적 테일 재귀적 동작을 보증합니다.치킨 스킴 컴파일러의 구현은 공간에 대해 점근적으로 안전합니다.

표준으로부터의 제한 및 편차

치킨 스킴은 대부분 R5RS에 준거하고 있으며 몇 가지 주목할 만한 제한과 [9]편차가 있습니다.R7RS 호환성은 확장 [2]라이브러리로 제공됩니다.

코어 시스템은 UTF-8 문자를 기본적으로 지원하지만 문자열 인덱싱 및 조작 절차는 UTF-8을 인식하지 않습니다.완전한 UTF-8 인식 [10]지원을 추가하는 확장 라이브러리가 존재합니다.

애드온 소프트웨어

치킨에는 [11]에그라고 불리는 라이브러리와 프로그램이 추가된 큰 소프트웨어 저장소가 있습니다.이 시스템은 RubyGems[12]매우 유사합니다.

처음에 이러한 에그는 하나의 중앙 svn [13]저장소에서 개발되었습니다.태그를 작성하면 새로운 버전의 확장 기능을 자동으로 다운로드할 수 있게 됩니다.현재, 에그는 대부분의 인기 코드 호스팅 [14]사이트를 이용할 때 반자동 릴리스 관리를 유지하면서, 모든 버전 관리 시스템 하에서 어디서나 개발할 수 있다.이 릴리스 방법은 사용자가 이러한 VCS를 설치할 필요가 없다는 점에서 VCS에 구애받지 않습니다.개발자는 원하는 장소에서 자유롭게 호스트할 수 있으며 공개 버전 관리를 피하고 일반 tarball만 배포할 수도 있습니다.

릴리스된 모든 에그에 대해 최신 버전은 연속적인 통합 프로세스의 일부로 자동으로 테스트됩니다.표준 테스트 서버가 존재합니다.[15]이 서버는 코어 시스템과 모든 에그를 최신 개발 버전(회귀적인 버그를 포착하기 위해)과 최신 안정 버전(안정적인 시스템 사용자에게 모든 것이 확실히 동작하도록 하기 위해)과 비교하여 매일 테스트합니다.또한 하드웨어, 운영 체제 또는 코어 릴리스 등 다양한 테스트 용량을 제공할 수 있습니다.

특징들

치킨은 대부분의 R5RS 표준 스킴을 지원하지만 일부 스킴 구현에서는 사용할 수 없는 몇 가지 비표준 기능도 추가합니다.

외부 기능 인터페이스

C에 대한 치킨 컴파일을 통해 커스텀 C 코드를 컴파일 결과에 삽입할 수 있으므로 C 라이브러리와의 통합이 용이합니다.외부 함수 인터페이스는 대부분의 내장 C 타입과 대응하는 Scheme 오브젝트 간의 변환을 지원합니다.

또한 확장 라이브러리는 Java Native Interface(JNI;[18] Java 네이티브인터페이스) 또는 [19]브릿지를 통해 Python,[16] Lua [17]Java인터페이스하기 위해 존재합니다.

크로스 컴파일

스킴 코드를 다른 플랫폼에 크로스 컴파일 하는 것은 비교적 간단합니다(예를 들어, 디바이스상의 임베디드 사용).

스킴 코드의 교차 컴파일을 가능하게 하기 위해 치킨은 다음과 같은 개별 컴파일 모델을 적용합니다.컴파일된 모듈은 2개의 공유 라이브러리로 구성됩니다.한 라이브러리는 실행 시(타깃 플랫폼용으로 컴파일됨)에 사용되는 실제 코드를 포함하고, 다른 라이브러리는 Import 모듈로, 절차 매크로 코드와 같은 컴파일 시(호스트 플랫폼)에 실행되는 코드를 로드하는 데 사용됩니다.

또한 치킨 컴파일러는 쉽게 교차 컴파일할 수 있습니다.C로의 변환이 완료되면 다른 플랫폼용으로 구축하도록 설정된 C 컴파일러를 사용할 수 있습니다.

모듈 및 매크로

버전 4 이후, Chicken은 모듈 시스템을 내장하고 명시적인 이름 변경[20] 매크로를 통해 낮은 수준의 위생 매크로를 지원합니다(버전 4 이전 버전에서는 애드온 라이브러리를 통해 사용 가능).표준 구문 규칙 매크로 및 암묵적인 이름 변경 [21]매크로도 지원됩니다.이는 기본적으로 명시적 이름 변경의 역버전입니다.

이 메커니즘은 편의를 위해 성능을 교환합니다.비위생적으로 명시적으로 삽입되지 않은 각 식별자는 이름 캡처를 방지하기 위해 자동으로 이름이 변경됩니다.퍼포먼스 비용은 암묵적인 이름 변경에 의해 매크로 익스팬더가 식을 2회 더 역방향으로 되돌려야 하기 때문에 발생합니다.이 비용은 확장 시 지불되므로 매크로 작성자는 더 긴 컴파일 시간을 허용할 수 있는지 고려해야 합니다.

리모트 디버거

버전 4.11 이후 [22]치킨은 Featurs라는 이름의 디버거와 함께 제공됩니다.스킴 코드가 필요한 디버깅옵션을 사용하여 컴파일되면 디버깅이벤트가 코드의 특정 포인트에 주입됩니다.이들은 C 함수에 대한 콜로서 실장됩니다.이 함수는 실제로 코드를 디버깅하지 않을 경우 상대적으로 오버헤드가 낮습니다.디버깅 시 Feathers 서버 프로세스에 TCP 접속을 시도합니다(다른 머신에 접속할 수도 있습니다).프로세스가 중지되고 사용자가 중단점을 설정하고 프로그램을 시작할 수 있습니다.다음으로 브레이크포인트가 히트하면 클라이언트(디버깅되는 프로세스)는 명령어루프에 들어갑니다이 루프는 클라이언트에 대한 질문, 변수 읽기 또는 변환을 가능하게 합니다.

제한된 정적 유형 분석

Chicken은 로컬 흐름 분석을 지원합니다.이를 통해 컴파일러는 컴파일 시 변수 유형 오류를 포착하여 유형 전문화를 수행할 수 있습니다.이 전문화를 통해 컴파일 시 유형을 추론할 수 있는 런타임에 유형 탐지를 위한 몇 가지 안전 검사를 제거할 수 있습니다.그 결과 런타임 성능이 향상됩니다.

정밀 조사기는 모듈 간 흐름 분석을 지원하지 않으므로 컴파일 유닛(또는 모듈)의 일부인 코드를 최적화하는 데만 사용할 수 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Winkelmann, Felix. "Announcing the Chicken Scheme-to-C compiler". Google Groups (comp.lang.scheme).
  2. ^ a b evhan (2018-11-09). "r7rs (Chicken manual)". Chicken Scheme. Retrieved 2019-02-28.
  3. ^ 섹션 "Scheme used for?" "Scheme FAQ".(스킴의 용도)
  4. ^ Bex, Peter (sjamaan) (2018-08-16). "Software written in Chicken Scheme". Chicken Scheme. Retrieved 2019-02-26.
  5. ^ "Portability". Chicken Scheme Wiki.
  6. ^ Bex, Peter (sjamaan) (2016-05-28). "Cross development". Chicken Scheme (Manual). Retrieved 2019-02-26.
  7. ^ Baker, Henry (1994). "CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A." Archived from the original on 2006-03-03.
  8. ^ 체니, C.J. "비재귀 리스트 압축 알고리즘"CACM 13,11(1970년 11월), 677-678.
  9. ^ Bex, Peter (sjamaan); Winkelmann, Felix (2016-05-28). "Confirmed deviations (Chicken manual)". Chicken Scheme. Retrieved 2019-02-28.
  10. ^ Bex, Peter (sjamaan); kooda; mario; svnwiki; wasamasa; kon; mario (2018-08-11). "utf8 (Chicken manual)". Chicken Scheme. Retrieved 2019-02-28.
  11. ^ "Chicken eggs". Chicken Scheme.
  12. ^ "RubyGems". RubyGems.org. Retrieved 2019-02-26.
  13. ^ Bex, Peter (sjamaan). "VCS-independent distribution of language extensions"., More Magic에 관한 블로그 투고
  14. ^ "Instructions for popular code hosting methods and VCSes". Chicken wiki.
  15. ^ "Chicken automated tests". Chicken Scheme. Retrieved 2019-02-28.
  16. ^ iraikov (2016-06-11). "pyffi". Chicken Scheme Wiki. Retrieved 2019-03-03.
  17. ^ Bex, Peter (sjamaan); iraikov (2012-03-11). "Lua". Chicken Scheme Wiki. Retrieved 2019-03-03.
  18. ^ mario; svnwiki (2013-06-04). "JNI". Chicken Scheme Wiki. Retrieved 2019-03-03.
  19. ^ Winkelmann, Felix; mario (2013-06-04). "Javahack". Chicken Scheme Wiki. Retrieved 2019-03-03.
  20. ^ Bex, Peter (sjamaan); Winkelmann, Felix; mario (2018-09-23). "Module (Chicken syntax)". Chicken Scheme. Retrieved 2019-02-28.
  21. ^ Bex, Peter (sjamaan); Winkelmann, Felix; mario (2018-09-23). "Module (Chicken syntax)". Chicken Scheme. Retrieved 2019-02-28.
  22. ^ Bex, Peter (sjamaan) (2018-11-25). "Debugging". Chicken Scheme.

외부 링크