A pretty wide range of concurrent programming languages have been
developed over the years. Coming from different programming traditions,
concurrent languages differ in many respects, though all share the
common aspect to expose parallelism to programmers. In order to provide
language level support to programming with more than one process, a few
basic concurrency primitives are often combined to provide the main
language constructs, sometimes making different
assumptions. In this paper, we analyze the most common primitives and
related semantics for the class of synchronous concurrent programming
languages, i.e., languages with a global
mechanism of processes synchronization. Then, we present a generic
framework for approximating the semantics of the main constructs which
applies to both, declarative as well as imperative concurrent
programming languages. We determine the conditions which ensure the
correctness of the approximation, so that the resulting abstract
semantics safely supports program analysis and verification. Finally,
we ascertain the conditions that make it possible to implement the
abstraction by a source to source transformation of the language
semantics.