Free Rexx !
Everything You Ever Wanted to Know About Rexx (but were afraid to ask)
Howard Fosdick
(C) 2006 FCI Version 2.0
Who Am I?
Presentation by Howard Fosdick,
author of Rexx Programmers Reference
Find the book at www. Amazon.com/rexx
This presentation is published under the Open
Publication License (OPL).
Viewpoint / Purpose
All languages have their strengths & roles Not here to put down other languages Here to present Rexxs strengths and
discuss where it fits in your toolbox Goals: (1) Know where Rexx fits (2) Teach you to script it in < 2 hours !
Outline
1. 2. 3. 4.
Why Scripting ? Why Rexx ? Rexx Tutorial Further Info
I. Why Scripting ?
2 Big Software Trends Converge
Ka-Boom!
Free and Open Source Perl, Python, Rexx, Tcl/Tk, Bash, Korn, Ruby, others Scripting
Java, C/C++, COBOL
Visual Basic, VBScript, WSH
Whats a Scripting Language ?
Rexx:
General purpose
Free / open source Universal
Interpreted High-level Glue language
Portable code Transferable skills
Standardized (8 of 9 free Rexxes meet stds) Dynamic Sizing (variables & arrays) Memory management No variable declarations No data typing Integrated debugger
Scripting Vs. Traditional Languages
Scripting ----High level Interpretive More productive Varying degrees of automatic variable management -- Shifts burden to the machine -- Glue languages -- Acceptable execution speed Rexx, Perl, Python, Tcl/Tk, Ruby, others
Traditional --------Lower level Compiled More detail-oriented Manual variable management Pre-declared variables More programmer effort Coding languages Optimize execution speed C/C++, COBOL, Java, Pascal, others
When to Use Rexx
Yes
-- Productivity -- Reliability -- Quick development -- Glue language -- Prototyping -- Systems administration -- OS extensions -- Portable apps -- Mainframe migrations -- Embedded programming -- Handhelds -- Text processing -- Interactive development / debugging
No
-- Optimal execution speed is required -- Systems -level programming (No BIOS interrupts, direct addressing, etc.)
Performance
Ratio of compiler to interpreter speed remains constant while processor speeds increase exponentially
200k
3M
10k 70 Year-- 1981 Mhz-- 4.77 CPU-- 8088 4k
1988 8 386
1993 66 486
1998 266 PII
2005 3 ghz PIV
II. Why Rexx ?
Why Rexx Vs Other Scripting Languages ?
Easy but Powerful Powerful Easy
Ease of use benefits experienced developers ...
FAST coding ! Reliable code Easy to code right out of memory Maintainable code
70%+ of IT does maintenance This determines your codes longevity Saves your company $$$
Why Rexx Vs Other Scripting Languages ?
Power Conflict !
Simplicity
Rexx uses specific technologies to tie them together
Power Through Simplicity by
Small instruction set, w/ power in the functions Extensible Call external functions just like internal Glue language (uses OS commands, interfaces, DLLs, shared libraries, services, objects, etc.)
Minimal syntax Minimal special characters, variables, etc. Automated memory management Automated variable management No data definitions No data typing Dynamic array sizes Dynamic string or variable lengths
Power Through Simplicity
Rexx presents a radically different philosophy on how to achieve power than the Unix tradition languages (Perl, Bash, Korn, Awk, etc.)
Rexx presents a unique scripting paradigm
The Language Structure Makes Rexx Easy
Operators
Arithmetic Comparison Logical String
2 dozen Instructions
70 Built-in Functions
Other Features
Learn from the inside out
OS commands, external functions, DLLs, APIs, widgets, etc.
Rexx Runs Everywhere
Linux-Unix-BSD-Windows-Mac OS-DOS Handhelds-all versions all versions all versions all versions all versions all versions (32- and 16- bit), IBM PC-DOS 2000 and 7 Windows CE / Mobile / PPC / etc, Palm OS, Symbian/EPOC32, EPOC, DOS emulation
Embedded--
Embedded Linux, DOS, Windows variants
Mainframes-- z/OS, z/VM, z/VSE (all versions) IBM iSeries-- i5/OS, OS/400 (all versions) Many others-- AmigaOS, AROS, MorphOS, OpenVMS, BeOS, OpenEdition, AtheOS/Syllable, SkyOS, QNX (QNX4/QNX6), OS/2, eCS, osFree, more
Rexx predominates on systems in red
Rexx Has Critical Mass...
Perl Python Rexx, Tcl/Tk, Ruby Critical mass
Many other good languages (Korn, C-shell, bash, Bourne, Lua, Mumps, etc)
Do not have critical mass
Open source, general purpose scripting languages with critical mass -* Run everywhere (on all major OSs and platforms) * Have strong standards * Enjoy wide use and offer good support * Internationally * In many spoken languages * Offer thousands of free tools and scripts * Interface to everything (databases, web programming, GUIs, etc, etc)
NOTE-- The chart excludes non-open source (eg VB, VBScript) and non-general purpose (eg PHP) scripting languages
The Free Rexx Interpreters
Regina All major operating systems Rexx/imc Unix, Linux, BSD BRexx Windows, DOS (32/16 bit), Windows CE, Linux, Unix, Mac OS, AmigaOS, others Rexx for Palm OS Palm OS
Reginald Windows
r4 Windows Open Object Rexx Linux, Windows, Solaris, AIX
roo!
OOP extensions
NetRexx
Any Java Environment
Windows
Rexx Free Tools and Interfaces
Over 2000 free tools & scripts for Rexx. Examples:
SQL database access GUIs XML Web programming Math libraries Regular Expressions Code managers Communications functions OS interface libraries Graphics Speech, MIDI, sound . . . you name it . . .
III. Lets Code !
Example Script # 1
/*******************************************************************/ /* Find Payments: */ /* Reads accounts lines one by one, and displays overdue */ /* payments (lines containing the phrase PAYMENT_OVERDUE). */ /*******************************************************************/ arg filein do while lines(filein) > 0 input_line = linein(filein) /* Read the input file name*/ /* Do while a line to read */ /* Read an input line */
if pos('PAYMENT_OVERDUE',input_line) > 0 then say 'Found it:' input_line end /* Write line if $ overdue */
Simplicity in this script
Minimal syntax Minimal special characters and variables Free format Use spaces & blank lines however desired Case-insensitive (capitalize however you want)
No explicit file definition File is automatically OPENed and CLOSEd Automatic declaration of variables (see FILEIN and INPUT_LINE) No data typing All variables are strings Numbers are strings that look like numbers Decimal arithmetic (portable, consistent results) Automatic conversions where sensible
What is Power ?
Is it the number of Lines of Code (LOC) ? Can reduce LOC by nesting functions But why write a complex fortune-cookie script ?
Power is not solving the problem in the fewest LOC! Power is a deft script that solves the problem in a reliable, readable, maintainable manner
Example Script # 2
arg filein fgrep PAYMENT_OVERDUE
filein
This script does the same thing as Example #1
The Power of Glue Languages
Rexx evaluates a statement, sends anything that is not Rexx to the external environment (by default this is the OS) Full power of a string-manipulation language to direct external interfaces
Inspect return code, command output, messages, and respond Rexx is a glue language
Structured Control Instructions
If If then else
Do End
Do While Select
Call (case)
Subroutine or Function
Un-Structured Control Instructions
Do Until
Do Forever
Iterate
Leave (goto)
Signal
Rexx Functions
70 Built-in Functions:
String manipulation (character, bit, hex) Word manipulation I/O Numeric Environmental Conversion Other
2 statements access external function library Those functions are then coded just like built-ins
Example Script # 3
/*******************************************************************/ /* Code Lookup: */ /* Looks up the area code for the town the user enters. */ /*******************************************************************/ area. = '' area.CHICAGO = 312 area.HOMEWOOD = 708 area.EVANSTON = 847 do while town <> '' /* Initialize array entries to null */ /* Define a table of area codes */
/* Loop until user enters null line */
say 'For which town do you want the area code?' pull town if town <> '' then do if area.town = '' then say 'Town' town 'is not in my database' else say 'The area code for' town 'is' area.town end end
Simplicity in this script
Array recognized by the period (area.) Do not have to declare arrays or predefine their size Sets all possible elements to null string (area. = ) Subscript array by any arbitrary string (content-addressable memory or associative memory) Arrays can be: Dense or sparse Contain homogenous or heterogeneous elements Represent records or C structs Expand to size of memory Automatic capitalization (pull & array element names) Can always override Rexxs automation
Example Script # 4 (part I)
/* /* /* Find Books: This program illustrates how arrays may be of any dimension in retrieving book titles based on their keyword weightings.
/* Initialize both arrays to all null strings
*/ */ */
*/
keyword. = '' title. = ''
/* The array of keywords to search for among the book descriptors keyword.1 = 'earth' keyword.3 = 'life' ; ; keyword.2 = 'computers' keyword.4 = 'environment'
*/
/* The array of book titles, each having several descriptors
title.1 = 'Saving Planet Earth' title.1.1 = 'earth' title.1.2 = 'environment' title.1.3 = 'life' title.2 = 'Computer Lifeforms' title.2.1 = 'life' title.2.2 = 'computers' title.2.3 = 'intelligence' title.3 = 'Algorithmic Insanity' title.3.1 = 'computers' title.3.2 = 'algorithms' title.3.3 = 'programming'
*/
Example Script # 4 (part II)
arg weight /* Get number keyword matches required for retrieval */ /* Output header */ */
say 'For weight of' weight 'retrieved titles are:' do j = 1 while title.j <> '' count = 0 do k = 1 while keyword.k <> ''
/* Look at each book
/* Inspect its keywords */
do l = 1 while title.j.l <> '' /* Compute its weight if keyword.k = title.j.l then count = count + 1 end
end
*/
if count >= weight then say title.j end
/* Display titles matching the criteria */
Discussion
Array keyword. is a lookup table or list key/value pairs like Perl or Berkeley DB Array title. is a tree Trees can be balanced or not
DO I = 1 TO n DO UNTIL DO FOREVER DO n BY m WHILE condition FOR x
DO
IF
IF condition THEN DO ... END ELSE DO ... END
Enclose multiple statements within a DO END pair
Create Any Data Structure With Rexx Arrays :
Element 1 Element 2 Element 3 A Simple List or Look-up Table b.1 b.1.1 b.1.2 b.2 b.2.1 b.2.2 b.3 b.3.1 b.3.2 Balanced Tree Key 1 Key 2 Key 3 Value 1 Value 2 Value 3 b.1 b.1.1 b.1.1.1 b.1.1.2 b.2 b.2.1 b.2.2 b.2.3 b.3 b3.1 b.3.1.1 b.3.1.1.1
Key 4
Value 4
Key-value Pairs
b.1 b.1.1 b.2 b.2.1 b.2.2 b.2.3 b.3 b.4 Un-Balanced Tree
A Multi-level Tree (unbalanced)
Also: linked list, doubly linked list, stack, queue, dequeue, etc...
Example-- Creating a Linked List
list.0 list.1 list.2 list.3 = = = = HEAD 'a' 'b' TAIL ; ; ; ; list.0.next list.1.next list.2.next list.3.next = = = = 1 2 3 TAIL /* Define linked list. /* You could also /* create it /* dynamically. */ */ */ */
call display_linked_list list.99 = 'after a, before b' list.99.next = 2 list.1.next = 99 call display_linked_list exit
/* Display the linked list */ /* Add new item in list /* Point new item to next /* Point to the new item */ */ */
/* Display the linked list */
display_linked_list: /* Displays the linked list*/ sub = 0 do while list.sub.next <> TAIL say 'Element:' list.sub sub = list.sub.next end return
Why Rexx Vs Other Scripting Languages ?
For a language that lacks data structures, Rexx sure has a lot of them!
Power thru Simplicity!
IV. More about Rexx
Rexx Standards
Extensions
TRL-2
ANSI
8 of 9 free Rexx interpreters adhere to TRL-2 ANSI adds little beyond TRL-2 Most Rexxes offer extensions Extensions offer OS-specific stuff and other niceties
Rexx Standards
1985
1990
Early 90s
1996
TRL-1
TRL-2
SAA
ANSI
3.50
4.00
5.00
Language Level
The Evolution of Rexx
Object-oriented Rexx
Early 1980s
Mid 1990s
Standard or Classic Rexx
NetRexx
(for Java environments)
Rexx on Handhelds
Native Interpreter: BRexx Rexx for Palm OS Regina
DOS Emulation Interpreter: PocketDOS XTM others BRexx
Windows CE Palm OS Symbian / EPOC32
+ Integrates with... + DOS Services + DOS Applications + Faster + Integrates with native services + Many DOS apps instantly available without any changes
How DOS Emulation Works
Rexx Scripts
Rexx Interpreter
DOS Operating System DOS Emulator
Native operating system
PC Hardware
Each layer runs on top of the one below it
Object-Oriented Rexx Means
Classic Rexx
Classes and Methods PLUS Inheritance & Derivation
Encapsulation
Abstraction Polymorphism
Huge Class Library
Object Rexx Adds to Classic Rexx . . .
Classes and Methods
Complete Object Orientation
Object Rexx
New Instructions
Built-in Objects, Special Variables, many other features
More Functions
New Operators
And Much More
NetRexx
A Rexx-like language Brings Rexx ease of use to Java environment NetRexx scripts use Java classes Script: Classes for use by Java Applets Applications Servlets Java Beans (EJBs) Client & server sides both
NetRexx Goes Beyond Classic Rexx
Classic Rexx
Java environment integration
Object orientation
New instructions Changed and Extended with . . . Data typing (types) Indexed strings Special names Special methods and much more
Developing and Running NetRexx Scripts
To translate, compile and run in one step enter: nrc -run hello
Translate NetRexx source into a Java program Source script Eg: hello.nrx Java file Eg: hello.java Class file Eg: hello.class
Compile Java into bytecode Run
NetRexx interprets and/or compiles. Can generate commented, formatted Java code. Runs under JVM or stand-alone.
V. More Rexx Features
Modularity
How Rexx Supports Modularity
Internal Routines -- Built-in Functions
External Resources -- Extensions and Function Libraries -- Operating System Commands -- Commands to other environments -- External Programs -- API Interfaces to external features -- API into Rexx
-- Functions you develop
-- Subroutines
String Processing Operations
abc + abc abcabc Bifurcation abc abc Splits a string abcabc Concatenation Joins two or more strings
abcabc
Parse Count = 2
Parsing Scans and analyzes a string, may split it into its constituent components Pattern Matching
Find def
abcdef
Identifies patterns in strings
Parsing Operations
By Words Separate by words
By Pattern
Separate ,
using ,
commas
By Numeric Pattern
abc abc abc 1 5 9
Columns:
The Two I/O Modes
Line-oriented
Character-oriented Process one character at a time
Process one line at a time
linein lineout
charin charout
lines
chars
+ More portable
+ Reads special characters
The Stack is both a Stack and a Queue
PUSH PULL, PARSE PULL
QUEUE
Rexxs Stack is a generalized communications mechanism
Rexx Supports Recursion
How Recursion Works
Script X
End Test Fufilled ?
No
Yes
Call Script X
Tip Steps to Good Programming Style
Ect ! Error checking Structured Code
Modularity
Comments Limit Nesting
Spacing & indentation
Good variable names Capitalization
Debugging Options
SAY Instruction
TRACE Instruction in batch mode
Interactive TRACE
+ Quick, informal + Great for simple problems + Requires changing code (adding SAY instructions)
+ Batch script trace + Can set trace level based on user input + Many trace settings available + Good for paperanalysis of a problem
+ Resolves challenging problems + Allows real-time code tests + Programmer-directed interaction resolves problems + Quick & easy, but powerful
Condition / Exception Trapping
signal on condition name label_name
code of the main routine...
label_name: code of the error handling routine...
Conditions: error, failure, halt, novalue, notready, syntax, lostdigits
VI. Conclusions
Conclusions
Free & open source languages have taken over
Scripting is the quiet revolution
Rexx offers Power through Simplicity
Useful addition to your toolbox
Resources
Find everything at www.RexxInfo.org -- download Rexx -- download tools -- tutorials, articles, how-tos -- reference materials
Rexx Programmers Reference at Amazon www.amazon.com/rexx
?
?
?
?
?
questions...
?
?
? ?