8 ms·
COBOL has an almost-COME-FROM, its called “ALTER” and it changes the destination of a GO TO, but it’s “discouraged” nowadays.
by anyfoo 1y ago
COBOL has an almost-COME-FROM, its called “ALTER” and it changes the destination of a GO TO, but it’s “discouraged” nowadays.
- skissane 1y agoHistorically, COBOL has had some rather fascinatingly unusual features-my favourite is OPEN INPUT REVERSED, which opens files for reading backwards-not sure if this was ever in any of the COBOL standards, but it exists in IBM mainframe COBOL, and many implementations on other platforms have copied it from there. It usually only works for files with fixed length records, and reads the records in reverse sequential order, but the bits/bytes within the record in forward order. In theory, it could be made to work for variable-length record files as well, but I’m not aware of any implementation which does. The original motivation was to support reading magnetic tapes backwards, so you could write data to a tape, then read it back in without a time-consuming rewind - which was important in the early years of computing, when memory and disk sizes were so small, magnetic tapes were commonly used for temporary storage / work files. Most tape drives nowadays don’t support reading tapes backwards, even though there are standard SCSI commands defined to do so-but I believe IBM 3592 tape drive series still supports this, as do virtual tape servers targeted at mainframes. The drive physically reads the bits off the tape in reverse order, but then reverses the data before sending it to the computer. I’m not aware of any other language which supports reading files backwards, other than COBOL. Well, mainframe assembly does, and you can invoke the relevant mainframe IO calls from languages such as C-but COBOL is the only language I know of which has it as a language feature.
- rbanffy 1y ago> I’m not aware of any other language which supports reading files backwards, other than COBOL. You can always use seek() and read(). Won’t work for variable length records, but open(file).readlines()[::-1] should work in Python (even though it’s cheating under the hood).
- skissane 1y agoThose are ways of emulating reading files backward using other language features, not explicit language features for reverse-reading of files. Actually now I realise z/OS stdio has support for backwards-reading of VSAM files: you can fopen with mode “r,type=record,acc=bwd” and “acc=bwd” sets file read direction to reverse. And you can put an open type=record file in reverse reading mode by calling flocate() with __KEY_LAST, __KEY_EQ_BWD, etc But going just by the docs, that only works for VSAM not BSAM. Whereas COBOL’s OPEN INPUT REVERSED definitely works for BSAM, but not sure if it works for VSAM
- rbanffy 1y agoFair, but reading files backwards doesn't make much sense on random access media. I wonder if anyone still uses it.
- skissane 1y agoI don’t know who uses the COBOL feature or the z/OS stdio feature But relational databases do it all the time… it is very common for certain queries (especially those involving ORDER BY DESC) to be compiled into query plans which do reverse table/index scans… stdio VSAM acc=bwd is just the same thing at a much lower level - VSAM is pretty close to the storage engine layer of a standard relational database, to the point that relational databases for z/OS sometimes end up using VSAM instead of the custom storage engines they use on other platforms > Fair, but reading files backwards doesn't make much sense on random access media. On the contrary, it actually makes more sense. A tape drive has a standard direction, and reverse reading is rarely supported (especially nowadays) and requires special circuitry if it is supported. Floppy disks, hard disks and optical disks also have an inherent direction of rotation, but they are really random-sequential not pure random access devices. But true random access devices-DRAM, flash, SSD, etc-don’t have any inherent direction, so reading backwards (decreasing sequential block addresses) is just as valid as reading forwards (increasing sequential block addresses)
- rbanffy 1y ago
- Sesse__ 1y agoMany languages have exceptions, which are essentially COME FROM.