0% found this document useful (0 votes)
20 views

Complete Download Understanding Programming Languages 1st Edition Cliff B. Jones PDF All Chapters

Programming

Uploaded by

moutzodvut
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
20 views

Complete Download Understanding Programming Languages 1st Edition Cliff B. Jones PDF All Chapters

Programming

Uploaded by

moutzodvut
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 55

Experience Seamless Full Ebook Downloads for Every Genre at textbookfull.

com

Understanding Programming Languages 1st Edition


Cliff B. Jones

https://textbookfull.com/product/understanding-programming-
languages-1st-edition-cliff-b-jones/

OR CLICK BUTTON

DOWNLOAD NOW

Explore and download more ebook at https://textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Programming Languages and Systems 1st Edition Nobuko


Yoshida

https://textbookfull.com/product/programming-languages-and-
systems-1st-edition-nobuko-yoshida/

textboxfull.com

Foundations of Programming Languages Second Edition Lee

https://textbookfull.com/product/foundations-of-programming-languages-
second-edition-lee/

textboxfull.com

Concepts of programming languages Twelfth Edition Sebesta

https://textbookfull.com/product/concepts-of-programming-languages-
twelfth-edition-sebesta/

textboxfull.com

Concepts of programming languages 11th Edition Sebesta

https://textbookfull.com/product/concepts-of-programming-
languages-11th-edition-sebesta/

textboxfull.com
Programming Languages and Systems Amal Ahmed

https://textbookfull.com/product/programming-languages-and-systems-
amal-ahmed/

textboxfull.com

Foundations of Programming Languages Kent D. Lee

https://textbookfull.com/product/foundations-of-programming-languages-
kent-d-lee/

textboxfull.com

Programming Interviews for Dummies 1st Edition Eric T.


Jones

https://textbookfull.com/product/programming-interviews-for-
dummies-1st-edition-eric-t-jones/

textboxfull.com

Practical Foundations For Programming Languages 2nd


Edition Robert Harper

https://textbookfull.com/product/practical-foundations-for-
programming-languages-2nd-edition-robert-harper/

textboxfull.com

Domain Specific Languages in R Advanced Statistical


Programming 1st Edition Thomas Mailund

https://textbookfull.com/product/domain-specific-languages-in-r-
advanced-statistical-programming-1st-edition-thomas-mailund/

textboxfull.com
Cliff B. Jones

Understanding
Programming
Languages
Understanding Programming Languages
Cliff B. Jones

Understanding Programming
Languages
Cliff B. Jones
School of Computing
Newcastle University
Newcastle upon Tyne, UK

ISBN 978-3-030-59256-1 ISBN 978-3-030-59257-8 (eBook)


https://doi.org/10.1007/978-3-030-59257-8

© Springer Nature Switzerland AG 2020


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of
the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology
now known or hereafter developed.
The use of general descriptive names, registered names, trademarks, service marks, etc. in this publication
does not imply, even in the absence of a specific statement, that such names are exempt from the relevant
protective laws and regulations and therefore free for general use.
The publisher, the authors, and the editors are safe to assume that the advice and information in this book
are believed to be true and accurate at the date of publication. Neither the publisher nor the authors or
the editors give a warranty, expressed or implied, with respect to the material contained herein or for any
errors or omissions that may have been made. The publisher remains neutral with regard to jurisdictional
claims in published maps and institutional affiliations.

This Springer imprint is published by the registered company Springer Nature Switzerland AG
The registered company address is: Gewerbestrasse 11, 6330 Cham, Switzerland
Preface

The principal objective of this book is to teach a skill; to equip the reader with a way
to understand programming languages at a deep level.
There exist far more programming languages than it makes sense even to attempt
to enumerate. Very few of these languages can be considered to be free from issues
that complicate –rather than ease– communication of ideas.
Designing a language is a non-trivial task and building tools to process the lan-
guage requires a significant investment of time and resources. The formalism de-
scribed in this book makes it possible to experiment with features of a programming
language far more cheaply than by building a compiler. This makes it possible to
think through combinations of language features and avoid unwanted interactions
that can confuse users of the language. In general, engineers work long and hard on
designs before they commit to create a physical artefact; software engineers need to
embrace formal methods in order to avoid wasted effort.
The principal communication mode that humans use to make computers perform
useful functions is to write programs — normally in “high-level” programming lan-
guages. The actual instruction sets of computers are low-level and constructing pro-
grams at that level is tedious and unintuitive (I say this from personal experience
having even punched such instructions directly into binary cards). Furthermore these
instruction sets vary widely so another bonus from programming in a language like
Java is that the effort can migrate smoothly to computer architectures that did not
even exist when the program was written.
General-purpose programming languages such as Java are referred to simply as
“High-Level Languages” (HLLs). Languages for specific purposes are called “Do-
main Specific” (DSLs). HLLs facilitate expression of a programmer’s intentions by
abstracting away from details of particular machine architectures: iteration can be
expressed in an HLL by an intuitive construct — entry and return from common
code can be achieved by procedure calls or method invocation. Compilers for HLLs
also free a programmer from worrying about when to use fast registers versus slower
store accesses.
Designing an HLL is a challenging engineering task: the bigger the gap between
its abstraction level and the target hardware architecture, the harder the task for the

v
vi Preface

compiler designers. A large gap can also result in programmers complaining that
they cannot get the same efficiency writing in the HLL as if they were to descend to
the machine level.
An amazing number of HLLs have been devised. There are many concepts that
recur in different languages but often deep similarities are disguised by arbitrary
syntactic differences. Sadly, combinations of known concepts with novel ideas often
interact badly and create hidden traps for users of the languages (both writers and
readers).
Fortunately, there is a less expensive way of sorting out the meaning of a pro-
gramming language than writing a compiler. This book is about describing the
meaning (semantics) of programming languages. A major objective is to teach the
skill of writing semantic descriptions because this provides a way to think out and
make choices about the semantic features of a programming language in a cost-
effective way. In one sense a compiler (or an interpreter) offers a complete formal
description of the semantics of its source language. But it is not something that
can be used as a basis for reasoning about the source language; nor can it serve
as a definition of a programming language itself since this must allow a range of
implementations. Writing a formal semantics of a language can yield a far shorter
description and one about which it is possible to reason. To think that it is a sensible
engineering process to go from a collection of sample programs directly to coding a
compiler would be naive in the extreme. What a formal semantic description offers
is a way to think out, record and analyse design choices in a language; such a de-
scription can also be the basis of a systematic development process for subsequent
compilers. To record a description of the semantics of a language requires a notation
— a “meta-language”. The meta-language used in this book is simple and is covered
in easy steps throughout the early chapters.
The practical approach adopted throughout this book is to consider a list of issues
that arise in extant programming languages. Although there are over 60 such issues
mentioned in this book, there is no claim that the list is exhaustive; the issues are
chosen to throw up the challenges that their description represents. This identifies a
far smaller list of techniques that must be mastered in order to write formal semantic
descriptions. It is these techniques that are the main takeaway of the current book.
Largely in industry (mainly in IBM), I have worked on formal semantic descrip-
tions since the 1960s1 and have taught the subject in two UK universities. The payoff
of being able to write formal abstract descriptions of programming languages is that
this skill has a far longer half-life than programming languages that come and go:
one can write a description of any language that one wants to understand; a lan-
guage designer can experiment with combinations of ideas and eliminate “feature
interactions” at far less cost and time than would be the case with writing a compiler.
The skill that this book aims to communicate will equip the reader with a way
to understand programming languages at a deep level. If the reader then wants to
1 This included working with the early operational semantic descriptions of PL/I and writing the
later denotational description of that language. PL/I is a huge language and, not surprisingly, con-
tains many examples of what might be regarded as poor design decisions. These are often taken as
cautionary tales in the book but other languages such as Ada or CHILL are not significantly better.
Preface vii

design a programming language (DSL or HLL), the skill can be put to use in creating
a language with little risk of having hidden feature interactions that will complicate
writing a compiler and/or confuse subsequent users of the language.
In fact, having mastered the skill of writing a formal semantic description, the
reader should be able to sketch the state and environment of a formal model for
most languages in a few pages. Communicating this practical skill is the main aim
of this book; it seeks neither to explore theoretical details nor to teach readers how
to build compilers.

Using this book

The reader is assumed to know at least one (imperative) HLL and to be aware of
discrete maths notations such as those for logic and set theory — [MS13], for ex-
ample, covers significantly more than is expected of the reader. On the whole, the
current book is intended to be self-contained with respect to notation.
The material in this book has been used in final-year undergraduate teaching for
over a decade; it has evolved and the current text is an almost complete rewrite.
Apart from a course environment, it is hoped that the book will influence design-
ers of programming languages. As indicated in Chapter 1, current languages offer
many unfortunate feature interactions which make their use in building major com-
puter systems both troublesome and unreliable. Programming languages offer the
essential means of expression for programmers — as such they should be as clean
and free from hidden traps as possible. The repeated message throughout this book
is that it is far cheaper and more efficient to think out issues of language design be-
fore beginning to construct compilers or interpreters that might lock in incompletely
thought-out design ideas.
Most chapters in the book offer projects, which vary widely in their challenge.
They are not to be thought of as offering simple finger exercises — some of them
ask for complete descriptions of languages — the projects are there to suggest what
a reader might want to think about at that stage of study.
Some sections are starred as not being essential to the main argument; most chap-
ters include a section of “further material”. Both can be omitted on first reading.

Writing style

“The current author” normally eschews the first person (singular or plural) in tech-
nical writing; clearly, I have not followed this constraint in this preface. Some of the
sections that close each chapter and occasional footnotes also use the first person
singular when a particular observation warrants such employment.
viii Preface

Acknowledgements

I have had the pleasure of working with many colleagues and friends on the subject
of programming language semantics. Rather than list them here, their names will
crop up throughout the book. I have gained inspiration from students who have fol-
lowed my courses at both Newcastle University and the University of Manchester.
I’m extremely grateful to Jamie Charsley for his insertion of indexing commands.
I owe a debt to Troy Astarte, Andrzej Blikle, Tom Helyer, Adrian Johnson and Jim
Woodcock, who kindly offered comments on various drafts of this book. (All re-
maining errors are of course my responsibility.) My collaboration with Springer
–especially with Ronan Nugent– has been a pleasure. I have received many grants
from EPSRC over the years — specifically, the “Strata” Platform Grant helped sup-
port recent work on this book.
Contents

1 Programming languages and their description . . . . . . . . . . . . . . . . . . . . . 1


1.1 Digital computers and programming languages . . . . . . . . . . . . . . . . . . 1
1.2 The importance of HLLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Translators, etc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Insights from natural languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.5 Approaches to describing semantics . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.6 A meta-language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.7 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2 Delimiting a language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.1 Concrete syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2 Abstract syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.3 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3 Operational semantics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1 Operational semantics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2 Structural Operational Semantics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

4 Constraining types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.1 Static vs. dynamic error detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2 Context conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.3 Semantic objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.4 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

5 Block structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.1 Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.2 Abstract locations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.3 Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.4 Parameter passing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.5 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

ix
x Contents

6 Further issues in sequential languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83


6.1 Own variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.2 Objects and methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.3 Pascal variant records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.4 Heap variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.5 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.6 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

7 Other semantic approaches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95


7.1 Denotational semantics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.2 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
7.3 The axiomatic approach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
7.4 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.5 Roles for semantic approaches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

8 Shared-variable concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119


8.1 Interference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
8.2 Small-step semantics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
8.3 Granularity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
8.4 Rely/Guarantee reasoning [*] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
8.5 Concurrent Separation Logic [*] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
8.6 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

9 Concurrent OOLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131


9.1 Objects for concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
9.2 Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
9.3 Simple statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
9.4 Creating objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
9.5 Method activation and synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . 141
9.6 Reviewing COOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
9.7 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

10 Exceptional ordering [*] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153


10.1 Abnormal exit model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
10.2 Continuations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
10.3 Relating the approaches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
10.4 Further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

11 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
11.1 Review of challenges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
11.2 Capabilities of formal description methods . . . . . . . . . . . . . . . . . . . . . 160
11.3 Envoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Contents xi

A Simple language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163


A.1 Concrete syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
A.2 Abstract syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
A.3 Semantics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

B Typed language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169


B.1 Abstract syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
B.2 Context conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
B.3 Semantics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

C Blocks language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175


C.1 Auxiliary objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
C.2 Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
C.3 Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
C.4 Simple statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
C.5 Compound statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
C.6 Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
C.7 Call statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
C.8 Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

D COOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
D.1 Auxiliary objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
D.2 Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
D.3 Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
D.4 Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
D.5 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
D.6 Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

E VDM notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201


E.1 Logical operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
E.2 Set notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
E.3 List (sequence) notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
E.4 Map notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
E.5 Record notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
E.6 Function notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

F Notes on influential people . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207

References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Chapter 1
Programming languages and their description

This chapter sets the scene for the rest of the book. Sections 1.1–1.3 outline the
problems presented by programming languages and their related tools; Section 1.4
points out that there is material from the study of natural languages that is relevant
to the problems of describing artificial languages such as those used to program
computers; an overview of a range of techniques for recording the meaning of pro-
gramming languages is given in Section 1.5 and Section 1.6 introduces the specific
notation used throughout this book. In common with most of the following chap-
ters, this one closes with a section (1.7) that contains further material — in particular
such sections point to related reading.

1.1 Digital computers and programming languages

Consider the phrase “high-level languages for programming general-purpose com-


puters”; starting at the end:
• The focus in this book is on digital –rather than analogue– computers. The quali-
fication of “general-purpose” indicates that the behaviour of the computer is con-
trolled by a stored program. The crucial idea that machines can be devised that
are in some sense universal is credited to Alan Turing’s famous paper [Tur36]
on a technical issue in logic but few people would choose to program a “Turing
machine”.
• An essential question underlying this book is what is meant by “programming”.
A position can be taken that a program for device x should extend what can be
expressed in terms of the basic repertoire of x. Thus an early computer that had
no support for, say, floating-point numbers had to be programmed to simulate
such calculations; even modern computers1 do not normally offer instructions
1 Many modern machine architectures follow the idea of the “Reduced Instruction Set Computer”
(RISC); design and programming at the RISC level often requires re-building concepts that were
in the instruction sets of earlier machine architectures.

© Springer Nature Switzerland AG 2020 1


C. B. Jones, Understanding Programming Languages,
https://doi.org/10.1007/978-3-030-59257-8_1
2 1 Programming languages and their description

that compute, say factorial, so this is programmed in terms of multiplication etc.;


similarly many sorting algorithms can be realised as programs.
• Even leaving aside the arcane language of Turing machines, programming at the
level of machine code is tedious and error-prone (see Section 1.2). The reason
for designing “high-level” languages (HLLs) is to get above this finicky way of
expressing programs and make it easier and more productive for programmers to
express their ideas.
Thus high-level languages for programming general-purpose computers are a
means of generating (via a compiler) a series of instructions that can be executed
on a digital computer and that realise concepts that are not directly available as
expressions of the language.

1.2 The importance of HLLs

Picking up the point about the productivity of programmers from the preceding sec-
tion, there was a panel discussion2 on Programming Languages and their Semantics
at a conference in Pittsburgh in May 2004 to which Vaughan Pratt put the intriguing
question of how much money the panelists thought that high-level programming lan-
guages had saved the world. Pratt was aware of the difficulty of the question because
he added a subsidiary query as to whether an answer to the main question would
qualify for a Nobel Prize in economics. Without hoping –even with time to reflect–
to provide a number, considering Pratt’s question is illuminating. There are almost
certainly millions of people in the world for whom programming forms a significant
part of their job. Programmers tend to be well paid. A good programmer today can
create –using a high-level programming language such as Java– systems that were
unthinkable when programs could only be communicated in machine code. A good
programming language can, moreover, ensure that many mistakes made by even an
average-level programmer are easily detected and corrected. To these powerful sav-
ings, ease of program migration can be added: avoiding the need to write versions of
essentially the same program for different machine instruction sets must itself have
saved huge wastage of time and money.
It is also important to appreciate the distribution of costs around programs: even
back in the days of mainframes, the majority of programs cost more to develop than
their lifetime machine usage costs. Since that period, decades of tracking Moore’s
Law [Moo65] have dramatically reduced the cost of executing programs. With mod-
ern interactive applications, and factoring in the human cost of user time, the actual
machine time costs are close to irrelevant. The productivity of programmers and
their ability to create systems that are useful to the end user are the paramount con-
cerns.
2 The panelists were John McCarthy, John Reynolds, Dana Scott and the current author.
1.2 The importance of HLLs 3

The mere fact that there are thousands3 of programming languages is an indica-
tion that their design is a subject of interest. The additional observation that there is
no one clear “best buy” suggests that designing a high-level programming language
is non-trivial. One tension in design is between offering access to the power of the
underlying machine facilities so that programs can be made to be efficient versus
providing abstractions that make it easier to create programs. The problems of writ-
ing programs are also likely to be exceeded by the costs of their maintenance, where
the intentions of the original programmer must be understood if the person changing
the program is to do so safely.
A good programming language offers several aids to the programmers who use
it to express their ideas:
• data structuring
• common forms of control can be built into a language (with only the compiler
having to fiddle with the specific machine-level instruction sequences that realise
the higher-level expressions)
• protecting programmers from mistakes
It is worth expanding on the issue of how programming languages provide ab-
stractions. Most computers have a small number of registers, in which all basic
computations are performed and instructions can only access one additional storage
cell. A calculation involving several values must –at the machine level– involve a
series of instructions and might require the storage of intermediate results. A first
level of abstraction allows programmers to write arbitrary expressions that have to
be translated into strings of machine operations.
Clear layers of abstraction can be seen with regard to data representation. The
storage of a computer can most easily be viewed as a sequence of small contain-
ers (bits, bytes or words).4 From its inception, the FORTRAN language supported
declaring arrays of multiple dimensions whose elements could be addressed in a
style familiar to mathematicians (e.g. A[I, J ∗ 3]). Such operands have to be trans-
lated into sequences of machine instructions that compute the machine address
in the sequence of addressable storage cells of the machine. The APL language
pushed arrays to extremes and even PL/I provides ways of manipulating slices of n-
dimensional arrays — such sub-arrays can then be manipulated as if they had been
declared to be arrays of lesser dimensions.
Array elements are all of one type. Both the COBOL and Pascal languages of-
fer ways of defining inhomogeneous records5 that facilitate grouping data elements
whose types differ from each other. Furthermore the whole inhomogeneous object
can be used (e.g. as parameters or in input/output) as a single data item or its com-
ponents can be addressed separately.
3 As early as 1969, Jean Sammet’s book [Sam69] recognised 500 programming languages; a web
site that claimed to be listing all known languages got to 8,512 in 2010 then gave up.
4 Of course, computer architectures normally include registers and might themselves provide ab-

straction such as “virtual memory” (supported by “paging”). Some of these features are discussed
when issues relating to code generation are considered in subsequent chapters.
5 Some languages, including PL/I, use the term “structures” rather than records.
4 1 Programming languages and their description

List processing facilitates the creation of arbitrary graphs of data by allowing the
manipulation of something like machine addresses as data. Early languages such as
IPL-V, Lisp and Scheme had to develop a lot of techniques for garbage collection
before list processing could be adopted into more mainstream languages.
The concept of objects is a major contribution to the abstractions, as offered in
object-oriented languages such as Simula, Smalltalk and Java. Object orientation is
discussed in Section 6.2 and its role in taming concurrent computation is the main
topic of Chapter 9.
A similar story of programming languages developing abstraction mechanisms
above the raw conditional jumps of machine level programming could be developed:
conditional if constructs, compound statement lists, for and while looping constructs
and –above all– recursion make it possible to present complicated programs as a
structured and readable text. Tony Hoare reported [Hoa81, p.76] that he could not
express his innovative Quicksort [Hoa61] algorithm until he learned the ALGOL 60
programming language.6 This almost certainly contributed to his judgement on AL-
GOL 60 in [Hoa74b]:
Here is a language so far ahead of its time, that it was not only an improvement on its
predecessors, but also on nearly all its successors. Of particular interest are its introduction
of all the main program structuring concepts, the simplicity and clarity of its description,
rarely equalled and never surpassed.

A final, but crucial, area where programming language designers have sought
to offer abstractions is that of concurrency.7 Most computers offer rather low-level
primitives such as a compare-and-swap instruction; programming even at the level
of Dijkstra’s semaphores [Dij62, Dij68a] is extremely error-prone. The whole sub-
ject of concurrency in programming languages is still in evolution and its modelling
occupies several chapters later in this book. References to histories of the evolution
of programming languages are given in Section 1.7.
Here, the concern is with the problem of knowing how to record the meaning –or
semantics– of useful abstractions such as those sketched above. Semantic descrip-
tion is a non-trivial problem and occupies Chapters 3–10 of this book. The payoff
for mastering these techniques is large and can have effects far beyond the language
design team. It is just not realistic to expect anyone to be able to design a program-
ming language that will overcome the challenges listed above by sketching sample
programs and then proceeding to compiler writing. In fact, such a procedure is a
denial of everything known about engineering. The ability to record the meaning of
a language at an abstract level means that designers can think out, document and
refine their ideas far less expensively than by coding processors. Furthermore, the
6 Although initially designed as a publication language (and the vast majority of algorithms pub-
lished in the Algorithms section of Communications of the ACM were written in ALGOL 60) the
language contributed so many fundamental concepts to programming language design that it has
had enormous influence (see [AJ18, §1.4]).
7 In contrast, so-called “weak” (or “relaxed”) memory is a hardware feature which might in-

flict considerable damage on software development because it is hard to find apposite abstrac-
tions [ŠVZN+ 13, LV16].
1.3 Translators, etc. 5

far bigger bonus is that users of better thought-through languages will become more
productive and stumble into far fewer unexpected “feature interactions”.
Before techniques for describing semantics and the case for formalism are dis-
cussed in Section 1.5, it is worth considering the software tools that process pro-
gramming languages.

1.3 Translators, etc.

Given that a programmer elects to write a program in a high-level language –say


L – and that the hardware on which the program is to run only obeys instructions in
its particular machine language,8 some tool is required to bridge the gap. Two key
tools are translators and interpreters.
Perhaps the more obvious tool is to write an interpreter program in machine
language. Such an interpreter would read in the program written in L and simulate
its behaviour step by step. This can be done, but pure interpreters tend to run rather
slowly. The alternative is to write a program (again in machine language) that can
translate any program of L into a sequence of machine instructions that have the
effect of the original program. The obvious name for such a program is a translator
but the commonly used term is to refer to “compilers” for L .9
In practice, the description above is a simplification to make the distinctions
clear.10 Rather than producing pure machine code, a compiler can translate to the
language of a virtual machine which is in turn interpreted on actual hardware. This
idea has significant advantages in reducing the task of supporting multiple lan-
guages. Furthermore, compilers or interpreters can at least partially be written in
high-level programming languages; this process is referred to as “bootstrapping”.
It is worth reinforcing the point about translation by considering just a few
examples. The focus in this book is on imperative programming languages.11 In
general-purpose languages, the key imperative statement is the assignment. (Other
8 Grace Hopper said [Hop81]:

In the early years of programming languages, the most frequent phrase that we heard was
that the only way to program a computer was in octal.

9 The origin of this word is explained in [Bey09] as deriving from the first attempts to automate
program construction by collecting (compiling) a group of subroutines. It is surprising that this is
the term that continues to be more commonly used for what is clearly a process of translation.
10 In a detailed study [vdH19] of the ALGOL 60 implementation by Dijkstra and his colleagues,

Gauthier van den Hove makes clear that, even early in the history of language processing, the
question of compiling and interpreting was seen less as a dichotomy and more as a spectrum.
11 Functional languages such as Miranda [Tur85] and Haskell [Hut16] make it easier to reason

about programs as though they were mathematical functions. Early implementations of functional
languages tended to perform considerably more slowly than imperative languages but this gap has
reduced and some serious applications are now written in functional languages. Logic languages
such as Prolog [SS86] make a further step both in expressiveness and in their challenge to offer
performance. (In fact, Prolog still has imperative features.) The techniques presented in this book
6 1 Programming languages and their description

imperative languages might move the arm of a robot, project an image or update a
database.) Most of the statement types actually only orchestrate the order in which
updates to variables are made by assignments.
As outlined above, straightforward expression evaluation has to be implemented
by loads, stores and single-address operations of the machine. But a compiler will
often try to optimise expression evaluation. For example “common sub-expressions”
might be evaluated only once. Even in early FORTRAN compilers, expressions
that occurred inside FOR loops but did not depend on variables whose values were
changed in the loop could be evaluated once before the loop. More subtly, expres-
sions such as those which compute array indexes in the loop could be subject to
strength reduction so that the effect of multiplication could be achieved by addi-
tion each time round a loop. Many of these optimisations are known as “source-
to-source” in the sense that there is an equivalent source program that represents
the optimised code. There are other optimisations such as those concerned with
maximising efficiency by minimising the number of loads and saves for registers
(especially index registers for address calculation) that cannot be expressed in the
source language. In either case, it is clearly essential that the “optimisations” do
not result in a program doing something different from the programmer’s legitimate
expectations. In other words, any optimisations must respect the semantics of the
given high-level language.
Similar points could be made about compiling control constructs. Most machines
provide a primitive (conditional) jump instruction. High-level languages offer far
more structured control constructs. The task of a compiler is to translate the latter
into the former in a way that results in efficient code. But, again, that low-level code
must respect the semantics of the programming language.
Three final points can be made about tools for executing high-level languages:

• The cost of building a translator for a high-level programming language is nor-


mally significant.12 Many arguments can be advanced against undertaking this
step too early in the design process for a new programming language. Clearly, if
some language deficiencies or irregularities can be resolved less expensively by
writing a formal semantics, this is a wise move. More worryingly, once a mis-
taken design choice is cemented in the code of a translator, the designer might be
far more reluctant to undertake the rework to correct the infelicity.
• The division of a compiler into lexical analysis, parsing, dictionary building, . . . ,
code generation provides useful analogies for the task of formal description of
languages — these are used in later chapters.
• There are also other important tools such as those that assist a programmer in
debugging programs written in some language L .
for describing the semantics of imperative languages would apply to both functional and logic
languages (see for example [AB87, And92]).
12 This can be reduced if translation to the language of an existing virtual machine is possible.
1.5 Approaches to describing semantics 7

1.4 Insights from natural languages

The languages that are spoken by human beings were not designed by committees13
— they just evolved and they continue to change. The evolution process is all too
obvious from the irregularities in most natural languages. The task of describing
such natural languages is therefore very challenging but, because they have been
around longer, it is precisely on natural languages that the first systematic studies
were undertaken. Charles Sanders Peirce (1839-1914) used the term Semiotics for
the study of languages. Peirce14 divided the study of languages into:

• syntax: concerning the structure of utterances in a language


• semantics: about the meaning of the language
• pragmatics: covering the intention of using the language
Heinz Zemanek applied the terminology to programming languages in [Zem66] but
work on formalising the syntax of programming languages goes back to the ALGOL
effort in the late 1950s.
As shown in Chapter 2, it is not difficult to write syntax rules for parts of natu-
ral languages but, because of their irregularity, a complete syntax is probably not a
realistic objective. It is far harder to give a semantics of a language (than to write
syntactic rules) and Section 1.5 expands on this topic, which then occupies the ma-
jority of the following chapters.
One way of appreciating the distinction between syntax and semantics is to con-
sider some questions that arise with programming languages:
• Ways to fix the nesting of expressions (e.g. 2 + 3 ∗ 4 vs. (2 + 3) ∗ 4) is a syntactic
question.
• Another syntactic question is how to fix to which test the else clause in
if a = b then if c = d then x: = 1 else x: = 2
applies.
• Choosing which of the many possibilities of parameter passing modes is to be
included in a language is a semantic question.
• Deciding whether to under-determine the results expected by a program is cer-
tainly a semantic decision and the role of non-determinism in programming lan-
guages is particularly important in the context of concurrency (see Chapter 8).

1.5 Approaches to describing semantics

Some general points about semantics can be made concrete by looking at a few
specific programs. The following program (in a syntax close to that of ALGOL 60):
13 Of course, there are a small number of exceptions such as Volapük and Esperanto.
14 Pronounced “Purse”.
8 1 Programming languages and their description

begin integer n, fn;


...
begin integer t;
t : = 0;
fn : = 1;
while t 6= n do
t : = t + 1;
fn : = fn ∗ t;
od
end
end
computes the factorial of the (integer) value of the variable n and places the result
in variable fn. A formal justification of this fact is contained in Section 7.3 but it is
apparent that such a claim can only be based on an understanding of the meaning of
the statements of the language in which the program is written. Thus it is clear that
one role for a semantic description of a language –say L – is to be able to reason
about the claim that a program written in language L meets its specification. (This
notion is examined in detail in Chapter 7.)
But, if it were the case that a programmer presented an argument –possibly even
a formal proof– that a program met its specification and then a purported compiler
for L introduced errors in the sense that the machine code created by the compiler
was not in accord with the semantics of L , the programmer would have every right
to be aggrieved. So it is clear that a key role for a semantic description of a language
is to remove this risk: any compiler or interpreter for L must realise the semantics
of L . (A formal statement of this notion is given in Section 3.3.)
Thus the semantics should mediate the bridge between programmers using L
and implementers of language L so that the former group expect and the latter
group deliver the same meaning. Faced with the large challenge of getting a com-
puter to behave in an intended way, the semantics provides a “division of concerns”:
programs should be written on the assumption of the recorded semantics and pro-
cessors for the language should reflect that semantics.
There are also other interesting questions. Consider the following alternative pro-
gram:
begin integer n, fn;
..
.
fn : = 1;
while n 6= 0 do
fn : = fn ∗ n;
n : = n − 1;
od
end
This also has the effect of placing in fn the factorial of the initial value of n. If
the earlier program included n : = 0 after the while loop, the two programs might
1.5 Approaches to describing semantics 9

be considered to be equivalent in some sense. Making such notions of equivalence


precise is another semantic issue. (These issues of what it means for programs to
be equivalent become clearer with larger programs such as those for sorting: many
sorting algorithms have been devised (see [Knu73]) but two such programs can be
unrecognisably different from each other.)
It is time to discuss different approaches to recording the semantics of program-
ming languages. If one knows one natural language, another language might be
explained by translating it into the known language (although nuances and beauty
might be lost in translation). So an option for giving the semantics of language L
is to record a translation into a known language. This is, of course, exactly what
a compiler does but unfortunately machine code is not an attractive lingua Franca
for recording semantics. The problem with machine code as a vehicle for explaining
semantics to a human being is that its own semantics might be opaque. Of more con-
cern –and a clearer criteria– is that machine code is not tractable in the sense that
there is no natural way of reasoning about texts in machine language. An approach
that was originally called mathematical semantics, but is now commonly referred
to as denotational semantics, defines semantics by mapping into mathematically
tractable objects. This approach is described in Section 7.1 and commonly uses
mathematical functions from states to states as denotations.
Denotational semantics is mathematically elegant but requires some fairly so-
phisticated mathematical concepts in order to describe programming languages of
the sort that are used to build real applications. Taking a cue from the class of lan-
guage tools that are known as interpreters points to a more direct approach to pro-
viding the semantics of a programming language. A so-called operational semantics
provides a way of taking a program and a starting state and computing its final state.
Again, it could be said that this is exactly what an interpreter written in machine
code does but the key to a clear operational semantics is to write an abstract in-
terpreter in a limited meta-language. Such meta-languages should themselves be
tractable so that it is straightforward to reason about the description. The majority
of chapters in this book employ operational methods of semantic description and
Section 1.6 describes the meta-language used throughout this book.
The notion of a state is central to both denotational and operational semantics.
The two approaches share the need to choose states that are as abstract as possi-
ble; both can therefore be viewed as offering model-oriented language descriptions.
In contrast, it is possible to consider property-oriented approaches to semantics.
One obvious way to convey information about the meaning of complex features
of a programming language is to describe their meaning by relating them to sim-
pler constructs in the same language. Early attempts to use this idea formally in-
clude [Bek64] and it can be seen in less formal descriptions in, for example, the
way that [BBG+ 63] describes the for statement of ALGOL 60. This approach can
be compared to the way in which a mono-lingual dictionary defines the more arcane
words in terms of a limited subset of the vocabulary of a natural language. There is
of course an inherent circularity about this approach in that a reader must be able
to understand some expressions in a language but it is certainly possible to explain
less familiar features such as “call by name” in ALGOL 60 by their translation to
10 1 Programming languages and their description

simpler subsets of a language. Notice that equivalences provide semantic knowledge


without any notion of the state of a computation having to be described
A more radical –and now more widely used– approach that can be viewed as giv-
ing a property-oriented semantics is to provide ways of of reasoning about programs
in a language L . The idea of adding assertions to programs has a surprisingly long
history (see Section 7.3.1) but the really important step was made by Tony Hoare
who introduced an approach known as axiomatic semantics. Essentially, this ap-
proach provides rules of inference that facilitate proofs about programs and their
specifications. Section 7.3 goes into some detail on such axiomatic approaches.
The tasks of reasoning about programs in a language L and justifying the cor-
rectness of a translator for L are distinguished above. It can be argued that one or
another approach to semantics is better suited to the different tasks (this topic is re-
viewed in Section 7.5). But it should be clear that, if more than one approach is used,
they must be shown to be coherent in the sense that they fix the same semantics.
The bulk of this book uses operational semantic descriptions because the aim
is to equip the reader with the ability to describe useful programming languages.
(Chapter 7 reviews the other potential approaches.)
The above division of approaches to giving semantics can even be discerned
when looking at informal descriptions of programming languages that are contained
in most textbooks, although it is also true that most modern textbooks put heavy re-
liance on examples that the reader has to somehow “morph” to solve their actual
problem.15 What then is the case for promoting formality in descriptions of pro-
gramming languages? Although main-line programming languages (and –today–
their indispensable libraries) are orders of magnitude larger than the formal meta-
language described in Section 1.6, the desirability of them being as tractable as
practical carries over to programming languages. For example, programmers are
unlikely to use language constructs safely if a phrase in a language has unexpect-
edly different meanings depending on the context in which the phrase is embedded.
A clear test of a language being tractable is the ease of writing out formal rules of
inference for the language.
Furthermore, if users can be given a clear mental model of the state of a pro-
gramming language, they can understand the meaning of each construct by seeing
how it affects that state. With both considerations (properties and models of a lan-
guage), one way of testing clarity is to be able to record the ideas formally. As with
any piece of knowledge, such a record makes it available for review and subsequent
study. A compiler or interpreter for language L is itself “formal” — but its con-
struction costs far more than does a formal language description and a compiler is
certainly not tractable in the sense that it would be convenient to reason from the
compiler about programs in L .16
15 This “use case” approach applies to many physical objects and their manuals fail to give the user
any picture of the internal state of the object with which they are trying to interact.
16 A more subtle facet of the question of relying on a compiler comes from the thorny issue of

non-determinism: most HLLs actually permit a range of results (e.g. because of concurrency or
to leave implementors some flexibility): even if a user is interested in the result of a program on
1.6 A meta-language 11

As indicated in Section 1.2, a premature leap from example programs for a new
language to beginning to write a compiler for the language does not constitute sound
engineering. A process of experimenting with language choices within a formal
model can iron out many potential consistencies more quickly and far less expen-
sively. The formal model can also serve as the starting point for a systematic design
process for compilers once the language has been thought out.
Chapter 11 lists a number of formal descriptions of extant programming lan-
guages. One possibility opened up by making these descriptions formal is to pro-
vide tools that use them. There is quite good support for reasoning about program
correctness from various forms of property-oriented semantics, although this nor-
mally applies to restricted subsets of major languages such as SPARK-Ada. There
are far more tools based on formal ideas that check specific properties of programs
in languages (e.g. possible dereferencing of null pointers, deadlock detection).
Having listed the technical criteria of being able to reason about programs written
in L and acting as a base for compilers for L , there remains a bigger objective. The
main aim of this book is to ensure that formal models are more widely used in the
design of future programming languages. It is to be regretted that most of the current
main-line programming languages have semantic traps that surprise programmers
and/or complicate the task of providing compilers for the language. Such anomalies
can be detected early by writing formal semantic descriptions before tackling the
far more costly job of programming a compiler.
What then is the impediment to writing, for example, an operational semantics
of a language? Section 1.6 introduces a meta-language that should not prove dif-
ficult for any programmer to understand. With that one meta-language, he or she
can describe any (imperative) programming language. Chapter 3 covers the basic
method of writing an operational semantics and subsequent chapters consider new
challenges and eight known techniques for coping with them. Experience of teach-
ing these methods over the years suggests that the real hurdle is learning to employ
the right degree of abstraction in tackling language descriptions. That can proba-
bly only be learned by looking at examples, and Chapters 3–9 provide many such
examples.

1.6 A meta-language

The term object language can be used to refer to the language whose syntactic and
semantic description is to be undertaken17 and the script letter L is used when
making a general point rather than discussing a specific object language such as
FORTRAN or Java. In contrast, languages that are used in the description of an
object language are referred to as meta-languages.

a single input item, knowing that the result is as required in one implementation of L does not
guarantee that the program will give the same result on a different correct implementation of L .
17 The qualification “object” indicates that it is the object of study; this is not to be confused with

“object code”, which is what a translator generates when it compiles a source program.
12 1 Programming languages and their description

A meta-language is itself a formal language. To serve the purpose of describing


a range of programming languages:
• A useful meta-language must be capable of describing a large class of object
languages — it must be “rich enough” for its intended task.
• A meta-language should be far smaller than most programming languages.
• Crucially, any meta-language should be tractable in the sense that there are clear
rules for reasoning about its expressions.
The meta-language used in this book is derived from (but is a subset of) the
notation used in the Vienna Development Method (VDM). A brief outline of the
origins of VDM is given in Section 3.3.
The reader is assumed to be familiar with set notation;18 Figure 1.1 indicates
the symbols used as logical operators in VDM. Fortunately, textbooks use fairly
uniform set notation and the only points worth mentioning from Figure 1.1 are:
• rather than use a special symbol (φ ), VDM uses { } for the empty set because it
is just a special case of an enumerated set with no elements;
• the type of all finite subsets of some type X is written X-set;
• the set of all (finite or infinite) subsets is written (conventionally) as P(X);
• the name of the set of natural numbers is N = {0, 1, · · ·}, the set of all integers
Z = {· · · , −1, 0, 1, · · ·} and the set of Boolean values B = {true, false}.

T-set all finite subsets of T


{t1 , t2 , . . . , tn } set enumeration
{} empty set
B {true, false}
N {0, · · ·}
Z {· · · , −1, 0, · · ·}
{x ∈ S | p(x)} set comprehension
{i, · · · , j} subset of integers (from i to j inclusive)
t∈S set membership
t∈
/S ¬ (t ∈ S)
S1 ⊆ S2 set containment (subset of)
S1 ⊂ S2 strict set containment
S1 ∩ S 2 set intersection
S1 ∪ S 2 set union
S1 − S 2 set difference
card S cardinality (size) of a set
P(X) power set

Fig. 1.1 Set notation

Notation for VDM sequences is introduced in Section 2.2 (see Figure 2.2) and
maps in Section 3.1 (Figure 3.1) when they are needed.
18 Many useful textbooks exist on the notations of discrete mathematics including [Gro09].
1.6 A meta-language 13

A call for abstraction pervades work on modelling computer systems in general


and in giving the semantics to programming languages in particular: as such, “ab-
straction” is a Leitmotiv of this book. For example, if the order of a collection of
objects has no influence on the semantics of a language, it is far better to employ a
set than a sequence. It might be possible to express the semantics in terms of a se-
quence but the description will have to cope with messy details; far more tellingly,
any reader of the formal description is left to determine whether the order does in
fact influence the semantics by reading every line of the description. In contrast, as
soon as a reader sees that something is modelled as a set, it is abundantly clear that
the order of its elements can have no semantic effect.

B {true, false}
¬E negation (not)
E 1 ∧ E2 conjunction (and)
E1 , E2 are conjuncts
E1 ∨ E2 disjunction (or)
E1 , E2 are disjuncts
E 1 ⇒ E2 implication
E1 antecedent, E2 consequent
E1 ⇔ E2 equivalence
∀x ∈ S · E universal quantification
∃x ∈ S · E existential quantification

Fig. 1.2 Logic symbols

The symbols used for logic (technically, first-order predicate calculus) vary be-
tween textbooks and Figure 1.2 indicates the symbols used in this book.
It is common to set out proof rules that define valid deductions about the logical
operators. Examples that are assumed below include a definition of implication:
¬ E1 ∨ E2
⇒ -I
E1 ⇒ E2
equivalence as bi-implication:
E1 ⇒ E2
E ⇒ E1
⇔ 2
E1 ⇔ E2
What can be thought of as a definition of disjunction in terms of conjunction is
characterised by the bi-directional rule:
¬ (¬ E1 ∧ ¬ E2 )
de-Morgan-1
E1 ∨ E2
is one of de Morgan’s laws; another is:
¬ (E1 ∨ E2 )
de-Morgan-2
¬ E1 ∧ ¬ E2
14 1 Programming languages and their description

There is, however, an interesting extension in VDM to conventional logic in that a


Logic of Partial Functions (LPF) is used. The reader should have no difficulty with
an innocent reading of the propositional connectives listed in Figure 1.2 but LPF
offers a principled extension to cope with the situation where operands can be “un-
defined”. An obvious example is the proposition 5/0 = 0 which –since division by
zero means that the arithmetic term (5/0) fails to denote a number– is taken as “fail-
ing to denote a truth value”. Far more useful examples of partial expressions arise
in both specifications and reasoning about such documents and attention is drawn
to examples in later chapters — but it is important that the obvious interpretation of
such logical expressions works; more detail is given in Section 1.7.3.

1.7 Further material

1.7.1 Further reading

An excellent source of material on the history of programming languages them-


selves is the series of conferences on History of Programming Languages [Wex81,
BG96, RH07] — the first of these is a real gem. The PL/I language is mentioned
several times throughout the current book and some of these mentions indicate the
ways in which the interactions between language design decisions can result in con-
fusion. George Radin’s [Rad81] account of the creation of PL/I throws some light
on how committee compromises can complicate a language. However, the use of
PL/I to illustrate excesses in language design comes more from the current author’s
familiarity with PL/I than as a claim that it is the language that suffers the worst
interaction of language features.
Another way to read the words of the masters is to access the Turing Award
talks — printed versions include [Knu74a, Hoa74b, Sco77, Bac78, Wir85, Mil93,
Ive07]; further wise words are in [Hoa81, Wir67]; specific language discussions
include: [Knu67], [PJ03] and [Hut16].
An extremely useful book on concepts in programming languages is [Sco00] and
it could be useful to read Michael Scott’s book alongside the current text. Another
book that covers a range of languages and provides useful historical background
is [Seb16]. References on approaches to the formal description of programming
languages are given in the closing sections of later chapters of the current book.
There are actually two aspects of VDM itself: it offers a formal development
approach for any form of program and it has specific support for the denotational
description of programming language semantics. The current book uses only the
simplest common features of these two aspects. A general book on VDM is [Jon90]
and the ISO standard for VDM is described and referenced in [PL92]. The semantics
of full VDM is complicated by the fact that it was designed to write denotational
semantic descriptions (see Chapter 7); the subset used here for operational semantics
should be clear.
1.7 Further material 15

1.7.2 Classes of languages

This book tackles the semantics of imperative languages such as ALGOL and Java.
Descriptions of functional and logic programming languages (e.g. Scheme [ASS85],
Prolog [SS86]) would use the same ideas but it is worth saying a few words about
the differences. Rather than design algorithmic solutions to solve problems, it would
be attractive to write logical assertions and have a program find solutions. Even
in the restricted world of mathematics or logic19 this is impossible in general, but
Prolog-style logic programming moves in this direction. Unfortunately, in order to
circumvent the problems of massive search spaces, imperative features have been
included in Prolog itself [SS86].
An intermediate approach between fully imperative and logic languages is the
class of functional programming languages. In the extreme, such languages avoid
all imperative constructs such as assignment. This makes it possible to reason
about functional programs as though they are mathematical functions. Among other
things, this avoids the need for a Hoare-style logic. Most functional languages actu-
ally offer some limited ability to “change the world”.

1.7.3 Logic of Partial Functions

As indicated above, the logic used in the VDM meta-language is an extension of


standard first-order predicate calculus (see for example [MS13]). The need for a
Logic of Partial Functions (LPF) comes from the frequency with which reasonable
expressions in specifications involve terms that can fail to denote a value.
Writing the specific expression 5/0 = 0 would be bizarre but the following is
more reasonable:20
i > 0 ∧ j 6= 0 ⇒ i/j ≤ j
where the troublesome i/0 is one instance of i/j.
Far more useful examples arise in both specifications and reasoning about such
documents and attention is drawn to examples in later chapters, but it is important
that the obvious interpretation of such logical expressions works — for example,
while the antecedent of the preceding implication does not guard the consequent in
classical logic, the implication in LPF has the desired effect.
For example, the head (first element) of an empty list is undefined and applying
a mapping (finite function) to an element not in its domain fails to denote a value.
LPF offers obvious extensions to the normal meanings of propositional operators
as in Figure 1.3 where an operand that fails to denote a truth value is marked as an
asterisk.
19 It is by no means obvious how to develop or validate specifications of systems that interface to
the physical world. Some work in this area is described in [JHJ07, JGK+ 15, BHJ20].
20 Such an expression is better written with type constraints and these are used below but do not

cover all cases.


16 1 Programming languages and their description

The reason that the reader should have no difficulty with these extended meanings
is that key properties such as the symmetry of conjunction and disjunction hold:
E1 ∨ E2
∨ -sym
E2 ∨ E1

E1 ∧ E2
∧-sym
E2 ∧ E1
In fact, the key difference with conventional propositional logic is that the so-called
“law of the excluded middle” (P ∨ ¬ P) only holds in LPF where it is established
that P denotes a truth value.

a b ¬a a∧b a∨b a ⇒ b a ⇔ b
true true false true true true true
∗ true ∗ ∗ true true ∗
false true true false true true false
true ∗ ∗ true ∗ ∗
∗ ∗ ∗ ∗ ∗ ∗
false ∗ false ∗ true ∗
true false false true false false
∗ false false ∗ ∗ ∗
false false false false true true

Fig. 1.3 LPF extensions of propositional operators

Quantifiers are in no way mysterious. Over finite sets, they are just convenient
abbreviations:
(∃i ∈ {1, · · · , 3} · p(i)) ⇔ (p(1) ∨ p(2) ∨ p(3))
(∀i ∈ {1, · · · , 3} · p(i)) ⇔ (p(1) ∧ p(2) ∧ p(3))
Even the infinite cases should present no difficulty:
∀i ∈ N · ∃j ∈ N · i < j
With all of the quantifiers, the scope is assumed to extend as far as possible to
the right; parentheses are not required for this case but they can be used to define
different grouping.
This leaves only the end cases with the empty range for the bound variable to
note:
∃i ∈ { } · p(i) ⇔ false
∀i ∈ { } · p(i) ⇔ true
which are obviously related from the quantifier versions of de Morgan’s laws:
¬ (∃x · p(x))
de-Morgan-3
∀x · ¬ p(x)
1.7 Further material 17

¬ (∀x · p(x))
de-Morgan-4
∃x · ¬ p(x)
There are other logics that attempt to handle terms that fail to denote a value
and a comparison is given in [CJ91]. Details of the specific LPF used in VDM
are addressed in [BCJ84, JM94]. Kleene (in [Kle52]) attributes the propositional
operator definitions in Figure 1.3 to [Łuk20]. Other papers that address the issue of
undefinedness include [Kol76, Bla86, KTB88, Bli88].
Chapter 2
Delimiting a language

The body of this book addresses the task of describing –or designing– the semantics
of programming languages. This chapter prepares the way for that task by introduc-
ing the division between syntax and semantics. A tiny language is introduced which,
because it has few surprises, can be used to explain the description method. As more
complicated language features are considered in later chapters of this book, they are
treated independently as far as is possible (e.g. input/output is modelled in Sec-
tion 4.3.1 and a similar extension could be made to the concurrent object-oriented
language in Chapter 9).
For an extant language,1 it is necessary to delimit the set of allowed programs
before their meaning can be discussed: Section 2.1 outlines “concrete syntax” no-
tations for fixing the textual strings of an object language (such strings include var-
ious marks that make it possible to parse the strings); Section 2.2 addresses a way
of defining the “abstract syntax” of programs without the symbols needed to facili-
tate parsing. This chapter also covers most of the VDM notation used in the current
book. The topic of semantics is first tackled in Chapter 3 and runs throughout the
remainder of this book.

2.1 Concrete syntax

Any interesting language allows an unbounded number of different “utterances”. It


is therefore not possible to enumerate all of the allowable strings of characters in a
language.
It is not difficult to devise meta-languages with which to define the set of plausi-
ble programs of a language. Many of the notations used are close relatives of Backus
1 A Leitmotiv of the remaining chapters of this book is the value of using formal models in the
design of languages but this topic is postponed until the basic description tools have been covered
in the current chapter.

© Springer Nature Switzerland AG 2020 19


C. B. Jones, Understanding Programming Languages,
https://doi.org/10.1007/978-3-030-59257-8_2
Another Random Scribd Document
with Unrelated Content
ce moment, une forme s’approcha : je reconnus le douanier qui
m’avait donné, l’année précédente, le nom et l’adresse de celle qui
était aujourd’hui ma femme.
— Un peu d’air fait du bien, n’est-ce pas ? me dit-il.
— Oui, en vérité, répondis-je.
Et, feignant d’être tout heureux de la rencontre, je l’emmenai
prendre un verre au Rocher de Cancale.
Vers les deux heures du matin, les gens de la noce vinrent, aux
sons d’une musette et d’un accordéon, nous reconduire dans la
haute ville, et je dus boire encore avec eux, avant de rejoindre Adèle
dans sa chambre. Lorsque j’y pénétrai, elle était au miroir, qui
défaisait sa coiffure. La cornette ôtée, ses lourds cheveux
s’épandirent, l’enveloppèrent toute d’un flot sombre où des clartés
frissonnaient çà et là, comme des lueurs d’astres sur un étang
nocturne. J’en rassemblai par derrière deux pleines poignées et, y
plongeant mes lèvres, mes yeux, tout mon visage, sans que j’eusse
su dire si c’était d’amour ou de désespoir, je fondis en sanglots.

Les jours, les ans qui suivirent n’ont pas d’histoire. En me


retournant vers ce passé, je vois des pays gais, riches en moissons,
des estuaires d’eau profonde entre des collines boisées, des nappes
de mer aussi délicatement nuancées que le plumage des mouettes,
et les bourgs, des villages, — les jolis villages de là-bas, avec leurs
toits d’ardoises claires qui semblent dire au voyageur : « Arrête-toi.
Qu’irais-tu chercher plus loin ? Le bonheur est ici ! »
Nous habitâmes tour à tour les postes de Bodic, de Port-Béni, de
Lantouar. Tous, des phares terriens, situés sur les hauteurs
verdoyantes ou à l’embouchure des rivières salées du Trégor. Il eût
été difficile de rêver à notre félicité des nids plus charmants. Nous y
vivions, Adèle et moi, côte à côte, jamais séparés. Les nuits même,
lorsque j’étais de quart, elle les passait avec moi dans la lanterne.
Ces veillées aériennes dans la grande lumière éclatante, lui étaient
un prétexte à mille imaginations délicieuses ou folâtres. Élevée,
toute petite, sur les genoux des conteuses trégorroises, adonnée
plus tard, dans le désœuvrement de ses après-midi solitaires, aux
lectures les plus romanesques, elle avait à un degré surprenant
l’esprit fécond et la verve ingénieuse de sa race… Sa fantaisie, tout
naturellement, créait des merveilles.
Elle disait, par exemple : « Nous sommes des châtelains de
l’ancien temps ; c’est fête, ce soir, dans notre donjon. Des seigneurs
chamarrés d’or, des dames en robes de brocart montent l’escalier.
Des ménestrels aussi vont venir. Écoute ! Ce que tu prends pour le
souffle du vent dans les ramures ou le fracas lointain de la mer
parmi les galets, c’est le son de leurs violes qu’ils accordent. Ils
s’apprêtent à célébrer tes exploits et la beauté de ta noble épouse.
Tendons l’oreille, mon doux sire !… » Ou bien elle disait encore :
« J’étais une princesse captive. Une magicienne perverse m’avait
enchaînée dans cette prison. La tour où je languissais jetait dans la
nuit des lueurs si effrayantes que les chevaliers les plus courageux
n’en osaient approcher. Mais, un jour que je me peignais sur mon
balcon, tu me vis, tu m’aimas, et tu fis le serment de me délivrer, de
rompre le mauvais sort qui pesait sur mon destin. Rappelle-toi ! Un
ermite te remit une lance dont la pointe avait été trempée dans le
sang du Christ. Armé de cette lance, tu éventras les dragons,
vomisseurs de feu. Mais, quand tu voulus atteindre jusqu’à moi, les
échelles que tu appliquais au mur cassèrent l’une après l’autre.
Alors, ayant tressé mes cheveux en deux longues nattes, je les
laissai pendre et tu les saisis. Et maintenant nous voici mari et
femme, et, pour que tout s’achève comme dans les contes, nous
allons avoir beaucoup d’enfants… »
Des enfants !… Cela seul manquait à nos vœux… Il ne nous en
est pas né, Dieu merci !
Ces fictions d’Adèle enchantaient mes nuits de garde. Je
l’écoutais avec ravissement. Elle m’apparaissait comme un être
d’une essence supérieure. Je l’admirais.
— Vous autres, filles du Trégor, lui disais-je, vous avez eu des
fées pour aïeules ; elles vous ont légué des secrets magiques. Les
femmes de chez nous ne savent que prier les saints et filer de la
laine. Toi et tes pareilles, vous êtes des tisseuses de beaux rêves.
Tu dois me trouver bien stupide, en comparaison des jeunes
hommes de ton pays qui t’ont désirée avant que tu sois devenu
mienne. Je suis, en effet, le fils d’une race lourde et grossière,
enfermée dans un cercle étroit. Tu aurais tort de me mépriser,
toutefois. Nous avons aussi nos qualités, en Léon. Aucune légèreté
d’esprit, il est vrai, mais par contre, une constance à toute épreuve.
Quand nous nous sommes donnés, nous sommes incapables de
nous reprendre. Nous aimons d’un amour fort comme la mort.
Elle ripostait en riant :
— C’est pourtant vrai que tu n’es pas comme tout le monde. On
voit bien que tu as été élevé pour la prêtrise, dans une contrée où
les jeunes filles se croiraient damnées, si elles chantaient ailleurs
qu’à la messe. Tu parles de tout, et même de l’amour, sur un ton
prêcheur. Au fond, tu n’es peut-être pas très sûr que le mariage ne
soit pas un péché. Avoue que tu me considères presque comme une
créature de perdition…
Je lui fermais la bouche avec des baisers. Les siens avaient une
saveur subtile, pénétrante, et qui enivrait… Mais non ! non ! pas de
ces souvenirs ! Leur poison m’énerverait. Ouvrons plutôt au vent de
la nuit, à l’air vierge, à l’air irrespiré des grandes solitudes
atlantiques.

Je viens de passer quelques minutes sur la galerie. La brise est


tombée avec le jusant. Le ciel est à la brume. Le feu des Pierres-
Noires, tout à l’heure très distinct, se recule et s’efface. La Pointe du
Raz elle-même n’est plus qu’une haute silhouette sombre, vers
l’orient : elle a son aspect des mauvais jours, le profil indécis et
menaçant d’une terre-fantôme. Ainsi nous apparut-elle, lorsque nous
y arrivâmes d’Audierne, Adèle et moi, dans une charrette de roulier
que nous avions frétée à Quimper pour le transport de nos meubles
et de nos personnes.
Ma nomination de gardien-chef au phare de Gorlébella m’était
parvenue dans la semaine, à Lantouar, mon troisième poste. C’était
un avancement inespéré : je comptais à peine cinq ans de services.
Il m’avait causé néanmoins plus de déplaisir que de joie. Adieu la vie
parfaite, le repos et le travail en commun, les chères veillées à deux
dans la lanterne ! Je ne serais plus sous le toit de ma femme qu’un
hôte intermittent. Pour quinze jours de présence, un mois de
séparation ! Les deux tiers de l’année à me dessécher loin d’elle,
captif des eaux, l’esprit perpétuellement obsédé de son image ! Et
elle, la fine et frêle fleur du Trégor, comment supporterait-elle sans
dépérir cette transplantation soudaine au dur pays des Capistes ?
Comment, surtout, cet isolement dans l’exil ?… Je voulais refuser.
Ce fut Adèle qui s’y opposa :
— Partons ! dit-elle délibérément.
Dans le train, elle me confessa qu’elle n’était pas fâchée de
connaître d’autres horizons, une autre Bretagne, un autre peuple.
— Je suis la fille de mon père, vois-tu. Par lui, un peu de
l’humeur inquiète des marins et de leur goût d’aventures a passé
dans mes veines. C’est pourquoi j’ai constamment repoussé les
bourgeois de Tréguier qui se disputaient ma main : c’étaient des
boutiquiers, des gens établis. Changer de comptoir ? Ma foi, non ! Je
n’avais que trop moisi dans notre vieille salle de la rue Colvestre.
J’étais comme une giroflée des murs qui cherche l’air ; j’avais soif de
mouvement, de nouveauté… Je n’aurais pas non plus épousé un
matelot. Les matelots, cela voyage, mais leurs femmes piétinent sur
place à les attendre. Si tu n’étais pas entré dans les phares, tu ne
m’aurais pas eue.
— Prends garde, répondis-je, ce que l’on va quérir ne vaut pas
toujours ce que l’on quitte.
Elle haussa les épaules, me traita de « Léonard », de « planteur
de choux », ce qui était sa grande injure, quand, avec la maladresse
qui m’était habituelle, je froissais involontairement ses rêves.
Jusqu’à Audierne, la fuite et la diversité des paysages la tinrent
en gaieté. Elle s’amusait de la démarche alourdie des
Cornouaillaises, de leurs coiffes étranges, comme on n’en voit plus
que dans les miniatures des livres anciens, de leur breton aussi, qui
lui semblait une autre langue, tant la prononciation locale la
déconcertait.
Mais, lorsque nous nous fûmes engagés dans la route du Cap,
ses yeux s’assombrirent devant ces vastes étendues dénudées, à
peine hérissées çà et là d’un bouquet d’ormes rachitiques, et dont la
mélancolie du soir d’octobre accentuait encore la tristesse et la
sauvagerie. Des vols de corbeaux se levaient des labours,
regagnant leurs gîtes dans les pinèdes lointaines, vers Beuzec et
Douarnenez. De distance en distance, se profilait un manoir isolé,
d’aspect tragique et sur qui semblait planer le souvenir d’un crime.
La mer demeurait invisible, mais on entendait son grondement sourd
et, par intervalles des coups de ressac si puissants qu’ils ébranlaient
le sol, faisaient trembler la terre dans ses profondeurs. A partir de
Plogoff, Adèle ne parla plus. Moi-même je me taisais, écoutant
sonner les sabots de l’attelage sur les dalles de granit brut dont le
chemin était comme pavé. Une brume, d’heure en heure plus
épaisse, flottait maintenant sur les choses, ainsi qu’une poussière
salée ou quelque mystérieuse fumée d’océan. Dans cette brume,
une sorte de cime s’estompa. Notre conducteur, nous la désignant
du manche de son fouet, dit :
— C’est la Pointe !
Des deux gardiens que j’allais avoir sous mes ordres, il n’y en
avait qu’un de marié. Nous trouvâmes sa femme qui nous attendait
dans l’enclos de la caserne. C’était une Ilienne de Sein, toute vêtue
de noir, à mine sévère et d’humeur concentrée. Après qu’elle nous
eut fait visiter notre logis, Adèle lui demanda de nous montrer au
large le feu de Gorlébella.
— Suivez-moi, répondit la femme, mais assujettissez bien
chacun de vos pas, car les sentiers sont glissants.
Nous nous enfonçâmes derrière elle dans la nuit. Tout en
marchant, elle nous renseignait d’un ton bref :
— Ce bruit, sur notre gauche, c’est l’Enfer du Raz… Cette grève,
au pied de la falaise, c’est la Baie des Trépassés…
L’Enfer ! Les Trépassés ! ces mots nous glaçaient, et il n’était pas
jusqu’à cette femme en noir, dans tout le noir, tout l’inconnu de ces
lieux sinistres, qui ne nous inspirât je ne sais quelle angoisse mêlée
d’épouvante.
— Gorlébella ! dit l’Ilienne.
Une pâle lumière verdâtre trouait au loin les ténèbres de l’abîme.
Et notre guide continuait :
— Cet autre feu, là-bas, c’est le phare de Sein. Cet autre, tout là-
bas, c’est l’Ar-Mèn.
Nous ne regardions que Gorlébella. Adèle, pressée contre moi,
frissonnait ; d’un geste brusque, elle se cacha le visage dans ma
poitrine et se mit à pleurer en silence. A ce moment, un de ces
oiseaux de mer qu’on appelle des fous nous frôla presque de ses
ailes, décrivit au-dessus de nos têtes deux ou trois cercles, puis
plongea, comme une flèche, dans l’obscurité béante. Et j’eus le
pressentiment très net que ce pays farouche, voué jadis à d’horribles
holocaustes, nous serait fatal.
III

De toute la nuit dernière, il m’a été impossible d’écrire une ligne.


J’avais eu dans la journée une si chaude alerte que, douze heures
après, je n’en étais pas encore remis. Voici la chose, mon ingénieur.
Elle est de celles qui se doivent consigner sur les feuilles de service.
Je venais, le feu éteint, de terminer le nettoyage de l’appareil et
j’allais être libre de m’allonger sur ma couchette pour prendre un peu
de repos. Mais il me restait à m’assurer d’abord — vous devinez
sans doute à quelle fin — qu’aucune des barques du continent ou de
l’île, en se rendant sur les lieux de pêche, ne louvoyait à portée du
phare. C’est une précaution à laquelle je n’aurai garde de faillir, tant
que tout ne sera point consommé. Je passai donc sur la galerie
extérieure. La brume de la veille s’était dissipée ; le ciel, toutefois,
demeurait chargé, dans l’ouest, et la houle se cassait en une infinité
de lames courtes, comme il arrive quand le Raz couve de méchants
desseins. La mer, à perte de vue, était vide. Les bateaux
homardiers, les seuls qui fréquentent assidûment ces parages,
avaient sans doute flairé le gros temps, et pas une voile n’était
sortie.
Je me félicitais déjà de cette constatation, lorsqu’en me tournant
vers le nord, j’aperçus une fumée légère qui se déroulait à fleur
d’horizon, dans les lointains du chenal du Four. Un vapeur de Brest,
évidemment. J’observai sa marche : il gagnait le suroît. Une idée
soudaine me traversa l’esprit :
— Si c’était le Baliseur !
J’ai le regard perçant des hommes de ma profession : je ne
tardai pas à être fixé. C’était lui, en effet, c’était bien le steamer des
Ponts et Chaussées, reconnaissable à la couleur saumon de sa
carène, que barrait par le milieu un liséré d’un rouge vif. Il faisait cap
sur l’Ar-Mèn. Peut-être allait-il simplement ravitailler ce phare,
quoique ce ne fût pas encore l’époque réglementaire. J’avais vu le
cas se produire. Mais il se pouvait aussi qu’il eût à son bord quelque
chef en tournée d’inspection générale, et alors… alors, c’étaient mes
patientes combinaisons déjouées et les affres de l’expiation
abrégées pour les deux coupables !… Serais-je donc contraint de
renoncer à mon œuvre vengeresse, en les libérant par une mort
prompte, qu’ils recevraient comme un bienfait ! Tout mon être se
révoltait à cette pensée.
L’événement faillit justifier mes craintes. Sur les trois heures de
l’après-midi, le Baliseur, sa visite faite à l’Ar-Mèn, obliquait vers l’île
de Sein. Embusqué derrière le vitrage de la lanterne, je suivais d’un
œil anxieux chacun de ses mouvements. Je le vis stopper dans le
petit port insulaire, puis, presque aussitôt, reprendre sa marche, en
continuant de gouverner à l’est. L’incertitude ne m’était plus permise.
Il s’acheminait sur Gorlébella. Le vent était pour lui, mais il avait à
lutter contre une mer fatigante. Ce furent des moments tragiques et
qui me parurent des siècles. A toute éventualité, j’avais armé mon
revolver et je me tenais prêt à descendre. En bas, dans la chambre
du premier étage, ils devaient être aux aguets, comme moi-même,
car j’entendis qu’on s’efforçait, une fois de plus, de briser à coups de
poings le verre épais qui forme hublot du côté du large. Le vapeur
approchait, approchait toujours ; malgré le grand bruit des eaux, on
percevait le halètement saccadé de la machine. Une encablure à
peine le séparait du phare. Dans la chambre scellée, au-dessous de
moi, c’étaient, maintenant, des appels, des cris sourds, le
glapissement aigu de la femme mêlé à la rauque vocifération de
l’homme. Ils se croyaient probablement sauvés, les misérables !
— Sauvés, oui ! murmurai-je, sauvés des jours que vous étiez
encore condamnés à vivre !
J’avais le pied dans l’escalier, pour les faire taire à jamais, quand
brusquement le steamer vira de bord. Un personnage, debout à
l’arrière, venait d’emboucher le porte-voix :
— Ohé du phare !… Goulven Dénès !
Je ne fis qu’un saut jusqu’à la plate forme. Le conducteur, — car
ce n’était que lui, — reprit :
— Rien de nouveau chez vous ?
Je hurlai de toute la force de mes poumons :
— Rien !
Et le Baliseur s’éloigna, rebroussant chemin devant la tempête
dont la grande ombre livide achevait de noyer l’horizon, du côté de
l’occident… Deux heures plus tard, elle se ruait sur Gorlébella.
Elle dure depuis, déchaînée par trombes énormes qui font
sonner la mer comme sous un galop de bêtes invisibles. Parfois, il
me semble ouïr des bruits de cloches, une sorte de tocsin sauvage,
jailli des profondeurs de l’abîme. Le phare ronfle, ainsi qu’un
immense tuyau d’orgue. Une vie monstrueuse anime les nuages : ils
se heurtent, s’étreignent, se bousculent, s’entre-déchirent, se livrent
une formidable et silencieuse bataille de spectres dans les champs
bouleversés de l’espace. Le fanal, cependant, à l’abri derrière ses
étincelantes persiennes de cristal, promène sur ce carnage des
choses sa belle flamme tranquille, la puissante lumière rouge et
verte de son double secteur. Moi aussi, j’ai retrouvé le calme. La
colère des éléments a comme détendu mes nerfs. Ma main ne
tremble plus, ma tête est redevenue libre… Je me remets à mon
récit.

J’étais désigné pour prendre le service en mer à la date du 1er


novembre, jour de la Toussaint. Dans la matinée, nous nous
rendîmes, Adèle et moi, au bourg de Plogoff, pour entendre la
messe de paroisse. L’air était pur et froid. Une bise d’hiver hâtif
balayait le morne plateau, piquait nos joues, nous soufflait à la face
le gravier de la route. Lorsque nous arrivâmes à l’église, la nef, le
porche même, tout était comble ; le flot des fidèles débordait jusque
dans le cimetière, parmi les tombeaux. Nous n’eûmes d’autre
ressource que de nous agenouiller sur les marches du calvaire. Les
Capistes, aux fronts durs et broussailleux comme leurs landes, nous
dévisageaient avec une curiosité narquoise, Adèle surtout, dont la
joliesse, le teint finement rosé sous les dentelles de la coiffe,
faisaient paraître encore plus déplaisants les traits âpres et comme
barbouillés de rouille des femmes de la Pointe, accroupies autour de
nous sur leurs galoches, dans l’herbe, raidie par le givre, de l’enclos
sacré.
— Ça ne va pas être gai, de vivre avec ces brutes, me dit Adèle,
tandis que nous regagnions la caserne… — As-tu remarqué le
ricanement des hommes ?… Et les femmes ? C’était à se boucher
les narines ! Elles avaient encore sur elles l’odeur des bouses de
vaches qu’elles ont coutume de pétrir avec leurs mains pour en
fabriquer des mottes à feu… Ah ! non, mon pauvre Goulven, nous ne
sommes plus en Trégor.
— Et c’est cela qui t’attriste le plus ? lui demandai-je.
Moi, ma tristesse me venait d’une autre cause ; elle me venait de
l’affreuse pensée, amèrement remâchée depuis des jours et des
jours, que j’allais quitter ma femme, languir loin d’elle, là-bas, dans
cette lugubre tour de pierre dont la mince silhouette, d’une blancheur
de sépulcre, s’effilait ainsi qu’une colonne funéraire hors de
l’immense désert des eaux. Adèle suivit la direction de mon regard,
vit le phare dressé sur l’occident clair et murmura d’une voix
dolente :
— Oui, par-dessus le marché, tu vas me laisser seule !
« Par-dessus le marché ! » Elle avait souvent de ces paisibles
cruautés inconscientes qui me poignaient le cœur, qui me faisaient,
comme on dit, saigner en dedans. D’ordinaire, je me contentais d’en
souffrir en silence. Je fus pourtant sur le point de relever celle-ci ;
mais déjà la petite âme changeante de la Trégorroise s’épanchait en
jolis rêves, me versait le baume de ses mirages, de ces délicieuses
imaginations qui n’étaient qu’à elle :
— Durant ton absence, voilà, je serai une veuve. Les gens ne me
rencontreront qu’en vêtements noirs. Même chez nous, dans notre
logis, je porterai ton deuil. Ainsi, toute idée de joie me sera
défendue. Ne m’as-tu pas dit que c’était de la terrasse de Saint-Theï,
sur la Pointe du Van, qu’on apercevait le mieux les fenêtres de
Gorlébella ? Je m’y rendrai les jours de ciel serein, aux heures du
soir, alors que la lumière déclinante agrandit les formes des choses.
Aidé de ta longue-vue, tu me reconnaîtras sans peine et pourras
distinguer jusqu’à mes gestes. J’agiterai mon mouchoir, je t’enverrai
des baisers. Quand tu seras pour revenir, je me ferai belle, je mettrai
mes atours comme pour une fête, et j’irai au-devant de toi, en
chantant la chanson que tu aimes, celle, tu sais, qui commence par
ces vers si doux :

Sur le bord de la mer profonde,


J’ai bâti ma maison, ma maison de tendresse,
Pour saluer de plus loin la voile
Qui me ramènera mon ami !…

Et le reste du temps, eh bien, je broderai. Peut-être réussirai-je à


la terminer enfin, cette courtepointe en dentelle que je destinais à
notre lit de noces et à laquelle je n’ai pas ajouté cinq fleurs en cinq
ans !…
Elle avait retrouvé son sourire et la mobile, la déconcertante
clarté de ses yeux.
Dans l’après-midi, quoique un peu lasse, elle tint à
m’accompagner jusqu’au havre de Beztré. Vous connaissez cette
anse, mon ingénieur, la menue crique de sable, sculptée par les
eaux dans une faille du promontoire, et où il faut descendre presque
à pic comme au creux d’un puits. Le Ravitailleur m’y attendait, prêt à
larguer son amarre. Je pris congé d’Adèle sur la côte surplombante
de la falaise, et je dévalai seul dans le précipice. A chaque tournant
de l’escalier en zigzag, taillé dans le roc vif, je levais la tête pour la
contempler encore tout là-haut, découpée sur le fond du ciel et
comme dorée par les flammes du couchant. Peu à peu, je la vis
diminuer, décroître, et, à mesure, c’était une sorte de nuit qui se
faisait en moi. Bientôt son Kénavo même, son adieu de plus en plus
affaibli, cessa de retentir à mes oreilles et, à ce moment-là, je me
rappelle, il me sembla tout à coup qu’elle se détachait de moi, que je
ne comptais plus dans sa vie, qu’entre nous deux un mur venait de
surgir, un grand mur d’ombre, pareil aux gigantesques maçonneries
primitives de cette terre du Cap, le long desquelles m’emportait le
Ravitailleur… Devers Plogoff, les cloches tintaient pour la Vêprée
des Morts.

Trois heures plus tard, j’inaugurais ma première veille solitaire, à


la place où me voici, dans la lanterne de Gorlébella.
J’avais été jusqu’alors un fonctionnaire attentif, ponctuel, étant
fils d’une race façonnée depuis des siècles à l’obéissance et qui a,
d’instinct, le culte de la règle, le goût des besognes scrupuleusement
accomplies. Toute violation de l’ordre m’est apparue, dès l’enfance,
comme une monstruosité. A Gorlébella, ce ne fut plus du zèle que je
montrai, mais une ardeur inquiète, fébrile, quasi maniaque. J’eus
l’œil partout, la main à tout. Non content de faire mon propre service,
je fis encore celui de mon compagnon de garde. Les nuits même où
il était de quart et où il pouvait me croire plongé dans le sommeil, je
venais à l’improviste m’asseoir à son côté, comme si j’eusse cherché
à le prendre en faute, ou bien je me promenais sur la galerie,
scrutant l’horizon, comme s’il s’y fût passé des choses mystérieuses,
visibles pour moi seul. Ces manières n’étaient pas sans agacer mes
deux subalternes. Ils me prêtaient, j’en suis convaincu, des
ambitions furieuses, une idée fixe d’avancement.
Une nuit que j’étais resté jusqu’à l’aube accoudé à la balustrade
extérieure, malgré le froid, Thomas Chevanton, le mari de l’Ilienne,
ne put s’empêcher de me dire d’un ton vexé :
— On jurerait, ma parole, que vous êtes chargé aussi de veiller
sur les feux des étoiles.
Ce qui indignait ces hommes me valait votre approbation à vous,
mon ingénieur. Et, toutefois, je ne la méritais guère plus que leur
ressentiment. J’ai là vos notes si flatteuses : « Serviteur
exemplaire… Vigilance infatigable… Le phare assurément le mieux
tenu… Rapports circonstanciés, nourris d’observations, témoignant
d’une intelligence précise, et rédigés dans une forme peu
commune… » Ah ! si vous aviez su le vrai des choses, mon
ingénieur !… Vigilant ? Il m’eût été difficile de ne l’être point : la
solitude de ma couchette me faisait horreur ! Dès que j’essayais de
fermer l’œil, mille souvenirs brûlants me hantaient. J’étais possédé
par l’image d’Adèle. Je croyais sentir la tiédeur juvénile de son
corps, la soie caressante de ses cheveux. Des visions m’assaillaient,
dont j’avais honte. Pour les fuir, je m’en allais à travers le phare. Je
trouvais, dans ces rondes nocturnes, un dérivatif à ma fièvre, et les
longues stations à l’air glacé du dehors apaisaient mes nerfs affolés.
Le jour, c’étaient des langueurs étranges, un accablement infini. Je
demeurais immobile, des heures et des heures, à regarder, dans la
direction de la Pointe du Van, si je ne verrais pas se profiler, sur la
ligne des falaises, la silhouette exiguë, à peine perceptible, de celle
qui m’était tout. Lorsqu’elle ne se montrait pas, j’étais pris comme
d’une soif de mourir. Mais, aussi vite, cette perspective d’une mort
possible, loin d’elle, m’emplissait d’une épouvante qui m’arrachait à
ma torpeur. Mon cœur se remettait à battre avec violence : des
énergies inconnues me soulevaient hors de moi-même.
— Il faut vivre, me disais-je, il faut durer à tout le moins jusqu’au
retour du Ravitailleur.
Et je me ruais au travail. Je démontais, je remontais les rouages
de la machine, je vernissais les boiseries, j’astiquais les cuivres ;
j’aurais poli, je crois, les pierres même de la muraille. Ce n’était pas
de la conscience, mais de la rage. Il ne me suffisait pas de suivre de
point en point toutes les prescriptions du règlement ; je m’absorbais,
de propos délibéré, en des minuties, en des vétilles ; ou bien je
m’imposais des besognes stupides, comme d’apprendre par cœur la
Notice relative au service météorologique des phares.
Vous avez loué mes rapports. Ils étaient ma principale
distraction : je m’y appliquais avec une lenteur méthodique, comme
jadis, au petit séminaire de Saint-Pol, à mes thèmes, à mes versions
d’écolier. J’en faisais des « devoirs de style », soigneusement
calligraphiés. Qu’est-ce que je n’y mentionnais pas ! Vingt fois le
jour, j’interrogeais le baromètre, le thermomètre, le pluviomètre. Une
saute de vent, le passage d’un navire, l’apparition d’un vol d’oiseaux
migrateurs, la moindre variation dans l’éclat du feu, une tache de
buée sur les vitres, tout me devenait matière à développements. Au
besoin, j’aurais compté les astres ou dénombré les flots. Il n’y avait
pas pour moi de détail insignifiant. Le gardien idéal, certes, je l’ai
été… Je l’ai été pour me masquer à moi-même le vide obsédant
d’une existence d’où était exclu le seul être qui la pût remplir.
Soyons juste : ma rigide probité native, si elle ne fut pour presque
rien dans ma façon d’entendre mes fonctions et de les pratiquer, me
préserva du moins de certaines tentations auxquelles il m’eût été
aussi facile qu’agréable de me laisser glisser. Adèle, durant mes
premiers séjours à terre, me demandait souvent :
— Puisque d’être privé de moi te fait tant souffrir, pourquoi ne
veux-tu pas que j’aille te rejoindre, de temps à autre ? Personne ne
le saurait, hormis l’homme qui serait de garde avec toi, et de celui-là
qu’aurions-nous à craindre ? Ce n’est pas lui, j’imagine, qui
s’aviserait de dénoncer son chef. Par mesure de prudence, je
m’embarquerais à Audierne, un samedi soir, sur un des bateaux qui
y viennent de l’île pour le marché. Je m’arrangerais avec le patron
pour qu’il me reprenne à son prochain voyage. Ils font d’ordinaire
jusqu’à trois et quatre traversées par semaine, à ce que m’a dit la
femme Chevanton… Pense donc, tu m’aurais à toi, quand tu t’y
attendrais le moins !… Moi, cela me ravirait, cette escapade ! Ce
serait une aventure d’amour, comme dans les romans. J’arriverais à
nuit close, toute trempée par l’embrun du Raz, et je heurterais à la
poterne de la tour, en criant : « Ouvre ! C’est moi, Goulven ! » Tu me
recevrais dans tes bras et, vite, tu m’emporterais pour me sécher, là-
haut, dans la chambre ardente. Et après… après, je t’aimerais à la
barbe de l’administration, passionnément, non sans frissonner un
peu, à cause de la grande rumeur des vagues dans les ténèbres.
Endormie, j’aurais des rêves singuliers, comme d’habiter les eaux
profondes et d’être l’épouse immortelle de quelque génie sous-
marin, de quelque Morgan, maître de la mer… Je t’en prie, Goulven !
C’est la chose du monde la plus simple, et ce serait si délicieux !
Elle parlait ainsi, de sa voix de sirène, avec des insinuations qui
me troublaient jusqu’aux moelles. Je n’avais la force que de lui
répondre :
— Tais-toi, au nom de Dieu, tais-toi !
Par peur de céder, je faisais celui qui ne veut pas entendre. Et à
cela, oui, mon ingénieur, j’ai vraiment eu quelque mérite. Il y a quatre
jours, Adèle Lézurec n’avait pas encore mis le pied sur la roche de
Gorlébella. Si elle s’y trouve à cette heure, ce n’est, vous pouvez
m’en croire, ni pour son plaisir, ni pour le mien.
IV

24 avril.

Nettoyé par la tempête, le ciel est d’une profondeur sans limites,


et la nuit d’une transparence quasi surnaturelle. Il semble que,
derrière l’atmosphère normale, se révèlent des éthers inconnus, de
vagues paradis, superposés en voûtes et perdus à des distances
vertigineuses. Les courants du Raz, apaisés, roulent avec une
silencieuse majesté de fleuves. Une brise légère évente les eaux
endormies. Leur respiration s’entend à peine. Les récifs même de la
Chaussée de Sein n’exhalent plus qu’en sourdine leurs abois de
sphinx hurleurs.
Il se dégage des champs d’ondes, au pied du phare, une odeur
discrète, pénétrante, cette fine odeur de violette qui étonne les
terriens quand ils traversent les marais salants. Car la mer aussi a
ses printemps qui embaument. Jamais leur influence ne m’avait
autant ému que ce soir. Je me sens faible et lâche. Si je m’écoutais,
j’en finirais tout de suite. Je vois se balancer sous mes yeux des
creux de houles calmes où il serait doux de s’étendre, comme font,
dans les douves des prairies léonardes, les faucheurs d’herbes, leur
journée close. Mais non, les temps ne sont pas encore venus : ma
journée à moi n’est point close, et c’est le plus pénible de ma tâche
qu’il me reste à remplir.
Je vous ai dit, mon ingénieur, sous l’oppression de quelles
angoisses, de quels cauchemars, se traînait ma vie à Gorlébella.
Chez un autre, à la longue, l’habitude aurait émoussé la souffrance.
Mais j’ai toujours été l’homme d’un sentiment unique. Le mal de
l’absence, loin de décroître, me rongeait l’âme chaque fois plus
avant, à la manière d’un cancer. Les retours auprès d’Adèle ne me
procuraient point la guérison — ni même la trêve — que j’en
espérais. Je ne l’avais pas plus tôt retrouvée que la pensée qu’il
faudrait la quitter encore passait sur ma joie comme l’ombre d’un
nuage de grêle sur une moisson d’épis mûrissants. Et, de même
qu’au phare je supputais mes semaines, mes siècles d’isolement, de
même, dans notre logis de la Pointe, je me gâtais, à les compter une
à une, les brèves minutes de notre bonheur.
J’essayais de dissimuler à ma femme les mouvements qui
m’agitaient et de feindre devant elle la gaieté que je n’avais pas.
Mais je n’ai jamais été très habile à ces sortes de déguisements. Il
m’arrivait à tout instant de m’oublier en des attitudes de prostration
auxquelles il n’était guère possible qu’Adèle se méprît.
— Qu’as-tu, me disait-elle, à me regarder avec ces yeux tristes ?
Tu as l’air morne des béliers noirs de ton pays, quand on les mène
au boucher.
Je me secouais, je me forçais à rire. Elle, dépitée, continuait :
— Ton rire sonne faux, mon pauvre Goulven !… Je ne t’ai jamais
connu bien folâtre ; ce n’est pas dans ta nature, à ce qu’il paraît.
Mais, en vérité, depuis que nous sommes exilés en cette contrée de
malédiction, tu deviens comme un enterrement. Est-ce là ta façon de
me récréer ? Ce n’est donc pas assez, crois-tu, de la tristesse de
cette caserne, de ces landes stériles, de ce ciel venteux ? Il faut
encore que tu y ajoutes la tienne !…
Et, avec une insistance presque amère :
— Un mois à me dessécher d’ennui, pas un être avec qui causer
à cœur ouvert, voilà mon lot, quand tu es au phare. Tu reviens : c’est
pour m’achever avec tes mines de résignation, ta figure de
pénitence. Qui me distraira, si tu ne le fais point ? Invente quelque
chose, parle !… A moins qu’il ne soit vrai, comme on raconte, que
les hommes des phares, à force de vivre en tête à tête, finissent par
désapprendre la parole.
Ces reproches augmentaient encore mon embarras et ma
gaucherie. J’aurais voulu lui crier :
— Épargne-moi ! C’est parce que je t’aime trop, c’est parce que
ton amour est en moi comme une flamme insatiable et que cette
flamme a tout dévoré !…
Mais, au lieu de sons humains, il ne fût sorti de ma poitrine que
des sanglots.
D’autres fois, au contraire, le sentiment — dont j’étais torturé
sans cesse — de la rapidité des jours heureux, exaspéré peut-être
par les longues continences du large, allumait dans mon sang la
fougue barbare de mes ancêtres, les antiques écumeurs de plages.
J’étreignais Adèle avec une violence qui la terrifiait, la faisait se
sauver de moi, toute meurtrie, comme si j’eusse été quelque
ravisseur. L’accès passé, j’étais le premier à en rougir. Je
m’humiliais, je demandais pardon. Adèle, d’une voix tremblante de
peur et de courroux, murmurait :
— C’est bien ce qu’on m’avait dit !… Pas de milieu chez ces
Léonards !… Tantôt des moutons et tantôt des brutes !
Après, j’étais des heures sans oser l’approcher. Je me suis
même vu me lever, la nuit, tandis qu’elle reposait, et m’en aller courir
au dehors, par les sentiers de ténèbres, sous la rafale, — cela pour
lui marquer mon repentir et la laisser revenir à moi, spontanément.
Elle ne m’en savait, du reste, aucun gré. De mois en mois, je crus
m’apercevoir qu’elle s’écartait, se retirait davantage, devenait plus
absente, plus lointaine. Plus elle m’échappait, plus je me
cramponnais à elle. Mais, il s’était décidément mis entre nos âmes,
le grand mur d’ombre, aussi résistant que les falaises du Cap, et les
efforts que je tentais pour le démolir n’aboutissaient qu’à le
consolider. N’importe ! Je ne me décourageais pas.
— Adèle est aigrie, me disais-je : le changement d’habitudes a
été trop brusque et trop profond. Dès le premier soir, ce pays lui est
apparu comme une terre hostile. Elle est ici comme une fleur de
jardin livrée à toute l’âpreté des vents atlantiques, et qui regrette les
tièdes abris des moûtiers trégorrois. Comment pourrait-elle n’en pas
souffrir ?… Là-bas, elle était entourée, choyée. Tout, autour d’elle,
respirait une douceur paisible. Les choses revêtaient les aspects les
plus variés ; les gens étaient d’un commerce aimable. Ici, personne
avec qui s’entretenir. Quel secours attendre de ces femmes de la
Pointe, uniquement occupées à garder des vaches, à pétrir des
bouses nauséabondes ou à gratter des champs pierreux ? Et quoi
d’étonnant si la solitude lui est aussi mauvaise qu’à moi-même ?… »

J’avais espéré, dans les débuts, qu’elle aurait en la femme


Chevanton, sinon une amie du moins une compagne. Mais celle-ci,
outre qu’elle avait à décrotter toute une nichée de marmaille, ne
montra, dès l’abord, qu’un empressement médiocre à répondre aux
avances d’Adèle. C’était — je l’ai dit — une Ilienne. Elle attirait peu.
Sous sa cape noire, elle avait le front étroit, et comme barré de
fanatisme, de la plupart de ses compatriotes. Le temps que lui
laissaient libre son ménage et la culture de quelques arpents
d’oignons ou de patates, elle le consacrait à réciter son chapelet.
Pour rien au monde, elle n’eût manqué une messe ; mais, les
lendemains de tourmentes, elle errait, la nuit, le long des grèves, en
quête d’épaves qu’elle vendait à un marchand de Plogoff, et, l’argent
que lui rapportait ce trafic clandestin, elle le dépensait, le dimanche,
avec des commères, à boire des micamos, des tasses de café noir
qu’on noyait d’eau-de-vie.
Elle affectait vis-à-vis d’Adèle, qu’elle nommait la « cheffesse »,
une sorte d’obséquiosité sournoise, lui faisant, quand elle la
rencontrait, des révérences pleines de componction, à la manière
des nonnes, mais détournant obstinément la tête pour passer devant
le corps de logis que nous habitions, et, si ma femme venait à
l’interpeller, rompant tout de suite l’entretien ou n’y répondant que
par des monosyllabes.
Au fond, avec le tempérament exclusif et inhospitalier des gens
de son île, elle considérait Adèle comme une intruse. C’était assez
pour qu’elle la détestât… Mais de plus, je pense, elle la jalousait,
parce qu’elle était jolie, fraîche, distinguée, parce qu’elle avait un air
de dame, des mains blanches, et que, même sur semaine elle
s’habillait de vêtements coquets. Peut-être aussi la méprisait-elle un
peu, tout en la jalousant. Robuste fille de Sein, façonnée dès
l’enfance aux dures besognes de la terre, elle devait avoir en mince
estime la Trégorroise nonchalante qui recourait à une mercenaire,
ne fût-ce que pour laver son linge, et ne faisait œuvre de ses dix
doigts que de feuilleter des livres ou de broder. Broder ! La
ménagère d’un gardien de phare ! Et, quant aux livres, comment
pouvait-on se permettre d’en lire d’autres que le livre de messe, à
moins d’être une créature vicieuse, une femme de péché !… Ainsi
raisonnait l’Ilienne : et elle ne raisonnait déjà pas si mal.
L’événement l’a prouvé.
— Je renonce à l’apprivoiser, m’avait, un jour, déclaré Adèle…
J’ai essayé de la prendre par ses enfants : ils sont encore plus
ombrageux que la mère. Lorsque je leur tends des sucreries, ils se
sauvent à toutes jambes, ni plus ni moins que si j’étais la peste.
Et, avec un haussement d’épaules, elle avait ajouté :
— Après tout, pour ce que j’y perds !…
Il ne fut plus question entre nous de cette femme. Elle était, du
reste, aussi peu gênante que possible, ne faisait pas plus de bruit,
ne tenait pas plus de place qu’un fantôme… Comment nous
fussions-nous doutés qu’avec son air de n’être nulle part elle était
partout et rôdait furtivement autour de notre vie, les yeux aux aguets
sous sa cape de bure sombre, comme la figure, muette et voilée de
noir, de la Fatalité ?

Cependant, l’impuissance où j’étais de distraire Adèle me navrait


le cœur. Tout d’abord, nous risquâmes bien quelques promenades
aux environs de la Pointe. Mais la saison n’y était guère propice. Le
plus souvent, les averses, les torrentielles et cinglantes ondées du
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like