saqut-compiler/docs/adr/ADR-008-kisa-devre-mantiksa...

2.3 KiB
Raw Blame History

ADR-008: && ve || kısa devre değerlendirmesi

Durum

Kabul edildi.

Bağlam

Mevcut kodda && ve || çalışma anında bozuk: IR üretici bu operatörler için case içermiyor, default koluna düşüp LOAD_CONST 0 üretiyor — yani değişken operandlarda her zaman false dönüyor. Yalnızca her iki operand sabit olduğunda sabit katlama doğru sonucu veriyor. (Kanıt: ir_generator.cpp:395-413, constant_folding.hpp:107-112; davranış referansı bölüm B.)

Karar

&& ve || KISA DEVRE değerlendirilir:

  • a && b: a false ise b HİÇ değerlendirilmez, sonuç false.
  • a || b: a true ise b HİÇ değerlendirilmez, sonuç true.

Bu, bu operatörlerin sıradan ikili işlem (iki tarafı hesapla sonra birleştir) DEĞİL, bir dallanma olarak üretilmesi gerektiği anlamına gelir.

IR şeması:

a && b:
  slot_a  = [a değerlendir]
  result  = freshSlot()
  LOAD_CONST result, 0        ; varsayılan: false
  JIF_FALSE slot_a → DONE     ; a false? b'yi atla, result=0 kalsın
  slot_b  = [b değerlendir]
  LOAD_SLOT result, slot_b    ; result = b'nin değeri
DONE:

a || b:
  slot_a  = [a değerlendir]
  result  = freshSlot()
  LOAD_CONST result, 1        ; varsayılan: true
  JIF_TRUE  slot_a → DONE     ; a true? b'yi atla, result=1 kalsın
  slot_b  = [b değerlendir]
  LOAD_SLOT result, slot_b    ; result = b'nin değeri
DONE:

|| için JIF_TRUE opcode'u gerekir. JIF_FALSE'un simetriği olarak instruction.hpp'e ve interpreter.cpp'e eklendi. do-while döngüsünün mevcut EQUAL_EQUAL(cond, 1) geçici çözümü bu opcode'dan faydalanabilir (ayrı düzeltme — bu ADR kapsamı dışı).

Gerekçe

  • C-ailesi dillerin (C, Go, Java, JS, C#) tamamı kısa devre yapar; hedef kitle bunu bekler.
  • Performans artısı: gereksiz sağ-taraf değerlendirmesi atlanır; kısa devre OLMAYAN versiyon her iki tarafı da her zaman hesaplayacağı için daha yavaştır.
  • Niş ile uyumlu: derleyici "şu çağrı şu durumda atlandı" diye gösterebilir.

Sonuçlar

  • Tek dezavantaj: mantıksal operatörün sağındaki yan etki koşullu çalışır. Bu kabul edilir; yan etkiyi koşula gömmek zaten kötü kalıptır.
  • Sabit katlama yolu (constant_folding.hpp) zaten doğru çalışıyordu ve değiştirilmedi; bu düzeltme yalnızca değişken-operand (IR üretim) yolunu etkiler.