Comparison of PC-DCL vs. Open DCL Lite

An exploration of Michel Valentin's PC-DCL setup file, PCDCL_Setup_V407.exe -- downloaded in 2012-01 from the "PC-DCL home page" [available then via http://www.michelvalentin.net/ and available now via the 2014-05-22 snapshot of "PC-DCL home page" at archive.org], followed by a subsequent installation and playing around with PC-DCL, yielded the observations contained on the present "Comparison of PC-DCL vs. Open DCL Lite" page.

PC-DCL Pros           PC-DCL Cons      

PC-DCL Pros (for the most part):

  • PC-DCL is freeware (ie, it costs $0).
  • It is also "free" as defined by the Free Software Foundation, since it has the 3 clause BSD license in its external license with the later 2010 copyright. But there is some confusion on the licensing, since internally the HELP LICENSE indicates PC-DCL is GPL v2 licensed and an older PC-DCL 2001 copyright is listed immediately preceding the GPL v2 license.
  • It is compatible with Windows NT4, 2000, XP, Vista, and Win7.
  • It includes updates as late as 2010-01-07.
  • It includes approximately 30 useful example scripts.
  • It allows changing of default command file extension (in dcl.ini).
  • It allows changing the "qualifier/switch" character from '/' to '-'.
  • It includes a help facility (patterned loosely after that of OpenVMS DCL).
  • It has some facilities that Accelr8 Open DCL Lite does not have:
    • @ has some enhanced functionality:
      • @ searches the PATH environmental variable to find command procedures, if necessary -- this is both an advantage and a disadvantage,
      • even though both PC-DCL and Open DCL Lite can use the /OUTPUT qualifier to log other command files called directly from within their sessions, a PC-DCL session can even be started using "@command_file/output=logfilespec" arguments, whereas the OpenVMS DCL "command_file/output=logfilespec" mechanism of invoking and recording another temporary, batch-like DCL instance is apparently not implemented by Open DCL Lite,
    • CLOSE, OPEN, READ, WRITE (includes a general purpose WRITE, not just WRITE SYS$OUTPUT as in Open DCL Lite),
    • DEFINE /KEY,
    • F$CHR,
    • F$CVTIME,
    • F$ENVIRONMENT,
    • F$FAO,
    • F$FILE_ATTRIBUTES,
    • F$GETJPI (though PC-DCL's help doesn't say so),
    • F$GETDVI,
    • F$GETSYI which returns some new different values,
    • F$MATCH_WILD,
    • F$MESSAGE,
    • F$NODE,
    • F$PID,
    • F$UNIQUE to generate unique filenames,
    • HELP SPECIFY,
    • INQUIRE,
    • Logicals which are not "rooted" can be used as if they were rooted,
      eg, if logical MYDIR was defined as "[USER.NAME]", it can still be used as if it was defined as the root "[USER.NAME." in order to connect to its subdirectory tree: MYDIR:[SUBLVL1.LVL2],
    • PRINT,
    • RECALL of more than 20 commands -- I've seen up to 64 -- in a list which seems to be globally maintained across all that user's sessions such that the history of the last session which has been logged out is available for later use -- very useful !!!,
    • RUN and RUN /WAIT (which works much like Open DCL Lite's SHELL command),
    • RUN /NOWAIT (which runs the command as a detached process, where behavior seems to be like an Open DCL Lite SHELL START command without any switches [might require filespecs to not contain complications like spaces],
    • -, a hyphen, immediately preceding a Windows command, program, or batch file and its parameters, which works like RUN /NOWAIT,
    • SET CONTROL=(C,T),
    • SET FILE,
    • SET SYMBOL /SCOPE,
    • SET TIME,
    • SHOW CPU,
    • SHOW DEVICES,
    • SHOW KEY,
    • SHOW LOGICAL iterates if result is also a logical,
    • SHOW MEMORY,
    • SHOW PROCESS which includes /ALL and /CONTINUOUS,
    • SHOW STATUS,
    • SHOW SYSTEM /DRIVERS,
    • WAIT,
    • Ctrl-T to display a snapshot of CPU, PF, IO and MEM,
    • DCL$CTRLT symbol can be defined to replace the standard Ctrl-T output display.
    • COPY /NEW switch,
    • DELETE /ERASE switch,
    • DIR /ATTRIBUTE, /PAGE, and /SORT switches,
    • /SUBDIR switch on various commands so an entire directory tree can be operated on even when MS-DOS or Unix style filespecs are used,
    • /BINARY and /TEXT switches on various commands can differentiate the two formats.
  • It's line editing works much better than Open DCL Lite -- both for SET TERM /OVERSTRIKE and SET TERM /INSERT -- if everything fits on a single line of the terminal. This excellent single line "what you see is what you get" editing, in conjunction with a wide window and RECALL's larger 64 commands list makes PC-DCL very useful when doing testing where a command must be tested in a variety of ways, editing and retrying over and over again. This, in and of itself, is a reason to install PC-DCL alongside Open DCL Lite.
  • It has a REPEAT / UNTIL enhancement.
  • It has a WHILE / DO / ENDWHILE enhancement.
  • It has a SET STEP that can be used for debugging.
  • SET PROMPT can handle $P and $G (similar to MS-DOS / CMD Prompt).
  • It tries to translate any PC-DCL file specification into DOS format when a DOS command is about to be executed, but this can be overridden by preceding the command with a colon (:).
    • Example 1: If the following is issued:
           $ fc [vms.like.dir1]filename1.typ [vms_style.dir2]filename2.typ
      then WinXP's FC file comparison utility will actually perform the file comparison.
      I really like that!  It is not possible with Open DCL Lite.
    • Example 2: However, the same command issued while preceding the FC with a colon:
           $ :fc [vms.like.dir1]filename1.typ [vms_style.dir2]filename2.typ
      will fail, because WinXP's FC file comparison utility can not understand VMS-style directories.  Example 2's results in PC-DCL are the same as issuing the Example 1 command in Open DCL Lite.
    • Example 3: When you need to issue a MS-DOS / CMD Prompt command which also has the same PC-DCL name, then you can precede the command with a colon to force the MS-DOS / CMD version to be executed (albeit at the expense of not having the VMS-style file specifications translated to MS-DOS format). For example, the equivalent of the Open DCL Lite command to display a directory via a WinXP's DIR /X variant:
           $ shell dir /a /4 /ogd /x
      can be done in PC-DCL as:
           $ :dir /a /4 /ogd /x
    • Example 4: Similar to example 1, if the following is issued:
           $ cd any_dir_or_logical_which_is_VMS_like
      and if CD is not defined as a PC-DCL symbol, then WinXP's CD utility will perform directory changing. So CD and the PC-DCL :CD variant become a more flexible way to change directory than using Open DCL Lite's CMD shell CD usage.
  • It's SHOW SYSTEM lists programs somewhat differently compared to the SHOW SYSTEM of Open DCL Lite.  PC-DCL's SHOW SYSTEM has:
    • an added "User name" column,
    • a missing "Handles" column,
    • PID in decimal (not hex),
    • "Pages" instead of "Ph. Mem" (in k), and
    • CPU time which is different for some surprising reason.
  • The source for Michel Valentin's PC-DCL   <<< NEW resource discovered 2020-05-18
    does seem to be publicly available on github!!!
      PC-DCL is the only one of the native Windows or Linux DCL implementations (I'm aware of) that has open source available.  I have not researched that github site to see if the PC-DCL source:
    • corresponds to PC-DCL v4.07,
    • can be successfully rebuilt, or
    • can overcome any of the PC-DCL Cons listed below...

PC-DCL Cons (for the most part):

  • PC-DCL does not have some "important to me" facilities that Accelr8 Open DCL Lite does have, eg, the following listed in decreasing order of importance to me:
    • no DIFF or SEARCH command,
    • no /EXCLUDE switch on any command,
    • no /WIDTH or /SELECT=SIZE on DIRECTORY command,
    • no /CREATED or /MODIFIED on any command.
    I depend on all of these.
  • Lines with TABs in them are oftentimes detected as bad syntax. This is very annoying.
  • CREATE file doesn't seem to create ASCII text files in DOS format, but instead in Unix format.  However, can easily convert to DOS format by following the CREATE command with:
         $ gsar -ud just_created_file new_dos_format_file
    as long as UnxUtils are in the PATH.  Also, UnxUtils' SED or GAWK could be used to convert to DOS format.
  • DEFINE logical can not handle complicated syntax involving multiple lexicals and/or symbols like I've already defined for Open DCL Lite logicals. This is extremely limiting!!
  • DEFINE symbol can not handle complicated syntax involving multiple lexicals and/or symbols like I've already defined for Open DCL Lite symbols. This is extremely limiting!!
  • DEFINE SYS$OUTPUT does not behave as expected.
    The sequence:
    • DEFINE SYS$OUTPUT some_file_name,
    • miscellaneous commands which output to SYS$OUTPUT,
    • DEASSIGN SYS$OUTPUT,
    seems to:
    • always output to SYS$OUTPUT.lis, and
    • have locking problems sometimes after the DEASSIGN.
    This is unacceptably limiting to me, since I depend on DEFINE SYS$OUTPUT occasionally.
  • DELETE doesn't seem to be able to delete an empty directory.
    It doesn't recognize the *.DIR files, even though they are visible with DIRECTORY as lines containing the string: <DIR>.
  • DIFFERENCES is not implemented at all.
    Must rely on Open DCL Lite's DIFFERENCES, Microsoft's FC, UnxUtils DIFF oriented utilities, ComponentSoftware's CSDiff, or some other difference utility.
  • DIRECTORY can not be used to display directory files using the *.DIR syntax (like in OpenVMS and Open DCL Lite).  Instead the directory files appear in PC-DCL DIRECTORY listings as lines containing the string: <DIR> -- somewhat similar to how they appear in WinXP's DIR listing.
  • DIRECTORY file1,file2,etc syntax -- to display a list of several individual files -- not handled.
  • DIRECTORY /DOTFILES /SELECT=SIZE..., /WIDTH switches are missing.
  • EXIT has major deficiencies.
    • An EXIT which follows the invocation of an external command file (via @) seems to require some other line between the command file invocation and the exit command. A blank line with a single dollar sign, a comment line, a label (and probably most other statements) will serve this purpose.
    • If an EXIT follows a procedure with nested IFs, then some subsequent EXIT inside of an unreached ELSE clause may cause unexpected procedure exit.
    • EXIT does not display VMS-style error messages like Open DCL Lite does, eg, for:
           $ exit 2
           $ exit 8
           $ exit 16
              ...etc...
  • F$GETSYI returns far fewer values compared to Open DCL Lite.
  • F$SEARCH does not work with VMS filespecs..
    And it does not return the full filespec, but instead leaves off the directory spec.
    So it's nowhere near as useful as it should be.
  • IFs, especially nested IFs, behave in un-OpenVMS ways.
    • Nested IFs do not work like OpenVMS and Open DCL Lite. They use a different syntax apparently, so many, even mildly complicated, scripts developed for OpenVMS or Open DCL Lite will not work without heavy adaptation. Beware of using PC-DCL with any procedures containing nested IFs.
    • PC-DCL seems to unexpectedly execute certain statements within THEN or ELSE clauses which should not logically be executed. I've encountered this with executing an EXIT inside a "should not be executed" ELSE clause, and a DCL Lite SHELL command inside a "should not be executed" THEN clause. Additionally, I've seen an @ invocation of another command file being incorrectly executed in a then clause which is otherwise skipped. Usually these problems can be worked around by fiddling with the arrangement of the IFs, adding GOTOs, pulling the @ invocation outside of all then/else clauses (except that it seems to work in the THEN clause of an inline IF ... THEN), adding "earlier than would normally be used" EXITs, etc. This problem with PC-DCL makes the programming ugly and hard to read at times, and is one of the main reasons for not using PC-DCL as your primary DCL implementation.
    • IF clause expressions sometimes fail when 3 separate comparison clauses are ORed or ANDed together. For example,
           if (a .eqs. b) .or. (a .eqs. b) .or. (a .eqs. c)
           then do_my_stuff
      croaks with an "Invalid syntax" error. Sometimes they fail, sometimes they don't.
    These nested IF problems, in and of themselves, are reasons for me to not use PC-DCL as my preferred DCL implementation.  But I do have to admit that Michel Valentin himself -- in his HELP / Miscelaneous / "What is PC-DCL ?" topic -- says PC-DCL is suitable for simple DCL command files.
  • It's help facility has several problems:
    • It doesn't operate hierarchically the same way that OpenVMS DCL and Accelr8 Open DCL Lite do.
    • It seems to be incomplete sometimes.
    • It's readability is hampered by being right justified (at least part of the time).
    • It displays (at least some) pages as if a /PAGE qualifier had been issued to pause the display after each page. This can be considered both an advantage or a disadvantage. I consider it primarily a disadvantage, since there is not a switch to enable/disable it.
    • It always clears the screen.
    • The command
           $ HELP subject *
      does not work to display all help on that subject.
  • A logical which has been defined with another logical, when followed by a colon then filespec, does not always work in situations where it does work in OpenVMS DCL and Accelr8 Open DCL Lite. For example, using this logical definition for PCDCLHELP:
         $ define pcdclhelp sys$dcl:[help]
    neither of these two commands will list any of the directory's help files:
         $ dir pcdclhelp:*.hlp
         $ dir pcdclhelp:open.hlp
    though the following does list all the directory's help files:
         $ dir pcdclhelp:
    This contrasts with the case where the PCDCLHELP logical is defined by:
         $ define pcdclhelp "C:[Progra~1.PCDCL.help]"
    where all three of the above DIR commands work.
  • Deleting a local symbol with DELETE/SYMBOL xxxx will delete all symbols, both local and global, which contain the same xxxx substring at the beginning of their string name.
    For example,
         $ show symbol xxxx
         $ xxxx111 == "This_Is_Global_String_1"
         $ xxxx222 :== This is global string 2
         $ xxxx := I-am-ZEE-local-STRINGEE
         $ show symbol xxxx
         xxxx111 == This_Is_Global_String_1
         xxxx222 == THIS IS GLOBAL STRING 2
         xxxx == I-AM-ZEE-LOCAL-STRINGEE
         $ delete/symbol xxxx
         $ show symbol xxxx
         $ show symbol xxxx111
         $ show symbol xxxx222
    OpenVMS DCL and Accelr8 Open DCL Lite do not delete more than one symbol at a time.
  • **** CHECK THIS OUT FURTHER THEN UPDATE ****
    It can not handle all 3 filespec formats -- VMS, Windows (backslash) and Unix (forward slash) -- simultaneously in a single command, judging from its dcl.ini. PC-DCL can only be in VMS filespec mode or Windows/Unix filespec mode, but not both at the same time. For example, you couldn't do a copy where the source was in VMS format, but the destination was in Windows format.
  • **** CHECK THIS OUT FURTHER THEN UPDATE ****
    There is apparently no difference between the := and :== string assignment operators. They both apparently put the result in the global symbol table.
  • RECALL /ALL doesn't have a way of clearly showing all the commands in only the present PC-DCL session like DCL Lite can (though PC-DCL's RECALL /ALL is, in general, much better than DCL Lite's).
  • RENAME names all output files in upper case, even when filenames with lower case characters are enclosed in double quotes.
  • SEARCH is not implemented at all.
    Must rely on Open DCL Lite's SEARCH, Microsoft's FIND or FINDSTR, UnxUtils' GREP oriented utilities or GSAR, ActivePerl's SEARCH.BAT, Digital Mars' GREP [not free], or some other search utility.
  • Command line overflow usually inhibits PC-DCL's excellent line editing capability..
    In those cases, DCL Lite is far better, since with DCL Lite you can at least edit the "wrapped around" line(s).
    • Using a window of maximum width is a useful, partial workaround for the PC-DCL "command line overflow inhibits line editing" problem.
    • But if the command fits on a single line, then PC-DCL line editing is far superior to Open DCL Lite's.
  • It apparently doesn't automatically process all files, since there is an /ALL switch on some commands to enable processing hidden and system files.
  • SHOW LOGICAL has a couple deficiencies:
    • It will not display wildcarded logicals, eg, SHOW LOG SYS* or SHOW LOG INI*, either by including the asterisk or leaving it off. That's inconvenient. It requires using SHOW LOG to display the entire list of logicals.
    • It will not display all logicals when SHOW LOG * is used (though it will display the entire list via the simpler SHOW LOG command, and that's easy to adapt to).
  • SHOW SYMBOL has deficiencies:
    • It does not display alphabetically.
    • It does not display a symbol when defined as the null string.
    • It does not display correctly when certain asterisk wildcard formats are used (eg, *ID* to show all symbols that contain ID anywhere in the symbol -- at the beginning, in the middle, or at the end).
    • It does not show the asterisk when the asterisk is used to define a minimal length match (eg, TOD*AY == "DIR/SINCE" to define TOD as the minimal length of the TODAY command).
  • It's SHOW TERMINAL and SET TERMINAL commands do not operate like OpenVMS's DCL. For example, SET TERMINAL /PAGE is not available, and SHOW TERMINAL is completely different.
  • TYPE SYS$INPUT can not be used as an easy way to display multiple lines.
    This is unfortunate and is another reason why I can't use PC-DCL as my default DCL implementation, since I have a very large amount of HELP documentation that uses the TYPE SYS$INPUT facility.
  • /BY_OWNER switch is not implemented.
  • Only single equivalence names are allowed per logical in PC-DCL (whereas OpenVMS DCL and Accelr8 Open DCL Lite allow multiple equivalence names per logical).
  • My classy CHD implementation (using CHDL.DCL) can not be used because of its extensive use of nested IFs which PC-DCL isn't mature enough to handle. This, in and of itself, is enough for me to decide to not use PC-DCL as my default, everyday shell. But, my simpler CHDL_PCDCL.DCL substitute (for PC-DCL only) does work for lots of the most common directory changes.

Open DCL Lite can be installed along side PC-DCL in order to extend PC-DCL by:

yet using PC-DCL as the primary shell.

Also, DCL Lite can be run as a separate process in a separate window, initiated either from PC-DCL, or from within Windows, eg, via a shortcut icon.

However, I have yet to determine how to extend Open DCL Lite with PC-DCL such that PC-DCL runs "on top of" DCL Lite to execute either a single PC-DCL command or a complete PC-DCL script. I've only been able to run PC-DCL from DCL Lite as a separate process in a separate window.

See Mutual Extensibility of Open DCL Lite and PC-DCL for more details on how PC-DCL and Open DCL Lite can coexist and mutually extend one another.

PC-DCL Pros           PC-DCL Cons      

Note:
This page's analysis was based on 2-3 weeks of heavy experience with PC-DCL v4.07.

These days I rarely ever use PC-DCL -- maybe once every 6-12 months.  And that's normally for only a single operation, or only a brief time.
Mid 2020-05 update:
The "PC-DCL home page" link started hanging in mid-2020-05, so I reverted to using its Wayback Machine 2014-05-22 snapshot.  I've verified that the PCDCL_Setup_V407.exe downloadable from that 2014-05-22 snapshot is the exact same setup file that I originally used during my 2012 testing. 

This page is copyright © 2012-2022, Richard H. Jones. All rights reserved.

Page's last update was on 2022-07-12.