스탈린 컴파일러는 잔인하게 최적화하지만 어떻게?


14

JM Siskind의 연구 결과는 다음 과 같습니다.

스탈린은 전체 프로그램 정적 분석을 수행하고 해당 분석 결과를 사용하여 매우 효율적인 코드를 생성하는 Scheme 용 최적화 컴파일러입니다. 스탈린은 대규모의 정적 분석 기법을 활용합니다. 반복 된 단 변량 흐름 분석을 사용하여 흐름 지향 분할을 수행하는 새로운 형태의 다변량 흐름 분석을 수행합니다. 절차의 특수 사본 복제 및 이러한 클론에 대한 대상별 콜 사이트 지정. 흐름 분석 결과를 사용하여 수명 분석, 이스케이프 분석, 지점 간 분석 및 필수 앨리어스 분석을 수행합니다. 이러한 분석은 가변 세계화 및 지역화와 같은 기술을 사용하여 대부분의 폐쇄 슬롯을 제거하고 정적 백 체인을 압축하며 일반적으로 프로그램에서 대부분의 폐쇄를 제거하는 새로운 형태의 경량 폐쇄 변환을 지원합니다. 또한 위의 분석을 사용하여 흐름 가비지 기반 스토리지 관리를 지원합니다. 여기서 런타임 가비지 수집은 요약 값 및 프로그램 포인트별로 정적 할당 및 할당 취소로 대체됩니다. 또한 Screamer로 개척 한 기술의 확장을 사용하여 흐름 지향 경량 CPS 변환을 수행하여 매우 효율적인 일류 연속을 지원합니다. 마지막으로, 흐름 지향 인라인 및 저수준 표현 선택을 지원하여 태그의 구현 (또는 비 구현), 태그 확인 및 태그 별 및 값별로 프로그램 별 포인트 디스패치를 ​​선택할 수 있습니다. 이를 통해 대부분의 런타임 태그, 태그 검사, 태그 지정, 태그 제거, 태그 디스패치, 복싱 및 프로그램에서 언 박싱이 제거됩니다. 여기서 런타임 가비지 콜렉션은 추상 값 및 프로그램 포인트별로 정적 할당 및 할당 취소로 대체됩니다. 또한 Screamer로 개척 한 기술의 확장을 사용하여 흐름 지향 경량 CPS 변환을 수행하여 매우 효율적인 일류 연속을 지원합니다. 마지막으로, 흐름 지향 인라인 및 저수준 표현 선택을 지원하여 태그의 구현 (또는 비 구현), 태그 검사 및 태그 별 및 값별로 프로그램 별 포인트 디스패치를 ​​선택할 수 있습니다. 이를 통해 대부분의 런타임 태그, 태그 검사, 태그 지정, 태그 제거, 태그 디스패치, 복싱 및 프로그램에서 언 박싱이 제거됩니다. 여기서 런타임 가비지 콜렉션은 추상 값 및 프로그램 포인트별로 정적 할당 및 할당 취소로 대체됩니다. 또한 Screamer로 개척 한 기술의 확장을 사용하여 흐름 지향 경량 CPS 변환을 수행하여 매우 효율적인 일류 연속을 지원합니다. 마지막으로, 흐름 지향 인라인 및 저수준 표현 선택을 지원하여 태그의 구현 (또는 비 구현), 태그 검사 및 태그 별 및 값별로 프로그램 별 포인트 디스패치를 ​​선택할 수 있습니다. 이를 통해 대부분의 런타임 태그, 태그 검사, 태그 지정, 태그 제거, 태그 디스패치, 복싱 및 프로그램에서 언 박싱이 제거됩니다. Screamer로 개척 한 기술의 확장을 사용하여 매우 효율적인 일류 연속을 지원합니다. 마지막으로, 흐름 지향 인라인 및 저수준 표현 선택을 지원하여 태그의 구현 (또는 비 구현), 태그 검사 및 태그 별 및 값별로 프로그램 별 포인트 디스패치를 ​​선택할 수 있습니다. 이를 통해 대부분의 런타임 태그, 태그 검사, 태그 지정, 태그 제거, 태그 디스패치, 복싱 및 프로그램에서 언 박싱이 제거됩니다. Screamer로 개척 한 기술의 확장을 사용하여 매우 효율적인 일류 연속을 지원합니다. 마지막으로, 흐름 지향 인라인 및 저수준 표현 선택을 지원하여 태그의 구현 (또는 비 구현), 태그 검사 및 태그 별 및 값별로 프로그램 별 포인트 디스패치를 ​​선택할 수 있습니다. 이를 통해 대부분의 런타임 태그, 태그 검사, 태그 지정, 태그 제거, 태그 디스패치, 복싱 및 프로그램에서 언 박싱이 제거됩니다.이러한 분석 및 최적화를 통해 스탈린은 특히 숫자가 많은 코드의 경우 2에서 100 사이의 요인으로 다른 모든 Scheme 컴파일러보다 성능이 뛰어난 매우 효율적인 코드를 생성 할 수 있습니다. 스탈린은 종종 필기 c 및 Fortran 코드보다 우수한 코드를 생성합니다.

클로저 / 함수 호출 구현에 대한 다음과 같은 매우 흥미로운 논문을 찾을 수있었습니다 : Flow-Directed Lightweight Closure Conversion . 또한 저자에게 다른 주제에 대한 논문에 대해 전자 메일을 보냈습니다. 논문은 클로저 변환 논문에 기록되어 있습니다.

시스 킨트, JM 2000a. 흐름 지향 경량 CPS 변환. 준비중.

시스 킨트, JM 2000b. 흐름 지향 다변량. 준비중.

시스 킨트, JM 2000c. 흐름 지향 표현 선택. 준비중.

시스 킨트, JM 2000d. 흐름 지향 스토리지 관리. 준비중

불행히도, 그는 그 신문을 쓰지 않았습니다. 당신에게 내 질문은 :이 주제를 다루는 대안 또는 관련 논문이 있습니까? 스탈린 (또는 다른 컴파일러)이 가비지 수집되고 동적으로 형식화되고 1 등석 기능을 지원하며 1 등석 연속 기능을 사용하여 정적 코드를 정적 코드로 정적 컴파일 할 수있는 방법과 같은 고급 언어를 컴파일하는 방법에 대해 매우 관심이 있습니다. . 흐름 분석에 대한 논문은 상당히 풍부하지만, 이러한 분석 결과를 사용하여 위에서 언급 한 최적화를 수행하는 방법에 대한 논문은 그렇지 않습니다.

답변:


11

핵심은 아마도 전체 프로그램 분석과 전체 프로그램 최적화를 사용한다는 사실 일 것입니다. 프로그램의 작동 방식에 대해 더 많이 알수록 전문화하고 인라인하고 성능을 향상시킬 수 있습니다.

Standard ML의 MLton 컴파일러는 비슷한 작업을 수행합니다 ( http://mlton.org/ ). 그것에 대해 적어도 하나의 프레젠테이션이 있습니다 : http://mlton.org/pages/References/attachments/060916-mlton.pdf .

초기 작업은 워싱턴 대학의 Craig Chambers와 그의 그룹이 수행했습니다 (예 : http://www.cs.washington.edu/research/projects/cecil/www/pubs/jdean-thesis.html ). 이것은 Self와 나중에 Cecil / Vortex의 맥락에서 이루어졌다.

Scheme / Lisp 커뮤니티에는 더 많은 작업이있을 것입니다. 인터넷 검색 "전체 프로그램 최적화"를 고려하고 싶을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.