feat(charka): charka-shadow — validador en sombra + corpus COBOL
El pipeline COBOL->Rust queda completo (7 crates) y validado de punta a punta. charka-shadow certifica que el transpilador preserva la semántica del COBOL original con una ejecución sombra: un intérprete que corre el Ir directamente sobre charka-runtime, sin compilar nada. Es una segunda ruta de ejecución, independiente del código que emite charka-codegen — si la sombra y el transpilado divergieran, sería un bug. - interpret(&Ir) -> Outcome ejecuta el IR y captura las líneas de DISPLAY; run_source(&str) corre el pipeline completo. - Tope de pasos (Halt::StepLimit): un bucle que no termina se corta en vez de colgarse. - Módulos: field (datos -> campos vivos) / interp (el motor). Corpus nuevo crates/modules/charka/corpus/ — 7 programas COBOL de complejidad graduada (01-hola .. 07-clasificar) con sus salidas esperadas verificadas a mano: DISPLAY, aritmética con GIVING, IF/ELSE, PERFORM TIMES/UNTIL, grupos, COMPUTE con paréntesis, ROUNDED, IF anidado con AND. Material de prueba del pipeline entero. 11 tests (los 7 del corpus + fuente vacío, STOP RUN, tope de pasos, error de léxico); fmt + clippy limpios. No hay GnuCOBOL en la máquina: la referencia v1 es el corpus; un modo futuro diferenciará contra el compilador real. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@ embebido, dialectos IBM Enterprise) es un esfuerzo multi-mes.
|
||||
| `charka-ir` | lib | Representación intermedia: el AST con los statements del PROCEDURE ya tipados |
|
||||
| `charka-runtime` | lib | Soporte de ejecución de los programas transpilados: campos `Num` y `Text` |
|
||||
| `charka-codegen` | lib | Emisión de Rust: IR → fuente Rust sobre `charka-runtime` |
|
||||
| `charka-shadow` | lib | Validador en sombra: intérprete del IR + corpus de prueba |
|
||||
|
||||
## charka-bcd
|
||||
|
||||
@@ -136,15 +137,36 @@ del programa COBOL.
|
||||
- Fuera de alcance v1: grupos como campo propio, `REDEFINES`,
|
||||
`OCCURS`/tablas, `PERFORM ... THRU` como rango, E/S de ficheros.
|
||||
|
||||
## charka-shadow
|
||||
|
||||
El validador: certifica que el pipeline preserva la semántica del
|
||||
COBOL original. Lo hace con una **ejecución sombra** — un intérprete
|
||||
que corre el `Ir` directamente sobre `charka-runtime`, sin compilar.
|
||||
|
||||
- `interpret(&Ir) -> Outcome` — ejecuta el IR y captura las líneas de
|
||||
`DISPLAY`. `run_source(&str)` corre el pipeline completo.
|
||||
- El intérprete es una segunda ruta de ejecución, independiente del
|
||||
código que emite `charka-codegen`: si la sombra y el transpilado
|
||||
divergieran, eso delataría un bug.
|
||||
- Tope de pasos: un bucle que no termina se corta con
|
||||
`Halt::StepLimit` en vez de colgarse.
|
||||
- La referencia v1 es el **corpus** (`corpus/`): 7 programas COBOL de
|
||||
complejidad graduada con sus salidas esperadas verificadas a mano.
|
||||
Un modo futuro, con GnuCOBOL, diferenciará contra el compilador real.
|
||||
|
||||
## El corpus
|
||||
|
||||
`crates/modules/charka/corpus/` — 7 programas COBOL graduados
|
||||
(`01-hola` … `07-clasificar`), cada uno con su `.expected`. Ejercita
|
||||
el pipeline completo de punta a punta. Ver su `README.md`.
|
||||
|
||||
## Estado
|
||||
|
||||
`charka-bcd` (22 tests), `charka-lexer` (17 tests), `charka-parser`
|
||||
(15 tests), `charka-ir` (17 tests), `charka-runtime` (17 tests) y
|
||||
`charka-codegen` (14 tests) implementados y verdes. El pipeline
|
||||
COBOL→Rust corre de punta a punta. **Pendiente** — el último crate:
|
||||
Pipeline **completo** — `charka-bcd` (22 tests), `charka-lexer` (17),
|
||||
`charka-parser` (15), `charka-ir` (17), `charka-runtime` (17),
|
||||
`charka-codegen` (14) y `charka-shadow` (11) implementados y verdes.
|
||||
COBOL → Rust corre de punta a punta, validado contra el corpus.
|
||||
|
||||
| crate pendiente | rol |
|
||||
| ----------------- | ---------------------------------------------------- |
|
||||
| `charka-shadow` | validador en sombra (original vs transpilado) |
|
||||
|
||||
Hito intermedio sugerido: subconjunto COBOL'85 puro antes de CICS/SQL.
|
||||
Próximo hito mayor: salir del subconjunto COBOL'85 puro hacia CICS,
|
||||
SQL embebido y los dialectos IBM Enterprise; ampliar el codegen
|
||||
(grupos, `REDEFINES`, `OCCURS`/tablas, E/S de ficheros).
|
||||
|
||||
Reference in New Issue
Block a user