정적 단일 할당 형식
Static single-assignment form컴파일러 설계에서 정적 단일 할당 형식(종종 SSA 형식 또는 단순 SSA)은 각 변수를 정확히 한 번 할당하고 사용하기 전에 정의해야 하는 중간 표현(IR)의 속성입니다.원본 IR의 기존 변수는 버전으로 분할되며, 새 변수는 일반적으로 교과서에 첨자가 있는 원래 이름으로 표시됩니다. 따라서 모든 정의는 고유한 버전을 가집니다.SSA 형식에서는 use-def 체인은 명시적이며 각각1개의 요소를 포함합니다.
SSA는 Barry K에 의해 제안되었습니다. 로젠, 마크 N Wegman과 F. 케네스 자덱이 1988년에.[1]Ron Cytron, Jeanne Ferante 및 IBM의 이전 세 연구자는 SSA 형식을 효율적으로 [2]계산할 수 있는 알고리즘을 개발했습니다.
SSA는 Fortran, C 또는 C++용 컴파일러에서 찾을 수 있지만 Scheme 및 ML용 컴파일러와 같은 기능적 언어 컴파일러에서는 일반적으로 CPS(Continuation-Passing Style)가 사용됩니다.SSA는 로컬 이외의 제어 플로우를 제외한 CPS의 정상 동작 서브셋과 정식으로 동등합니다.이러한 서브셋은 CPS가 중간 [3]표현으로 사용되는 경우에는 발생하지 않습니다.따라서 하나의 관점에서 공식화된 최적화와 변환은 다른 것에 즉시 적용됩니다.
혜택들
SSA의 주된 유용성은 변수의 속성을 단순화함으로써 다양한 컴파일러 최적화 결과를 동시에 단순화하는 방법에서 비롯됩니다.예를 들어 다음과 같은 코드를 생각해 보겠습니다.
y : = 1 y : = 2 x : = y
인간은 첫 번째 임무가 필요하지 않다는 것을 알 수 있고, 그리고 그 가치는y
세 번째 행에서 사용되는 것은 두 번째 할당에서 비롯된다y
이를 판별하려면 프로그램이 도달 정의 분석을 수행해야 합니다.그러나 프로그램이 SSA 형식인 경우 다음 두 가지가 모두 즉시 수행됩니다.
y1 : = 12 y : = 2 x1 : = y2
SSA를 사용하여 활성화되거나 강력하게 확장되는 컴파일러 최적화 알고리즘은 다음과 같습니다.
- 지속적인 전파 – 런타임에서 컴파일 시간으로의 계산 변환(예: 명령 처리)
a=3*4+5;
마치 그런 것처럼a=17;
- 값 범위 전파[4]– 계산 가능한 범위를 미리 계산하여 분기 예측을 미리 작성할 수 있습니다.
- 스파스 조건부 상수 전파 – 일부 값을 검사하여 테스트에서 가장 가능성이 높은 분기를 예측할 수 있습니다.
- 데드코드 삭제– 결과에 영향을 주지 않는 코드 삭제
- 글로벌 값 번호 부여– 동일한 결과를 생성하는 중복 계산 대체
- 부분 용장성 배제– 프로그램 일부 브랜치에서의 중복 계산 삭제
- 강도 감소 – 비용이 많이 드는 작업을 비용이 적게 들지만 동등한 작업으로 대체합니다. 예를 들어, 정수의 곱이나 나누기를 2의 거듭제곱으로 대체하고, 잠재적으로 비용이 적게 드는 왼쪽 이동(배수의 경우) 또는 오른쪽 이동(분할의 경우)으로 변경합니다.
- 레지스터 할당 – 제한된 수의 머신 레지스터를 계산에 사용하는 방법을 최적화합니다.
SSA로의 변환
일반 코드를 SSA 형식으로 변환하는 것은 주로 각 할당의 타깃을 새로운 변수로 대체하고 변수의 각 사용을 해당 지점에 도달하는 변수의 "버전"으로 대체하는 것입니다.예를 들어 다음 제어 흐름 그래프를 생각해 보겠습니다.
"x \ \ arrow x - 3" 왼쪽에 있는 이름 변경 및 다음 사용 변경x그 새 이름으로 바꾸면 프로그램은 바뀌지 않을 겁니다.이는 SSA에서 다음 2개의 새로운 변수를 작성함으로써 이용할 수 있습니다.x1 그리고x각각 1회만 할당됩니다2.마찬가지로 다른 모든 변수에 구별 첨자를 지정하면 다음과 같은 결과가 나옵니다.
한 가지 경우를 제외하고 각 용도가 어떤 정의를 참조하는지 명확합니다. 두 가지 용도는 모두y아래 블록은 다음 중 하나를 참조할 수 있습니다.y1 또는y제어 플로우가 어느 패스를 사용했느냐에 따라 달라집니다2.
이 문제를 해결하기 위해 마지막 블록에 δ(Phi) 함수라고 하는 특수 문이 삽입됩니다.이 문은 y의 새로운 정의를 생성합니다.y3 어느 쪽인가 하면y1 또는y과거의 제어 흐름에 따라 달라집니다2.
이제 마지막 블록은 단순히y어느 쪽이든 올바른 값을 얻을 수 있습니다3.x의 δ 함수는 필요 없습니다.이 함수는 1가지 버전만x즉,x2 이 장소에 도달하고 있기 때문에 문제 없습니다(즉, φ).x2,x2)=x를 참조해 주세요2.
임의의 제어 흐름 그래프를 지정하면 δ 함수를 어디에 삽입해야 하는지, 어떤 변수를 삽입해야 하는지 알기 어려울 수 있습니다.이 일반적인 질문에는 우위 프런티어라는 개념을 사용하여 계산할 수 있는 효율적인 솔루션이 있습니다(아래 참조).
machines 기능은 대부분의 기계에서 기계 조작으로 구현되지 않습니다.컴파일러는 모든 이전 블록의 끝에 "이동" 연산을 삽입함으로써 δ 함수를 구현할 수 있습니다.위의 예에서 컴파일러는 다음에서 이동을 삽입할 수 있습니다.y1 로y3 중도좌파 블록의 끝과 에서 움직이다y2 로y3 오른쪽 중간 블록 끝에 있습니다.이러한 이동 조작은, 컴파일러의 레지스터 할당 순서에 근거하는 최종 코드로 끝나지 않는 경우가 있습니다.그러나 동시 연산이 δ 함수에 대한 입력을 추측적으로 생성하는 경우에는 이 접근방식이 작동하지 않을 수 있습니다(와이드 이슈 머신에서 발생할 수 있음).일반적으로 와이드 이슈 머신에는 이러한 상황에서 컴파일러가 δ 함수를 구현하기 위해 사용하는 선택 명령이 있습니다.
케니 [5]자덱에 따르면 1980년대 SSA가 IBM Research에서 개발될 때 Ⅱ 함수는 원래 가짜 함수로 알려져 있었습니다.φ 함수의 정식 명칭은 이 연구가 학술 논문에 처음 발표되었을 때만 채택되었습니다.
우세한 경계를 사용한 최소한의 SSA 계산
제어 흐름 그래프에서 노드 A는 먼저 A를 통과하지 않고 B에 도달할 수 없는 경우 다른 노드 B에 대해 말한다.즉, 노드 B에 도달하면 A가 실행되었다고 가정할 수 있습니다.A가 B를 엄밀하게 지배하거나 A = B를 지배하면 A가 B를 지배한다고 한다.
노드 A에 제어를 이전하는 노드를 A의 노드라고 한다.
노드 A의 세트는 노드B의 세트입니다.여기서 A는 B를 엄밀하게 지배하지 않지만 B의 직전의 노드 B를 지배하고 있습니다.여러 제어 경로가 다시 하나의 경로로 병합되는 지점입니다.
예를 들어, 다음과 같은 코드입니다.
[1] x = random() x < 0.5 [2] 결과 = "heads" 그렇지 않으면 [3] 결과 = "tail" end [4] print(결과)
노드 1은 2, 3, 4를 엄밀하게 지배하며 노드4의 바로 앞은 노드2와 노드3입니다
우세 프런티어는 δ 기능이 필요한 지점을 정의합니다.위의 예에서는 노드4에 제어가 전달되었을 때,result
노드 2에서 제어가 전달되었는지 3에서 전달되었는지에 따라 달라집니다.도미네이터에 정의되어 있는 변수에는 적용할 수 있는 정의가1개밖에 없기 때문에 δ 함수가 필요하지 않습니다.
각 노드의 우위 경계를 찾는 효율적인 알고리즘이 있습니다.이 알고리즘은 [6]1991년 Ron Cytron, Jeanne Ferrante 등의 "효율적인 컴퓨팅 정적 단일 할당 양식 및 제어 그래프"에서 처음 설명되었습니다.
키스 D.Rice University의 Cooper, Timothy J. Harvey 및 Ken Kennedy는 A Simple, Fast Unity [7]Algorithm이라는 제목의 논문에서 알고리즘을 설명합니다.
각 노드 b에 대해 b 러너의 직전의 p에 대한 b δ2의 직전의 수가 = p인 반면, 러너 θ idom(b) adomity_delin(runner) : = plunner { b } runner : = idom(runner)
위의 코드에서는idom(b)
는 b를 엄밀하게 지배하지만 b를 엄밀하게 지배하고 있는 다른 노드를 엄밀하게 지배하지 않는 고유한 노드입니다.
δ 함수의 수를 줄이는 변형
「Minimal」SSA는, 각 이름이 정확하게 1 회 할당되어 원래의 프로그램내의 이름의 각 참조(사용)가 일의의 이름을 참조할 수 있는 것을 보증하기 위해서 필요한 최소한의 수의 δ 함수를 삽입합니다.(후자의 요건은 컴파일러가 각 오퍼랜드의 이름을 각 오퍼랜드에 기록할 수 있도록 하기 위해 필요합니다).
다만, 이러한 Ω 함수의 일부는 무효가 되어 있을 가능성이 있습니다.따라서 최소 SSA가 특정 절차에 필요한 최소의 δ 함수를 생성하는 것은 아닙니다.분석에 따라서는 이러한 δ 함수가 불필요하여 분석의 실행 효율이 저하될 수 있습니다.
프루닝된 SSA
프루닝된 SSA 형식은 단순한 관찰에 기초하고 있습니다.이러한 함수는 δ함수 뒤에 있는 "라이브" 변수에 대해서만 필요합니다.(여기서 "live"는 해당 δ 함수로 시작하는 경로를 따라 값이 사용됨을 의미합니다.)변수가 Live가 아닐 경우 cannot함수의 결과를 사용할 수 없으며 is함수에 의한 할당은 무효가 됩니다.
프루닝된 SSA 형식의 구축에서는 φ함수 삽입 국면에서 라이브 변수 정보를 사용하여 특정 is함수가 필요한지 여부를 판단합니다.원래 변수 이름이 φ 함수 삽입 지점에 없으면 φ 함수는 삽입되지 않습니다.
플루닝을 데드코드 제거 문제로 취급할 수도 있습니다.그 후, 입력 프로그램에서의 사용이 그 함수에 고쳐 쓰이거나 다른 φ함수의 인수로 사용되는 경우에만 φ함수가 활성화됩니다.SSA 폼을 입력할 때 각 용도는 SSA 폼을 지배하는 가장 가까운 정의로 고쳐집니다.δ 함수는 적어도 하나의 사용 또는 적어도 하나의 활성 δ 인수를 지배하는 가장 가까운 정의인 한 활성으로 간주됩니다.
세미 프루닝 SSA
세미 프루닝 SSA 형식은[8] 라이브 변수 정보 계산 비용이 상대적으로 많이 들지 않고 δ 함수의 수를 줄이려는 시도입니다.이는 다음 관찰에 기초하고 있습니다.기본 블록에 입력할 때 변수가 활성화되지 않으면 δ 함수가 필요하지 않습니다.SSA 구축 중에는 "블록 로컬" 변수의 δ 함수는 생략됩니다.
블록 로컬 변수 세트를 계산하는 것은 완전한 라이브 변수 분석보다 간단하고 빠른 절차이므로 반분할 SSA 형식은 프루닝된 SSA 형식보다 계산 효율이 높습니다.한편, 세미 프루닝 SSA 형식에는 더 많은 δ 함수가 포함됩니다.
블록 인수
블록 인수는 표현적으로는 동일하지만 실제로는 최적화 중에 더 편리할 수 있는 δ 함수의 대체 수단입니다.블록에는 이름이 지정되고 함수 매개 변수로 표기되는 블록 인수 목록을 가져옵니다.블록을 호출할 때 블록 인수는 지정된 값에 바인딩됩니다.Swift 및 LLVM의 다단계 중간 표현은 블록 [9]인수를 사용합니다.
SSA 형식에서 변환
SSA 형식은 일반적으로 직접 실행에는 사용되지 않으며(SSA를[10] 해석하는 것은 가능하지만), 직접 대응 관계를 유지하는 다른 IR 위에 자주 사용됩니다.이는 SSA를 기존 IR의 일부(기본 블록, 명령, 오퍼랜드 등)와 SSA의 대응 요소 간에 매핑하는 함수 집합으로 "구성"함으로써 달성할 수 있습니다.SSA 폼이 필요 없게 되면 이러한 매핑 기능은 폐기되고 최적화된 IR만 남게 됩니다.
SSA 형식에서 최적화를 실행하면 보통 SSA-Web이 얽히게 됩니다.즉, 모든 오퍼랜드가 동일한 루트 오퍼랜드를 가지는 것은 아닙니다.이 경우 SSA에서 컬러아웃알고리즘이 사용됩니다.Naigive 알고리즘에서는, 행선지 φ 와는 다른 루트 기호의 송신원이 φ 에 배치되는 원인이 되는, 각 선행 패스에 카피가 도입됩니다.SSA에서 복사 수가 적은 여러 알고리즘이 있으며 대부분은 간섭 그래프 또는 그 근사치를 사용하여 복사 [11]병합을 수행합니다.
내선번호
SSA 형식의 확장은 2개의 카테고리로 나눌 수 있습니다.
스킴 확장의 이름을 변경하면 이름 변경 기준이 변경됩니다.SSA 형식에 값이 할당되면 각 변수의 이름이 변경됩니다.대체 방식으로는 정적 단일 사용 형식(사용 시 각 문에서 각 변수의 이름을 변경함)과 정적 단일 정보 형식(각 변수에 값이 할당될 때 및 지배 후 프런티어에서 각 변수의 이름을 변경함)이 있습니다.
기능별 확장은 변수에 대한 단일 할당 속성을 유지하지만 추가 기능을 모델링하기 위해 새로운 의미론을 통합합니다.일부 기능별 확장 기능은 배열, 객체 및 별칭 포인터와 같은 고급 프로그래밍 언어 기능을 모델링합니다.기타 기능별 확장 기능은 추측 및 예측과 같은 하위 수준의 아키텍처 기능을 모델링합니다.
SSA 폼을 사용한 컴파일러
![]() |
SSA 형식은 컴파일러 커뮤니티에서 비교적 최근에 개발된 것입니다.따라서 많은 오래된 컴파일러는 컴파일 또는 최적화 프로세스의 일부에만 SSA 폼을 사용하고 있지만 대부분은 SSA 폼에 의존하지 않습니다.SSA 형식에 크게 의존하는 컴파일러의 예는 다음과 같습니다.
- ETH Oberon-2 컴파일러는 SSA의 변형인 "GSA"를 도입한 최초의 공공 프로젝트 중 하나였다.
- LLVM 컴파일러 인프라스트럭처는 프라이머리 코드 표현에서 모든 스칼라 레지스터 값(메모리를 제외한 모든 것)에 SSA 형식을 사용합니다.SSA 폼은 레지스터 할당이 발생한 후 컴파일 프로세스(대부분 링크 시) 늦게만 삭제됩니다.
- Open64 컴파일러는 글로벌스칼라 옵티마이저에서 SSA 형식을 사용합니다.단, 코드는 이전에 SSA 형식으로 변환되어 후에 SSA 형식으로 변환됩니다.Open64는 SSA 형식의 확장자를 사용하여 메모리 및 스칼라 값을 SSA 형식으로 나타냅니다.
- 버전 4(2005년 4월 출시)의 시점에서는 GNU 컴파일러 컬렉션인 GCC는 SSA를 광범위하게 사용하고 있습니다.프런트엔드는 "GENERIC" 코드를 생성하고 "gimplifier"에 의해 "GIMPLE" 코드로 변환됩니다.그런 다음 "GIMPLE"의 SSA 형식에 높은 수준의 최적화가 적용됩니다.그 결과 최적화된 중간 코드가 RTL로 변환되어 낮은 수준의 최적화가 적용됩니다.아키텍처 고유의 백엔드는 마침내 RTL을 어셈블리 언어로 바꿉니다.
- IBM의 오픈 소스 적응형 Java 가상 머신인 Jikes RVM은 통합 프레임워크에서 스칼라, 어레이 및 객체 필드를 분석할 수 있는 SSA의 확장 기능인 확장 어레이 SSA를 사용합니다.Extended Array SSA 분석은 최대 최적화 수준에서만 활성화되며, 이는 가장 자주 실행되는 코드 부분에 적용됩니다.
- 2002년 연구자들은 IBM의 JikesRVM(당시 Jalapeno로 명명됨)을 표준 Java 바이트 코드와 타입세이프 SSA(SafeTSA) 바이트 코드 클래스 파일을 모두 실행하도록 수정하고 SSA 바이트 코드를 사용하는 데 상당한 성능 이점을 입증했습니다.
- Oracle의 HotSpot Java Virtual Machine은 JIT [12]컴파일러에서 SSA 기반 중간 언어를 사용합니다.
- Microsoft Visual Studio 2015 Update 3에서 사용할 수 있는 Microsoft Visual C++ 컴파일러 백엔드는 SSA를 사용합니다[13].
- Mono는 Mini라고 불리는 JIT 컴파일러에서 SSA를 사용합니다.
- jackcc는 학술 명령어 세트 Jackal 3.0용 오픈 소스 컴파일러입니다.중간 표현에는 SSA와 함께 단순한 3-operand 코드를 사용합니다.흥미로운 변형으로서 δ 함수를 레지스터 할당자에게 동일한 물리 레지스터에 배치하도록 지시하는 이른바 SAME 명령으로 대체합니다.
- 컴파일러는 아니지만 부메랑 디컴파일러는 SSA 형식을 내부 표현에 사용합니다.SSA는 표현 전파, 파라미터 및 반환 식별, 보존 분석 등을 단순화하기 위해 사용됩니다.
- 포터블.NET은 JIT 컴파일러에서 SSA를 사용합니다.
- lib 컴파일러의 완전한 그래프 기반의 SSA 중간 표현을 확인합니다.libFirm은 SSA 인식 레지스터 할당자를 사용하여 코드가 생성될 때까지 모든 스칼라 레지스터 값에 SSA 형식을 사용합니다.
- Illinois Concert Compiler circa[14] 1994에서는 SSU(Static Single Use)라는 SSA의 변형을 사용했습니다.SSU(Static Single Use)는 변수가 할당될 때 각 변수의 이름을 변경할 때 각 조건부 컨텍스트(기본적으로 위에서 설명한 정적 단일 정보 형식)에서 이름을 변경합니다.SSU 양식은 John Plevyak의 Ph.에 기재되어 있습니다.D 논문
- COINS 컴파일러는 SSA 폼 최적화를 사용합니다.
- Mozilla Firefox SpiderMonkey JavaScript 엔진은 SSA 기반 [15]IR을 사용합니다.
- Chromium V8 JavaScript 엔진은 2010년 12월에 발표된 바와 같이 크랭크샤프트 컴파일러 인프라스트럭처에 SSA를 구현합니다.
- PyPy는 JIT 컴파일러의 트레이스에 선형 SSA 표현을 사용합니다.
- Android의 Dalvik 가상 머신은 JIT 컴파일러에서 SSA를 사용합니다.
- Android Runtime용 새로운 최적화 컴파일러는 IR에 SSA를 사용합니다.
- Standard ML 컴파일러 MLton은 중간 언어 중 하나로 SSA를 사용합니다.
- LuaJIT는 SSA 기반 [16]최적화를 많이 사용합니다.
- PHP 및 Hack 컴파일러 HHVM은 [17]IR에서 SSA를 사용합니다.
- Resources Labs의 R-Stream 컴파일러는 비 SSA(쿼드 리스트), SSA 및 SSI([19]Static Single[18] Information) 폼을 지원합니다.
- Go (x86-64 아키텍처의 경우 1.7, 지원되는 모든 [20][21]아키텍처의 경우 1.8)
- SPIR-V는 Vulkan 그래픽스 API 및 OpenCL 컴퓨팅 API용 커널 언어의 셰이딩 언어 표준으로 SSA 표현입니다.[22]
- 셰이딩 [23]언어의 SSA 표현인 NIR을 통한 다양한 Mesa 드라이버.
- WebKit는 JIT [24][25]컴파일러에서 SSA를 사용합니다.
- Swift는 LLVM IR 위에 SIL(Swift Intermediate Language)[26][27]이라고 불리는 자체 SSA 형식을 정의합니다.
- Erlang은 OTP 22.0의 컴파일러를 "Static Single Assignment(SSA)에 기반한 중간 표현을 내부적으로 사용한다."로 고쳐 썼습니다.향후 [28]릴리즈에서는 SSA를 기반으로 한 추가 최적화를 계획하고 있습니다.
레퍼런스
메모들
- ^ Barry Rosen; Mark N. Wegman; F. Kenneth Zadeck (1988). "Global value numbers and redundant computations" (PDF). Proceedings of the 15th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages.
- ^ Cytron, Ron; Ferrante, Jeanne; Rosen, Barry K.; Wegman, Mark N. & Zadeck, F. Kenneth (1991). "Efficiently computing static single assignment form and the control dependence graph" (PDF). ACM Transactions on Programming Languages and Systems. 13 (4): 451–490. CiteSeerX 10.1.1.100.6361. doi:10.1145/115372.115320. S2CID 13243943.
- ^ Kelsey, Richard A. (1995). "A Correspondence between Continuation Passing Style and Static Single Assignment Form" (PDF). Papers from the 1995 ACM SIGPLAN Workshop on Intermediate Representations: 13–22. doi:10.1145/202529.202532. ISBN 0897917545. S2CID 6207179.
- ^ 값 범위 전파
- ^ 프랑스 Autrans, SSA'09 세미나에서 SSA의 역사에 관한 프레젠테이션, Zadek, F. Kenneth의 43페이지 ["II-Functions-Functions and the Name"]를 참조한다.
- ^ Cytron, Ron; Ferrante, Jeanne; Rosen, Barry K.; Wegman, Mark N.; Zadeck, F. Kenneth (1 October 1991). "Efficiently computing static single assignment form and the control dependence graph". ACM Transactions on Programming Languages and Systems. 13 (4): 451–490. doi:10.1145/115372.115320. S2CID 13243943.
- ^ Cooper, Keith D.; Harvey, Timothy J.; Kennedy, Ken (2001). "A Simple, Fast Dominance Algorithm" (PDF). Archived from the original (PDF) on 2022-03-26.
{{cite journal}}
:Cite 저널 요구 사항journal=
(도움말) - ^ Briggs, Preston; Cooper, Keith D.; Harvey, Timothy J.; Simpson, L. Taylor (1998). "Practical Improvements to the Construction and Destruction of Static Single Assignment Form" (PDF). Archived from the original (PDF) on 2010-06-07.
{{cite journal}}
:Cite 저널 요구 사항journal=
(도움말) - ^ "Block Arguments vs PHI nodes - MLIR Rationale". mlir.llvm.org. Retrieved 4 March 2022.
- ^ von Ronne, Jeffery; Ning Wang; Michael Franz (2004). "Interpreting programs in static single assignment form". Proceedings of the 2004 workshop on Interpreters, virtual machines and emulators - IVME '04. p. 23. doi:10.1145/1059579.1059585. ISBN 1581139098. S2CID 451410.
- ^ Boissinot, Benoit; Darte, Alain; Rastello, Fabrice; Dinechin, Benoît Dupont de; Guillon, Christophe (2008). "Revisiting Out-of-SSA Translation for Correctness, Code Quality, and Efficiency". HAL-Inria Cs.DS: 14.
- ^ "The Java HotSpot Performance Engine Architecture". Oracle Corporation.
- ^ "Introducing a new, advanced Visual C++ code optimizer". 4 May 2016.
- ^ "Illinois Concert Project".
- ^ "IonMonkey Overview".,
- ^ "Bytecode Optimizations". the LuaJIT project.
- ^ "HipHop Intermediate Representation (HHIR)". GitHub. 30 October 2021.
- ^ Ananian, C. Scott; Rinard, Martin (1999). "Static Single Information Form". CiteSeerX 10.1.1.1.9976.
{{cite journal}}
:Cite 저널 요구 사항journal=
(도움말) - ^ Encyclopedia of Parallel Computing.
- ^ "Go 1.7 Release Notes - The Go Programming Language". golang.org. Retrieved 2016-08-17.
- ^ "Go 1.8 Release Notes - The Go Programming Language". golang.org. Retrieved 2017-02-17.
- ^ "SPIR-V spec" (PDF).
- ^ Ekstrand, Jason. "Reintroducing NIR, a new IR for mesa".
- ^ "Introducing the WebKit FTL JIT". 13 May 2014.
- ^ "Introducing the B3 JIT Compiler". 15 February 2016.
- ^ "Swift Intermediate Language (GitHub)". GitHub. 30 October 2021.
- ^ "Swift's High-Level IR: A Case Study of Complementing LLVM IR with Language-Specific Optimization, LLVM Developers Meetup 10/2015". YouTube. Archived from the original on 2021-12-21.
- ^ "OTP 22.0 Release Notes".
일반 참고 자료
- Appel, Andrew W. (1999). Modern Compiler Implementation in ML. Cambridge University Press. ISBN 978-0-521-58274-2. Java(ISBN 0-521-82060-X, 2002) 및 C(ISBN 0-521-60765-5, 1998) 버전에서도 사용 가능합니다.
- Cooper, Keith D. & Torczon, Linda (2003). Engineering a Compiler. Morgan Kaufmann. ISBN 978-1-55860-698-2.
- Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. Morgan Kaufmann. ISBN 978-1-55860-320-2.
- Kelsey, Richard A. (March 1995). "A Correspondence between Continuation Passing Style and Static Single Assignment Form". ACM SIGPLAN Notices. 30 (3): 13–22. doi:10.1145/202530.202532.
- Appel, Andrew W. (April 1998). "SSA is Functional Programming". ACM SIGPLAN Notices. 33 (4): 17–20. doi:10.1145/278283.278285. S2CID 207227209.
- Pop, Sebastian (2006). "The SSA Representation Framework: Semantics, Analyses and GCC Implementation" (PDF).
{{cite journal}}
:Cite 저널 요구 사항journal=
(도움말) - Matthias Braun; Sebastian Buchwald; Sebastian Hack; Roland Leißa; Christoph Mallon; Andreas Zwinkau (2013), "Simple and Efficient Construction of Static Single Assignment Form", Compiler Construction, Lecture Notes in Computer Science, vol. 7791, Springer Berlin Heidelberg, pp. 102–122, doi:10.1007/978-3-642-37051-9_6, ISBN 978-3-642-37050-2, retrieved 24 March 2013
외부 링크
- 보스처, 스티븐, 그리고 디에고 노빌로.GCC는 새로운 Optimizer Framework를 도입했습니다.GCC의 SSA 사용 및 오래된 IR에 비해 어떻게 개선되는지에 대한 기사입니다.
- SSA 서지 목록.SSA 연구 논문의 광범위한 카탈로그.
- 자덱, F. 케네스「고정적인 단일 할당 양식의 개발」, 2007년 12월, SSA의 기원에 대해 설명합니다.
- VV.AA. "SSA 기반 컴파일러 설계" (2014년)