C compiler design