2009-11-04 19 views
18

¿Por qué COBOL tiene SECTION y PARAGRAPH?¿Por qué COBOL tiene tanto `SECTION` como` PARAGRAPH`?

¿Alguien puede explicar por qué los diseñadores de COBOL crearon tanto SECTION s como PARAGRAPH s? Estos han existido desde el lanzamiento inicial de COBOL, así que sospecho que la razón real de su existencia se ha ido hace mucho tiempo (similar a cosas como NEXT SENTENCE que todavía están en la especificación del lenguaje para compatibilidad con versiones anteriores pero ya no son necesarias desde la introducción del alcance explícito terminadores).

Supongo que SECTION puede haber sido introducido en las superposiciones de programas de soporte. SECTION tiene un número PRIORITY opcional asociado para identificar la superposición del programa de la que forma parte. Sin embargo, la mayoría de las implementaciones modernas de COBOL ignoran o han eliminado números PRIORITY (y superposiciones).

Actualmente, veo que todavía se requieren SECTION s en la parte del PROCEDURE DIVISION, pero no puede encontrar ninguna justificación para esto. No veo ninguna diferencia semántica entre SECTION y PARAGRAPH que no sea PARAGRAPH está subordinada a SECTION.

Algunas tiendas COBOL prohíben el uso de SECTION a favor de PARAGRAPH (parece común en América del Norte). Otros prohíben PARAGRAPH a favor de SECTION (parece común en Europa). Todavía otros tienen pautas sobre cuándo cada uno es apropiado. Todo esto me parece muy arbitrario, lo que plantea la pregunta: ¿por qué se incluyeron en la especificación del lenguaje en primer lugar? Y, ¿tienen alguna relevancia hoy?

Si responde esta pregunta, sería genial si también pudiera señalar una referencia para respaldar su respuesta.

Gracias

Respuesta

5

No hay referencias sobre esto, ya que escuché que me pasó de uno de los veteranos en mi tienda, pero ...

En los viejos compiladores COBOL, al menos para IBM y Unisys, las secciones podían cargarse en la memoria de a una por vez. En los viejos tiempos, cuando la memoria era escasa, un programa que era demasiado grande para cargarse en la memoria de una sola vez se podía modularizar para el uso de la memoria mediante secciones. Tener ambas secciones y párrafos le permitió al programador decidir qué partes del código se cargaron juntas en la memoria si no todas pudieran cargarse a la vez: querría que dos partes del mismo bucle de ejecución se cargaran juntas para mayor eficiencia. Hoy en día es más o menos discutible.

Mi tienda solo utiliza párrafos, prohíbe GOTO y requiere párrafos de salida, por lo que todos nuestros PERFORMES son de 100 PARÁGRAFOS A 100-SALIDA o algo similar, lo que parece hacer que los párrafos me parezcan más a secciones. Pero no creo que realmente haya mucha diferencia ahora.

+0

Bah, veo que Colemanj tenía la misma respuesta que yo. Acabo de desplazarme más allá de la primera entrada de respuesta. No puedo comentar las respuestas de los demás, así que lo dejo como una explicación ligeramente expandida de lo que dijo Colemanj. –

+0

Creo que usted y Colemanj tienen la respuesta correcta, pero su respuesta es más elocuente. La segmentación del programa era el mecanismo de "estado o arte" para administrar programas "grandes" en un espacio de direcciones pequeño. Afortunadamente, la memoria virtual hizo que esta función quedara obsoleta (he estado alrededor el tiempo suficiente como para que haya experimentado la "alegría" de escribir programas segmentados). Todo lo que veo que queda es un posible uso de "espaciado de nombre" y un requisito inexplicable de que las Declarativas hacen referencia a Secciones en lugar de a Párrafos (como lo señala Tim Sylvester). – NealB

1

Por un lado, los nombres de párrafo deben ser únicos a menos que estén en secciones separadas, por lo que permiten las secciones "espacios de nombre" de los párrafos.

Si no recuerdo mal, la única razón por la que debe utiliza un SECTION es para DECLARATIVES. Aparte de eso, son opcionales y principalmente útiles para agrupar párrafos. Creo que es común (en términos relativos, de todos modos) exigir que PERFORM se use en los párrafos solo cuando están en la misma sección.

+0

me había olvidado de la 'función de los espacios de nombre' que' 'SECTION's proporcionan más PARAGRAPH's, pero era que la justificación de los diseñadores del lenguaje utilizado ¿cuando viene con estos constructos? J.Sammet escribió un interesante artículo sobre la Historia Antigua de COBOL hace algún tiempo donde se dio una idea de por qué ciertas características del lenguaje son como son, pero no proporcionó ninguna idea de por qué ambos 'SECCIÓN 'y' PARAGRAPH' se incorporaron. Simplemente no lo entiendo, pero estas personas no eran tontas, así que imagino que debe haber habido buenas razones para tenerlas. Gracias, Neal – NealB

6

Aprendí COBOL alrededor de 1978, en un ICL 2903. Tengo una vaga memoria de que a los encabezados SECTION se les podía asignar un rango numérico, lo que significaba que esos encabezados SECTION podían intercambiarse y desaparecer de la memoria, cuando el programa era demasiado grande para la memoria.

+1

Sí, esos eran números PRIORITY, y Apuesto a que podrías darme un montón de historias de terror sobre tener que usarlas también. Creo que un programa podría tener problemas reales si alguna vez permitiera que un segmento independiente (número de prioridad> = 50) hiciera referencia a otro segmento independiente. Afortunadamente, esos días están más o menos detrás de nosotros ahora ... – NealB

1

Una sección puede tener varios párrafos. Cuando ejecuta una sección, ejecuta todos los párrafos en la sección. Dentro de la sección puede usar PERFORM o GOTO para derivar a los párrafos dentro de la sección.

+0

De ahí la declaración EXIT como un objetivo para GO TO. Hoy, EXIT es solo un lugar para "colgar" un nombre de párrafo. Creo que algunos compiladores tempranos requieren que EXIT sea la única declaración en el último párrafo de un rango realizado de SECTIONs/PARAGRAPHs. Se requirió generar código implementando el retorno desde un rango PERFORMed. Como PARAGRAPH está subordinado a SECTION, se puede esperar que al realizar una SECCIÓN se ejecuten todos los párrafos contenidos. Se puede ejecutar un rango de párrafos usando 'PERFORM para-1 THROUGH para-n', de modo que la misma funcionalidad se puede lograr utilizando solo párrafos. – NealB

-1

Usamos la codificación COBOL SECCIÓN en todos nuestros programas COBOL de lotes de 37K MVS. Utilizamos esta técnica para obtener tiempos de ejecución mucho más rápidos y una sobrecarga de la CPU significativamente menor. Esta técnica de codificación COBOL es muy similar al ensamblador por lotes de alto rendimiento.

de llamadas que alto rendimiento Funcionalmente COBOL estructurado programación

Una vez que una sección está definido todos realizan xxxxx volverá en la próxima no SECCIÓN codificado el siguiente párrafo en la sección. Si los párrafos están codificados antes de la primera SECCIÓN, entonces se pueden ejecutar normalmente. (Pero no permitimos que esto)

Usando una sección tiene cabeza más alta que cuando se utiliza y PERFORM ing sólo párrafos - MENOS - utiliza GOTO lógica de código de derivación que debe estar ejecutado condicionalmente Nuestra regla es que un GOTO solo puede apuntar a un Tag-Line en la misma SECCIÓN. (un párrafo) Todos los párrafos en una SECCIÓN deben ser una función secundaria de la función SECCIÓN. La instrucción EXIT es una instrucción ensamblador NOP. Permite colocar Tag-Line antes de la próxima SECCIÓN - una salida/devolución rápida.

La ejecución de un REALIZAR xxxx TRAVÉS aaaa tiene mayor carga de CPU que la ejecución de una sección sin los GOTO s.

ADVERTENCIA: Ejecución de una REALIZAR xxxx Tag-Line en una sección caerá a través de todo el código de la sección hasta que se encuentre la siguiente sección. A GOTOTag-Line fuera de la SECCIÓN actual caerá a través de todo el código en la nueva SECCIÓN de aterrizaje hasta que se encuentre la siguiente SECCIÓN. (Pero no permitimos esto)

+0

Interesante ... ¿Hizo * usted * pruebas de referencia para demostrar estas diferencias de rendimiento ? Tenía la impresión de que el mecanismo de control utilizado en los compiladores de IBM era * exactamente * el mismo cuando REALIZAMOS SECCIONES y PARÁGRAFOS. El mecanismo de control utilizado en IBM COBOL compiladores para implementar el retorno de un PERFORM se describe en [este documento] (http://portal.acm.org/citation.cfm?id=381788.316163) No esperaría ninguna diferencia al realizar una SECCIÓN o un PÁRRAFO. – NealB

+1

Sé que esto es "viejo", pero ... Aquí hay muchas contradicciones y conceptos erróneos. Pueden nacer con una redacción pobre, pero están ahí. "Coder tenga cuidado". La "Advertencia" en particular no tiene sentido; la primera parte no es cierta, la segunda parte no tiene por qué ser cierta. Hay un solo sentido en el que REALIZAR una SECCIÓN con varios párrafos será "más rápido" que REALIZAR los párrafos individuales (fuera de una SECCIÓN, sería absurdo hacerlo si están * dentro de * una SECCIÓN): REALICE A-SECTION (que contiene B-PARA y C-PARA) PERFORM B-PARA PERFORM C-PARA El primero es un código menor. –

+0

Hablando como escritor de compiladores de COBOL, esta es una carga de tonterías. Usar una SECCIÓN no es intrínsecamente diferente de usar párrafos. No hay ninguna razón para esperar que sea más rápido o más lento, lo que sea que reclame. No sé por qué usa el término que no es de COBOL 'Etiqueta-Línea' cuando PARAGRAPH ya existe. La técnica de codificación que describes no tiene nada que ver con 'ensamblador por lotes de alto rendimiento'. Usar GOTO para eludir la lógica condicional no es preferible al uso de ELSE. EXIT no es un ensamblador NOP: es un retorno condicional. No hay GOTO en PERFORM xxx THRU yyy. @ BillWoodger ++ – EJP

2

Bueno, la más simple de las razones es que SECTION s le proporciona la "modularidad" - al igual que las funciones en C - una necesidad en los programas "estructurados". Notaría que el código escrito usando SECTIONs parece mucho más legible que el código escrito en párrafos, porque cada sección debe tener un "EXIT" - un único y muy explícito punto de salida de una SECCIÓN (el punto de salida de un paragrpah está lejos más vago e implícito, es decir, hasta que se encuentre una nueva declaración de párrafo). Considere este ejemplo y usted puede estar tentado a usar secciones en su código:

*================== 
MAINLINE SECTION. 
*================== 
    PERFORM SEC-A 
    PERFORM SEC-B 
    PERFORM SEC-C 
    GOBACK. 
*================== 
MAINLINE-EXIT. 
*================== 
    EXIT. 

*================== 
SEC-A SECTION. 
*================== 

..... 
..... 
..... 
..... 

    IF <cond> 
     go to A-EXIT 
    end-if 

..... 
..... 
..... 
..... 

. 

*================== 
A-EXIT. 
*================== 
    EXIT. 

no creo que tendría este tipo de un privlege al escribir sus códigos en los párrafos. Es posible que haya tenido que escribir una declaración ELSE enorme para cubrir las afirmaciones que no deseaba ejecutar cuando se alcanza una determinada condición (considere que el conjunto de declaraciones se ejecuta en 2 o 3 páginas ... un conjunto adicional de IF/ELSE te abofeteará por sangría). Por supuesto, tendrá que usar "IR A" para lograr esto, pero siempre puede indicar a sus profesionales que no utilicen IR A menos que salgan, lo cual es un trato justo, creo.

Así que, aunque también estoy de acuerdo en que todo lo que se puede escribir usando SECTIONs también se puede escribir usando párrafos (con pocos o ningún retoque), mi elección personal sería una implementación que pueda hacer el trabajo de mis desarrolladores un poco más fácil en el futuro!

+1

+1 por los comentarios interesantes. Usted describe un estilo de codificación particular usando SECCIÓN/PÁRRAFO más bien que identifica los criterios de diseño del lenguaje que condujeron a la inclusión de SECCIÓN y PÁRRAFO en la especificación del lenguaje COBOL. Tenga en cuenta en su ejemplo si los encabezados SECTION se eliminan, convirtiéndolos en PARÁGRAFOS, y 'PERFORM SEC-A 'se reemplaza por' REALIZAR SEC-A A SALIR', etc. tiene un programa funcionalmente equivalente que usa solamente PARÁGRAFO. BTW Coloque 'MAINLINE-EXIT' antes de' GOBACK'; de lo contrario 'GO TO MAINLINE-EXIT' hará que conduzca a problemas. – NealB

+0

Aquellos que recurren a "IR A" como una "primera respuesta" a un error de diseño del programa :-) tienden a imaginar que aquellos que no deben codificar IF/EVALUAR profundamente anidados en su lugar. No es necesario que sea cierto, aunque sucede. –

1

Cobol se desarrolló a mediados de los años 50. Como el nombre completo alude, fue desarrollado para la programación comercial, como un lenguaje más relevante para fines comerciales que los lenguajes "científicos" o "técnicos" existentes (había muy pocos "idiomas" de todos modos, y "código máquina" (específico) , por supuesto, a una arquitectura particular (casi le dije "chip específico", antes de pensar en tubos de vacío)) que puede tener que configurarse a través de interruptores físicos/diales en algunas máquinas y, si tiene suerte, con un "Ensamblador". Cobol estaba muy avanzado para su día, para su propósito.

La intención era que los programas escritos en Cobol se asemejaran mucho más al idioma inglés que a un conjunto de "códigos" que significan algo para los iniciados.

Si observa alguna de las nomenclaturas relacionadas con el lenguaje - párrafo, oración, verbo, cláusula - está siguiendo deliberadamente los patrones atribuidos al idioma inglés.

SECCIÓN no encaja del todo en esto, hasta que relacione las cosas con un documento comercial formal.

Tanto las SECCIONES como los párrafos aparecen también fuera de la DIVISIÓN DE PROCEDIMIENTOS. Al igual que en el inglés escrito, los párrafos pueden existir por sí solos, o pueden ser parte de una SECCIÓN.

Las SECCIONES pueden tener un número de prioridad relacionado con la "función de segmentación". Esto solía incluir la "superposición" de SECTION para proporcionar un nivel primitivo de administración de la memoria. Esta es una "herramienta de cálculo" más que una de habla inglesa :-) La "característica de segmentación" tiene algo de efecto restante, pero nunca lo he visto realmente utilizado.

Sin DECLARATIVOS (que no uso, y acabo de notar que el manual no está claro) entonces es una "opción" si se utilizan SECCIONES o párrafos para PERFORMAR.

Si se utiliza GO TO, racionalmente, se puede lograr la "equivalencia" con PERFORM ... TRHU .... Si no es así, y no hay un uso gratuito de PERFORM ... THRU ..., entonces hay equivalencia ya.

Las comparaciones con el código "estructurado" y los idiomas modernos son "leer la historia al revés" o simplemente delinear una "práctica" en particular. De la reputación alcanzada por el "código spaghetti" y ALTER ... PARA PROCEDER A ... bien puede ser que durante 20 años haya sido "común" no hacer mucho con PERFORM a menos que necesites la "gestión de la memoria", pero yo no tiene referencias o conocimiento para respaldar esto.

SECCIONES permiten nombres de párrafo duplicados, de lo contrario los nombres de párrafo deben ser únicos.

No puedo poner un dedo específico sobre uno sobre el otro todo el tiempo.

Si utilizo IR A, usaría las SECCIONES.Si no, párrafos. Con DECLARATIVOS usaría SECTIONs. Si utilizo las SECCIONES, comenzaría la DIVISIÓN DE PROCEDIMIENTOS con una SECCIÓN para evitar un mensaje de diagnóstico.

Las normas locales pueden dictar, pero no necesariamente sobre una base "moderna" (o incluso "racional"). Mucho es "conocido" pero en realidad es mal entendido acerca de las SECCIONES y los párrafos, en mi experiencia.

Para el rendimiento (donde se procesan masas de datos, y me refiero a masas) entonces un PERFORM de una SECCIÓN en lugar de múltiples párrafos individuales vería mejoras. El efecto sería el mismo con PERFORM ... THRU ..., pero prefiero no recomendarlo. IR A fuera del rango de un PERFORM es 1) malo 2) puede perder en "optimización". No debería ser un problema * excepto "cuando GO TO abend/exception y sin esperar ningún retorno lógico. Si se considera que el uso de este es necesariamente" inmediatamente ", entonces es mejor hacerlo con un PERFORM a pesar del" contraintuitivo " "aspecto (por lo documentarla).

2

sé que esto es una cuestión de edad, pero el OP solicitada acerca de la documentación sobre la justificación original de la utilización de la sección así como el párrafo en COBOL.

no se puede conseguir mucho más "original" de la documentación CODASYL Diario.

en la sección 8 de la especificación del Diario de la lengua,

"segmentación COBOL es un centro que proporciona un medio por el cual el usuario puede comunicarse con el compilador para especificar programa objeto requisitos de superposición"

(página 331, capítulo 8.1 "Segmentación - Descripción general")

"Aunque no es obligatorio, la División Procedimiento para una fuente de programas se suele escribir como un grupo consecutivo de secciones, cada una de que se compone de una serie de operaciones estrechamente relacionadas que una re diseñado para realizar colectivamente una función particular. Sin embargo, cuando se usa la segmentación , toda la División de procedimientos debe estar en las secciones . Además, cada sección debe clasificarse como perteneciente al ya sea en la parte fija o en uno de los segmentos independientes del programa objeto . La segmentación no afecta en absoluto la necesidad de calificación del procedimiento de nombres para asegurar la unicidad."

(p 331, sección 8.1.2.1 'segmentos de programa')

En su libro sobre lenguajes de programación comparativos ("Lenguajes de programación: Historia y Fundamentos", 1969) Jean Sammet (que estaba sentado en el comité CODASYL, lo que representa Sylvania eléctrico) afirma:

" .. la asignación de almacenamiento es manejado automáticamente por el compilador. La unidad principal para asignar código ejecutable es un grupo de secciones llamado segmento . El programador combina secciones especificando un número de prioridad con el nombre de cada sección. ... Se requiere el compilador para ver que se proporcionen las transferencias de control adecuadas para que el control entre los segmentos que no se almacenan simultáneamente pueda tener lugar. ..."

(p 369-371 COBOL V.3)

Cuestiones relacionadas