With the prevalence of open systemsopen systems and multi-vendor computing, it is often necessary to construct systems consisting of programs written in a number of different programming languages for a number of different systems. For example, a particular functionality might be implemented by a shellscript (invoked by the user) that calls a C program that makes a network connection to a Pascal program that queries a database. Quite often all these programs must conspire closely to execute their function. In the normal case, they must be written separately. FunnelWeb allows them to be written as a whole.
By creating a single FunnelWeb file that creates many product files in different languages, the programmer can describe the interaction between the different programs in any manner desired. Furthermore, because the different product files are all created in the same text space (in a single FunnelWeb file), it is easy for them to share information.
For example, in one real application FunnelWeb was used to create a system for printing filesprintingsystem on a laser printerlaserprinter connected to a remote Vax Unix machine from a local Vax VMS machine. The system consisted of two files: a VMS DCL command procedure to run on the local node, and a Unix shellscript to run on the remote node. The user, by giving the print command, invoked the local VMS command procedure, which in turn fired up the remote Unix shellscript. The two scripts then cooperated to transfer the files to be printed and print them.
In addition to its usual documentation powers, FunnelWeb assisted in the creation of this system in two special ways. First, it allowed pieces of code from the two different command procedures to be partially interwoven in a description of their interaction. This is just not possible with comments. Second, it facilitated the use of shared information. For example, under some conditions, each file to be printed would be renamed and copied to the remote system using a particular constant filename (printfile.tmp). FunnelWeb allowed this constant filename to be included in a single macro definition which was invoked in the definition of each of the scripts. This ensured that the two scripts used the same name.
@A The following macro contains the temporary file name used to allow the two shellscripts to transfer each file to be printed. @$@<printfile@>@M==@{printme.txt@} @A Here are the scripts for the local VMS node and the remote UNIX node. @O@<vmscommandprocedure.com@>==@{@- DCL commands copy @<printfile@> unixnode:: DCL commands @} @O@<unixshellscript@>==@{@- unix commands print @<printfile@> unix commands @}
In the case of the printing system, the entire system was described and defined in a single FunnelWeb .fw file. In larger systems containing many FunnelWeb .fw files for many different modules in many different languages, the same trick can be pulled by placing FunnelWeb macro definitions for shared values into FunnelWeb include files. For example, a suite of implementations of network nodes, with each implementation being in a different programming language for a different target machine, could all share a table of configuration constants defined in macros in a FunnelWeb include file.
In summary, FunnelWeb's macro and include file mechanisms provide a simple way for programs written in different languages to share information. This reduces redundancy between the systems and hence the chance of inconsistencies arising.sharing information