I worked primarily on DOS/VSE, not MVS, accounts as a  
regional specialist on CICS/DL/I for accounts using IBM's  
COPICS.  The advent of COBOL II with its structured  
programming features proved interesting.  My first experience  
on it was trying to instruct a COBOL programmer how to write  
inline PERFORM's.  Now some several decades later out-of-line  
still dominate coding practices. 
Dwight failed to explain why the "9000-OPEN-FILES" started  
off with the "9000-" or why "8090-" would appear before and  
"9040-" after it.  The programmer essentially numbered and  
physically ordered the paragraphs in source to make locating  
them in the listing easier.  I had the habit in reading COBOL  
program listings to "decollate" the pages, laying them out in a  
two-dimensional manner to make it easier to move from  
reading one paragraph to another. 
There was very low overhead in an out-of-line reference.   
That was not a performance issue.  The performance issue  
arose due to the reference pattern physically in storage and  
the number of virtual storage pages it touched (and which  
therefore had to be brought into memory) in the course of its  
travels.  This increased the working set of the number of  
pages.  Putting the executing code inline reduced this number. 
I don't know that any of this has any meaning any more when  
main storage runs into the gigabytes and essentially no paging  
occurs. 
I used COBOL to illustrate granularity of reuse down to the  
statement level, something not "attractive" through use of  
"include's" in C or PL/I.  Sometimes people think I invent things  
like "reuse at the statement level".  I just wanted to show its  
presence in existing software technology. 
However, the use of a number prefix as part of a label, i.e.  
paragraph, name, a compiler (meta-programming) option to  
produce inline instead of out-of-line execution, and "smart"  
editors that perform syntax checking but seem incapable  
processing "include" or "copy" statements by including them  
inline in source--whew--makes several points with respect to  
the deficiencies of our current tool set and use of third  
generation languages. 
In the system I propose no "explicit" use of an "include" or  
"copy" occurs, because "implicitly" every statement is  
accessed as if it were an "include" or "copy".  Thus the editor,  
in this instance the Developer's Assistant, would present the  
fully exploded source. 
Now remember this uses a fourth generation language in  
which the "code segments" representing specifications can  
appear in any order, i.e. unordered.  That's the "input" source. 
Fourth generation languages, in fact all of logic programming,  
uses a two-stage proof engine: a completeness proof and an  
exhaustive true/false proof.  As part of the processing of the  
completeness proof the software "organizes", i.e. orders,  the  
unordered input source into an optimal output source format. 
That means that every specification, which appears only once  
in the actual input, is replicated wherever it is referenced by  
other specifications.  The only exception occurs when a  
specification exists as a named subroutine, i.e. a "procedure". 
Thus the "output" source resulting from the completeness  
proof contains replications of the "input" source where  
required and no use of artifacts like paragraph names in  
COBOL occurs.  This results in a completely structured source,  
obeying the one-in-one-out pattern of structured  
programming. 
You need to understand the "output" source, which is the  
input to the code generation process of the completeness  
proof, is never stored, only generated.  Thus no maintenance  
ever occurs on it, only regeneration.  Maintenance only occurs  
on the unordered input where changes get reflected through  
regeneration in the output source. 
We achieve this through a data repository/directory, in this  
instance based on using a relational database, in which we  
store only the individual statements as rows in a table.  To do  
that the software assigns each statement a name based on  
the first 20 bytes of its content appended by a 4-byte  
(binary) index value.  The index value compensates for the  
possibility of homonyms (same name, different referents).   
Together they form a 24-byte unique name required for every  
row in a table. 
Now note that the programmer writes statements as he would  
normally without concern for their existence in the database.   
The software will process a statement, create a name based  
on its content, check it against same names (homonyms) in  
the database, and check its total content against that of the  
other homonyms.  If it finds a match, it will use that existing  
name for the source.  Otherwise it will add a index suffix to  
give it a unique name and store it in the database.  
All this is invisible to the programmer.  All he sees is the  
unaltered source.  Now he could look to see if the source  
statement he wants is in the database, but that would take  
longer than simply writing it.  So he just writes it.  The  
software assumes all responsibility from that point on.  Note  
that statement reuse is automatic, requiring no effort on the  
part of the programmer.  Also note that any statement  
appears only once in the database, the data repository,  
regardless of how many times it appears in how many  
programs. 
You can write the input in any order.  The software will  
determine (generate) the output order.  Thus you can accept  
user changes/requirements as they occur, write them as  
specifications, insert them into the input, and the software  
will regenerate the output reflecting changes to the input. 
Now I said that kind of fast, but not fast enough for the  
software which can do all that tens of millions times  
faster.  If you have followed this to this point--and if you  
have not, go back and do so--and you have any kind of  
experience in the difficulties of source program maintenance  
of third generation languages, you have just seen what a  
difference a fourth makes. 
Moreover don't forget the completeness proof has two results:  
true, if it has all it needs to order the input source completely,  
and, false, if it does not.  In either case, just in case you don't  
understand how it derived the output form from the input or  
why it couldn't, it incorporates a feature called "backtracking"  
(present in all of logic programming) to show you why it did  
what it did or why it could not (an incomplete or false  
instance). 
Don't stop now.  It gets even better.  Though the  
completeness proof may register a "false" or "incomplete"  
status (state), that doesn't mean that completed portions do  
not exist, i.e. partially complete.  Nothing prevents the  
completeness proof from displaying incomplete results based  
on its complete portions.  By display I mean in the form of  
dataflows, structure charts, or any of the dozen of more  
forms of UML.   
When you use these visual output results to base changes to  
the "unordered" input source, it automatically regenerates the  
new output source which means it automatically regenerates  
the visual output results.  Ten million times faster relative to  
your speed puts it in real time. 
Remember all you do is write specifications.  Your's then  
becomes a "one-write" activity on input while the software  
engages in a "multi-write" activity on output.  That means  
you maintain only one source, the unordered input, and  
automatically gain through the software all the different  
outputs, visual and otherwise, that exist as options for your  
selection. 
If you understand the meaning, the implication (and  
simplification) of all these features and functions in a single  
tool, you're not the only one.  Intelligent people following the  
same logic come to the same conclusion: you only need one  
comprehensive tool, one user interface, and one form of  
source writing translating one form of user requirements.  You  
now see why the software tool vendors offered lip service  
coupled with passive resistance to IBM's proposed AD/Cycle. 
You may also come to understand why my friend and  
collaborator Bob Blair has his focus on developing the front  
end which includes the data repository/directory while I  
prattle on the back end which produces all these visual and  
text outputs.  In the middle we have our "smartest" editor for  
maintaining our unordered input source specifications, which  
get checked against the front end and processed by the back. 
You probably missed the other fact of using a relational  
database to house the data repository/directory.  You can  
query to get a listing of all homonyms.  Within any one family  
of same "proper names", the text portion of the unique row  
name, you can check all the contents at leisure, determining if  
simplification, a reduction in number, is possible.  If so, you can  
have the effect of the reduction replicated in all affected  
assemblies. 
The point is that you now can administer the entire source of  
an entire enterprise and that includes all documentation  
within the enterprise, not just source code and source text.   
You have a means of employing "literate programming"  
technology to an entire enterprise from a single source. 
If you are smart enough to know the difference, you will give  
up on storing html "files", use the same tool for maintaining  
websites as you do for programming as you do for enterprise  
documentation.  This means you can totally "integrate" the  
information or knowledge base of an entire enterprise from a  
single source data repository/directory.  That means everyone  
uses the same means for maintaining unordered source and  
generating ordered output. 
I thank you for your patience. 
===================================================== 
To unsubscribe from this list, send an email message 
to "steward@scoug.com". In the body of the message, 
put the command "unsubscribe scoug-programming". 
For problems, contact the list owner at 
"rollin@scoug.com". 
===================================================== 
<< Previous Message << 
 >> Next Message >>
Return to [ 29 | 
August | 
2003 ]
The Southern California OS/2 User Group
P.O. Box 26904
Santa Ana, CA  92799-6904, USA
Copyright 2001 the Southern California OS/2 User Group.  ALL RIGHTS 
RESERVED. 
SCOUG, Warp Expo West, and Warpfest are trademarks of the Southern California OS/2 User Group.
OS/2, Workplace Shell, and IBM are registered trademarks of International 
Business Machines Corporation.
All other trademarks remain the property of their respective owners.