You seem to be separating the activity of executing a program from the program itself. There's no reason a program cannot be constructed which takes arbitrary data and we feed data to programs to get other programs. So what's "mere data" in one system might bbbe executed by another.
While a recipe card might not constitute a "program" in most contexts, if you construct a cooking robot, the same data is now magically software because the robot could use it to cook. So the line you are attempting to draw between software and data is merely that of the limitations of what the system can process.
And all programs are ultimately processed as data by the instruction loop within the CPU. For example, I can construct the "non data" program of 0x20FE (unconditional branch to its own start on the 86HC11, i.e. 10 GOTO 10). The CPU unconditionally fetches the instruction at the instruction pointer, then executes it. In this case, it increments the instruction pointer by 2 while reading it, then executes and decrements the instruction pointer by 2, endlessly looping over the same data.
Comments
You seem to be separating the activity of executing a program from the program itself. There's no reason a program cannot be constructed which takes arbitrary data and we feed data to programs to get other programs. So what's "mere data" in one system might bbbe executed by another.
While a recipe card might not constitute a "program" in most contexts, if you construct a cooking robot, the same data is now magically software because the robot could use it to cook. So the line you are attempting to draw between software and data is merely that of the limitations of what the system can process.
And all programs are ultimately processed as data by the instruction loop within the CPU. For example, I can construct the "non data" program of 0x20FE (unconditional branch to its own start on the 86HC11, i.e. 10 GOTO 10). The CPU unconditionally fetches the instruction at the instruction pointer, then executes it. In this case, it increments the instruction pointer by 2 while reading it, then executes and decrements the instruction pointer by 2, endlessly looping over the same data.