Productive Programming Systems for Heterogeneous Supercomputers