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 (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:
- executing a single (native) DCL Lite command
"on top of" the existing PC-DCL session, or
- executing a DCL Lite script, just like in DCL Lite,
where the user's full environment of DCL Lite symbols and logicals
is available by the time the script starts executing,
but doing so "on top of" the existing PC-DCL session,
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.
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.