There seem to be some tacitly accepted assumptions in the comp sci
community that I think may be a barrier to "thinking different" about
computer architectures:
1. Computers have single instruction streams
Comp sci education tends to focus on minimizing "operations". But in
the real world, we typically want to minimize time and these are not
necessarily positively correlated with operations on parallel
architectures. An algorithm that uses 1000x more operations may
complete in far less time on a highly parallel architecture.
What seems really odd is that we program algorithms that could greatly benefit from concurrency in languages
that have no notion of concurrency, compile to a serial instruction
stream and then have our modern processors try to guess at how to break tiny bits of it back into multiple streams to eek out a bit more performance.
2. Computers must have instruction streams
Processors trade speed for the ability to perform any computation. With
reconfigurable logic, we may be able to dispense with instruction
streams entirely by compiling the algorithm all the way down to
transistors which may be both faster and more energy efficient by several orders of magnitude.
3. Logic and data must be separated
This is the primary bottleneck on modern machines, but little has been
done address it. Object oriented languages are not only more intuitive,
but are ideal for mapping to hardware where data and logic are
organized to minimize communication costs.
4. Instruction streams must share data
That is, instruction streams can touch each others data directly - as
"threads" do. This creates enormous problems with programming
concurrent systems, but few question this assumption at the level of
programming language design.