If a digit (bit, byte, dword) can contain either data or instruction, it becomes a universal data format, by definition. The data comes togheter with the ways to treat the data.
It is really not handy to carry around fat files with both program and data, it would be like having every JPEG embed Photoshop. But it is easy to imagine (it is hype today) an data ecology where a central repository would handle “codecs” not only for video, but for every kind of data possible: letters, foreign-language texts, tridimensional models, voxels, whatever.
Followying this rationale, one could think that the issue of information-abstraction might be acomplished by simply assigning enough initial bytes to strictly specify the data-format. Instead of “Magic Numbers” it would advocate a general standard for identification of the data assembling mechanisms.
But, besides being unworkable, is also a mistaken assumption. What makes a data scheme flexible is the error condition. Not a prediction of all the possible (meaningful, achievable, real…) states of the system, but instead a predictable way to deal with errors.
The error condition is the basic mechanism for system-expansibility. And for data abstraction. Obviously the error is not desirable, but an enlightened routine to deal with errors is.
But what i mean for “enlightened” is more like the unix approach to error. Define a clear, unique, but ultimately simplistic routine and do not try to fix everything. If things go wrong, call kernel panic and freeze.
Continuing with the “universal data type” idea, the ideal is that the “error condition” would open up the system to insertion of code. That is, the system enters an code-appending mode, where a safely authenticated admin could enhance the system itself, for example downloading a new codec or writing a script or using a debugger, all of this preferably live.
But this approach does not lead to an perfect data ecology, not even a perfectible one. The other approach would be more adequate for it. But it is actually the wrong idea to even try for it. It is like building perfection from the end back, from the top dow. But abstraction requires a perfectibility from the start, from bottom up. And this is actually a very different idea.