Quantum computers may solve some problems far beyond the reach of classical digital computers. However, emerging quantum systems are typically noisy and difficult to control. These noises create significant difficulties for the practical usage of quantum systems, leaving a substantial gap between the requirements of quantum applications and the realities of noisy devices. Bridging this gap is crucial – the dissertation shows that the system software can adapt to the constraints of large applications and noisy hardware. In particular, this dissertation combines systems techniques at three main levels: i. Gate-level noise mitigation, which enhances the robustness of quantum processors through coordinated control instructions that reduce errors; ii. Program-level quantum memory management, which addresses problems of qubit allocation throughout a quantum program and implements automated tools to selectively reuse qubits, much like in garbage collection for classical programs; iii. Architecture-level quantum error correction with low overhead, which seeks to provide correctness guarantees for quantum applications by encoding quantum bits so that errors can be detected and corrected, analogous to classical error-correcting codes.