Modern Programming Languages: A Practical Introduction