Generating parallel applications for distributed memory systems using aspects, components, and patterns