CodeBlanks Logo Icon CodeBlanks

SSA

Static Single Assignment ara temsilini öğrenirsin.

SSA

SSA (Static Single Assignment), her değişkenin yalnızca bir kez atandığı ara gösterimdir. x = 1; x = x + 2 kodu x1 = 1; x2 = x1 + 2 olur. Bu biçim derleyicinin şu optimizasyonları kolayca yapmasını sağlar:

  • Sabit katlama: 2 * 3 → 6
  • Ölü kod silme: hiç kullanılmayan hesaplar atılır
  • Sınır denetimi silme (BCE): kanıtlanabilen dilim erişimlerinde kontrol kaldırılır

BCE ipucu

Döngüden önce en büyük dizine bir kez erişmek, derleyiciye sonraki erişimlerin güvenli olduğunu kanıtlatır:

func topla4(b []byte) int {
    _ = b[3]  // tek kontrol burada
    return int(b[0]) + int(b[1]) + int(b[2]) + int(b[3])
}

go build -gcflags="-d=ssa/check_bce" kalan sınır denetimlerini satır satır gösterir. GOSSAFUNC=topla4 go build ise her SSA aşamasını HTML olarak çizer.

Uygulama BCE dostu fonksiyon

oku32(b []byte) uint32 yaz: önce _ = b[3], sonra dört baytı küçük uçlu (little-endian) birleştir: uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24. oku32([]byte{1, 0, 0, 0}) sonucunu yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

func oku32(b []byte) uint32 {
    _ = b[3]
    return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
}

func main() {
    fmt.Println(oku32([]byte{1, 0, 0, 0}))
}

Beklenen çıktı

1

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Sınır denetimi silme (BCE) neyi kaldırır?

  • Kullanılmayan importları
  • Yorum satırlarını
  • Güvenli olduğu kanıtlanan dizin erişimlerindeki panic kontrolünü Doğru cevap
  • Tüm hata kontrollerini

Açıklama: Her s[i] erişimi normalde i < len(s) kontrolü içerir; derleyici bunun her zaman doğru olduğunu kanıtlarsa kontrolü siler.

2 Sınır ipucu

Soru
func f(b []byte) byte {
    _ = b[____]
    return b[0] ^ b[1] ^ b[2] ^ b[7]
}
Cevap
func f(b []byte) byte {
    _ = b[7]
    return b[0] ^ b[1] ^ b[2] ^ b[7]
}

Açıklama: En büyük kullanılan dizine (7) erişmek, diğer dizinlerin de güvenli olduğunu kanıtlar.

3 Optimizasyon

Kavram Anlamı
Sabit katlama 2*3 → 6
Ölü kod silme Kullanılmayan hesap atılır
BCE Dizin kontrolü silinir
GOSSAFUNC SSA aşamalarını gösterir

Uzman bölümündeki tüm dersler