Abstract.In this paper we discuss the semantics of a simple block-structured programming language which allows sharing or aliasing. Sharing, which arises naturally in procedural languages which permit certain forms of parameter passing, has typically been regarded as problematical for the semantic treatment of a language. Difficulties have been encountered in both denotational and axiomatic treatments of sharing in the literature. Nevertheless, we find that it is possible to define a clean and elegant formal semantics for sharing. The key to our success is the choice of semantic model; we show that conventional approaches based on locations are less than satisfactory for the purposes of reasoning about partial correctness, and that in a well defined sense locations are unnecessary in a formal treatment of our programming language. In the first part of the paper we describe a denotational semantics for an ALGOL-like language which allows sharing; the semantic model is not based on locations, but instead uses an abstract sharing relation on identifiers to represent the notion of aliasing, and uses an abstract state with a stack-like structure to capture the semantics of blocks. The semantics is shown to be fully abstract with respect to partial correctness properties, in contrast to conventional location-based models. This means that the semantics identifies terms if and only if they induce identical partial correctness behaviour in all program contexts. This property typically fails for locationbased semantics because in such models it is possible to distinguish between terms on the basis of their effect on individual locations, which has no bearing on partial correctness behaviour.In the second part of the paper we demonstrate that our choice of semantic model enables us to design a Hoare-style proof system for our language, and to give relatively straightforward proofs of the soundness and completeness of this system. We claim that our proof rules are conceptually simpler to understand than other rules proposed in the literature, without losing any expressive power. Indeed, we are able to derive some of these proposed rules. We believe that semantically based methods such as ours may lead to improvements and clarifications in the axiomatic and denotational treatment of other programming constructs. The methods by which we construct a proof system will lead us to some general principles which ought to be more widely applicable. We show, for example, that it is possible to define a "generic" inference rule for blocks which is uniformly applicable to blocks headed by different forms of declaration. The important point here is that, unlike the proof systems for these constructs in the literature, we do not have to design a separate rule for blocks for each possible form of declaration. This results in greater flexibility and adaptability in our proof system. In summary, we are advocating a generalization of Hoare logic to encompass the semantics of a wider range of syntactic categories, and we believe that axiomati...