Relive: Writing Drivers in High-Level Languages