Home > Store > Programming > C/C++

larger cover

Add To My Wish List

C Interfaces and Implementations: Techniques for Creating Reusable Software

Register your product to gain access to bonus material or receive a coupon.

  • Description
  • Downloads
  • Reviews
  • Sample Content

Product Author Bios

David R. Hanson is a Professor of Computer Science at Princeton University with more than 20 years of research experience in programming languages. He has conducted research in conjunction with Bell Laboratories and is the co-author of lcc, a production quality, research compiler for the C language that is popular with the Unix community. lcc is presented and analyzed in the book A Retargetable C Compiler: Design and Implementation, by Christopher Fraser and David Hanson (c) 1995, Addison-Wesley.



0201498413AB04062001

Every programmer and software project manager must master the art of creating reusable software modules; they are the building blocks of large, reliable applications. Unlike some modern object-oriented languages, C provides little linguistic support or motivation for creating reusable application programming interfaces (APIs). While most C programmers use APIs and the libraries that implement them in almost every application they write, relatively few programmers create and disseminate new, widely applicable APIs. C Interfaces and Implementations shows how to create reusable APIs using interface-based design, a language-independent methodology that separates interfaces from their implementations. This methodology is explained by example. The author describes in detail 24 interfaces and their implementations, providing the reader with a thorough understanding of this design approach.

Features of C Interfaces and Implementations:

  • Concise interface descriptions that comprise a reference manual for programmers interested in using the interfaces.

  • A guided tour of the code that implements each chapter's interface tp help those modifying or extending an interface or designing related interfaces.

  • In-depth focus on "algorithm engineering:" how to package data structures and related algorithms into reusable modules.

  • Source code for 24 APIs and 8 sample applications is examined, with each presented as a "literate program" in which a thorough explanation is interleaved with the source code.

  • Rarely documented C programming tricks-of-the-trade.

  • Convenient access to all source code in the book via the World Wide Web at http://www.cs.princeton.edu/software/cii/



0201498413B04062001

Source Code

Click below for Source Code related to this title:
Source Code Resources

Customer Reviews

60 of 61 people found the following review helpful
5.0 out of 5 stars Probably the best advanced C book in existance..., August 4, 1999
By 
Thomas Ptacek (Chicago, IL) - See all my reviews
(REAL NAME)   
This review is from: C Interfaces and Implementations: Techniques for Creating Reusable Software (Paperback)
Clearly written and well organized, this book presents more than 20 _highly_ useful library interfaces for containers, string management, mathematics, and memory management. There isn't a line of code in the whole book that you couldn't take and use, verbatim, in a project today --- after reading this book, you'll probably never have a compelling reason to write a string library or a hash table interface again.

More importantly, though, each example library illustrates ways to effectively design consistant and useable library interfaces, from generic ADTs to system service wrappers. After reading this book, you'll not only have an arsenal of useful code to leverage, but also a good understanding of how to design clean, modular, reuseable components for your application.

Hanson's C code is extremely clear and concise. Even if you've been programming professionally for a long time, you are likely to pick up a useful technique or two just by reading the source code... Read more

Help other customers find the most helpful reviews 
Was this review helpful to you? Yes No


28 of 28 people found the following review helpful
5.0 out of 5 stars From novice to a professional, October 5, 2001
By A Customer
This review is from: C Interfaces and Implementations: Techniques for Creating Reusable Software (Paperback)
If you want to become a professional programmer overnight.read and thoroughly understand this book. If one could master the techniques described in this book..he may never have to worry about failing software developer's job interviews. This last statement is based on my personal experience.
The chapters provide source code which is clear, efficient, and outrightly professional, the description is concise, to the point and clear enough.Most of the code in the book can be used without any modification. I don't know of a book in the market that could teach how to design and implement a user-level threads library from the scratch WITHOUT any help from the Operating System. Simply wonderful
Help other customers find the most helpful reviews 
Was this review helpful to you? Yes No


26 of 27 people found the following review helpful
5.0 out of 5 stars By far the most advanced C book I read, May 13, 2002
By 
Mike Meng (Beijing, China) - See all my reviews
This review is from: C Interfaces and Implementations: Techniques for Creating Reusable Software (Paperback)
I have been a C and C++ programmer for 5 years, and is regarded as an professional C and C++ programmer. After scanning this book, I think I should re-estimate my C skill.

In one word, this book is the most advanced C book I've read, it presents lots of wonderful techniques and ideas, and more, all the things are very useful. For examples:

* Use standard C's setjmp/longjmp to implement WIn32 SEH-like exception handling machanism.

* Very detailed and smart memory management solution.

* All the data structures and utilities in well-defined, reusable format: atoms, tables, sets, vectors(dynamic arrays), rings, strings, arithmetric with any precisions, thread library... everything you need to build a whole new system.

I'd say that once you master each of those things (this means read and re-read until understanding occur, as Fransis Glassborow said ), you will be an outstanding programmer in any circumstance, and can be full of confidence to accept any programming... Read more

Help other customers find the most helpful reviews 
Was this review helpful to you? Yes No


Share your thoughts with other customers:
 See all 13 customer reviews...

Praise For C Interfaces and Implementations: Techniques for Creating Reusable Software

"Very little (if any) guidance exists on how to design, implement, and effectively use libraries. This excellent text fills that gap. (C Interfaces and Implementations) could be the next Software Tools and should be read by all C programmers."

-W. Richard Stevens

"I recommend this book to every professional C programmer. C programmers have neglected these techniques for too long."

-Norman Ramsey, Bell Communications Research

Preface

Programmers are inundated with information about application programming interfaces, or APIs. Yet, while most programmers use APIs and the libraries that implement them in almost every application they write, relatively few create and disemminate new, widely applicable, APIs. Indeed, programmers seem to prefer to "roll their own" instead of searching for a library that might meet their needs, perhaps because it is easier to write application-specific code than to craft well-designed APIs.

I'm as guilty as the next programmer: lcc, a compiler for ANSI/ISO C written by Chris Fraser and myself, was built from the ground up. (lcc is described in A Retargetable C Compiler: Design and Implementation, Addison-Wesley, 1995.) A compiler exemplifies the kind of application for which it is possible to use standard interfaces and to create interfaces that are useful elsewhere. Examples include interfaces for memory management, string and symbol tables, and list manipulation. But lcc uses only a few routines from the standard C library, and almost none of its code can be used directly in other applications.

This book advocates a design methodology based on interfaces and their implementations, and it illustrates this methodology by describing 24 interfaces and their implementations in detail. These interfaces span a large part of the computing spectrum and include data structures, arithmetic, string processing, and concurrent programming. The implementations aren't toys - they're designed for use in production code. As described below, the source code is freely available.

There's little support in the C programming language for the interface-based design methodology. Object-oriented languages, like C++ and Modula-3, have language features that encourage the separation of an interface from its implementation. Interface-based design is independent of any particular language, but it does require more programmer willpower and vigilance in languages like C, because it's too easy to pollute an interface with implicit knowledge of its implementation and vice versa.

Once mastered, however, interface-based design can speed development time by building upon a foundation of general-purpose interfaces that can serve many applications. The foundation class libraries in some C++ environments are examples of this effect. Increased reuse of existing software - libraries of interface implementations - reduces initial development costs. It also reduces maintenance costs, because more of an application rests on well-tested implementations of general-purpose interfaces.

The 24 interfaces come from several sources, and all have been revised for this book. Some of the interfaces for data structures - abstract data types - originated in lcc code, and in implementations of the Icon programming language done in the late 1970s and early 1980s (see R. E. Griswold and M. T. Griswold, The Icon Programming Language, Prentice Hall, 1990). Others come from the published work of other programmers; the "Further Reading" sections at the end of each chapter give the details.

Some of the interfaces are for data structures, but this is not a data structures book, per se. The emphasis is more on algorithm engineering - packaging data structures for general use in applications - than on data-structure algorithms. Good interface design does rely on appropriate data structures and efficient algorithms, however, so this book complements traditional data structure and algorithms texts like Robert Sedgewick's Algorithms in C (Addison-Wesley, 1990).

Most chapters describe one interface and its implementation; a few describe related interfaces. The "Interface" section in each chapter gives a concise, detailed description of the interface alone. For programmers interested only in the interfaces, these sections form a reference manual. A few chapters include "Example" sections, which illustrate the use of one or more interfaces in simple applications.

The "Implementation" section in each chapter is a detailed tour of the code that implements the chapter's interface. In a few cases, more than one implementation for the same interface is described, which illustrates an advantage of interface-based design. These sections are most useful for those modifying or extending an interface or designing related interfaces. Many of the exercises explore design and implementation alternatives. It should not be necessary to read an "Implementation" section in order to understand how to use an interface.

The interfaces, examples, and implementations are presented as literate programs; that is, the source code is interleaved with its explanation in an order that best suits understanding the code. The code is extracted automatically from the text files for this book and assembled into the order dictated by the C programming language. Other book-length examples of literate programming in C include A Retargetable C Compiler and The Stanford GraphBase: A Platform for Combinatorial Computing by D. E. Knuth (Addison-Wesley, 1993).

Organization
The material in this book falls into the following broad categories:

Most readers will benefit from reading all of Chapters 1 through 4, because these chapters form the framework for the rest of the book. The remaining chapters can be read in any order, although some of the later chapters refer to their predecessors.

Chapter 1 covers literate programming and issues of programming style and efficiency. Chapter 2 motivates and describes the interface-based design methodology, defines the relevant terminology, and tours two simple interfaces and their implementations. Chapter 3 describes the prototypical Atom interface, which is the simplest production-quality interface in this book. Chapter 4 introduces exceptions and assertions, which are used in every interface. Chapters 5 and 6 describe the memory management interfaces used by almost all the implementations. The rest of the chapters each describe an interface and its implementation.

Instructional Use
I assume that readers understand C at the level covered in undergraduate introductory programming courses, and have a working understanding of fundamental data structures at the level presented in texts like Algorithms in C. At Princeton, the material in this book is used in systems programming courses from the sophomore to first-year graduate levels. Many of the interfaces use advanced C programming techniques, such as opaque pointers and pointers to pointers, and thus serve as nontrivial examples of those techniques, which are useful in systems programming and data structure courses.

This book can be used for courses in several ways, the simplest being in project-oriented courses. In a compiler course, for example, students often build a compiler for a toy language. Substantial projects are common in graphics courses as well. Many of the interfaces can simplify the projects in these kinds of courses by eliminating some of the grunt programming needed to get such projects off the ground. This usage helps students realize the enormous savings that reuse can bring to a project, and it often induces them to try interface-based design for their own parts of the project. This latter effect is particularly valuable in team projects, because that's a way of life in the "real world."

Interfaces and implementations are the focus of Princeton's sophomore-level systems programming course. Assignments require students to be interface clients, implementors, and designers. In one assignment, for example, I distribute Section 8.1's Table interface, the object code for its implementation, and the specifications for Section 8.2's word frequency program, wf. The students must implement wf using only my object code for Table. In the next assignment, they get the object code for wf, and they must implement Table. Sometimes, I reverse these assignments, but both orders are eye-openers for most students. They are unaccustomed to having only object code for major parts of their program, and these assignments are usually their first exposure to the semiformal notation used in interfaces and program specification.

Initial assignments also introduce checked runtime errors and assertions as integral parts of interface specifications. Again, it takes a few assignments before students begin to appreciate the value of these concepts. I forbid "unannounced" crashes; that is, crashes that are not announced by an assertion failure diagnostic. Programs that crash get a grade of zero. This penalty may seem unduly harsh, but it gets the students' attention. They also gain an appreciation of the advantages of safe languages, like ML and Modula-3, in which unannounced crashes are impossible. (This grading policy is less harsh than it sounds, because in multipart assignments, only the offending part is penalized, and different assignments have different weights. I've given many zeros, but none has ever caused a course grade to shift by a whole point.)

Once students have a few interfaces under their belts, later assignments ask them to design new interfaces and to live with their design choices. For example, one of Andrew Appel's favorite assignments is a primality testing program. Students work in groups to design the interfaces for the arbitrary-precision arithmetic that is needed for this assignment. The results are similar to the interfaces described in Chapters 17 through 19. Different groups design interfaces, and a postassignment comparison of these interfaces, in which the groups critique one anothers' work, is always quite revealing. Kai Li accomplishes similar goals with a semester-long project that builds an X-based editor using the Tcl/Tk system (J. K. Ousterhout, Tcl and the Tk Toolkit, Addison-Wesley, 1994).



0201498413P04062001

Table of Contents

Preface        xi
    Organization        xiii
    Instructional Use        xiv
    How to Get the Software        xvi
    Acknowledgments        xvii



Chapter 1: Introduction        1
    1.1  Literate Programs        2
    1.2  Programming Style        8
    1.3  Efficiency        11
    Further Reading        12
    Exercises        13


Chapter 2: Interfaces and Implementations        15
    2.1  Interfaces        15
    2.2  Implementations        18
    2.3  Abstract Data Types        21
    2.4  Client Responsibilities        24
    2.5  Efficiency        30
    Further Reading        30
    Exercises        31

Chapter 3: Atoms        33
    3.1  Interface        33
    3.2  Implementation        34
    Further Reading        42
    Exercises        42

Chapter 4: Exceptions and Assertions        45
    4.1  Interface        47
    4.2  Implementation        53
    4.3  Assertions        59
    Further Reading        63
    Exercises        64

Chapter 5: Memory Management        67
    5.1  Interface        69
    5.2  Production Implementation        73
    5.3  Checking Implementation        76
    Further Reading        85
    Exercises        86

Chapter 6: More Memory Management        89
    6.1  Interface        90
    6.2  Implementation        92
    Further Reading        98
    Exercises        100

Chapter 7: Lists        103
    7.1  Interface        103
    7.2  Implementation        108
    Further Reading        113
    Exercises        114

Chapter 8: Tables        115
    8.1  Interface        115
    8.2  Example: Word Frequencies        118
    8.3  Implementation        125
    Further Reading        132
    Exercises        133

Chapter 9: Sets        137
    9.1  Interface        138
    9.2  Example: Cross-Reference Listings        140
    9.3  Implementation        148
    Further Reading        158
    Exercises        158

Chapter 10: Dynamic Arrays        161
    10.1  Interfaces        162
    10.2  Implementation        165
    Further Reading        169
    Exercises        169

Chapter 11: Sequences        171
    11.1  Interface        171
    11.2  Implementation        174
    Further Reading        180
    Exercises        180

Chapter 12: Rings        183
    12.1  Interface        183
    12.2  Implementation        187
    Further Reading        196
    Exercises        197

Chapter 13: Bit Vectors        199
    13.1  Interface        199
    13.2  Implementation        202
    Further Reading        213
    Exercises        213

Chapter 14: Formatting        215
    14.1  Interface        216
    14.2  Implementation        224
    Further Reading        238
    Exercises        239

Chapter 15: Low-Level Strings        241
    15.1  Interface        243
    15.2  Example: Printing Identifiers        249
    15.3  Implementation        251
    Further Reading        264
    Exercises        265

Chapter 16: High-Level Strings        269
    16.1  Interface        269
    16.2  Implementation        276
    Further Reading        293
    Exercises        294

Chapter 17. Extended-Precision Arithmetic        297
    17.1  Interface        297
    17.2  Implementation        303
    Further Reading        321
    Exercises        322

Chapter 18: Arbitrary-Precision Arithmetic        323
    18.1  Interface        323
    18.2  Example: A Calculator        327
    18.3  Implementation        334
    Further Reading        353
    Exercises        354

Chapter 19: Multiple-Precision Arithmetic        357
    19.1  Interface        358
    19.2  Example: Another Calculator        365
    19.3  Implementation        373
    Further Reading        402
    Exercises        402

Chapter 20: Threads        405
    20.1  Interfaces        408
    20.2  Examples        418
    20.3  Implementations        431
    Further Reading        463
    Exercises        465

Appendix: Interface Summary        469

Bibliography        497

Index        505

 
Buy

Book  $54.99  $43.99

We're temporarily out of stock, but order now and we'll send it to you later.

This book is temporarily out of stock, but will ship for free when in stock.

Purchase Reward: One Month Free Subscription
By completing any purchase on InformIT, you become eligible for an unlimited access one-month subscription to Safari Books Online.

Get access to thousands of books and training videos about technology, professional development and digital media from more than 40 leading publishers, including Addison-Wesley, Prentice Hall, Cisco Press, IBM Press, O'Reilly Media, Wrox, Apress, and many more. If you continue your subscription after your 30-day trial, you can receive 30% off a monthly subscription to the Safari Library for up to 12 months. That's a total savings of $199.