When writing a multi-threaded program, the programmer may write each thread as a sequence of instructions without specifying the timing of any instruction relative to instructions in other threads. In event-driven programming, the programmer may write sequences of instructions to respond to events without specifying an overall sequence for the program. In dataflow programming, the programmer may write each section of a computing pipeline without specifying the timing relative to other sections.