Patterns Of Parallel Programming Languages