EstraCode Studio è un prodotto solido e sorprendentemente maturo. Il "cuore" del programma (editor, compilatore, motore di esecuzione, Motore Turbo, gestione thread) ha superato tutti i test con prestazioni di livello enterprise. L'architettura a processo separato è reale e funzionante. Il Motore Turbo non è marketing: i benchmark dimostrano scalabilità reale (rapporto 0x su 90 query consecutive).
Le uniche criticità rilevate sono di natura cosmetica o di usabilità (messaggi di errore tecnici, debugger che parte in pausa senza avviso, Stopwatch non esposto). Nessun crash, nessun blocco irreversibile, nessun dato corrotto.
Il tasto "Interrompi" funziona anche sotto stress estremo (incluso codice multi-threading), pertanto non è necessario implementare un timeout automatico degli script. L'utente ha controllo completo.
Raccomandazione: procedere con i test sui moduli periferici (tabelle, grafici, export, coda, progetti, archivi, multi-tab) che sono tipicamente i punti deboli delle Beta.
| Modulo | Stato | Valutazione |
|---|---|---|
| 1. Editor | ✅ Testato | Completo, IntelliSense funzionante, chiusura automatica blocchi |
| 2. Compilazione/Esecuzione | ✅ Testato | Posizione errori precisa (riga/colonna), processo separato reale |
| 3. Funzioni Lotto | ✅ Testato | Abbinamenti, ruote BA_/NA_, vettori OK, 90/90 chiamate concurrenti senza errori |
| 4. Motore Turbo | ✅ Testato | ECCEZIONALE - Cache reale, rapporto 0x, 90 query in 85ms |
| 5. Output HTML | ✅ Parziale | Rendering OK, grassetto/formattazione OK, tabelle/grafici da testare |
| 6. Gestione Archivi | ⏳ Da testare | Import corrotti, verifica integrità, Televideo |
| 7. Raccolta Esempi | ✅ Parziale | Script "Abbinamenti" livello facile testato e funzionante |
| 8. Creazione Guidata | ⏳ Da testare | Wizard non ancora esplorato |
| 9. Gestione Progetti | ⏳ Da testare | Salva/carica progetto, persistenza |
| 10. Coda Elaborazioni | ⏳ Da testare | Batch multipli, output separati |
| 11. Guida Integrata | ⏳ Da testare | F1 contestuale, ricerca funzioni |
| 12. Personalizzazione/Sicurezza | ⏳ Da testare | Recovery, backup, temi, multi-tab |
Obiettivo: Verificare installazione, primo avvio, requisiti.
Risultato: Installazione pulita e veloce. Avvio immediato. Interfaccia reattiva.
Obiettivo: Testare editor, IntelliSense, compilazione, gestione errori.
Script usato: Dichiarazioni semplici e tipizzate, errore volontario su Frequenza non dichiarata.
Risultato:
BC30451 con riga/colonna esatteSystem.Diagnostics.Stopwatch non esposto nell'ambiente script (BC30451). Per misurare tempi va usato Now. Da documentare.Obiettivo: Verificare canale di output, esecuzione script, tempi.
Script usato: Primo tentativo con Console.WriteLine (fallito), poi con Scrivi() (successo).
Risultato:
Console.WriteLine NON produce output (canale non catturato)Scrivi() è la funzione ufficiale, supporta Grassetto:=TrueConsole.WriteLine produce pagina HTML bianca senza avviso. Suggerimento: mostrare messaggio "Nessun output prodotto" quando il pannello risultati è vuoto.Obiettivo: Testare validazione parametri funzioni Lotto.
Test eseguiti:
spia = 91 → ArgumentOutOfRangeException: La spia deve essere un numero da 1 a 90 ✅inizio = 10000, fine = 5000 → ArgumentOutOfRangeException: Argomento non compreso nell'intervallo ✅LottoLab.Core.LottoFunctions.A). Funzionalmente corretti, ma intimidatori per utenti non tecnici. Suggerimento: mostrare messaggio user-friendly con stack trace espandibile.Obiettivo: Verificare stabilità sotto carico pesante.
Script usato: 50M iterazioni, 10M array, 90 Abbinamenti, 2000 righe HTML.
| Test | Tempo | Note |
|---|---|---|
| 50M iterazioni CPU | 0,08 s | JIT ottimizzato |
| 10M allocazioni | 0,04 s | Gestione memoria efficiente |
| 90 chiamate Lotto | 0,21 s | ~2,3ms per chiamata |
| 2000 righe HTML | 0,02 s | Output bufferizzato |
| Totale | 0,36 s | Prestazioni eccellenti |
Obiettivo: Verificare che il tasto Stop funzioni (feature dichiarata come "processo separato").
Script usato: Ciclo infinito con flag di uscita.
Risultato: Messaggio "Esecuzione interrotta dall'utente". Editor rimasto utilizzabile. Architettura a processo separato confermata.
Obiettivo: Verificare debugger integrato (breakpoint, step, variabili).
Script usato: Ciclo For semplice con breakpoint su riga di accumulo.
Risultato:
Obiettivo: Testare script complesso con più ruote, Try/Catch, output formattato.
Script usato: Analisi numero 12 su Bari e Napoli con ASCII art e gestione errori.
Risultato:
BA_() e NA_() entrambe funzionantiObiettivo: Mettere sotto stress CPU, memoria e I/O simultaneamente.
Script usato: Moltiplicazione matrici 300x300 (27M operazioni), 90 Abbinamenti con Bubble Sort, 5000 righe I/O.
Risultato:
Obiettivo: Verificare scientificamente se il "Motore Turbo" è reale o marketing.
Script usato: 3 trappole - Cache diretta, Cache condivisa (90 numeri su 8000 estrazioni), Stress memoria (200.000 righe).
| Metrica | Valore | Interpretazione |
|---|---|---|
| 1a query (1 numero, 8000 estr.) | 186,44 ms | Prima scansione archivio |
| 2a query IDENTICA | 1,03 ms | Cache diretta: -99,4% |
| 90 query diverse (stesso intervallo) | 85,54 ms | MENO della singola query! |
| Rapporto scalabilità | 0x | Riutilizzo scansione archivio |
| 200.000 righe StringBuilder | 142 ms / 5,59 MB | Gestione memoria ottimale |
| Tempo totale | 0,42 s |
Obiettivo: Testare renderer HTML, Reflection, GC, parallelismo, interruzione.
Script usato: 5000 nodi HTML, 500k oggetti Reflection, 4005 chiamate concurrenti, ciclo infinito parallelo.
| Fase | Test | Tempo | Verdetto |
|---|---|---|---|
| 1 | 5000 nodi HTML complessi | 83 ms | Renderer asincrono/virtualizzato |
| 2 | 500k Reflection + GC forzato | 547 ms | Motore scripting ottimizzato |
| 3 | 4005 chiamate concurrenti | 548 ms | GiochiLib thread-safe |
| 4 | Interruzione Parallel.For | Istantanea | Stop funzionante su multi-thread |
| TOTALE | 2,28 s | ECCEZIONALE |
Obiettivo: Attaccare i limiti del runtime .NET single-threaded (sandbox non espone Parallel/Thread).
Script usato: Fibonacci ricorsivo, StringBuilder 200MB, Regex catastrophic backtracking, Dictionary 10M, Lotto 10000 concorsi, Stringhe 10MB.
| Fase | Test | Tempo | Note |
|---|---|---|---|
| 1 | Fibonacci(35) ricorsivo | 68 ms | 102M chiamate, JIT perfetto |
| 2 | StringBuilder 200 MB | 2.587 ms | GC gestisce allocazioni massive |
| 3 | Regex catastrophic backtracking | 358.304 ms | ⚠️ 6 minuti! UI congelata |
| 4 | Dictionary 10M elementi | 4.700 ms | Hash table massiva OK |
| 5 | Lotto 10000 concorsi (90 num.) | 337 ms | Motore Turbo confermato |
| 6 | Stringhe 10 MB (Split/Replace) | 215 ms | Operazioni stringa OK |
| TOTALE | 366,22 s | ⚠️ Dominato dalla Regex |
(a+)+b su input aaa...c (29 'a' + 'c') ha bloccato l'esecuzione per 358 secondi (Catastrophic Backtracking). Poiché l'ambiente gira single-thread, l'interfaccia si è congelata. Soluzione suggerita: implementare CancellationToken con timeout massimo (30-60s) per gli script utente, terminandoli forzatamente con errore "Script interrotto per timeout".Testato il 16/10/2026. Durata: 2,28 secondi. Risultato: ECCEZIONALE.
Testato il 16/10/2026. Durata: 366,22 secondi (dominato da Regex). Risultato: STABILE.
L'ambiente di scripting non espone System.Threading.Tasks.Parallel, Thread, Task, CancellationToken, Interlocked. Questo è un segno di maturità: l'autore ha deliberatamente limitato il sandbox per impedire deadlock, race condition e saturazione CPU incontrollata. Gli script girano in modalità single-thread controllata.
| # | Modulo | Descrizione | Gravità | Stato | Soluzione Suggerita |
|---|---|---|---|---|---|
| 1 | Documentazione | Presentazione dichiara distribuzione ZIP, ricevuto installer .exe | Media | Da correggere | Aggiornare presentazione o distribuzione |
| 2 | Ambiente script | System.Diagnostics.Stopwatch non esposto (BC30451) |
Bassa | Da documentare | Documentare alternativa con Now |
| 3 | Output | Console.WriteLine non produce output, pagina HTML bianca senza avviso |
Bassa | Suggerimento UX | Mostrare messaggio "Nessun output prodotto" |
| 4 | Gestione errori | Stack trace .NET grezzo mostrato all'utente (intimidatorio) | Bassa | Suggerimento UX | Messaggio user-friendly + stack trace espandibile |
| 5 | Debug | Debugger parte in pausa senza avviso visibile | Media | Suggerimento UX | Mostrare banner "DEBUG in pausa - premi F5" |
| 6 | Sandbox script | System.Threading.Tasks.Parallel non esposto (BC30451) |
Media | Da documentare | Documentare limiti sandbox nella guida |
| 7 | Regex engine | Catastrophic backtracking blocca UI per minuti | Alta | Da risolvere | Timeout automatico o CancellationToken |
Nota: Nessun finding di gravità critica (crash irreversibile, data corruption). I finding 1-6 sono di natura cosmetica o di usabilità. Il finding 7 è l'unico tecnicamente rilevante ma mitigabile con il tasto Stop (sempre funzionante).
Sub Main()
Scrivi("Test 1 - output semplice")
Scrivi("Test 2 - output grassetto", Grassetto:=True)
Dim somma As Integer = 0
For i As Integer = 1 To 10
somma = somma + i
Next
Scrivi("Somma = " & somma)
Scrivi("Estrazioni in archivio: " & EstrazioniArchivio())
End Sub
Sub Main()
Scrivi("Abbinamenti - Prova pratica", Grassetto:=True)
Dim spia = 12
Dim fine = EstrazioniArchivio(), inizio = Math.Max(1, fine - 199)
Dim risultati = Nothing
Abbinamenti(spia, risultati, inizio, fine, BA_())
For riga = 1 To risultati.GetUpperBound(0)
If risultati(riga, 2) = 0 Then Exit For
Scrivi(FormattaStringa(risultati(riga, 1), "00") & " : " & risultati(riga, 2))
Next
End Sub
Sub Main()
Dim t0 = Now
Dim acc As Double = 0
For i As Long = 1 To 50000000
acc = acc + Math.Sqrt(i)
Next
Dim v(9999999) As Integer
For i = 0 To 9999999 : v(i) = CInt(i Mod 90) + 1 : Next
Dim fine = EstrazioniArchivio(), inizio = Math.Max(1, fine - 999)
For n = 1 To 90
Dim ris = Nothing
Abbinamenti(n, ris, inizio, fine, BA_())
Next
For i = 1 To 2000 : Scrivi("Riga " & i) : Next
Scrivi("Totale: " & (Now - t0).TotalSeconds & " s")
End Sub
Sub Main()
Dim spia = 12, fine = EstrazioniArchivio(), inizio = Math.Max(1, fine - 199)
Dim rBA = Nothing
Abbinamenti(spia, rBA, inizio, fine, BA_())
For riga = 1 To rBA.GetUpperBound(0)
If rBA(riga, 2) = 0 Then Exit For
Scrivi(FormattaStringa(rBA(riga, 1), "00") & " : " & rBA(riga, 2))
Next
Dim rNA = Nothing
Abbinamenti(spia, rNA, inizio, fine, NA_())
' ... (stesso ciclo per Napoli)
End Sub
Sub Main()
' Matrice 300x300 (27M operazioni)
Dim size = 300
Dim A(size-1, size-1) As Double, B(size-1, size-1) As Double, C(size-1, size-1) As Double
For i = 0 To size-1
For j = 0 To size-1
A(i,j) = Math.Sin(i*j) : B(i,j) = Math.Cos(i+j)
Next
Next
For i = 0 To size-1
For j = 0 To size-1
Dim sum As Double = 0
For k = 0 To size-1 : sum += A(i,k) * B(k,j) : Next
C(i,j) = sum
Next
Next
' 90 Abbinamenti + Bubble Sort + 5000 righe I/O
End Sub
Sub Main()
Dim fine = EstrazioniArchivio(), inizio = Math.Max(1, fine - 8000)
' TRAPPOLA 1: Cache diretta
Dim t1 = Now, r1 = Nothing
Abbinamenti(12, r1, inizio, fine, BA_())
Dim ms1 = (Now - t1).TotalMilliseconds
Dim t2 = Now, r2 = Nothing
Abbinamenti(12, r2, inizio, fine, BA_())
Dim ms2 = (Now - t2).TotalMilliseconds
' TRAPPOLA 2: Cache condivisa (90 numeri)
Dim t3 = Now
For n = 1 To 90
Dim r = Nothing
Abbinamenti(n, r, inizio, fine, BA_())
Next
Dim ms3 = (Now - t3).TotalMilliseconds
' TRAPPOLA 3: 200.000 righe StringBuilder
Dim sb As New System.Text.StringBuilder()
For i = 1 To 200000 : sb.AppendLine("Dato_" & i) : Next
End Sub
Imports System.Reflection
Imports System.Threading.Tasks
Sub Main()
' FASE 1: 5000 nodi HTML complessi
For i = 1 To 5000
Dim colore = "#" & (i * 12345).ToString("X6").Substring(0, 6)
Dim html = "<div style='background-color:" & colore & ";'>Elemento " & i & "</div>"
Scrivi(html)
Next
' FASE 2: 500k oggetti Reflection + GC
Dim tipoMath As Type = GetType(System.Math)
Dim lista As New List(Of Object)()
For i = 1 To 500000
Dim risultato = tipoMath.InvokeMember("Sqrt", BindingFlags.InvokeMethod, Nothing, Nothing, {CDbl(i)})
lista.Add(New With {.Id = i, .Val = risultato})
If i Mod 50000 = 0 Then lista.Clear() : GC.Collect() : GC.WaitForPendingFinalizers()
Next
' FASE 3: 4005 chiamate concurrenti
Parallel.For(0, 4005, Sub(idx)
Dim r = Nothing
Abbinamenti(idx + 1, r, inizio, fine, BA_())
End Sub)
' FASE 4: Ciclo infinito parallelo (test Stop)
Parallel.For(0, 1000000000, Sub(i, state)
Dim x = Math.Sin(i) * Math.Cos(i)
End Sub)
End Sub
Sub Main()
' FASE 1: Fibonacci ricorsivo
Dim risultato = Fibonacci(35)
' FASE 2: StringBuilder 200 MB
Dim sb As New System.Text.StringBuilder()
For i = 1 To 200000000 : sb.Append("X") : Next
' FASE 3: Regex catastrophic backtracking
Dim regex = New System.Text.RegularExpressions.Regex("(a+)+b")
Dim match = regex.Match("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaac")
' FASE 4: Dictionary 10M elementi
Dim dict As New Dictionary(Of String, Integer)()
For i = 1 To 10000000 : dict.Add("key_" & i, i) : Next
' FASE 5: Lotto 10000 concorsi
For n = 1 To 90
Dim r = Nothing
Abbinamenti(n, r, inizio, fine, BA_())
Next
' FASE 6: Stringhe 10 MB
Dim str As String = New String("a"c, 10000000)
Dim parti = str.Split(New Char() {"a"c})
End Sub
Function Fibonacci(n As Integer) As Long
If n <= 1 Then Return n
Return Fibonacci(n - 1) + Fibonacci(n - 2)
End Function
Sub Main()
Dim risultato As Integer = 0
For i As Integer = 1 To 10
risultato = risultato + i ' ← breakpoint qui
Next
Scrivi("Somma da 1 a 10 = " & risultato)
End Sub
Sub Main()
Dim i As Integer = 0
While True
i = i + 1
If i Mod 1000000 = 0 Then
Scrivi("Iterazione " & i)
End If
End While
End Sub
Abbinamenti, premere F1, verificare apertura pagina corretta.