Section 3/161 menit

3. Teori: Isolation Domains dan Invariants Compiler

3. Teori: Isolation Domains dan Invariants Compiler

Model Mental Isolation

Swift Concurrency membagi eksekusi ke dalam isolation domains — konteks eksekusi eksklusif yang tidak bisa diakses bersamaan oleh lebih dari satu task.

swift
Isolation Domains dalam satu aplikasi:

┌─────────────────────────┐
 MainActor Domain           Satu-satunya — berjalan di main thread
 (UIKit, SwiftUI update) 
└─────────────────────────┘

┌──────────────┐  ┌──────────────┐  ┌──────────────┐
 Actor A         Actor B         Actor C         Masing-masing eksklusif
 (satu task      (satu task      (satu task   
  pada satu       pada satu       pada satu   
  waktu)          waktu)          waktu)      
└──────────────┘  └──────────────┘  └──────────────┘

┌─────────────────────────────────────────────────────┐
 Nonisolated Domain (Cooperative Thread Pool)           Bisa paralel
 Task.detached, async let tanpa actor                
└─────────────────────────────────────────────────────┘

Tiga Invariant yang Dijaga Compiler

swift
1. MUTUAL EXCLUSION:
   Pada satu waktu, hanya satu task yang bisa menjalankan kode
   dalam isolation domain yang sama.

2. SENDABLE BOUNDARY:
   Nilai yang melewati batas isolation domain harus Sendable
   (atau dibuktikan aman oleh region analysis).

3. AWAIT = SUSPENSION POINT:
   Setiap `await` adalah titik di mana actor bisa menjalankan
   task lain. State setelah `await` bisa berbeda dari sebelumnya.

Bagaimana Compiler Memeriksa Isolation

Compiler Swift 6 melakukan analisis dua tahap:

Tahap 1 — Static isolation checking: Di compile time, compiler memeriksa setiap akses ke mutable state memiliki isolation yang sesuai.

Tahap 2 — Region analysis: Untuk setiap nilai non-Sendable yang melewati batas isolation, compiler memeriksa apakah nilai itu masih bisa diakses dari region asalnya.

swift
// Compiler memeriksa setiap akses mutable state
class State {           // Non-Sendable
    var value = 0
}

@MainActor
func update(state: State) {
    state.value = 1     // ✓ — kita di @MainActor, boleh akses
}

func background(state: State) async {
    state.value = 2     // ❌ — nonisolated, tapi State bukan Sendable
                        //      Compiler: potential data race
}