Add clang compiler & refactor