When „computers” came available for commercial data processing, they hardly contained storage (memory) and had little cpu at their disposal. Input came from media like punched tape, punched cards, telex, and such. Outputs were stored on these media too or became printed, line by line.
The first applications used adjustable boards with wires that basically connected the input signals to the output signals or transferred them into the accumulator (cpu). Rewiring was called „programming”.
While punched tape had a greatly free-format, the punched card introduced a strict fixed format and caused the „program” to group the data fields as records: a punched card was read as a complete unit or record, while punched tape could be infinite in length (very fragile and in practice the limit was a few meters). In those days computers were used in a most scientific way and the punched tape was king. Programs would read series of numbers (originating the term number crunching) and manipulate them. A stack was indispensable.
The birth of the need for mass data processing caused the appearance of punched cards and the wired boards, designed as a matrix. These features opted for storing mass data in a physical medium and flexible printing of their contents.
The connection of position (1,1) on the board wired to the position (5,10) on that same board caused that column 1 of the input punched card would be printed on column 10 of the line printer. In a naive way the board could be „programmed” to MOVE input column 1 to output column 10.
The connection of position (1,1) on the board wired to the position (3,12) caused that column 1 of the input punched card would be transferred to the cpu. Same for position (1,2) connected to position (3,13). This cpu processed this data by ADDing them and transfers the result on position (4,12) and (4,13). So, by connecting these positions (4,12) and (4,13) to the positions (5,10) and (5,11) a print is obtained of the addition of input columns 1 and 2.
Another function of that cpu was that the data coming from column 1 could be multiplied by the value of a external dip-SWITCH (or toggle-thingie) and transfers the result on position (3,14). So, by connection that position (3,14) to the position (5,10) a print of input column 1 that is MULTIPLY-ed by a certain fixed value from the „outside” is obtained.
Same principles could be applied to emulate a SUBTRACT, a DIVIDE, the conditional BLANK-WHEN-ZERO, and much more.
Later on, these machines could be equipped with large memories, called WORKING STORAGE, and the external dip-switch could be entered from the outside into certain positions of that memory. This was done using a telex-like equipment, later on a luxury typewriter. These machines came with not just one board for wiring INPUT to OUTPUT, but several boards in order to ADDRESS the memory properly. Programming these multiple boards became more and more a nightmare.
Of course, these boards became obsolete by intelligent mechanisms to put binary code into memory that could emulate the wiring. The birth of SOFTWARE. A typical computer job in those days, was to read the program into memory and than to process the data. These programs were stored on punched cards too, which was called a „deck”.
Note. A smart trick was applied here. The columns 1-6 of the punched card deck contained a (sortable) SEQUENCE NUMBER. If the machine operator was unlucky and let that deck slip out of his hands, well, it could be restored by sorting. Advanced programs (consisting of modules and/or subprograms) carried the name of the module on columns 73-80. So that a additional sorting pass could re-assemble the program structure again.
We still see a lot of elements of these historic environments in current advanced electronics: the wiring, dip-switches, the cpu and peripheral driving modules, allthough the punched hole is gone. It is no surprise that filenames in DOS, and even in modern software packages, have a length of 8 characters, whilst CP/M added a 3-character extension.
We still use, conscious or naive, the INPUT-PROCESSING-OUTPUT paradigm which grounded commercial large scale data processing. We may realize that the DIVISION structure of Cobol directly relates to the organizational needs of those early computers: IDENTIFICATION (what is it) DIVISION, ENVIRONMENT (what does it need) DIVISION , DATA DIVISION (what does it use) and PROCEDURE DIVISION (how to). And the formatting rules of Cobol sourceText does suggest a text document: SECTIONs, PARAGRAPHs and SENTENCEs with statements.
Nowadays computers do feature flexible stacks, segmented memory, protected threads, but also the silented jump (GO TO). Even the Turing Machine features the jump and it is implemented as a read forward/backward.
Cobol does not feature language constructs for stacks, queues or segments. Later languages however do offer syntax to pop and push, fifo read and inter program communication. And while in Cobol the GO TO and PERFORM VARYING were difficult to grasp (when abused), later languages introduce us to other exotic means to get hooked on.