While I am sure that the merits of Cutler's stated "low opinion" could
be debated, I'm interested to better understand exactly what he was
referring to here. There's no citation, and I haven't found a good
explanation critiquing his criticism.
Honestly, at face value, it's a naive criticism. Cutler was not naive, so, it's likely just a sound bite poke at UNIXs development model.
But that said, when you look at the larger picture, notably the "tools" notion of UNIX (as expressed in books such as Software Tools by Kernighan and Plauger) they demonstrate writing code and using things such as getc
or getchar
along with putc
and putchar
. The simplistic interface of reading from standard input, processing it, and writing to standard output. It's the essence of the composability of software that "does one thing and does it well".
These are, indeed, "get a byte, put a byte", and are well known to have a higher over head than block reads and writes. If you want I/O to perform well, it's best done in device size blocks (e.g. 1K, or 4K, depends on the device).
Now, in reality, underneath those getc
calls are block I/O calls. Underlying code loads up a buffer, and then works through that buffer, refilling as necessary.
There is higher function overhead, but not necessarily I/O overhead.
Perhaps these were naively implemented back in the day (I doubt it).
There is/was nothing stopping UNIX processes from doing more efficient block I/O, but idiomatically, it was not presented that way.
VMS is in many ways the antithesis of UNIX, with its special file formats and dedicated utilities in contrast to the UNIX universal stream of bytes and composable tools model.