PDA

Ver la Versión Completa : Conformidad NIST COBOL-85: 242 a 332 (1.62.15)


Eslopes
27 de agosto de 2026, 09:02
Conformidad NIST COBOL-85: de 242 a 332 de 434 programas

Esta entrega corrige una serie de construcciones del estandar COBOL-85 que
PowerRustCOBOL rechazaba o interpretaba mal. Todas son deuda tecnica: cosas que
ya deberian haber funcionado.

La medida es el conjunto oficial de validacion NIST CCVS85 (459 programas).
Cada cambio se midio por separado, uno a uno.

1. La coma y el punto y coma son puntuacion, no un error

COBOL-85 define la coma y el punto y coma seguidos de un espacio como
separadores: pueden aparecer donde quepa un espacio y significan
exactamente lo mismo que un espacio. Ninguno de estos ejemplos se aceptaba:


MOVE ZERO TO DN3, DN4.
CALL "SUB" USING TABLE-01, TABLE-02, DN3.
PROCEDURE DIVISION USING TABLE-1, TABLE-2, DN1.
READ SQ-FS1 ; AT END GO TO READ-EOF.
01 WRK-AN-X-18-1, REDEFINES WRK-XN-18-1 PIC A(18).


Lo que sigue llevando coma, porque una coma sin espacio detras nunca es
un separador: la coma decimal (1,5 con DECIMAL-POINT IS COMMA) y la coma de
edicion de una PICTURE (PIC ZZ,ZZ9.99).

2. Subindices separados por espacios

El unico separador que COBOL-85 exige entre subindices es el espacio.
Estas dos lineas son la misma referencia y solo se aceptaba la segunda:


MOVE 1 TO CELL (1 2).
MOVE 1 TO CELL (1, 2).


Ademas, el subindice puede ir detras del nombre cualificado completo,
que es el orden que especifica el estandar. Esto no se aceptaba de ninguna de
las dos formas:


MOVE W-3 TO CELL OF COLS OF ROWS (IDX-A IDX-B).


3. Una comilla duplicada dentro de un literal

COBOL-85 no tiene barra invertida: el delimitador de un literal se escapa
escribiendolo dos veces. El analizador lexico no lo decodificaba, asi
que 'IT''S' se convertia en dos literales distintos, en silencio.


DISPLAY 'IT''S WORKING'.


4. Una tabla entera como argumento de una funcion

COBOL-85 permite pasar una tabla completa a las funciones estadisticas
subindicandola con la palabra reservada ALL:


01 READINGS.
05 SAMPLE PIC 9(4) OCCURS 5 TIMES.
COMPUTE WS-PEAK = FUNCTION MAX(SAMPLE(ALL)).
COMPUTE WS-AVG = FUNCTION MEAN(SAMPLE(ALL)).


Funciona con MAX, MIN, SUM, MEAN, MEDIAN, MIDRANGE, RANGE, VARIANCE,
STANDARD-DEVIATION, ORD-MAX y ORD-MIN. ALL puede ocupar una dimension de una
tabla multidimensional con subindices normales en las demas.

5. MOVE ALL "X" no llenaba el campo

ALL es la unica constante figurativa cuyo caracter de relleno tiene mas de un
byte, por eso SPACES y ZEROS nunca mostraron el fallo. El literal se escribia
una sola vez y el resto del campo quedaba en blanco.


01 WS-BAR PIC X(10).
MOVE ALL "-" TO WS-BAR. *> antes: "- "
*> ahora: "----------"


Tambien se rechazaba MOVE ALL ZEROS, que el estandar permite (el ALL es
redundante delante de otra constante figurativa).

6. CLOSE ... WITH LOCK y las clausulas de cinta


CLOSE IX-FD2 WITH LOCK.
CLOSE SQ-FS1 WITH NO REWIND.
CLOSE TAPE-FILE REEL FOR REMOVAL.


Ninguna se analizaba, y LOCK se leia como el nombre del siguiente fichero a
cerrar. WITH LOCK ademas se cumple: reabrir ese fichero en la misma
ejecucion devuelve ahora el file status 38, en vez de abrirse como si
nada.

7. Un literal con signo como objeto de WHEN


WHEN -0.000020 THRU 0.000020


El signo delante hacia que el analizador leyera el objeto como el comienzo de
una condicion.

8. PERFORM ... TIMES con un dato como contador

COBOL-85 admite un identificador como numero de repeticiones, no solo un
literal:


77 THREE PIC 9 VALUE 3.
PERFORM PFM-C THREE TIMES.


9. Un contador escrito en la linea siguiente


10 STUFF-1 OCCURS
31 TIMES.


Un numero que abre una linea se toma por un numero de nivel - normalmente lo
es - asi que el 31 llegaba como nivel y OCCURS daba error.

10. Un nombre puede empezar por un digito

Una palabra definida por el usuario se forma con A-Z, 0-9 y el guion; solo un
nombre de dato debe llevar al menos una letra, y un nombre de parrafo o
de seccion ni siquiera eso:


01 25COUNT PICTURE 99.
01 3-DEM-TBL REDEFINES 3-DIMENSION-TBL.
0 SECTION.


Merece la pena senalar 3-DEM-TBL: el 3- podria leerse como "tres menos...", y
el estandar lo resuelve a favor del nombre porque un operador aritmetico exige
espacios alrededor. Es la misma regla que hace que B-C sea un nombre y B - C
una resta.

11. Una funcion desconocida ya no devuelve 0 en silencio

Una funcion intrinseca no implementada escribia un aviso y devolvia 0,
de modo que una errata producia un resultado erroneo que nadie reportaba.
Ahora es un error de compilacion y sugiere el nombre correcto:


COMPUTE WS-X = FUNCTION SQRTT(4).


'SQRTT' is not an intrinsic function RustCOBOL implements
- did you mean FUNCTION SQRT?

12. Las lineas de depuracion

Una D en la columna 7 marca una linea de depuracion, y el estandar dice que es
un comentario salvo que el programa lo pida:


SOURCE-COMPUTER. XYZ WITH DEBUGGING MODE.


Los dos preprocesadores de formato fijo no estaban de acuerdo: uno la trataba
como comentario y el otro la compilaba siempre. Solo aplica en formato fijo:
el formato libre no tiene zona de indicador.

13. Una etiqueta con apostrofo o salto de linea rompia la compilacion

Al generar el codigo de un formulario, el texto de una propiedad se escribia
tal cual entre dos apostrofos. Un Caption como "Don't Save" cerraba el
literal antes de tiempo, y un salto de linea producia un literal partido en dos
lineas sin continuacion. El sintoma era un error que no tenia nada que ver:

Build blocked - expected PROCEDURE DIVISION (line 367)

Ahora el delimitador se duplica (el escape del estandar) y los caracteres de
control se pliegan a un espacio. La PICTURE ademas se dimensiona segun el
valor, asi que una etiqueta de mas de 256 caracteres ya no se trunca.

14. Una aplicacion compilada no podia leer su propio programa

deserialize embedded AST: invalid value: integer 10,
expected variant index 0 <= i < 10

Una aplicacion compilada lleva su programa serializado dentro del binario, y el
formato identifica cada variante por su posicion. Anadir una variante en
mitad de la lista renumeraba todas las siguientes. El fallo aparecia al
arrancar la aplicacion, mucho despues de la compilacion que lo causaba.
Ahora, si vuelve a ocurrir, el mensaje dice la causa y la solucion: recompilar.

Medida


1.62.12 242 / 434
1.62.13 292 / 434
1.62.14 317 / 434
1.62.15 332 / 434


El modulo de funciones intrinsecas queda completo: 45 / 45.

Un aviso importante, y honesto

Todas esas cifras miden la compilacion: si el analizador acepta el
programa. Esta entrega anade ademas una medida de ejecucion, que corre
cada programa y lee el informe PASS/FAIL que el propio programa imprime.

De los 434 programas dentro de alcance, 0 llegan al final. 332 compilan;
de esos, 170 entran en un bucle, 76 agotan el tiempo, 66 no imprimen informe y
21 los rechaza el motor de ejecucion.

Es decir: 332 compilan y ninguno funciona todavia. Preferimos publicar
ese numero a dejar que la cifra de compilacion se lea como si fuera
conformidad. Ese es el trabajo que viene ahora.

Documentacion:
PowerRustCOBOL/docs/developers-guide-en.md at main · CloudLandBeta/PowerRustCOBOL · GitHub (https://github.com/CloudLandBeta/PowerRustCOBOL/blob/main/docs/developers-guide-en.md)

Anthropic Claude Codex Agent