saqut-compiler/TODO.md

7.7 KiB
Raw Permalink Blame History

TODO — Teknik Borçlar ve Ertelenen Kararlar

Bu dosya, kasıtlı olarak ertelenen teknik kararları ve ileride ele alınması gereken tasarım noktalarını tutar. Her giriş hangi issue'ya bağlı olduğunu belirtir.


TAMAMLANDI — GC-hazır nesne modeli + array runtime (2026-06-20)

ADR-020…024 (değer/referans semantiği, null güvenliği, mark-sweep GC, eşitlik) doğrultusunda uçtan uca array çalışıyor:

  • src/vm/object.hpp — Object, ArrayObject, Heap (v1: toplama yok, GC-hazır header)
  • src/vm/value.hpp — ValueKind::Ref + Null eklendi (dil anahtar sözcüğü null, nil DEĞİL)
  • src/ir/instruction.hpp — ARRAY_NEW/GET/SET/LEN eklendi
  • Array literal parser ([1,2,3]), int[] tip sözdizimi (Java/C# stili)
  • Referans semantiği, kimlik == (ADR-023), sınır kontrolü
  • Golden test: tests/golden/array/ref_semantics.sqt

TAMAMLANDI — Struct runtime + E010 revizyonu (2026-06-20)

ADR-020 doğrultusunda struct referans semantiğiyle uçtan uca çalışıyor:

  • src/vm/object.hpp — StructObject : Object, alan erişimi (GC-hazır header)
  • src/vm/value.hpp — ValueKind::Null eklendi (dil anahtar sözcüğü null)
  • E010 revizyonu: referansla tutulan struct Node { Node next; } artık meşru (döngü kurulabilir, GC v2 ile toplanacak)

TAMAMLANDI — float/double aritmetik runtime (#44) (2026-06-20)

  • src/vm/value.hpp — ValueKind::Float + floatValue alanı
  • IR opcode'ları: FADD/FSUB/FMUL/FDIV + float karşılaştırma
  • Literal bağlama-göre tipleme korundu (sabit folding dahil)

TAMAMLANDI — String cilası (ADR-024) (2026-06-20)

  • src/core/type.hppisString() yüklem yardımcısı eklendi
  • src/ir/instruction.hppSTRING_CONCAT opcode eklendi
  • src/semantic/type_checker.cpp+ string için izin (her iki taraf string → sonuç string)
  • src/ir/ir_generator.cppgenerateBinaryArithmetic string tespiti: ADDSTRING_CONCAT; += için de STRING_CONCAT
  • src/vm/interpreter.cppSTRING_CONCAT case: stringValue + stringValue
  • tests/golden/string/concat.sqt — concat, +=, içerik == golden testi
  • İçerik == / != VM'de zaten vardı (ADR-023/024); print(string) zaten çalışıyordu

TAMAMLANDI — Hata yönetimi (ADR-025, #57) (2026-06-20)

  • src/parser/ast_node.hppTryStatement, ThrowStatement ASTKind eklendi
  • src/parser/nodes/statements.hpp/.cppTryStatementNode, ThrowStatementNode
  • src/parser/parser_base.hpp + parser.cppparseTryStatement(), parseThrowStatement()
  • src/ir/instruction.hppENTER_TRY, LEAVE_TRY, THROW opcode'ları
  • src/ir/ir_generator.cpp — try/catch/throw IR üretimi
  • src/vm/interpreter.hppTryFrame struct, tryStack_, pendingThrow_, makeErrorValue()
  • src/vm/interpreter.cpp — ENTER_TRY/LEAVE_TRY/THROW VM uygulaması; runtime hataları (DIV/0, array OOB) pendingThrow_ üzerinden Error nesnesi olarak yakalanabilir hale getirildi
  • src/symbol/symbol_collector.cppError builtin struct kaydı (alan sırası: line,col,message,trace,code)
  • src/semantic/type_checker.cpp — TryStatement/ThrowStatement tip kontrolü (unchecked)
  • tests/golden/error/basic_catch.sqt — sıfıra bölme yakalama
  • tests/golden/error/throw_and_nested.sqt — iç içe fonksiyon unwind + array OOB + throw
  • Not: IR satır tablosu (stacktrace doldurma) ertelendi — trace alanı boş kalıyor

TAMAMLANDI — Null akış-analizi (ADR-021) (2026-06-20)

  • src/core/type.hppbool nullable alanı; asNullable(), asNonNull(), equalsBase(), isNullLiteral() yardımcıları; fromName("int?") desteği; toString()int?
  • src/parser/parser.cpp? suffix ayrıştırma (değişken, parametre, dönüş tipi); dispatch'te int? f()parseFunctionDecl() yönlendirmesi düzeltildi
  • src/ir/instruction.hppLOAD_NULL opcode eklendi
  • src/ir/ir_generator.cppLiteralType::BOŞLOAD_NULL
  • src/vm/interpreter.cppLOAD_NULL case → Value::null()
  • src/semantic/type_checker.hppnarrowedNonNull_ set; extractNullCheck(), alwaysExits() yardımcıları
  • src/semantic/type_checker.cpp:
    • checkAssign: T? ← null OK; T ← T? hata (E003); T? ← T OK (widening)
    • checkExpr Literal BOŞ: null sentinel tipi (Void+nullable)
    • checkExpr Identifier: narrowedNonNull_'dan non-null olduğu bilinenlerde nullable flag'i kaldırılıyor
    • checkExpr BinaryExpression: && sağ taraf narrowing; nullable operand hatası (E003)
    • checkExpr MemberAccess: nullable nesne üstünde doğrudan erişim hatası
    • checkStmt Block: guard pattern (if (a == null) return; → sonrasında a non-null)
    • checkStmt IfStatement: nested narrowing (if (a != null) → then'de non-null, if (a == null) → else'de non-null)
  • tests/golden/null/narrowing.sqt — nested + guard narrowing, int? dönüş tipi ✓
  • tests/golden/null/nullable_assign_error.sqtT? → T atama E003 ✓
  • tests/golden/null/nullable_operand_error.sqt — nullable aritmetik operand E003 ✓
  • tests/golden/null/and_narrowing.sqt&& sağ taraf narrowing ✓

🚀 SIRADAKİ İŞ

  1. mark-sweep GC v2 (#56) — en son; özellik bloklamaz, en karmaşık. Trigger basit "her N tahsiste" yeter; nesne modeli zaten GC-hazır.

ık mimari borçlar: #56 (döngüsel referans → mark-sweep GC v2), #57 (hata modeli görünürlük alt-ekseni).

⚠️ Terminoloji kilidi (Sonnet): anlaşılan isimleri değiştirme/icat etme. Dil anahtar sözcüğü null (nil değil), array literal [...] ({...} değil), hata tipi Error. İsmi belirsizse icat etme, Opus'a sor. Ayrıntı: docs/sonnet-handoff.md Bölüm 6 (terminoloji kilidi).


#modül-scope — IRFunction.moduleId: Modül-düzeyi değişken izolasyonu

Etkilenen dosyalar:

  • src/ir/instruction.hppLOAD_GLOBAL / STORE_GLOBAL yorumları
  • src/ir/ir_program.hppglobalCount, globalNames
  • src/vm/interpreter.hppglobalSlots_
  • src/vm/interpreter.cppLOAD_GLOBAL / STORE_GLOBAL case'leri

Mevcut durum (tek dosya): LOAD_GLOBAL dest, NglobalSlots_[N] — düz vektör, tek modül varsayımı. Tek dosyada bu doğru çalışır; globalSlots_[0] her zaman bu dosyanın 0. modül-değişkenidir.

Çok modüllü derlemede yapılması gereken: Her IRFunction'a std::string moduleId (veya int moduleIndex) alanı ekle. Interpreter'da globalSlots_ yerine std::unordered_map<std::string, std::vector<Value>> moduleSlots_ tut. LOAD_GLOBAL çalışırken frame.function->moduleId ile doğru modülün slot alanına bak.

// Hedef tasarım (modül sistemi gelince):
case Opcode::LOAD_GLOBAL:
    frame.slots[instr.dest] = moduleSlots_[frame.function->moduleId][instr.intValue];
    break;

Ne zaman: Modül sistemi issue'ları (#3 import sözdizimi, #4 görünürlük, #5 çoklu dosya) ele alınırken bu değişikliği de kapsama al.


#sembol-modül — Symbol.sourceModule: Sembol tablosunda açık modül kimliği

Etkilenen dosyalar:

  • src/symbol/symbol.hppSymbol struct

Mevcut durum: Symbol.definitionLoc.filePath dosya yolunu tutuyor — modül bilgisi dolaylı olarak var. Ama doğrudan moduleId / moduleName alanı yok; filtre/lookup için her seferinde definitionLoc.filePath'i ayrıştırmak gerekir.

Yapılması gereken: Symbol struct'ına std::string sourceModule alanı ekle (modül adı veya dosya yolu). Özellikle cross-module sembol çözümleme, LSP "tanıma git" ve hata mesajlarında "hangi modülden geldi" bilgisi için kritik.

Ne zaman: #3 (import sözdizimi) veya #4 (görünürlük) issue'larında.