Many problems of block structure derive from the remote specification of parts of the local environment. An alternative to block structure is proposed, in which the local environment is described within each program module. Concise environment descriptions are made possible by creating a tree whose terminal nodes are declarations and whose intermediate nodes can represent all of their descendant terminal node declarations. The tree encompasses all of the data used by the program and can thus be thought of as the data structure for the entire program. Each intermediate node of the tree names an abstract data structure that is implemented from the data named in its descendant nodes. Top-down refinement of abstract data structures consists of creating descendant nodes, and terminates when all terminal nodes of the tree have been created. This activity occurs as a normal part of program development, along with the top-down refinement of program modules. The tree can be used in place of a symbol table as a referencing structure for compilation or interpretation. Compilation time wili then increase linearly with the length of the program and the referencing structure can grow dynamically during compilation.