I suppose you could say, with respect to a UNIX-like operating system, that files are first class citizens. This is not necessarily so with LISP operating systems. In that paradigm, I suppose you’d say functions are the first class citizens. There are, like all engineering tools, benefits and disadvantages to both—the main disadvantage of files being, given the nature of UNIX being based in C, that you have to make sure the interprocess communication you are using to manipulate the data inside the files is sane.
In other words, programs in file-based operating systems don’t necessarily have the ability to check the sanity of the way in which they are dealing with data inside files. The metaphor does not necessarily admit of ‘reflection’: executable code is, all else held constant, separate from the data-content it operates on. The processes that are meant to share resources in the form of files need to be arranged in such a way prior to processing the data to make sure the structure of their operations does not clobber the structure of the data in the files, so that the computer output delivered to the human is intelligible.
I’m writing all this down because I have been quizzed many times on how LISP operating systems like Mezzano or Genera are supposed to make sense if files aren’t the fundamental abstraction with which humans are meant to engage with the computer. I haven’t, up until now, been able to give a response that I was happy with. I usually have ended up having to say, ‘I’m sorry but I just don’t know’.
I suppose the main advantage of the file metaphor is that you can be totally content-agnostic about whatever is in a file: a block device looks the same as a character device. A text file is just the same as an executable file: they can both be manipulated the same.
But I do think there is some power to functions being the building block of an operating system: reflectiveness is a powerful feature of functional programming. The computer can be programmed, in this paradigm, to inspect what it is doing to the data you want to process. Unless something extra is added to metaphor of files—and this is of course possible—files are just black boxes, little inert lumps, the structure of which only the human using the computer knows.
That’s not to say that LISPs cannot deal with files, and that UNIX cannot be reflective, but if we boil down both paradigms to their first-class, core abstractions, I’d say this is the difference between the UNIX tradition and that of functional programming language operating systems.