180 likes | 275 Views
Tools and Philosophies for Understanding Large Projects. Michael Gaiman CS161 November 28, 2005. Coding Large Projects for Understandability. Literate Programming Design by Contract. Literate Programming. Develop programs from perspective of a report or prose.
E N D
Tools and Philosophies for Understanding Large Projects Michael Gaiman CS161 November 28, 2005
Coding Large Projects for Understandability • Literate Programming • Design by Contract
Literate Programming • Develop programs from perspective of a report or prose. • Code and Documentation are interspersed in one source file. • Information is written in an order suitable for human viewing and comprehension • Tools process files and make them compilable.
Literate Programming • Pros • Creates highly readable, highly understandable source code and documentation from one file. • Leverages TeX knowledge • Cons • Requires TeX knowledge (usually) • Source maintenance can be more tedious.
Literate Tools • WEB - 1984 • Knuth’s original tool, supports Pascal • CWEB • Knuth follow-up, supports C • Noweb • Simple, language independent literate tool • Nuweb • Language independent, seems to be more maintained
Literate Example % -*- mode: Noweb; noweb-code-mode: c++-mode -*- \title{A Hello World Example!} A traditional introduction to new languages, Hello World has long been a slightly amusing tradition in Computer Science. Hello World has the following structure: <<hw.cpp>>= <<header files>> <<using directives>> <<main>> @ The crux of the application is the main function which simple prints out the words ``Hello World’’ and returns. <<main>>=
Literate Example (cont.) int main(int argc, char* argv[]) { cout<<“Hello World”<<endl; return 0; } @ Next we’ll discuss the $C++$ scaffolding. In hello world, all we need is the library for output: <<header files>>= #include <iostream> @ And as a standard $C++$ file, Hello World uses the standard name space. <<using directives>>= using namespace std; @
Semi-Literate Programming • Documentation Generators • JavaDoc • Doxygen • Allows documentation to be extracted from source • May or may not allow source code reordering. • Some argue that to be semi-literate ordering, at the least, is required.
Design by Contract (DBC) • Specify interfaces by pre-conditions, post-conditions and invariants. • Seeks to make explicit assumptions on which programmers rely when they write software elements that they believe are correct.
Design by Contract • Pros: • Allows for more reliable software • Allows contract violations (exceptions) to be quickly pinned down • Allows for descriptive documentation to be automatically generated. • Much of unit testing is done automatically by contracts. • Cons: • Depending on compile settings, this can incur run-time costs • Conditions can require duplication of coding effort
DBC Language Support • Eiffel • Object-Oriented originator of DBC. • C • Through pre-processors • Java • Through JML (Java Modeling Language)
DBC Example withdraw(sum: INTEGER)is -- Withdraw sum from the account. require sum >= 0 sum <= balance – minimum_balance do add(–sum) ensure balance =old balance – sum end
Understanding Existing Large Projects • If the project uses Literate Programming, then you’re all set. • If not, then… • Tools!
Tag Systems • Builds database of symbols used in project. • Allows easy searching of references and definitions. • Often integrates into editor of choice. • Tools: • cscope • etags • ctags • GNU Global
Tags Example • Global on Python 2.4.2 $global main Demo/embed/demo.c … Modules/ccpython.cc Modules/python.c Parser/pgenmain.c $global PyMain Modules/main.c
Visual Tools • Quickly see relationships between functions and between classes • Tools: • Scat - displays function call graphs for C • Source-Navigator - IDE/Visualizer for many languages
References • Literate Programming: http://www.literateprogramming.com/ • Design By Contract: http://en.wikipedia.org/wiki/Design_by_contract • Eiffel: http://en.wikipedia.org/wiki/Eiffel_programming_language • Global: http://www.gnu.org/software/global • Source-Navigator: http://sourcenav.sourceforge.net/