7.7 KiB
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,nilDEĞİ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.hpp—isString()yüklem yardımcısı eklendisrc/ir/instruction.hpp—STRING_CONCATopcode eklendisrc/semantic/type_checker.cpp—+string için izin (her iki tarafstring→ sonuçstring)src/ir/ir_generator.cpp—generateBinaryArithmeticstring tespiti:ADD→STRING_CONCAT;+=için deSTRING_CONCATsrc/vm/interpreter.cpp—STRING_CONCATcase:stringValue + stringValuetests/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.hpp—TryStatement,ThrowStatementASTKind eklendisrc/parser/nodes/statements.hpp/.cpp—TryStatementNode,ThrowStatementNodesrc/parser/parser_base.hpp+parser.cpp—parseTryStatement(),parseThrowStatement()src/ir/instruction.hpp—ENTER_TRY,LEAVE_TRY,THROWopcode'larısrc/ir/ir_generator.cpp— try/catch/throw IR üretimisrc/vm/interpreter.hpp—TryFramestruct,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 getirildisrc/symbol/symbol_collector.cpp—Errorbuiltin 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 yakalamatests/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.hpp—bool nullablealanı;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'teint? f()→parseFunctionDecl()yönlendirmesi düzeltildisrc/ir/instruction.hpp—LOAD_NULLopcode eklendisrc/ir/ir_generator.cpp—LiteralType::BOŞ→LOAD_NULLsrc/vm/interpreter.cpp—LOAD_NULLcase →Value::null()src/semantic/type_checker.hpp—narrowedNonNull_set;extractNullCheck(),alwaysExits()yardımcılarısrc/semantic/type_checker.cpp:checkAssign:T? ← nullOK;T ← T?hata (E003);T? ← TOK (widening)checkExpr Literal BOŞ: null sentinel tipi (Void+nullable)checkExpr Identifier:narrowedNonNull_'dan non-null olduğu bilinenlerde nullable flag'i kaldırılıyorcheckExpr 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ındaanon-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.sqt—T? → Tatama E003 ✓tests/golden/null/nullable_operand_error.sqt— nullable aritmetik operand E003 ✓tests/golden/null/and_narrowing.sqt—&&sağ taraf narrowing ✓
🚀 SIRADAKİ İŞ
- mark-sweep GC v2 (#56) — en son; özellik bloklamaz, en karmaşık. Trigger basit "her N tahsiste" yeter; nesne modeli zaten GC-hazır.
Açı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(nildeğil), array literal[...]({...}değil), hata tipiError. İsmi belirsizse icat etme, Opus'a sor. Ayrıntı:docs/sonnet-handoff.mdBölüm 6 (terminoloji kilidi).
#modül-scope — IRFunction.moduleId: Modül-düzeyi değişken izolasyonu
Etkilenen dosyalar:
src/ir/instruction.hpp—LOAD_GLOBAL/STORE_GLOBALyorumlarısrc/ir/ir_program.hpp—globalCount,globalNamessrc/vm/interpreter.hpp—globalSlots_src/vm/interpreter.cpp—LOAD_GLOBAL/STORE_GLOBALcase'leri
Mevcut durum (tek dosya):
LOAD_GLOBAL dest, N → globalSlots_[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.hpp—Symbolstruct
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.