100% found this document useful (11 votes)
269 views

Get (eBook PDF) Computer Systems: A Programmer's Perspective 3nd Edition free all chapters

Computer

Uploaded by

gozhdafilmi
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
100% found this document useful (11 votes)
269 views

Get (eBook PDF) Computer Systems: A Programmer's Perspective 3nd Edition free all chapters

Computer

Uploaded by

gozhdafilmi
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/ 56

Visit https://ebookluna.

com to download the full version and


explore more ebooks

(eBook PDF) Computer Systems: A Programmer's


Perspective 3nd Edition

_____ Click the link below to download _____


https://ebookluna.com/product/ebook-pdf-computer-
systems-a-programmers-perspective-3nd-edition/

Explore and download more ebooks at ebookluna.com


Here are some recommended products that might interest you.
You can download now and explore!

(eBook PDF) Health Informatics: A Systems Perspective,


Second Edition

https://ebookluna.com/product/ebook-pdf-health-informatics-a-systems-
perspective-second-edition/

ebookluna.com

(eBook PDF) Health Informatics: A Systems Perspective


First Edition

https://ebookluna.com/product/ebook-pdf-health-informatics-a-systems-
perspective-first-edition/

ebookluna.com

(eBook PDF) Comparative Health Systems: A Global


Perspective 2nd Edition

https://ebookluna.com/product/ebook-pdf-comparative-health-systems-a-
global-perspective-2nd-edition/

ebookluna.com

CMOS VLSI Design A Circuits and Systems Perspective (4th


Edition)

https://ebookluna.com/product/cmos-vlsi-design-a-circuits-and-systems-
perspective-4th-edition/

ebookluna.com
(eBook PDF) Computer Systems 5th Edition

https://ebookluna.com/product/ebook-pdf-computer-systems-5th-edition/

ebookluna.com

Computer Systems 5th Edition (eBook PDF)

https://ebookluna.com/product/computer-systems-5th-edition-ebook-pdf/

ebookluna.com

(eBook PDF) Health Care Operations Management: A Systems


Perspective 2nd Edition

https://ebookluna.com/product/ebook-pdf-health-care-operations-
management-a-systems-perspective-2nd-edition/

ebookluna.com

A New Ecology: Systems Perspective 2nd Edition Soeren Nors


Nielsen - eBook PDF

https://ebookluna.com/download/a-new-ecology-systems-perspective-
ebook-pdf/

ebookluna.com

Cardiology-An Integrated Approach (Human Organ Systems)


(Dec 29, 2017)_(007179154X)_(McGraw-Hill) 1st Edition
Elmoselhi - eBook PDF
https://ebookluna.com/download/cardiology-an-integrated-approach-
human-organ-systems-dec-29-2017_007179154x_mcgraw-hill-ebook-pdf/

ebookluna.com
Global Global
edition edition

edition
Global Computer Systems
A Programmer’s Perspective
For these Global Editions, the editorial team at Pearson has
collaborated with educators across the world to address a
wide range of subjects and requirements, equipping students
with the best possible learning tools. This Global Edition
preserves the cutting-edge approach and pedagogy of the
original, but also features alterations, customization, and
adaptation from the North American version.

edition
Third
Computer Systems

Bryant • O’Hallaron
This is a special edition of an established A Programmer’s Perspective
title widely used by colleges and universities
throughout the world. Pearson published this Third edition
exclusive edition for the benefit of students
outside the United States and Canada. If you
purchased this book within the United States
Randal E. Bryant • David R. O’Hallaron
or Canada, you should be aware that it has
been imported without the approval of the
Publisher or Author.

Pearson Global Edition

Bryant_1292101768_mech.indd 1 07/05/15 3:22 PM


Contents

Preface 19
About the Authors 35

1
A Tour of Computer Systems 37
1.1 Information Is Bits + Context 39
1.2 Programs Are Translated by Other Programs into Different Forms 40
1.3 It Pays to Understand How Compilation Systems Work 42
1.4 Processors Read and Interpret Instructions Stored in Memory 43
1.4.1 Hardware Organization of a System 44
1.4.2 Running the hello Program 46
1.5 Caches Matter 47
1.6 Storage Devices Form a Hierarchy 50
1.7 The Operating System Manages the Hardware 50
1.7.1 Processes 51
1.7.2 Threads 53
1.7.3 Virtual Memory 54
1.7.4 Files 55
1.8 Systems Communicate with Other Systems Using Networks 55
1.9 Important Themes 58
1.9.1 Amdahl’s Law 58
1.9.2 Concurrency and Parallelism 60
1.9.3 The Importance of Abstractions in Computer Systems 62
1.10 Summary 63
Bibliographic Notes 64
Solutions to Practice Problems 64

Part I Program Structure and Execution

2
Representing and Manipulating Information 67
2.1 Information Storage 70
2.1.1 Hexadecimal Notation 72
2.1.2 Data Sizes 75
7
8 Contents

2.1.3 Addressing and Byte Ordering 78


2.1.4 Representing Strings 85
2.1.5 Representing Code 85
2.1.6 Introduction to Boolean Algebra 86
2.1.7 Bit-Level Operations in C 90
2.1.8 Logical Operations in C 92
2.1.9 Shift Operations in C 93
2.2 Integer Representations 95
2.2.1 Integral Data Types 96
2.2.2 Unsigned Encodings 98
2.2.3 Two’s-Complement Encodings 100
2.2.4 Conversions between Signed and Unsigned 106
2.2.5 Signed versus Unsigned in C 110
2.2.6 Expanding the Bit Representation of a Number 112
2.2.7 Truncating Numbers 117
2.2.8 Advice on Signed versus Unsigned 119
2.3 Integer Arithmetic 120
2.3.1 Unsigned Addition 120
2.3.2 Two’s-Complement Addition 126
2.3.3 Two’s-Complement Negation 131
2.3.4 Unsigned Multiplication 132
2.3.5 Two’s-Complement Multiplication 133
2.3.6 Multiplying by Constants 137
2.3.7 Dividing by Powers of 2 139
2.3.8 Final Thoughts on Integer Arithmetic 143
2.4 Floating Point 144
2.4.1 Fractional Binary Numbers 145
2.4.2 IEEE Floating-Point Representation 148
2.4.3 Example Numbers 151
2.4.4 Rounding 156
2.4.5 Floating-Point Operations 158
2.4.6 Floating Point in C 160
2.5 Summary 162
Bibliographic Notes 163
Homework Problems 164
Solutions to Practice Problems 179

3
Machine-Level Representation of Programs 199
3.1 A Historical Perspective 202
Contents 9

3.2 Program Encodings 205


3.2.1 Machine-Level Code 206
3.2.2 Code Examples 208
3.2.3 Notes on Formatting 211
3.3 Data Formats 213
3.4 Accessing Information 215
3.4.1 Operand Specifiers 216
3.4.2 Data Movement Instructions 218
3.4.3 Data Movement Example 222
3.4.4 Pushing and Popping Stack Data 225
3.5 Arithmetic and Logical Operations 227
3.5.1 Load Effective Address 227
3.5.2 Unary and Binary Operations 230
3.5.3 Shift Operations 230
3.5.4 Discussion 232
3.5.5 Special Arithmetic Operations 233
3.6 Control 236
3.6.1 Condition Codes 237
3.6.2 Accessing the Condition Codes 238
3.6.3 Jump Instructions 241
3.6.4 Jump Instruction Encodings 243
3.6.5 Implementing Conditional Branches with
Conditional Control 245
3.6.6 Implementing Conditional Branches with
Conditional Moves 250
3.6.7 Loops 256
3.6.8 Switch Statements 268
3.7 Procedures 274
3.7.1 The Run-Time Stack 275
3.7.2 Control Transfer 277
3.7.3 Data Transfer 281
3.7.4 Local Storage on the Stack 284
3.7.5 Local Storage in Registers 287
3.7.6 Recursive Procedures 289
3.8 Array Allocation and Access 291
3.8.1 Basic Principles 291
3.8.2 Pointer Arithmetic 293
3.8.3 Nested Arrays 294
3.8.4 Fixed-Size Arrays 296
3.8.5 Variable-Size Arrays 298
10 Contents

3.9 Heterogeneous Data Structures 301


3.9.1 Structures 301
3.9.2 Unions 305
3.9.3 Data Alignment 309
3.10 Combining Control and Data in Machine-Level Programs 312
3.10.1 Understanding Pointers 313
3.10.2 Life in the Real World: Using the gdb Debugger 315
3.10.3 Out-of-Bounds Memory References and Buffer Overflow 315
3.10.4 Thwarting Buffer Overflow Attacks 320
3.10.5 Supporting Variable-Size Stack Frames 326
3.11 Floating-Point Code 329
3.11.1 Floating-Point Movement and Conversion Operations 332
3.11.2 Floating-Point Code in Procedures 337
3.11.3 Floating-Point Arithmetic Operations 338
3.11.4 Defining and Using Floating-Point Constants 340
3.11.5 Using Bitwise Operations in Floating-Point Code 341
3.11.6 Floating-Point Comparison Operations 342
3.11.7 Observations about Floating-Point Code 345
3.12 Summary 345
Bibliographic Notes 346
Homework Problems 347
Solutions to Practice Problems 361

4
Processor Architecture 387
4.1 The Y86-64 Instruction Set Architecture 391
4.1.1 Programmer-Visible State 391
4.1.2 Y86-64 Instructions 392
4.1.3 Instruction Encoding 394
4.1.4 Y86-64 Exceptions 399
4.1.5 Y86-64 Programs 400
4.1.6 Some Y86-64 Instruction Details 406
4.2 Logic Design and the Hardware Control Language HCL 408
4.2.1 Logic Gates 409
4.2.2 Combinational Circuits and HCL Boolean Expressions 410
4.2.3 Word-Level Combinational Circuits and HCL
Integer Expressions 412
4.2.4 Set Membership 416
4.2.5 Memory and Clocking 417
4.3 Sequential Y86-64 Implementations 420
4.3.1 Organizing Processing into Stages 420
Contents 11

4.3.2 SEQ Hardware Structure 432


4.3.3 SEQ Timing 436
4.3.4 SEQ Stage Implementations 440
4.4 General Principles of Pipelining 448
4.4.1 Computational Pipelines 448
4.4.2 A Detailed Look at Pipeline Operation 450
4.4.3 Limitations of Pipelining 452
4.4.4 Pipelining a System with Feedback 455
4.5 Pipelined Y86-64 Implementations 457
4.5.1 SEQ+: Rearranging the Computation Stages 457
4.5.2 Inserting Pipeline Registers 458
4.5.3 Rearranging and Relabeling Signals 462
4.5.4 Next PC Prediction 463
4.5.5 Pipeline Hazards 465
4.5.6 Exception Handling 480
4.5.7 PIPE Stage Implementations 483
4.5.8 Pipeline Control Logic 491
4.5.9 Performance Analysis 500
4.5.10 Unfinished Business 504
4.6 Summary 506
4.6.1 Y86-64 Simulators 508
Bibliographic Notes 509
Homework Problems 509
Solutions to Practice Problems 516

5
Optimizing Program Performance 531
5.1 Capabilities and Limitations of Optimizing Compilers 534
5.2 Expressing Program Performance 538
5.3 Program Example 540
5.4 Eliminating Loop Inefficiencies 544
5.5 Reducing Procedure Calls 548
5.6 Eliminating Unneeded Memory References 550
5.7 Understanding Modern Processors 553
5.7.1 Overall Operation 554
5.7.2 Functional Unit Performance 559
5.7.3 An Abstract Model of Processor Operation 561
5.8 Loop Unrolling 567
5.9 Enhancing Parallelism 572
5.9.1 Multiple Accumulators 572
5.9.2 Reassociation Transformation 577
12 Contents

5.10 Summary of Results for Optimizing Combining Code 583


5.11 Some Limiting Factors 584
5.11.1 Register Spilling 584
5.11.2 Branch Prediction and Misprediction Penalties 585
5.12 Understanding Memory Performance 589
5.12.1 Load Performance 590
5.12.2 Store Performance 591
5.13 Life in the Real World: Performance Improvement Techniques 597
5.14 Identifying and Eliminating Performance Bottlenecks 598
5.14.1 Program Profiling 598
5.14.2 Using a Profiler to Guide Optimization 601
5.15 Summary 604
Bibliographic Notes 605
Homework Problems 606
Solutions to Practice Problems 609

6
The Memory Hierarchy 615
6.1 Storage Technologies 617
6.1.1 Random Access Memory 617
6.1.2 Disk Storage 625
6.1.3 Solid State Disks 636
6.1.4 Storage Technology Trends 638
6.2 Locality 640
6.2.1 Locality of References to Program Data 642
6.2.2 Locality of Instruction Fetches 643
6.2.3 Summary of Locality 644
6.3 The Memory Hierarchy 645
6.3.1 Caching in the Memory Hierarchy 646
6.3.2 Summary of Memory Hierarchy Concepts 650
6.4 Cache Memories 650
6.4.1 Generic Cache Memory Organization 651
6.4.2 Direct-Mapped Caches 653
6.4.3 Set Associative Caches 660
6.4.4 Fully Associative Caches 662
6.4.5 Issues with Writes 666
6.4.6 Anatomy of a Real Cache Hierarchy 667
6.4.7 Performance Impact of Cache Parameters 667
6.5 Writing Cache-Friendly Code 669
6.6 Putting It Together: The Impact of Caches on Program Performance 675
Contents 13

6.6.1 The Memory Mountain 675


6.6.2 Rearranging Loops to Increase Spatial Locality 679
6.6.3 Exploiting Locality in Your Programs 683
6.7 Summary 684
Bibliographic Notes 684
Homework Problems 685
Solutions to Practice Problems 696

Part II Running Programs on a System

7
Linking 705
7.1 Compiler Drivers 707
7.2 Static Linking 708
7.3 Object Files 709
7.4 Relocatable Object Files 710
7.5 Symbols and Symbol Tables 711
7.6 Symbol Resolution 715
7.6.1 How Linkers Resolve Duplicate Symbol Names 716
7.6.2 Linking with Static Libraries 720
7.6.3 How Linkers Use Static Libraries to Resolve References 724
7.7 Relocation 725
7.7.1 Relocation Entries 726
7.7.2 Relocating Symbol References 727
7.8 Executable Object Files 731
7.9 Loading Executable Object Files 733
7.10 Dynamic Linking with Shared Libraries 734
7.11 Loading and Linking Shared Libraries from Applications 737
7.12 Position-Independent Code (PIC) 740
7.13 Library Interpositioning 743
7.13.1 Compile-Time Interpositioning 744
7.13.2 Link-Time Interpositioning 744
7.13.3 Run-Time Interpositioning 746
7.14 Tools for Manipulating Object Files 749
7.15 Summary 749
Bibliographic Notes 750
Homework Problems 750
Solutions to Practice Problems 753
14 Contents

8
Exceptional Control Flow 757
8.1 Exceptions 759
8.1.1 Exception Handling 760
8.1.2 Classes of Exceptions 762
8.1.3 Exceptions in Linux/x86-64 Systems 765
8.2 Processes 768
8.2.1 Logical Control Flow 768
8.2.2 Concurrent Flows 769
8.2.3 Private Address Space 770
8.2.4 User and Kernel Modes 770
8.2.5 Context Switches 772
8.3 System Call Error Handling 773
8.4 Process Control 774
8.4.1 Obtaining Process IDs 775
8.4.2 Creating and Terminating Processes 775
8.4.3 Reaping Child Processes 779
8.4.4 Putting Processes to Sleep 785
8.4.5 Loading and Running Programs 786
8.4.6 Using fork and execve to Run Programs 789
8.5 Signals 792
8.5.1 Signal Terminology 794
8.5.2 Sending Signals 795
8.5.3 Receiving Signals 798
8.5.4 Blocking and Unblocking Signals 800
8.5.5 Writing Signal Handlers 802
8.5.6 Synchronizing Flows to Avoid Nasty Concurrency Bugs 812
8.5.7 Explicitly Waiting for Signals 814
8.6 Nonlocal Jumps 817
8.7 Tools for Manipulating Processes 822
8.8 Summary 823
Bibliographic Notes 823
Homework Problems 824
Solutions to Practice Problems 831

9
Virtual Memory 837
9.1 Physical and Virtual Addressing 839
9.2 Address Spaces 840
Contents 15

9.3 VM as a Tool for Caching 841


9.3.1 DRAM Cache Organization 842
9.3.2 Page Tables 842
9.3.3 Page Hits 844
9.3.4 Page Faults 844
9.3.5 Allocating Pages 846
9.3.6 Locality to the Rescue Again 846
9.4 VM as a Tool for Memory Management 847
9.5 VM as a Tool for Memory Protection 848
9.6 Address Translation 849
9.6.1 Integrating Caches and VM 853
9.6.2 Speeding Up Address Translation with a TLB 853
9.6.3 Multi-Level Page Tables 855
9.6.4 Putting It Together: End-to-End Address Translation 857
9.7 Case Study: The Intel Core i7/Linux Memory System 861
9.7.1 Core i7 Address Translation 862
9.7.2 Linux Virtual Memory System 864
9.8 Memory Mapping 869
9.8.1 Shared Objects Revisited 869
9.8.2 The fork Function Revisited 872
9.8.3 The execve Function Revisited 872
9.8.4 User-Level Memory Mapping with the mmap Function 873
9.9 Dynamic Memory Allocation 875
9.9.1 The malloc and free Functions 876
9.9.2 Why Dynamic Memory Allocation? 879
9.9.3 Allocator Requirements and Goals 880
9.9.4 Fragmentation 882
9.9.5 Implementation Issues 882
9.9.6 Implicit Free Lists 883
9.9.7 Placing Allocated Blocks 885
9.9.8 Splitting Free Blocks 885
9.9.9 Getting Additional Heap Memory 886
9.9.10 Coalescing Free Blocks 886
9.9.11 Coalescing with Boundary Tags 887
9.9.12 Putting It Together: Implementing a Simple Allocator 890
9.9.13 Explicit Free Lists 898
9.9.14 Segregated Free Lists 899
9.10 Garbage Collection 901
9.10.1 Garbage Collector Basics 902
9.10.2 Mark&Sweep Garbage Collectors 903
9.10.3 Conservative Mark&Sweep for C Programs 905
Visit https://ebookluna.com
now to explore a diverse
collection of ebooks available
in formats like PDF, EPUB, and
MOBI, compatible with all
devices. Don’t miss the chance
to enjoy exciting offers and
quickly download high-quality
materials in just a few simple
steps!
16 Contents

9.11 Common Memory-Related Bugs in C Programs 906


9.11.1 Dereferencing Bad Pointers 906
9.11.2 Reading Uninitialized Memory 907
9.11.3 Allowing Stack Buffer Overflows 907
9.11.4 Assuming That Pointers and the Objects They Point to
Are the Same Size 908
9.11.5 Making Off-by-One Errors 908
9.11.6 Referencing a Pointer Instead of the Object It Points To 909
9.11.7 Misunderstanding Pointer Arithmetic 909
9.11.8 Referencing Nonexistent Variables 910
9.11.9 Referencing Data in Free Heap Blocks 910
9.11.10 Introducing Memory Leaks 911
9.12 Summary 911
Bibliographic Notes 912
Homework Problems 912
Solutions to Practice Problems 916

Part III Interaction and Communication


between Programs

10
System-Level I/O 925
10.1 Unix I/O 926
10.2 Files 927
10.3 Opening and Closing Files 929
10.4 Reading and Writing Files 931
10.5 Robust Reading and Writing with the Rio Package 933
10.5.1 Rio Unbuffered Input and Output Functions 933
10.5.2 Rio Buffered Input Functions 934
10.6 Reading File Metadata 939
10.7 Reading Directory Contents 941
10.8 Sharing Files 942
10.9 I/O Redirection 945
10.10 Standard I/O 947
10.11 Putting It Together: Which I/O Functions Should I Use? 947
10.12 Summary 949
Bibliographic Notes 950
Homework Problems 950
Solutions to Practice Problems 951
Contents 17

11
Network Programming 953
11.1 The Client-Server Programming Model 954
11.2 Networks 955
11.3 The Global IP Internet 960
11.3.1 IP Addresses 961
11.3.2 Internet Domain Names 963
11.3.3 Internet Connections 965
11.4 The Sockets Interface 968
11.4.1 Socket Address Structures 969
11.4.2 The socket Function 970
11.4.3 The connect Function 970
11.4.4 The bind Function 971
11.4.5 The listen Function 971
11.4.6 The accept Function 972
11.4.7 Host and Service Conversion 973
11.4.8 Helper Functions for the Sockets Interface 978
11.4.9 Example Echo Client and Server 980
11.5 Web Servers 984
11.5.1 Web Basics 984
11.5.2 Web Content 985
11.5.3 HTTP Transactions 986
11.5.4 Serving Dynamic Content 989
11.6 Putting It Together: The Tiny Web Server 992
11.7 Summary 1000
Bibliographic Notes 1001
Homework Problems 1001
Solutions to Practice Problems 1002

12
Concurrent Programming 1007
12.1 Concurrent Programming with Processes 1009
12.1.1 A Concurrent Server Based on Processes 1010
12.1.2 Pros and Cons of Processes 1011
12.2 Concurrent Programming with I/O Multiplexing 1013
12.2.1 A Concurrent Event-Driven Server Based on I/O
Multiplexing 1016
12.2.2 Pros and Cons of I/O Multiplexing 1021
12.3 Concurrent Programming with Threads 1021
12.3.1 Thread Execution Model 1022
18 Contents

12.3.2 Posix Threads 1023


12.3.3 Creating Threads 1024
12.3.4 Terminating Threads 1024
12.3.5 Reaping Terminated Threads 1025
12.3.6 Detaching Threads 1025
12.3.7 Initializing Threads 1026
12.3.8 A Concurrent Server Based on Threads 1027
12.4 Shared Variables in Threaded Programs 1028
12.4.1 Threads Memory Model 1029
12.4.2 Mapping Variables to Memory 1030
12.4.3 Shared Variables 1031
12.5 Synchronizing Threads with Semaphores 1031
12.5.1 Progress Graphs 1035
12.5.2 Semaphores 1037
12.5.3 Using Semaphores for Mutual Exclusion 1038
12.5.4 Using Semaphores to Schedule Shared Resources 1040
12.5.5 Putting It Together: A Concurrent Server Based on
Prethreading 1044
12.6 Using Threads for Parallelism 1049
12.7 Other Concurrency Issues 1056
12.7.1 Thread Safety 1056
12.7.2 Reentrancy 1059
12.7.3 Using Existing Library Functions in Threaded Programs 1060
12.7.4 Races 1061
12.7.5 Deadlocks 1063
12.8 Summary 1066
Bibliographic Notes 1066
Homework Problems 1067
Solutions to Practice Problems 1072

A
Error Handling 1077
A.1 Error Handling in Unix Systems 1078
A.2 Error-Handling Wrappers 1079

References 1083

Index 1089
Preface

This book (known as CS:APP) is for computer scientists, computer engineers, and
others who want to be able to write better programs by learning what is going on
“under the hood” of a computer system.
Our aim is to explain the enduring concepts underlying all computer systems,
and to show you the concrete ways that these ideas affect the correctness, perfor-
mance, and utility of your application programs. Many systems books are written
from a builder’s perspective, describing how to implement the hardware or the sys-
tems software, including the operating system, compiler, and network interface.
This book is written from a programmer’s perspective, describing how application
programmers can use their knowledge of a system to write better programs. Of
course, learning what a system is supposed to do provides a good first step in learn-
ing how to build one, so this book also serves as a valuable introduction to those
who go on to implement systems hardware and software. Most systems books also
tend to focus on just one aspect of the system, for example, the hardware archi-
tecture, the operating system, the compiler, or the network. This book spans all
of these aspects, with the unifying theme of a programmer’s perspective.
If you study and learn the concepts in this book, you will be on your way to
becoming the rare power programmer who knows how things work and how to
fix them when they break. You will be able to write programs that make better
use of the capabilities provided by the operating system and systems software,
that operate correctly across a wide range of operating conditions and run-time
parameters, that run faster, and that avoid the flaws that make programs vulner-
able to cyberattack. You will be prepared to delve deeper into advanced topics
such as compilers, computer architecture, operating systems, embedded systems,
networking, and cybersecurity.

Assumptions about the Reader’s Background


This book focuses on systems that execute x86-64 machine code. x86-64 is the latest
in an evolutionary path followed by Intel and its competitors that started with the
8086 microprocessor in 1978. Due to the naming conventions used by Intel for
its microprocessor line, this class of microprocessors is referred to colloquially as
“x86.” As semiconductor technology has evolved to allow more transistors to be
integrated onto a single chip, these processors have progressed greatly in their
computing power and their memory capacity. As part of this progression, they
have gone from operating on 16-bit words, to 32-bit words with the introduction
of IA32 processors, and most recently to 64-bit words with x86-64.
We consider how these machines execute C programs on Linux. Linux is one
of a number of operating systems having their heritage in the Unix operating
system developed originally by Bell Laboratories. Other members of this class

19
20 Preface

New to C? Advice on the C programming language


To help readers whose background in C programming is weak (or nonexistent), we have also included
these special notes to highlight features that are especially important in C. We assume you are familiar
with C++ or Java.

of operating systems include Solaris, FreeBSD, and MacOS X. In recent years,


these operating systems have maintained a high level of compatibility through the
efforts of the Posix and Standard Unix Specification standardization efforts. Thus,
the material in this book applies almost directly to these “Unix-like” operating
systems.
The text contains numerous programming examples that have been compiled
and run on Linux systems. We assume that you have access to such a machine, and
are able to log in and do simple things such as listing files and changing directo-
ries. If your computer runs Microsoft Windows, we recommend that you install
one of the many different virtual machine environments (such as VirtualBox or
VMWare) that allow programs written for one operating system (the guest OS)
to run under another (the host OS).
We also assume that you have some familiarity with C or C++. If your only
prior experience is with Java, the transition will require more effort on your part,
but we will help you. Java and C share similar syntax and control statements.
However, there are aspects of C (particularly pointers, explicit dynamic memory
allocation, and formatted I/O) that do not exist in Java. Fortunately, C is a small
language, and it is clearly and beautifully described in the classic “K&R” text
by Brian Kernighan and Dennis Ritchie [61]. Regardless of your programming
background, consider K&R an essential part of your personal systems library. If
your prior experience is with an interpreted language, such as Python, Ruby, or
Perl, you will definitely want to devote some time to learning C before you attempt
to use this book.
Several of the early chapters in the book explore the interactions between C
programs and their machine-language counterparts. The machine-language exam-
ples were all generated by the GNU gcc compiler running on x86-64 processors.
We do not assume any prior experience with hardware, machine language, or
assembly-language programming.

How to Read the Book


Learning how computer systems work from a programmer’s perspective is great
fun, mainly because you can do it actively. Whenever you learn something new,
you can try it out right away and see the result firsthand. In fact, we believe that
the only way to learn systems is to do systems, either working concrete problems
or writing and running programs on real systems.
This theme pervades the entire book. When a new concept is introduced, it
is followed in the text by one or more practice problems that you should work
Preface 21

code/intro/hello.c
1 #include <stdio.h>
2
3 int main()
4 {
5 printf("hello, world\n");
6 return 0;
7 }
code/intro/hello.c

Figure 1 A typical code example.

immediately to test your understanding. Solutions to the practice problems are


at the end of each chapter. As you read, try to solve each problem on your own
and then check the solution to make sure you are on the right track. Each chapter
is followed by a set of homework problems of varying difficulty. Your instructor
has the solutions to the homework problems in an instructor’s manual. For each
homework problem, we show a rating of the amount of effort we feel it will require:

◆ Should require just a few minutes. Little or no programming required.


◆◆ Might require up to 20 minutes. Often involves writing and testing some
code. (Many of these are derived from problems we have given on exams.)
◆◆◆ Requires a significant effort, perhaps 1–2 hours. Generally involves writ-
ing and testing a significant amount of code.
◆◆◆◆ A lab assignment, requiring up to 10 hours of effort.

Each code example in the text was formatted directly, without any manual
intervention, from a C program compiled with gcc and tested on a Linux system.
Of course, your system may have a different version of gcc, or a different compiler
altogether, so your compiler might generate different machine code; but the
overall behavior should be the same. All of the source code is available from the
CS:APP Web page (“CS:APP” being our shorthand for the book’s title) at csapp
.cs.cmu.edu. In the text, the filenames of the source programs are documented
in horizontal bars that surround the formatted code. For example, the program in
Figure 1 can be found in the file hello.c in directory code/intro/. We encourage
you to try running the example programs on your system as you encounter them.
To avoid having a book that is overwhelming, both in bulk and in content, we
have created a number of Web asides containing material that supplements the
main presentation of the book. These asides are referenced within the book with
a notation of the form chap:top, where chap is a short encoding of the chapter sub-
ject, and top is a short code for the topic that is covered. For example, Web Aside
data:bool contains supplementary material on Boolean algebra for the presenta-
tion on data representations in Chapter 2, while Web Aside arch:vlog contains
22 Preface

material describing processor designs using the Verilog hardware description lan-
guage, supplementing the presentation of processor design in Chapter 4. All of
these Web asides are available from the CS:APP Web page.

Book Overview
The CS:APP book consists of 12 chapters designed to capture the core ideas in
computer systems. Here is an overview.

Chapter 1: A Tour of Computer Systems. This chapter introduces the major ideas
and themes in computer systems by tracing the life cycle of a simple “hello,
world” program.
Chapter 2: Representing and Manipulating Information. We cover computer arith-
metic, emphasizing the properties of unsigned and two’s-complement num-
ber representations that affect programmers. We consider how numbers
are represented and therefore what range of values can be encoded for
a given word size. We consider the effect of casting between signed and
unsigned numbers. We cover the mathematical properties of arithmetic op-
erations. Novice programmers are often surprised to learn that the (two’s-
complement) sum or product of two positive numbers can be negative. On
the other hand, two’s-complement arithmetic satisfies many of the algebraic
properties of integer arithmetic, and hence a compiler can safely transform
multiplication by a constant into a sequence of shifts and adds. We use the
bit-level operations of C to demonstrate the principles and applications of
Boolean algebra. We cover the IEEE floating-point format in terms of how
it represents values and the mathematical properties of floating-point oper-
ations.
Having a solid understanding of computer arithmetic is critical to writ-
ing reliable programs. For example, programmers and compilers cannot re-
place the expression (x<y) with (x-y < 0), due to the possibility of overflow.
They cannot even replace it with the expression (-y < -x), due to the asym-
metric range of negative and positive numbers in the two’s-complement
representation. Arithmetic overflow is a common source of programming
errors and security vulnerabilities, yet few other books cover the properties
of computer arithmetic from a programmer’s perspective.
Chapter 3: Machine-Level Representation of Programs. We teach you how to read
the x86-64 machine code generated by a C compiler. We cover the ba-
sic instruction patterns generated for different control constructs, such as
conditionals, loops, and switch statements. We cover the implementation
of procedures, including stack allocation, register usage conventions, and
parameter passing. We cover the way different data structures such as struc-
tures, unions, and arrays are allocated and accessed. We cover the instruc-
tions that implement both integer and floating-point arithmetic. We also
use the machine-level view of programs as a way to understand common
code security vulnerabilities, such as buffer overflow, and steps that the pro-
Preface 23

Aside What is an aside?


You will encounter asides of this form throughout the text. Asides are parenthetical remarks that give
you some additional insight into the current topic. Asides serve a number of purposes. Some are little
history lessons. For example, where did C, Linux, and the Internet come from? Other asides are meant
to clarify ideas that students often find confusing. For example, what is the difference between a cache
line, set, and block? Other asides give real-world examples, such as how a floating-point error crashed
a French rocket or the geometric and operational parameters of a commercial disk drive. Finally, some
asides are just fun stuff. For example, what is a “hoinky”?

grammer, the compiler, and the operating system can take to reduce these
threats. Learning the concepts in this chapter helps you become a better
programmer, because you will understand how programs are represented
on a machine. One certain benefit is that you will develop a thorough and
concrete understanding of pointers.

Chapter 4: Processor Architecture. This chapter covers basic combinational and


sequential logic elements, and then shows how these elements can be com-
bined in a datapath that executes a simplified subset of the x86-64 instruction
set called “Y86-64.” We begin with the design of a single-cycle datapath.
This design is conceptually very simple, but it would not be very fast. We
then introduce pipelining, where the different steps required to process an
instruction are implemented as separate stages. At any given time, each
stage can work on a different instruction. Our five-stage processor pipeline is
much more realistic. The control logic for the processor designs is described
using a simple hardware description language called HCL. Hardware de-
signs written in HCL can be compiled and linked into simulators provided
with the textbook, and they can be used to generate Verilog descriptions
suitable for synthesis into working hardware.

Chapter 5: Optimizing Program Performance. This chapter introduces a number


of techniques for improving code performance, with the idea being that pro-
grammers learn to write their C code in such a way that a compiler can then
generate efficient machine code. We start with transformations that reduce
the work to be done by a program and hence should be standard practice
when writing any program for any machine. We then progress to trans-
formations that enhance the degree of instruction-level parallelism in the
generated machine code, thereby improving their performance on modern
“superscalar” processors. To motivate these transformations, we introduce
a simple operational model of how modern out-of-order processors work,
and show how to measure the potential performance of a program in terms
of the critical paths through a graphical representation of a program. You
will be surprised how much you can speed up a program by simple transfor-
mations of the C code.
24 Preface

Chapter 6: The Memory Hierarchy. The memory system is one of the most visible
parts of a computer system to application programmers. To this point, you
have relied on a conceptual model of the memory system as a linear array
with uniform access times. In practice, a memory system is a hierarchy of
storage devices with different capacities, costs, and access times. We cover
the different types of RAM and ROM memories and the geometry and
organization of magnetic-disk and solid state drives. We describe how these
storage devices are arranged in a hierarchy. We show how this hierarchy is
made possible by locality of reference. We make these ideas concrete by
introducing a unique view of a memory system as a “memory mountain”
with ridges of temporal locality and slopes of spatial locality. Finally, we
show you how to improve the performance of application programs by
improving their temporal and spatial locality.

Chapter 7: Linking. This chapter covers both static and dynamic linking, including
the ideas of relocatable and executable object files, symbol resolution, re-
location, static libraries, shared object libraries, position-independent code,
and library interpositioning. Linking is not covered in most systems texts,
but we cover it for two reasons. First, some of the most confusing errors that
programmers can encounter are related to glitches during linking, especially
for large software packages. Second, the object files produced by linkers are
tied to concepts such as loading, virtual memory, and memory mapping.

Chapter 8: Exceptional Control Flow. In this part of the presentation, we step


beyond the single-program model by introducing the general concept of
exceptional control flow (i.e., changes in control flow that are outside the
normal branches and procedure calls). We cover examples of exceptional
control flow that exist at all levels of the system, from low-level hardware ex-
ceptions and interrupts, to context switches between concurrent processes,
to abrupt changes in control flow caused by the receipt of Linux signals, to
the nonlocal jumps in C that break the stack discipline.
This is the part of the book where we introduce the fundamental idea
of a process, an abstraction of an executing program. You will learn how
processes work and how they can be created and manipulated from appli-
cation programs. We show how application programmers can make use of
multiple processes via Linux system calls. When you finish this chapter, you
will be able to write a simple Linux shell with job control. It is also your first
introduction to the nondeterministic behavior that arises with concurrent
program execution.

Chapter 9: Virtual Memory. Our presentation of the virtual memory system seeks
to give some understanding of how it works and its characteristics. We want
you to know how it is that the different simultaneous processes can each use
an identical range of addresses, sharing some pages but having individual
copies of others. We also cover issues involved in managing and manip-
ulating virtual memory. In particular, we cover the operation of storage
allocators such as the standard-library malloc and free operations. Cov-
Other documents randomly have
different content
jollei se tule hänen avukseen. Ainoana lohdutuksena olivat enään
kaupunginlähetyksen sikarit. August oli sullonut koko kyökkikaapin
alaosan niitä täyteen.

Jo kirkossa oli Konrad huomannut, että superintendentti ja useat


hänen likeisistä virkatovereistaan olivat kohdelleet häntä melkein
vältellen. He olivat ikäänkuin tarkoituksella paljon enemmän
puhutelleet hänen veljeään kuin häntä, sentään loukkaamatta
kohteliaisuutta. Yksin Bock oli monta kertaa tahallaan kääntänyt
hänelle selkänsä ja käyttäytynyt yhtä sopimattomasti kuin
epäkohteliaasti.

Julius oli kutsunut vieraat luokseen kahvia juomaan, mutta koskei


Konrad heti tahtonut lähteä heidän kanssansa, niin hän välillä
pistäysi surutaloon. Siellä tapasi hän Hedvigin ystävättärien keskellä.
He olivat tuoneet palmunoksia ja koettivat lohduttaa voimiensa
takaa. Useimmat olivat vainajan rippilapsia, monet hän sitäpaitsi oli
vihkinyt.

Puolen tunnin kuluttua Konrad, lupauksensa mukaan, läksi


veljensä luo.

Hänen astuessaan työhuoneeseen, loppui keskustelu äkkiä.


Varmaankaan ei kukaan enään ollut odottanut hänen tulevan, tai oli
puhelu koskenut juuri häntä. Seurasi sama kiusallinen mieliala kuin
silloin, kun Josefa äkkiä oli tuotu sisään ja kaikki olivat odottaneet
ilkeää kohtausta. Kummallista kyllä, istuivat melkein kaikki silloisilla
paikoillaankin. Luthertuolissa vain ylvästeli tällä kertaa koko
mahtavuudessaan Thürmel, nuuskien kaksiosaisella nenällään
ympärilleen kuin jahtikoira. Oikeanpuoleisen ikkunan luona istui
sitäpaitsi toinen pappi ja pari vierasta virkaveljeä.
Pitkä kandidaatti, joka Bockin puoltolauseella oli päässyt mukaan,
oli asettunut pienen pöydän taakse; hän katseli lakkaamatta
kahvikuppiaan ja purekseli laihojen viiksiensä toista päätä, koska
toinen jo oli langennut hänen pureksimisraivonsa uhriksi; Simmer
seisoi perällä, kirjakaapin edessä, luoden lupaavia katseita
ympärilleen; Kickert veti jalat alleen kuin koulupoika; onneton neiti
oli ottanut käteensä lentokirjasen ja rouva Simmer istui sohvassa
liikkumattomana kuin jättiläisnainen, joka odottaa yleisön
suosionosoituksia, kaula peittyneenä vallan kolminkertaisen leuvan
sisään. Tämän kaiken huomasi Konrad silmänräpäyksessä. Se oli uusi
näytös kappaleesta, jonka edellisessä osassa samat henkilöt jo olivat
esiintyneet samoissa asennoissa. Juliuskin seisoi kirjoituspöydän
luona, Bockin vieressä, joka istui pitäen oikeaa kättään suorana
pöydällä. Ja tuskin oli Konrad ehtinyt sisään, kun Klaudinakin tuli
katsomaan, olivatko vieraat tulleet kestitetyiksi. Siinä tilaisuudessa
ehti hän Bockin kanssa vaihtaa merkitsevän katseen.

— No kas siinähän sinä nyt olet! huudahti Julius, kääntyäkseen


samassa
Klaudinan puoleen: — kuppi lisää, neiti Schaff.

— On jo, herra pastori, vastasi Klaudina kuivasti, osoittaen suurta


pyöreää pöytää ja samassa lisäten: — ehkä herra tohtori suvaitsee
istua tässä.

Hän oli asettanut tarjottimen pöydälle ja aikoi juuri lähteä, mutta


kääntyi vielä ja kysyi:

— Saako Josefa hetkiseksi tulla sisään, herra pastori? Hän tahtoisi


mielellään kiittää lahjoista.
Melkein kaikki läsnäolijat olivat tuoneet hänelle jotakin pientä,
enimmäkseen hyödyllisiä kapineita, — ainakin antajien mielestä.
Sattuman kautta oli hän kolmelta taholta saanut virsikirjan, ja sille
asialle oli hiukan naurettu. Mutta Julius oli antanut lupaamansa
kultasen ristin, joka näytti erittäin kauniilta ja arvokkaalta.

Klaudinan sanat vaikuttivat häneen sangen epämiellyttävästi, sillä


hän muisti Bockin ja veljensä ensi tapaamisen ja pelkäsi silloisen
kohtauksen jostakin syystä uudistuvan. Hän oli koko iltapäivän ollut
levoton ja Konradin tullessa hänen levottomuutensa vain lisääntyi;
hän suututteli jo sitä, ettei hän ollut antanut kastamisen tapahtua
vieläkin ahtaammassa piirissä. Mutta äkkiä tuli hovisaarnaaja väliin,
huomauttaen mahtipontisella tavallaan, jota ei käynyt
vastustaminen, ettei lapselta saattanut kieltää sellaista pyyntöä.
Julius ei uskaltanut panna vastaan.

Kului viisi minuuttia, mutta keskustelu ei tahtonut päästä vauhtiin.


Julius ja superintendentti juttelivat vähäpätöisistä asioista, samoin
tekivät muutamat muutkin, paitsi Bock, joka tarkkaavaisesti katseli
oveen, ikäänkuin hän sieltä olisi odottanut jotakin tavatonta. Kaikki
näyttivät koettavan huomata Konradia niin vähän kuin suinkin. Syntyi
hetken hiljaisuus, jota seurasi tavaton kolina. Simmer oli pudottanut
maahan suuren kirjan ja se oli onnettomuudeksi sattunut Kickertin
vasemmalle jalalle.

— Mutta kuulkaa toki… mitä te teette? ärjäsi seminaarintirehtori


puoliääneen ja heitti vihaisen katseen Simmeriin, joka hämillään
pyysi anteeksi. Mutta Julius tarttui silminnähtävällä mielikarvaudella
kirjaan ja tarkasteli sitä joka haaralta. Tuo kirjainto rupesi todellakin
käymään sietämättömäksi.
Sitte kääntyi kaikkien huomio onnettomaan neitiin, joka oli
noussut ja rientänyt Konradin viereen istumaan.

— En ole teitä vielä kiittänyt siitä kauniista saarnasta, jonka eilen


piditte, lausui hän kovalla äänellä ja tarttui hänen käteensä,
pitääkseen sitä omiensa välissä koko ajan kuin hän puhui. Hänen
huntunsa oli tällä kertaa niin paksu, ettei hän ollut voinut kestää sen
takana, vaan oli turbaanin tavoin kietonut sen otsansa ympäri, mikä
teki hänet hyvin hullun näköiseksi. — Metterbach puhui kyllä hirveän
kauniisti (se oli hänen katoolilainen nuoruutensa rakastettu), jatkoi
hän, — mutta te puhuitte vielä kauniimmin. Te ette ensinkään
maininnut pyhää henkeä ja siitä minä pidin. Nimittäin
saarnastuolissa. Muu kaikki on vähäpätöisempää. Jos löytyisi pyhä
henki, niin ei hän kärsisi selibaattia. Antoihan Vapahtajammekin
anteeksi syntiselle vaimolle, mutta paavi luulottelee olevansa
enemmän. Hän ei kärsi edes avioliittoa… Jollei Kristus olisi ollut
ihminen niinkuin mekin, niin ei hän olisi antanut anteeksi
lähimmäisensä heikkouksia.

Hän puhui niin yhtämittaa, ettei Konrad voinut muuta kuin antaa
kuuran kaatua päälleen. Mutta Bock heitti neitiin ärtyisän katseen, ja
seurasi häntä sillä vielä sittenkin, kun hän, istuutuneena vanhalle
paikalleen, koetti herättää rouva Simmerissä myötätuntoisuutta
tunteilleen. Julius olisi mielellään suonut hänet sinne missä pippurit
kasvavat, mutta hän oli hiljan lahjoittanut hänen seurakuntansa
turvattomille lapsille sievän summan ja sentähden täytyi häneen nyt
tyytyä sellaisena kuin hän oli.

Äkkiä kuului kova koputus oveen ja maalaispastori astui


huoneeseen mitä kiihoittuneimmassa mielentilassa. Useimmat
läsnäolijoista eivät tunteneet häntä, joten hänen omituista olentoaan
katsottiin suurella uteliaisuudella.

— Anteeksi, rakas virkaveli, että näin mullin mallin työnnyn


huoneeseen, mutta minulla on teille tärkeä asia, alkoi hän
hengästyneenä ja ojentaen yhtäperää kätensä sekä Juliukselle että
Konradille ja ystävällisesti kumartaen joka taholle. Hän oli mahtanut
tulla aika kiivaasti, sillä vaikka ulkona oli talvinen ilma, niin kirkas hiki
pisaroi hänen otsaltaan.

— Tietysti, herra pastori. Minä olen kokonaan valmis teitä


palvelemaan, vastasi Julius. — Mutta tehän olette aivan
sulamaisillanne…

Hän piti nyt velvollisuutenaan esitellä hänet muille läsnäoleville.


"Erittäin hauska", äänteli Bläsel yhtämittaa, ottamatta
superintendenteistä tai hovisaarnaajista enemmän selkoa kuin
muistakaan. Sen sijaan jymisi hänen bassonsa pian huoneessa:

— Jaa, jaa, kyllä se osaakin suututtaa! Kyllä tämä p… ijakkaan


Berliini on minua harmittanut! Miltei olin kutsumaisillani sitä oikein
sen oikealla nimellä. Tässä kaupungissa vaeltelee synti sadoissa eri
muodoissa.

Hän pyyhki kasvonsa ja käyttäytyi muuten ikäänkuin hän olisi ollut


kahdenkesken pastorin kanssa.

Hän oli tuonut mukaansa raikkaan tuulahduksen luonnon


helmasta; se ikäänkuin elostutti koko taloa. Thürmelkään ei voinut
estää hymyä nousemasta kasvoilleen, mutta Bock tarkasteli ylpeästi
tuota yksinkertaista pappia, joka, vaikka hän paremmin oli kuin
kansakoulun-opettaja, oli uskaltanut jättää hänet huomaamatta.
Anteeksi pyytäen jätti Julius hetkeksi vieraansa ja vei vanhuksen
viereiseen huoneeseen. Vihdoin siirtyivät he sieltä
rippikouluhuoneeseen, sillä Bläsel tahtoi olla aivan häiritsemättä. Hän
oli niin haltioissaan, ettei hän malttanut istuutua ennenkuin hän
sanoilla: "odottakaa hetkinen, herra pastori, täällä on vielä joku
odottamassa", oli käynyt etehisessä ja sieltä palannut takaisin
Oskarin seurassa. Hämillään nuori mies pysähtyi oven ääreen.

— Tämä on poikani, jonka luultavasti muistatte entisiltä ajoilta. Ei


minun kai tarvitse kertoa, mitä kaikkia hänen kauttaan olen
kokenut… Mutta kuulkaa nyt, herra Baldus.

Julius ei voinut aavistaakkaan mistä oli kysymys. Kylmästi


vastattuaan Oskarin tervehdykseen ja suljettuaan oven, kuunteli hän
suurella uteliaisuudella.

— Minun täytyy vielä kysyä, alkoi pastori, istuuduttuaan, — onko


poikani joskus käynyt luonanne pyytämässä jonkinlaista apua? Se ei
olisi mahdotonta, sillä hän oli jo joutunut hyvin rappiolle. Mitä minä
siitä salaisin, sillä veljennehän…

— Ei koskaan, herra pastori, vastasi Julius kiireesti, sillä hän näki


Oskarin etenevän perälle päin huonetta.

— No, siinä on jo ensimmäinen rauhoitus, jatkoi maalaispastori. —


Mutta minun täytyy vielä antaa teille selitys. Te mainitsitte kerran,
että teiltä oli kadonnut joku kuva. Onkohan se tämä?

Samassa hän taskustaan veti esiin Valekrispinuksen ja kietoi sen


auki paperista. Oskar oli aamupäivällä kaikessa viattomuudessaan
näyttänyt hänelle kuvan, joka oli jäänyt hänen kesäpalttoonsa
taskuun. Ja tarkemmin asiaa ajattelematta oli hän sen yhteydessä
tullut maininneeksi pastorin nimen. Hän oli muka muutamalla
pennillä ostanut kapineen eräältä henkilöltä, joka oli sanonut
saaneensa sen pastorilta. Mutta samassa Oskar niin oli kietoutunut
omiin sanoihinsa, että isän oli täytynyt ruveta epäilemään koko
asiaa. Lorun lopuksi Oskar sitte oli kertonut kaikki, josta pastorin
epäluulo vain oli lisääntynyt. Ne asianhaarat, joitten vallitessa hänen
poikansa, omaatuntoaan rauhoittaakseen oli ostanut takaisin kuvan,
tuntuivat hänestä todellakin ansaitsevan likempää tarkastusta,
jonkatähden hän heti päivällisen jälkeen oli lähtenyt tänne. Oskar oli
joko vielä pelastettavissa, tai oli hän kokonaan mennyt mies. Siitä
täytyi pastorin saada ratkaiseva varmuus. Ja sentähden hän Oskarin
seurassa oli tehnyt tämän retken, vaikeimman eläessään.

— Kyllä se on juuri se, vastasi Julius äärimmilleen kummissaan ja


silmäili vuorotellen isään vuorotellen poikaan.

— Poikani sanoo juuri tulleensa paikalle, kun muuan Jannusch,


ylpeillen teidän tuttavuudestanne, oli myymäisillään sen jonnekin.
Asia tuntui pojastani epäilyttävältä, jonkatähden hän itse osti kuvan.

Sinä hetkenä lausui vanhus valheensa niin taitavasti, että hän


jälkeenpäin itsekin ihmetteli. Mutta tahtoihan hän nyt sovittaa kaikki,
mitä oli syydetty Oskarin niskoille.

— Olen teille hyvin kiitollinen, herra pastori, kun sellaisella huolella


olette ajanut asiaa, vastasi Julius, jolle paljastus itse teossa oli
tavattoman vastenmielinen. — Samalle Jannuschille olen minä
osoittanut paljon hyvyyttä ja kiitokseksi hän… Miten te herra pastori
saatoittekaan epäillä poikaanne sellaisesta. Mutta tulettehan nyt
sisään?

Tyytyväisenä maalaispastori nousi.


— Neljännestunniksi, herra pastori. Lähdemme tänä iltana.
Olemme löytäneet paikan pojalleni, mutta vasta ensi kuusta. Hän
saattaa siis nyt käydä kotiakin katsomassa. Hän pyytää paikalla
lausua teille jäähyväiset.

— No, onnea sitte, herra kandidaatti, sanoi Julius ja ojensi


Oskarille pari oikean kätensä sormea.

— Mutta ehkä hän tässä viereisessä huoneessa voisi odottaa?


huomautti maalaispastori äkkiä. — Meillä on nimittäin vielä vähän
asioita toimitettavana yhdessä.

Hän ei moneen päivään ollut päästänyt Oskaria silmistään ja nyt


hän pelkäsi, että Oskar, jolla oli rahaa taskussa, karkaisi, jos hän
jättäisi hänet yksin.

— Mieluinten minä jo paikalla lähtisin mukaan, mutta olisi ehkä


epäkohteliasta… huomautti hän.

Oskar pani tosin ensin hiukan vastaan, mutta rauhoittui vihdoin,


sillä hän käsitti, että hänen läsnäolonsa sekä hänelle itselleen että
seuralle olisi ollut sangen kiusallinen. Hän istuutui siis viereiseen
huoneeseen, valitsi niin mukavan asennon kuin suinkin ja syventyi
katselemaan Kristusta ja syntistä vaimoa.

Kymmenes luku.

Samana hetkenä kuin maalaispastori ja Julius yhdestä ovesta


astuivat työhuoneeseen, tuli Klaudina Josefan kanssa sisään toisesta.
Josefa suuntasi paikalla askeleensa Thürmelin luo, ojensi hänelle
kätensä ja lausui niiaten:

— Minä saan kiittää kauniista lahjasta. Juliuksen täytyi kääntyi


pois, niin häntä nauratti, sillä superintendentti oli ainoa, joka ei ollut
tuonut mitään lahjaa. Mutta superintendentti keksi pian keinon; hän
hymähti väkinäisesti ja virkkoi:

— Se tulee huomenna, lapseni. Se jäi minulta kotiin.

Klaudina oli syypää siihen, että Josefa ensin oli kääntynyt hänen
puoleensa, sillä Klaudina oli tahallaan tahtonut nolata
superintendenttiä.

Josefa kulki miehestä mieheen, tehden saman tempun; hän


hymyili jokaiselle, mutta hymy katosi paikalla, kun hän oli lausunut
kiitoksensa. Klaudina oli mahtanut mättää kaikki hänen päähänsä —
niin koneentapaiset olivat hänen liikkeensä, niin vähän ystävällisyyttä
hänen katseessaan, niin kylmästi, lyhyesti lausui hän sanansa.

Maalaispastori oli istuutunut pyöreän pöydän ääreen Konradin


viereen.

— No vai niin, huudahti hän, — tämä on nyt kai se pikku tyttö,


josta olen kuullut niin paljon… Tuleppa nyt tänne, lapseni. Onnittelen
sinua oikein sydämmellisesti… Tottahan herra pastori sallii, että
pistän pikkusen säästölaatikkoon…? (Juliuksella ei tietysti ollut
mitään sitä vastaan ja maalaispastori jatkoi:) — Kas, tuossa saat
oikein kiiltävän… Se on onnentaaleri, joka jo kymmenen vuotta on
ollut minulla, lisäsi hän kääntyen seuran puoleen. Sitte avasi hän
suuren kukkaronsa ja ojensi tytölle rahan, sanoen; — se tuottaa
sinulle onnea.
Tyttö otti taalerin ja kiitti hiljaisella äänellä. — Mutta lapseni, miltä
sinä näytät? virkkoi vanhus taputtaen häntä leuvan alle. — Pää
pystyyn vaan! Ei tuollaisilla hautajaiskasvoilla saa astua kristilliseen
elämään. Mikä sinun on?… Hän ei näytä olevan oikein terve, kääntyi
hän samassa Juliuksen puoleen. Kaikkien katseet suuntautuivat
maalaispastoriin, joka siten, aivan tietämättään tuli keskipisteeksi
koko seurassa. Hänen voimakas äänensä näkyi ikäänkuin estävän
kaikkia muita korottamasta ääniään. Kääntyen pois naisista veti hän
esiin nuuskarasiansa ja vahvistautui aika "priisillä". Sitte lähetti hän
rasian kiertämään miehestä mieheen.

— Ettekö tekään, herra hovisaarnaaja? kysyi hän, kun kaikki olivat


kieltäytyneet. Bock kiitti kohteliaalla, kylmällä kumarruksella.
Maalaispastorin vapaa tapa ei laisinkaan miellyttänyt häntä, eikä hän
myöskään kärsinyt sitä, että Bläsel yhtämittaa veti esiin ystävälliset
suhteensa Konradiin. Äkkiä heitti hän katseensa Klaudinaan, joka
liikkumattomana seisoi ovessa, ja virkkoi Juliukselle:

— Niin, hän näyttää todellakin sairaalta, minusta myöskin. Tuleppa


tänne lapseni, lisäsi hän sitte Josefalle. Ja kun tyttö oli saapunut
hänen eteensä, tarttui hän hänen molempiin käsiinsä ja jatkoi
korkealla äänellä: — onko täällä huoneessa ketään, josta sinä et
pidä… tarkoitan, joku, joka on kohdellut sinua pahoin? Puhu vain
vapaasti ja näytä, kuka se on.

— Mutta herra hovisaarnaaja! keskeytti hänet Julius niin kovalla


äänellä, että kaikki hämmästyivät. Ja hämmästys oli sitä suurempi,
kun ei kukaan ymmärtänyt keskustelun tarkoitusta.

— Antakaamme tytön puhua, herra pastori, vastasi Bock


rakastettavalla hymyllä ja kääntyi takaisin tytön puoleen. —
Katseleppa nyt ympärillesi.
Josefa totteli. Hänen silmänsä harhailivat pitkin huonetta, kunnes
pysähtyivät Konradiin. Hetkisen ajan seisoi hän siinä
liikkumattomana, mutta kaikki näkivät, kuinka hän säpsähti. Sinä
hetkenä teki hän oikein surkean vaikutuksen. Vähitellen muuttui
kalpeus hänen kasvoillaan tummaksi punaksi, mutta yhä vieläkin
pysyi hän liikkumattomana. Konradin valtasi kamala tunne: oli kuin
veri olisi pysähtynyt hänen suonissaan, hän liiteli pohjattomien
syvyyksien yli; hän ei saanut sanaa suustaan. Hän kävi
kalmankalpeaksi, mutta hillitsi itsensä ja loi tyttöön tyynen katseen.

— Puhu toki, lapseni, kehoitti Bock.

— Mutta mitä tämä oikeastaan merkitsee? kysyi maalaispastori,


nousten pöydän äärestä ja astuen hiukan syrjään. Muutkin
läsnäolijat näyttivät levottomilta ja äärimmilleen hämmästyneiltä.
Kickert vain pysyi tyynenä ja Klaudina seisoi ovessa liikkumattomana
kuin kivipatsas, uskaltamatta edes hengittää. Äkkiä kohtasi hän
Josefan katseen. Se oli hetken työ ja muut sitä tuskin
huomasivatkaan, mutta Josefa ymmärsi hänen päänsä keveän
liikkeen ja uhkaavan katseen. Hän nosti hitaasti oikean kätensä ja
viittasi sanatonna Konradiin.

— Tuo herra siis, sanoi Bock nousten. — Te kuulitte sen kaikki,


rakkaat ystävät. On tapahtunut asioita, joita ei täällä voi mainita,
mutta jotka tekevät, että tätä tyttö raukkaa täytyy suuresti sääliä. Ja
sitte sitä vielä ylpeillään jumalattomista mielipiteistä!… Voitteko,
herra tohtori, puolustautua tämän tytön syytöstä vastaan? Näiden
kunnioitettavien henkilöiden läsnäollessa vaadin teitä tekemään sen.

Hän oli asettunut aivan kiinni pöytään ja nojaten molempia


käsiänsä levyyn, tuijotti hän uhkaavasti Konradiin.
Maalaispastori otti Juliuksen erilleen, kysyäkseen, mitä tämä kaikki
oikeastaan merkitsi. Ja saatuaan selityksen, ilmoitti hän, ettei se ollut
muuta kuin häpeällistä panettelua. Jotakin niin odottamatonta kuin
tuo suoranainen syytös, ei Julius pitkiin aikoihin ollut kokenut. Hän ei
enään ymmärtänyt hovisaarnaajaa, enempää kuin veljeäänkään tai
Josefaa. Mutta kun hän vihdoin johonkin määrään oli tointunut ja
huomasi kaikkien muitten olevan aivan suunniltaan poissa, niin hän
katsoi velvollisuudekseen ruveta välittäjäksi.

— Mutta sano toki jokunen selityksen sana, lausui hän Konradille.

Klaudinan viittauksesta olivat rouva Simmer ja onneton neiti


nousseet ja hänen seurassaan lähteneet käytävän puolelle. Klaudina
palasi sentään parin minuutin perästä takaisin.

Bock vilkaisi tuontuostakin Thürmeliin, jolta hän oli odottanut


moraalista tukea, mutta superintendentti ei liikahtanut, vaan istui
kankeana ja arvokkaana paikallaan, kädet rinnalla ristissä. Hän oli
päättänyt jättää asian kokonaan hovisaarnaajan haltuun.

Konrad ei vieläkään ollut vastannut. Kun vihdoin maalaispastorikin


ystävällisesti rupesi häntä kehoittamaan puolustautumaan, niin hän
odottamattoman lempeällä äänellä virkkoi:

— Jos olisin samalla kannalla kuin herra hovisaarnaaja, niin minun


pitäisi vastata samallaisella solvauksella. Mutta täytyisihän minun
halveksia itseäni, jollen itse voisi täyttää sitä, mitä muilta vaadin.
Minä en milloinkaan kosta pahaa pahalla, siksi suon teille sydämmeni
pohjasta kaikki anteeksi, herra hovisaarnaaja, kääntyi hän
suorastaan Bockin puoleen. — Ja vaikka te nyt avaisitte ikkunat
taikka rientäisitte ulos julistamaan koko maailmalle, mitä minusta
ajattelette, — niin minun anteeksiantoni pysyisi entisellään.
Sentähden pidän puolustautumista arvolleni alentavana.

— Kauniita sanoja, ilkkui Bock ja käänsi hänelle selkänsä.

Konrad nousi; hänen silmänsä leimusivat samalla tavalla kuin


kerran silloin, kun hän oli asettanut rouva Brennerleinin aisoihinsa.

— Niin, kauniita sanoja kyllä, herra hovisaarnaaja, mutta teidän


pitäisi ennen kaikkia panna ne mieleenne. Teidän ei pitäisi kantaa
Vapahtajan nimeä yksin huulillanne, vaan teidän pitäisi koettaa
pyrkiä hänen kaltaisekseen. Ja jos te tiedätte, ettette voi, niin teidän
ainakin tulee korvata rakkaudenpuutteenne sillä, että koko maailman
edessä uskallatte luopua papillisesta puvustanne ja ilmoittaa ettette
enää ole sen arvoinen. Ehkä kyllä moni sinä hetkenä soimaa teitä
heikkoudesta, mutta tuo heikkous on itse asiassa suurin
väkevyytenne. Sillä silloin te olette lannistanut vihan ja seisotte
nöyränä voittajana tuomarienne edessä… Herra hovisaarnaaja,
katsokaa tuonne, jatkoi hän yhä kiihtyneempänä ja viittasi sohvan
yläpuolella riippuvaa kuvaa "Alasottaminen ristiltä", — ja katsokaa
sitte minua suoraan silmiin: Kristuksen veren nimessä minä teiltä
kysyn, uskotteko että olen syypää siihen tekoon, josta jo
viikkokausia olette minua syyttänyt… Käännätte pois kasvonne. Minä
kiitän teitä! Katsokaa nyt tätä tyttöä. Eikö hän puhunut pahojen
voimien vaikutuksesta?

Samassa lisahti ovi lukkoon: Klaudina katosi.

— Tule tänne Josefa, sinäkin saat anteeksi, varsinkin kosket


tietänyt, mitä puhuit, jatkoi Konrad, kun ei Bock vastannut kuin
olkapäitään kohauttamalla. Hän likeni tyttöä, tarttuakseen hänen
käteensä. Mutta samassa tapahtui hänessä omituinen muutos: hän
pakeni, tuijotti Konradiin suurin, mielettömin silmin, ojensi kätensä
torjuen eteensä ja sanoi vapisevin huulin:

— Älä minuun kajoo, sinä olet Vapahtaja ja kirkon vihollinen. Ja


kaikkien vihollisten täytyy kuolla… Neiti Schaff sanoi niin… Sillä
Vapahtaja on pelastaja ja sinä tahdot pelastaa syntiset.

Uskonnollinen hourailu oli hänet vallannut. Häntä pöyristytti


kumeensekainen vilu, sillä hän ei vielä ollut tointunut taudistaan;
sentähden hänen poskillaan koko päivän oli leimahdellut tulipuna.
Kuumuus värjäsi hänen kasvonsa ja otsalle pisaroi kirkas hiki. Sinä
hetkenä ei hän todellakaan tietänyt mitä hän teki tai mitä hän puhui.
Kaikki pyöri hänen päässään aivan niinkuin silloin, kun Konrad
kiviportailta oli löytänyt hänet väsyneenä, uuvuksissa,
kuumehourailussa. Hän oli niin surkean näköinen, että läsnäolijat
säälien kokoontuivat hänen ympärilleen.

— Mutta lapsi on kovasti kipeänä ja hourailee, sanoi


maalaispastori.
— Katsokaa toki… herra pastori!

Julius ei vastannut. Hän tahtoi häntä tukea ja asettaa hänet


istumaan, mutta hän karkasi hänen käsistään, pakeni viereistä
huonetta kohti, aukaisi oven ja ryntäsi sisään. Kaikki näkivät hänen
seisahtuvan ja hetken ajan tuijottavan yhteen kohtaan.

— Auttakaa, auttakaa! kirkasi hän äkkiä ja palasi kiireesti takaisin.

— Ei se ole kuin poikani, joka odottaa minua, selitti maalaispastori.


— Tule nyt tänne, Oskar, huusi hän sitte.
Kumarrellen joka taholle ilmestyi Oskar ovelle. Mielessään
annettuaan anteeksi "aviorikkojattaren" synnin, oli hän
tarkkaavaisesti kuunnellut viereisessä huoneessa vallitsevaa melua.
Nyt hän korjasi kakkuloitaan, tervehti Konradia äänekkäällä
tutunomaisuudella ja nyökäytti ystävällisesti päätään eräälle
apulaispapille, jonka seurassa hän ennen oli ottanut monen olutlasin.
Mutta maalaispastorilla ei ollut aikaa huomata hovisaarnaajan ja
muitten läsnäolijoiden merkitseviä katseita, sillä Josefa pakeni
äärimmäisen ikkunan luo asti ja huusi uudestaan:

— Älkää päästäkö häntä sisään, hän lyö minua. Mutta minäpä


raadan häneltä silmät puhki… niinkuin silloin kun hän asui tuolla
kirkon takana.

Hänen pelkonsa oli niin suuri, että hän painautui ikkunalautaa


vastaan, ja piiloutui kartiinin taakse. Epäilemättä hän oli sairas,
mutta hänen mielikuvituksensa muodot sekaantuivat niihin
vaikutuksiin, joita hän tunsi. Hänen tajuntansa palasi, mutta kasvoilla
hehkui vielä kuume. Muutos näytti tapahtuneen parempaan päin,
mutta muutos, joka pian huomattiin pettymykseksi. Huoneessa
vallitsi yleinen hiljaisuus.

— Tunnetko tuon tytön? kääntyi maalaispastori vihdoin poikansa


puoleen. — Sinä kuulit mitä hän sanoi.

Hänen kasvoilleen oli noussut tumma puna, hän aavisti pahaa.


Hän astui poikansa eteen ja mittasi häntä katseella, joka oli niin
hirveä, että Oskar välittömästi otti pari askeletta taaksepäin.

— Olen minä taitanut hänet joskus nähdä… tuolla, portaissa.


Muuten en tiedä mitään, vastasi hän, pakoittautuen
välinpitämättömäksi. Sitte hän katsahti Konradiin, ikäänkuin
sanoakseen jotakin, mutta malttoi mielensä ja jatkoi: — näkeehän
sen selvästi, että hän on puolihullu… Suokaa anteeksi, hyvät herrat,
että häiritsin.

Hänen kasvonsa olivat käyneet vielä kalpeammiksi kuin ne


tavallisesti olivat. Hän tahtoi jättää huoneen, mutta vanhus tarttui
hänen käteensä ja veti hänet keskelle lattiaa. Äkkiä kääntyi kaikki
huomio Josefaan, sillä hän oli, kädet ristissä, heittäytynyt polvilleen
Konradin eteen. Hänen puheensa oli taas aivan järkevää:

— Minä valehtelin, herra pastori, alkoi hän. — Te ette koskaan ole


tehnyt minulle kuin hyvää. Älkää olko minulle suutuksissanne, herra
pastori. En enään koskaan tee sillä tavalla. Tahtoisin suudella
jalkojanne, ehkä sitte taas saan rauhaa.

Hän oli jo vaivuttamaisillaan päänsä maahan asti, mutta Konrad


nosti hänet ylös ja laski hänet tuolille. Painettuaan päänsä käsien
varaan, purskahti hän katkeraan itkuun. Koko ruumis värisi
nyyhkytyksistä. Kauvan kannettu ja väkivallalla pidätetty tuska pääsi
siinä valloilleen. Hän ei enään voinut pidättyä.

— Jalo mies on täällä joutunut epäluulonalaiseksi, sanoi


maalaispastori pojalleen. — Vastaa nyt kysymykseeni: oletko roisto?
Kai ymmärrät… Rakkaat virkaveljet, suokaa anteeksi, mutta totuus ja
oikeus ennen kaikkia.

Hän piteli molemmin käsin kiinni Oskaria ja katseli häntä


läpitunkevalla katseella. Hetkisen ajan vallitsi huoneessa
äänettömyys, sitte lausui Josefa tuoliltaan hiljaa, mutta selvään:

— Minä olen vielä semmoinen, jommoiseksi Jumala minut loi.


Ja taas hän purskahti itkuun. Hänen päähänsä oli äkkiä noussut
hämärä aavistus, jota ei hän tähän asti ollut laisinkaan ajatellut.

Maalaispastorilta pääsi syvä huokaus. Hän päästi irti poikansa ja


viittasi hänelle, että hän menisi. Painava taakka oli poistunut hänen
rinnaltaan. Oliko tyttö puhunut totta? Kuka sen saattoi tietää. Mutta
huoneeseen oli äkkiä puhaltanut ikäänkuin puhdas ilma, jonka tieltä
kaiken likaisuuden oli täytynyt poistua. Kaikkien kasvot muuttuivat.
Julius astui ikkunan ääreen ja loi katseensa kirkkoon. Hänen uskonsa
oli pelastettu.

Hovisaarnaaja heitti Josefaan omituisen katseen ja pudisti


päätään. Sitte kuiskasi hän pari sanaa Kickertille. He tahtoivat
molemmat lähteä pois. Maalaispastori oli ensimmäinen, joka lausui
jäähyväiset. Hän otti hattunsa ja keppinsä, ojensi Josefalle ja
molemmille veljeksille kätensä, lähetti vielä terveisiä heidän
sisarelleen ja meni sitten pieneen huoneeseen, sulkien oven
jälkeensä.

— Sinä olet renttu. Kuritushuoneessa on sinun paikkasi, sanoi hän


hiljaa. — Mars eteenpäin.

— En minä tiedä mistään. Olin aivan juovuksissa.

— Niinkuin tavallisesti. Ja sen sinä vain kerrot aivan häpeämättä!…


Vanhus työnsi hänet inholla ovea kohti. — Kun ei vain olisi paras
antaa sinun mennä menojasi! lisäsi hän sitte.

Noin kymmenen minuutin perästä läksivät muutkin vieraat. Bock


oli mitä huonoimmalla tuulella, sadatteli mielessään Klaudinaa ja oli
vakuutettu siitä, että Josefa oli pettänyt heidät kaikki. Julius oli niin
perinpohjin suuttunut häneen, että hän oli kohdellut häntä
tavattoman lyhyesti. Konrad arveli jälkeenpäin, että hovisaarnaaja oli
mahtanut olla aika lailla häpeissään.

Josefa oli viety sänkyyn, jossa hän heti oli vaipunut levottomaan
uneen. Molemmat veljekset olivat yksin huoneessa, mutta eivät
sanallakaan koskettaneet siihen mitä vasta oli tapahtunut. Lääkäri
saapui ja puheli jonkun aikaa Juliuksen kanssa; Josefa tarvitsi hyvää
hoitoa. Hänen mentyään, sanoi Konrad äkkiä ja odottamatta:

— Kunhan nyt lapsesi paranee, niin tottahan sinä annat hänelle


hyvän kasvatuksen; ja ennen kaikkia uskot hänet toisiin käsiin.

Julius, joka oli seisonut ikkunan ääressä, katsellen ulos kirjavista


ruuduista, kääntyi äkkiä kummastuneena, mutta ei pitkään aikaan
sanonut mitään.

— Niin se on lapseni, en voi sitä kieltää. Enkä edes tahdo tietää


mistä sen olet kuullut, sillä se olisi tarpeetonta… Niin kauvan kuin
ihmisiä löytyy, tekevät he syntiä. Sillä jollei syntiä olisi, niin emmehän
voisi taistella sitä vastaan. Meillä on kaikilla vikamme ja onhan se
hyvä, sillä muutoin ei kukaan huomaisi etujamme… Sillä on suuri
merkitys, että ensimmäinen syntiinlankeemus juuri tapahtui
paratiisissa, jota aina ajatellaan ilon ja nautinnon täydellisyyden
maaksi. Jumala kai niin tahtoi… Minä eroon neiti Schaffista; tyytynet
kai aluksi siihen, lisäsi hän hetken kuluttua.

— Onko se vakaa aikomuksesi?

— On. Ole hyvä ja lähetä Hedvig tänne, kun käyt siellä. Tai olkoon,
korjasi hän samassa. — Minun täytyy kuitenkin mennä sinne ja mitä
Josefaan tulee, niin täytän velvollisuuteni häntä kohtaan.
Jäätyään yksin, läksi Julius Josefan huoneeseen. Hän nukkui,
kasvot hohtivat ja hengitys oli hätäinen. Julius ei enään ollut kahden
hänen kanssaan, sillä hän oli lähettänyt noutamaan
sairaanhoitajatarta, joka hänen astuessaan huoneeseen nousi
paikaltaan ja vaatimattomasti väistyi syrjään. Pastori oli käskenyt,
ettei hän ilman hänen erityistä lupaansa saanut päästää sisään
ketään, paitsi lääkäriä. Hetkisen ajan Julius vaieten katseli nukkuvaa,
laski kätensä hänen otsalleen ja meni sitte pois. Tultuaan
työhuoneeseensa, otti hän kirjoituspöytänsä laatikosta rahaa ja soitti
Klaudinaa.

Heti kun sairaanhoitajatar oli tullut, oli Klaudina aavistanut, että


jotakin mahtoi olla tekeillä. Nyt hänen ensi silmäyksensä sattui
rahaan, joka oli laskettu pyöreälle pöydälle. Hän kalpeni ja hänet
valtasi suuri levottomuus, mutta hän tekeytyi levolliseksi, ikäänkuin
ei mitään olisi tapahtunut. Hän seisahtui keskelle lattiaa, pani
käsivartensa ristiin rinnan yli, niinkuin hänen tapansa oli, ja katseli
odottavasti Juliukseen, joka istui kirjoituspöytänsä ääressä, selin päin
häneen.

— Josefa ei sittenkään joudu Siloahiin, alkoi pastori kovalla


äänellä, kääntymättä paikaltaan.

— Ihminen voi monasti erehtyä, vastasi Klaudina äänellä, josta


saattoi tehdä eri johtopäätöksiä.

Pastori vaikeni, silmäillen hajamielisenä eteensä, sillä hän ei oikein


tietänyt mitä hän vastaisi. Sitte hän äkkiä virkkoi:

— Voitte vielä tänä päivänä lähteä talostani, neiti Schaff. Tuossa


on palkkanne koko vuosineljännekseltä.
Hetkiseksi Klaudina hämmästyneenä, sanatonna jäi häneen
tuijottamaan, mutta sitte hän tointui. Hän otti rahat käteensä ja
päästi ne kilisten hameensa taskuun.

— Kiitoksia, herra pastori, vastasi hän levollisesti ja


vaatimattomana. — Hyvä on. Itse lähden jo tänään ja huomenna
annan noutaa tavarani. En ole koskaan tunkeutunut niskoillenne,
enkä koskaan tule sitä tekemään. Kaikki mitä tähän asti olen tehnyt,
on vaan tapahtunut teidän hyväksenne.

Julius hämmästyi hänen sanojensa hiljaista nöyryyttä; hän oli


odottanut vallan toista. Nyt vasta hän kääntyi häneen päin. Tuo
sävyisyys häntä kovin kaunisti; sellaisena hän aina oli pitänyt
hänestä, kun hänen oli pitänyt pyyhkiä murheet pois hänen
otsaltaan. Tosi naisellisuuden hohde lepäsi tänä hetkenä hänen
rumilla kasvoillaan; niissä oli viehätys, joka häikäsi Juliusta enemmän
kuin milloinkaan ennen. Mutta hän kokosi kaikki voimansa ja päätti
vastustaa. Pappilassa vastapäätä oli sekä isän ruumis että yksinäinen
sisar.

— Tehkää se, neiti Schaff, virkkoi hän sitten. — Minä kiitän teitä
kaikesta, vaikkette aina olekkaan pysynyt totuudessa. Ymmärrätte
varmaankin mitä tarkoitan… Johtakoon teitä Jumalan siunaus
teillänne, lisäsi hän saarnaäänellä. Eroaminen oli tässä totisesti
vaikeaa.

Klaudina oli tähän saakka ollut siinä luulossa, että pastori vain
tahtoi suututtaa häntä sekä että tuo tavallista pahempi tuuli menisi
menojaan niinkuin muutkin. Mutta nyt nousi veri hänen poskilleen ja
rinta alkoi hätäisesti kohota. Jos kerran pastori siis nyt todellakin oli
tosissaan, niin ei hänenkään tarvinnut häikäillä.
— Älkää lasketelko loruja, huudahti hän astuen pari askelta
eteenpäin. Hän oli silmänräpäyksessä niin muuttunut, että pastori
vallan säpsähti. — Totuutta, totuutta! jatkoi hän ylenkatseellisesti,
venytellen sanojaan. — Minäpä sanon teille jotakin, herra pastori…
Tässä talossa on minun aikanani vain kaksi kertaa puhuttu totuutta.
Ja sen teki veljenne, silloin kun hän sanoi koko kirkon kristillisyyttä
valheeksi ja tänään, kun hän oikein perinpohjaisesti luki
hovisaarnaajalle lain. Muuten täällä on ollut paljon mätää, niinkuin
kaikkialla, missä ihmiset ovat valmiit pikemmin näkemään tunkioita
lähimmäistensä kuin omien oviensa edessä… Tunnemmehan me
toisemme, me molemmat. Minun jälkeeni tulee toinen, siinä koko
muutos. Olkaa suora ja sanokaa, enkö ole oikeassa? Voi pyhä taivas,
ettenkö olisi! Mutta mitä minä sinua siitä soimaisin. Voithan sinä
tehdä rippisi kotona.

Pastori oli niin hämmästyksissään, että hän vain sanatonna, suu


auki, häneen tuijotti. Siihen tapaan Klaudina ei vielä milloinkaan ollut
puhunut. Ja eninten häntä hämmästytti, mitä hän Konradista oli
sanonut. Se se oli oikein noita hänen voittojaan, joihin hän aina
valmistautui jo kauvan edeltäkäsin.

— Mitä te puhutte? sai hän vihdoin sanotuksi. — Ja kuitenkin te


koko ajan olette koettanut vahingoittaa veljeäni.

— En häntä, vaan hänen henkeään. Sillä mitä kirkosta tulisi, jos


äkkiä rupeisi ilmestymään tuollaisia ihmisiä, jotka vakuuttavat että
kaikki mitä saarnataan onkin pelkää roskaa. Mistä papit silloin
saisivat leipänsä? Tiedän sen kokemuksesta… Klaudina nauroi
ivallisesti, sitten totisena jatkaakseen. — Tiedän muuten, että te itse,
ankarasta oikeauskoisuudestanne huolimatta, olette aivan samaa
mieltä. Ja eikö tyttö tuolla ole tyttärenne?… Eikö olisi ollut parempi,
ettei hän koskaan olisi tullut tähän taloon? Ja eikö vieläkin olisi
parempi, ettei hän koskaan saisi tietää, että te olette hänen isänsä?

Julius hypähti istuimeltaan ja tuijotti häneen pitkän aikaa


äänetönnä.

— Nainen, saatana puhuu suusi kautta! pääsi häneltä sitte;


Klaudina tiesi sen siis myöskin! Tämä uutinen pani Juliuksen
vapisemaan mielenliikutuksesta.

— Älkää toki sellaisia puhuko! vastasi Klaudina levollisesti ja katseli


häntä suoraan silmiin. — Onhan se totta! Ajatelkaa jos joku tietäisi
sen. Minä tietysti olisin hellästi ruvennut hoitamaan lasta, koska
kerran asian laita näin on. Mutta eihän se nyt käy ja se on ehkä
parasta.

— Todellako? Olisitteko tottakin sen tehnyt?

— Tietysti. Epäilettekö? Olenhan aikoja sitte nähnyt, että


rakastatte lasta. Miksen sitte siinäkin suhteessa olisi teitä palvellut?
Voihan sen asian järjestää. Annetaan lapsi hyvien ihmisten
hoidettavaksi, jonnekin kaupungille ja niin tulee omatunto
rauhoitetuksi. Ja sehän se sittenkin on pääasia. Eikö äiti ollut yhtä
paljon syypää kuin tekin, ja ettekö sitte silloin jo tehnyt tarpeeksi
hänen puolestaan? Minä tiedän kaikki.

Julius oli jo puoleksi voitettu. Klaudina oli oikeassa. Hänen


jälkeensä tulisi toinen, sillä hänen sisarensa oli sittenkin vain hänen
sisarensa. Ja tiesihän Klaudina kaikki. Vaikka hän vielä, jouduttuaan
maailmalle, panisi aikaan, ties mitä juonia. Nythän ei Juliuksen
enään tarvinnut salata häneltä mitään. Ja Josefan asia saataisiin
kyllä kuntoon. Ainakin oli talossa sitte ihminen, joka paikalla ymmärsi
kaikki. Hänen ajatustensa lanka katkesi siinä, sillä Klaudina astui
hänen eteensä ja virkkoi:

— Ojentakaa minulle toki kätenne jäähyväisiksi, herra pastori. Kun


ihminen kuusi vuotta on ollut talossa, niin ei sitä aivan ilman muuta
eroteta.

Juliuksen katse sattui hänen voimakkaaseen vartaloonsa. Mikä


majesteetillinen nainen! Hänen hengähdyksensä siveli pehmeästi
hänen poskeaan. Nyt ei hän enään vastustanut. Tahto oli hänen
aivoissaan pieni kipinä, jonka intohimojen meri hetkessä nielasi
kitaansa. Hän ojensi kätensä ja sulki Klaudinan syliinsä.

— Jää vain tänne!

Senjälkeen sai Klaudina kyllä käydä Josefan kamarissa…

Lähdettyään veljensä luota, ei Konrad heti mennytkään vanhaan


pappilaan, niinkuin hän oli aikonut, vaan läksi asuntoonsa, sillä hän
muisti että hänellä siellä oli joku asia toimitettavana. Eräässä
kadunkulmassa hän äkkiä huomasi maalaispastorin, joka ympärilleen
kurkistellen näytti etsivän jotakin.

— Oletteko te ehkä hänet nähnyt? kysyi hän heti Konradilta. —


Minä menin vain tänne kauppaan ostamaan itselleni uutta tupakkaa.
Ja kun tulin takaisin, niin hän oli kadonnut. Voi sitä kelvotonta!
huudahti pastori aivan toivotonna. — Kuka tietää, mihin paholainen
taas on kulettanut hänet. Hänellä oli taskussaan koskematon
satamarkkanen, jonka hän minulta sai houkutelluksi, ostaakseen sillä
itselleen kellon. Hyvä herra tohtori, neuvokaa nyt, mitä minun pitää
tehdä.
Puolen tuntia hän jo oli kävellyt edestakaisin siinä kadulla,
näkemättä poikaansa. Avuttomana lapsena hän harhaili
ihmisjoukossa, pyyhkien otsaansa nenäliinalla ja surullisena
tähystellen kaikille tahoille. Oskarin mukana näkyi koko hänen hyvä
tuulensa kadonneen. Saako hän enään koskaan nähdä häntä?
tuleeko isän sydäntä koskaan elähyttämään se tieto, että hän
pojasta on tehnyt hyvän ihmisen? Tai palaako hän takaisin suohon,
josta hän tahtoi hänet vetää ylös? Nämät ajatukset liikkuivat pastorin
mielessä. Ja tänään hänen täytyi jättää Berliini. Konrad koetti häntä
lohdutella. He kävivät kaikki likeiset kadut ja hakivat epäiltävistä
kapakoista, mutta löytämättä Oskaria.

— Nyt uskon todellakin, ettei häntä enään voi pelastaa, sanoi


maalaispastori, kun he tunnin ajan olivat kävelleet turhaan. — Se oli
vain siveellisyyden puuska, joka hänet oli vallannut. Tiedättekö,
rakas virkaveli, löytyy ihmisiä, joita ei voi pelastaa. He lankeevat
takaisin vanhoihin taipumuksiinsa. Minun täytyy ajatella runoilijan
sanoja — muistaakseni ne ovat Goetheltä: jos asetat sammakon
vaikka valkealle tuolille, niin kyllä se siitä hyppää takaisin
likalammikkoonsa… Nuo ihmiset ovat niinkuin vissit koppakuoriaiset,
jotka viihtyvät ainoastaan vissinlaisissa tunkioissa, mutta jotka
kauniilla, kiiltävällä kuorellaan välistä saattavat pettää. Yksi tie vie
ylöspäin, toinen alaspäin. Se joka pyrkii ylöspäin, se tosin ei aina
pääse eteenpäin, mutta hän ei myöskään mene takaisin. Mutta se
joka joutuu tuolle alaspäin kallistuvalle tielle, se vaipuu yhä
syvemmälle. Liha on silloin kuin sieni, joka on imeytynyt täyteen: se
vajoo pohjaan. Häpy on poissa, kaikki poissa.

Oskaria ei kuulunut illallakaan, kun lähtöhetki lähestyi. Raskain


mielin täytyi maalaispastorin yksin lähteä kotipuoleen. Agata tahtoi
vielä viipyä viikon päivät serkkunsa luona. Mutta vielä
hyvästijättäessä täytyi hänen luvata enolleen, että hän tekee kaikki
mitä ikinä voi, saattaakseen Oskarin hyvälle tielle, jos hän vain saa
hänet käsiinsä. Isän ainoana toivona oli vielä se, että Oskar äkkiä
ilmestyisi Agatan luo, tai hädän pakoittamana, vapaaehtoisesti
saapuisi kotiin.

Kahden päivän kuluttua kannettiin vanhan Balduksen maalliset


jäännökset hautausmaalle. Kellojen soidessa läksi pitkä, juhlallinen
saatto liikkeelle. Julius puhui haudalla todellakin kauniisti, jopa
Klaudinan mielestä niin liikuttavasti, että hän turhaan koetti pidättää
kyyneleitään. Vielä jälkeenpäinkin mainittiin sitä ruumissaarnaa.
Poika oli todellakin syvästi mahtanut rakastaa isäänsä!

Saman viikon lauvantaina aamupäivällä läksi Konrad taas Juliuksen


luo. Hän oli aamulla saanut ilmoituksen siitä, että hänet oli eroitettu
virastaan. Siihen hänen toimintansa siis loppui, siihen menivät
kauniit toiveet, jotka häntä Berliiniin olivat seuranneet. Kumma kyllä
ei tämä sanoma häneen suuresti koskenut: eihän ollut tapahtunut
muuta kuin asia, jota jo kauvan hiljaisuudessa oli valmistettu.

Julius ei näyttänyt vähääkään hämmästyvän, kun hän luki nuo


muutamat rivit. Hän ei yleensä ollut puhetuulella, sillä tämä päivä oli
jo tuottanut hänelle paljon harmia. Bock oli kirjoittanut hänelle, että
August Jannusch valitettavasti oli pettänyt kaikki hyvät toiveet, sillä
hänen ansiokseen oli luettava monen tuhannen sikarin varkaus,
jotapaitsi hän luvattomasti oli ottanut vastaan maksuja useilta
kauppatuttavilta. Kuitenkaan ei asiaa pitänyt jättää lain koviin
kouriin, jotta kadotetun lampaan vielä kävisi mahdolliseksi palata
takaisin laumaan ja jotta turhat juoksut tulisivat vältetyiksi. Julius
luki kyllä rivien välitse, ettei noilla "juoksuilla" tarkoitettu muuta kuin
kaikellaisia vastenmielisyyksiä, joita Bock tahtoi välttää.
— Niin, ei pidä leikkiä tulen kanssa, eikä hypistellä Jumalan sanaa,
lausui hän sitte. — Mitä sinä nyt aiot? lisäsi hän samassa.

— Aion kokonaan astua kirkon palveluksesta…

— Se lieneekin parasta, jos tahdot pysyä johdonmukaisena.

— Ja koettaa päästä päämaaliini toista tietä. Riippumattomana


miehenä, jatkoi Konrad.

Julius naurahti.

— Ehkä luopumalla valtiokirkosta ja rupeamalla lahkolaiseksi?


kysyi hän hiukan ivallisesti.

— Ei, en sitä. Sillä osoittaisin panevani liian suurta arvoa


kirkollisille tavoille. Aion pysyä rehellisenä kristittynä ja koettaa olla
sitä aivan toisessa hengessä kuin kirkko.

Julius kohautti ylenkatseellisesti olkapäitään.

— Se joka ei ota vaaria neuvoista, sitä ei myöskään voi auttaa…


Ehkä sitte joudutkin oikein sosialistisiin kulkuväyliin. Jatka, jatka!
Juokse pääsi puhki muurin seinään.

— Sitä en tule tekemään, vastasi Konrad levollisesti. — Kristillisyys


ja sosialismi ovat minulle aivan eri asioita, vaikka ehkä pyrkivät
samaan maaliin. Sosialismi hakee onnea ulkoa, kristillisyys
sisältäpäin. Sosialismi tekee vaatimuksia toisilta, kristillisyys itseltään.
Jos molemmat tapaisivat toisensa puolitiessä, niin päästäisiin ehkä
sovintoon. Sanoinhan muuten ensimmäisessä ja viimeisessä
saarnassani, jonka tässä kaupungissa pidin, selvään mielipiteeni.
Kaikki tässä maailmassa on kehittynyt vähitellen itsestään. Miksei siis
kerran tulisi aika, jolloin tämän keinotekoisen kristillisyyden sijasta
vallitsee luonnollinen kristillisyys. Ja vastavaikutus ei tule tulemaan
niinkutsutusta sivistyksestä, joka aina järjestää kaikki käsitteiksi,
vaan alhaalta päin, sieltä missä luonnolliset oikeudet ovat. Ja ne ovat
kaikkia teidän lakejanne tuhat kertaa väkevämmät.

— Mutta mitä sinä sitte oikeastaan vaadit meiltä?

— Suvaitsevaisuutta minä vaadin. Suvaitsevaisuutta


toisinajattelevia kohtaan. Jos valtio vaaran päivinä on oikeutettu
vaatimaan näiltä toisinajattelevilta heidän verensä, niin se myöskin
on velvollinen rauhan aikana pitämään huolta siitä, etteivät papit
suvaitsemattomuudellaan myrkytä tätä verta.

— Niin on aina ollut ja niin tulee aina olemaan, vastasi Julius


pitkällä haukotuksella, sillä hän oli viime yönä maannut huonosti. —
Minä näen sinut jo kirjailijana… laiha leipä. Oikein minä säälisin, jos
todellakin rupeisit elämään kokonaan kynäsi varassa. Huono pappi
on aina parempi kuin hyvä kirjailija. Onhan sitä sentään meidänkin
joukossamme muutamia, jotka kirjoittavat, mutta vain hartauskirjoja.

Samassa muisti hän, kuinka tyhjältä hänen vatsansa tuntui ja


soitti.

— Sinä et kai kuitenkaan syö kanssani? Konrad kiitti ja johti sitte


puheen siihen, minkätähden hän oikeastaan oli tullut. Oli kysymys
Hedvigin tulevaisuudesta. Hiukan hämillään Julius ilmoitti uuden
päätöksensä. Hän oli jo tottunut Klaudinaan ja lupasi Hedvigin
puolesta tehdä, mitä hän ikinä voi. Kahta taloutta hoitavaa sielua ei
toki voinut pitää samassa talossa.
— Ja sen sanot kaikkien näitten tapahtumien jälkeen? kysyi
Konrad äärimmilleen hämmästyneenä.

— Olen sinulta saanut oppia, vastasi Julius vakavasti. — Tein


itselleni kysymyksen: tuleeko siitä apua? ja vastaukseksi sain: älä
vastusta pahaa.

Konradin täytyi miltei ihaella hänen välinpitämättömyyttään, vaikka


hän häntä samalla syvästi sääli. Enempää ei hän sillä kertaa kysellyt,
vaan läksi sisarensa luo kertomaan, minkä käänteen asiat nyt olivat
saaneet. Hedvig otti hänet vastaan hymyllä, joka viittasi johonkin
odottamattomaan iloon. Mutta pahalla tuulella kuin oli, ei Konrad
huomannut ottaa siitä selvää, vaan heittäysi heti istumaan ja rupesi
purkamaan tämänkin päivän tuomia pahoja kokemuksia. Hedvig otti
asian tyynesti, pyysi, ettei hän hänen tähtensä huolehtisi ja koetti
rohkaista häntä.

— Sinä olet siis vielä jäänyt minulle, sanoi Konrad liikutettuna, veti
sisaren syliinsä ja suuteli hänen silmiään ja otsaansa. Hän ei
ensinkään huomannut, että hän samassa, aivan aiheettomasti, jätti
huoneen. Surullisesti hän jäi tuijottamaan eteensä lattiaan. Äkkiä
kuului hänen takanaan hiljainen kahina ja kuiskaus:

— Olenhan minäkin vielä jäänyt teille…

Hämmästyneenä käänsi hän päätään ja näki silloin Agatan, kädet


ristissä ja puna poskilla seisovan edessään. Hän hymyili, mutta koko
ruumis vapisi: hän pelkäsi, mitä nuo sanat, jotka vastustamattomalla
voimalla olivat tunkeutuneet hänen huuliltaan, vaikuttaisivat. Siinä
siis Hedvigin hymyilyn merkitys. Agata oli mahtanut olla piilossa
jossakin nurkassa.
— Agata! huudahti hän hiljaa, sulki hänet syliinsä ja painoi hänen
huulilleen ensi suudelman.

— Ota minut ja kaikki mitä minulla on, sanoi tyttö, silmissään


autuas piirre. — Minä tahdon olla uskollinen toverisi, tahdon, niinkuin
sinäkin aina tahtoa hyvää. Sekä ilon että surun päivinä.

Hedvig tapasi heidät lavertelemassa lasten lailla. Hän onnitteli


heitä sydämmensä pohjasta, eikä epäitsekkäisyydessään ensinkään
ajatellut itseään. Mutta Agata pysyi päätökselleen uskollisena.
Maalaispastori, joka suuresti ikävöi sisarentytärtään, oli kirjoittanut,
että hänen paikalla pitää tulla kotiin. Sentähden he kaikki kolme nyt
päättivät seuraavana päivänä lähteä vanhusta hämmästyttämään.
Hedvig lupasi olla viikon päivät Agatan luona, Konradin sen sijaan
piti palata takaisin Berliiniin, niin pian kuin hän oli tavannut Bläselin.
Kihlajaisia saattoi siis viettää paikalla. Nämät hetket olivat
ensimmäiset iloiset koko tuona raskaana viikkona.

Seuraavana aamuna tahtoi Hedvig, että he vielä kerran kävisivät


kirkossa kuulemassa Juliuksen saarnaavan. Hän käytti muunmuassa
tekstinä Jaakopin epistolan 1:n luvun 12 värssyä: Autuas on se mies,
joka kiusauksen kärsii; sillä koska hän koeteltu on, niin pitää hänen
elämän kruunun saaman, jonka Herra niille luvannut on, jotka häntä
rakastavat.

Hän ylisti kiusauksen voittamista siksi suoraksi tieksi, joka kaikissa


elämän tapauksissa vie korkeimpaan hyveeseen. "Muistakaa,
rakkaani, että sielun puhtaus se on, jota teidän hellinten täytyy
säilyttää, jos tahdotte vastustaa pahuuden ilkeintä henkeä,
intohimoa. Sillä se se uudestaan pyytää iskeä teihin kyntensä, se se
ei säästä leskiä eikä orpojakaan. Mutta joka sen voittaa, se tulee
kauvinten kantamaan elämän kruunua."
Hän puhui kuivalla äänellä, joka selvästi osoitti, että nämät asiat
hänelle olivat tuiki välinpitämättömät. Konradin täytyi hymyillä.

Pappispuvussa näytti hän kymmenen vuotta vanhemmalta. Hän


muistutti tyytymätöntä isää, joka lukemattomia kertoja on antanut
lapsilleen hyviä opetuksia, ilman että he ovat seuranneet niitä.
Lopulla puhui hän hiukan nopeammin, sillä hän tahtoi palkita
seurakuntaansa sen kärsivällisyydestä.

Kun Konrad päivällisen jälkeen oli pannut kuntoon matkalaukkunsa


ja sitte aikoi mennä rouva Brennerleinin puolelle, niin hän huomasi
äidin ja pojan äänekkäästi keskustelevan käytävän perällä. Viime
lauseet hän tahtomattaankin tuli kuulleeksi.

— Sinulle siis tahdotaan antaa matkapassi sentähden että illalla


vielä ansaitset jonkun pennisen, sanoi Ulrika kiihtyneellä äänellä.

— Holtmann arveli, että joko yhtä tai toista, vastasi Nikolaus. — Se


Magner aasi se on kuiskannut tuon kaiken hänen korvaansa. Minä
ansaitsen sillä tavalla kaksinkerroin ja se häntä ärsyttää.

— Kuuleppas nyt, Niilo… Jos asian laita niin on, niin heitämme
hiiteen koko kirkon. Kyllä olemme jo tarpeeksi kiusaantuneet… Mutta
täytyyhän ihmisen elää.

Ovi lisahti lukkoon ja kissa, jonka häntä oli jäänyt väliin, päästi
surkean huudon.

Kello viiden aikaan menivät Hedvig, Agata ja Konrad sanomaan


Juliukselle jäähyväisiä. Tytöt jäivät etuhuoneeseen siksi aikaa kuin
Konrad kävi Josefaa tervehtimässä. Hän oli yhä vuoteen omana ja
vaikka hänen tilansa jo olikin tullut paremmaksi, niin ei vaara vielä
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!

ebookluna.com

You might also like