61
Howard Fosdick (C) 2005 FCI Free Rexx ! Everything You Ever Wanted to Know About Rexx (but were afraid to ask)

Howard Fosdick (C) 2005 FCI Free Rexx ! Everything You Ever Wanted to Know About Rexx (but were afraid to ask)

Embed Size (px)

Citation preview

Howard Fosdick (C) 2005 FCI

Free Rexx ! Everything You Ever Wanted to Know About Rexx (but were afraid to ask)

Who Am I?

• Independent consultant DBA / SA for:

• Oracle, DB2, SQL Server• Linux, Unix, Windows

• Founder IDUG, MWDUG, CAMP

• Author: Rexx Programmer’s Reference

Contact: [email protected]

Viewpoint / Purpose

• All languages have their strengths & roles

• Not here to “put down” other languages

• Here to present Rexx’s strengths and discuss where it fits in your toolbox

(1) Know where Rexx fits (2) Teach you to script it in < 2 hours !

Goals:

Outline

3. Why Scripting ?4. Why Rexx ?5. Rexx Tutorial6. Further Info

I. Why Scripting ?

2 Big Software Trends Converge

Ka-Boom!

Free and Open Source

Scripting

Perl, Python,Rexx,Tcl/Tk, Bash,Korn,Ruby,others

Java,C/C++,COBOL

Visual Basic,VBScript,WSH

• Interpreted

• High-level

• Glue language

• General purpose

• Free / open source

• Universal

• 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

Rexx:

What’s a Scripting Language ?

Scripting Vs. Traditional Languages

-- High level-- Interpretive-- More productive-- Varying degrees of automatic variable management-- Shifts burden to the machine-- “Glue” languages-- Acceptable execution speed

-- Lower level-- Compiled-- More detail-oriented-- Manual variable management-- Pre-declared variables-- More programmer effort-- “Coding” languages-- Optimize execution speed

Rexx, Perl, Python, Tcl/Tk, Ruby, others

C/C++, COBOL, Java, Pascal, others

Scripting Traditional

When to Use Rexx

-- Productivity-- Reliability-- Quick development-- Glue language-- Prototyping-- Systems administration -- OS extensions-- Portable apps-- Mainframe migrations-- Embedded programming-- Handhelds-- Text processing-- Interactive development / debugging

-- Optimal execution speed is required

-- Systems -level programming

(No BIOS interrupts, direct addressing, etc.)

NoYes

Performance

Year-- 1981 1988 1993 1998 2005 Mhz-- 4.77 8 66 266 3 ghz CPU-- 8088 386 486 PII PIV

70 4k10k

200k

3M

Ratio of compiler to interpreterspeed remains constant whileprocessor speeds increaseexponentially

II. Why Rexx ?

Why Rexx Vs Other Scripting Languages ?

“Easy but Powerful”

• FAST coding !

• Reliable code

• Easy to code right out of memory

• Maintainable code

• 70%+ of IT does maintenance• This determines your code’s longevity• Saves your company $$$

Ease of use benefits experienced developers ...

“Easy but Powerful”

Rexx uses specific technologies to tie them together

Why Rexx Vs Other Scripting Languages ?

Power Simplicity

Conflict !

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-inFunctions

Other Features

OS commands, external functions, DLLs, APIs, widgets, etc.

Learn fromthe inside out

Rexx Runs Everywhere…

Linux-- all versionsUnix-- all versionsBSD-- all versionsWindows-- all versionsMac OS-- all versionsDOS all versions (32- and 16- bit)

Handhelds-- Windows CE, Palm OS, Symbian/EPOC32

Embedded-- Embedded Linux, DOS, Windows variants

Mainframes-- OS, VM, VSE (all versions)IBM mid-range-- i5/OS, OS/400 (all versions)

Many others-- Amiga OS, AROS, OpenVMS, BeOS, OpenEdition, AtheOS/Syllable, SkyOS, QNX (QNX4/QNX6), OS/2, eCS, osFree, more…

Rexx predominates on systems in red

The Free Rexx Interpreters

Windows, DOS (32/16 bit),Windows CE, Linux, Unix, Mac OS, others

All major operating systems

Windows

Unix, Linux, BSD

Windows Palm OS

WindowsLinux, Windows, Solaris, AIX

Any JavaEnvironment

Regina Rexx/imc

Reginald

roo!

Rexx forPalm OS

r4

BRexx

NetRexxOpen Object Rexx

OOPextensions

Rexx Free Tools and Interfaces

• Over 100 free tools 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. Let’s Code !

/*******************************************************************//* Find Payments: *//* Reads accounts lines one by one, and displays overdue *//* payments (lines containing the phrase PAYMENT_OVERDUE). *//*******************************************************************/ arg filein /* Read the input file name*/ do while lines(filein) > 0 /* Do while a line to read */  input_line = linein(filein) /* Read an input line */  if pos('PAYMENT_OVERDUE',input_line) > 0 then say 'Found it:' input_line /* Write line if $ overdue */ end

Example Script # 1…

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 OPEN’ed and CLOSE’d

• 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 fileinfgrep 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

Do EndIf If then else

Do While

(case)

Call

Subroutineor Function

Select

Un-Structured Control Instructions

Do UntilDo Forever

Iterate

LeaveSignal

(goto)

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. = '' /* Initialize array entries to null */ area.CHICAGO = 312 /* Define a table of area codes */ area.HOMEWOOD = 708 area.EVANSTON = 847  do while town <> '' /* 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 Rexx’s automation

Example Script # 4…/* Find Books: *//* This program illustrates how arrays may be of any dimension *//* in retrieving book titles based on their keyword weightings. */ keyword. = '' /* Initialize both arrays to all null strings */title. = '' /* The array of keywords to search for among the book descriptors */ keyword.1 = 'earth' ; keyword.2 = 'computers'keyword.3 = 'life' ; 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'

(part I)

Example Script # 4… (part II)

arg weight /* Get number keyword matches required for retrieval */ say 'For weight of' weight 'retrieved titles are:' /* Output header */ do j = 1 while title.j <> '' /* Look at each book */ count = 0 do k = 1 while keyword.k <> '' /* 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 /* Display titles matching the criteria */ say title.jend

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 BY m WHILE condition FOR xDO UNTIL …DO FOREVERDO n

IF condition THEN DO . . . ENDELSE DO . . .END

Enclose multiple statementswithin a DO END pair

DO

IF

Create Any Data Structure With Rexx Arrays :

Element 1

Element 2

Element 3

A Simple Listor Look-up Table

Key-value Pairs

Key 1 Value 1

Key 2 Value 2

Key 3 Value 3

Key 4 Value 4

Balanced Tree Un-Balanced Tree

b.1 b.1.1 b.1.2b.2 b.2.1 b.2.2b.3 b.3.1 b.3.2

b.1 b.1.1b.2 b.2.1 b.2.2 b.2.3b.3b.4

b.1 b.1.1

b.1.1.1b.1.1.2

b.2 b.2.1 b.2.2 b.2.3b.3 b3.1

b.3.1.1b.3.1.1.1

A Multi-level Tree (unbalanced)

Also: linked list, doublylinked list, stack, queue,dequeue, etc...

Example-- Creating a Linked List

list.0 = HEAD ; list.0.next = 1 /* Define linked list. */ list.1 = 'a' ; list.1.next = 2 /* You could also */ list.2 = 'b' ; list.2.next = 3 /* create it */list.3 = TAIL ; list.3.next = TAIL /* dynamically. */

call display_linked_list /* Display the linked list */

list.99 = 'after a, before b' /* Add new item in list */list.99.next = 2 /* Point new item to next */list.1.next = 99 /* Point to the new item */

call display_linked_list /* Display the linked list */exit

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

For a language that “lacks data structures,” Rexx sure has a lot of them!

Power thru Simplicity

Why Rexx Vs Other Scripting Languages ?

IV. More about Rexx

Rexx Standards

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

Extensions

Rexx Standards

1990Early90s

TRL-2 SAA

1996

ANSI

4.00 5.00LanguageLevel

TRL-1

3.50

1985

The Evolution of Rexx

Standard or “Classic” Rexx

Object-oriented Rexx

NetRexx (for Java environments)

Mid 1990sEarly 1980s

Windows CE BRexxPalm OS Rexx for Palm OSSymbian / EPOC32 Regina

PocketDOSXTMothers

BRexx

+ Faster

+ Integrates with native services

+ Integrates with... + DOS Services + DOS Applications

+ Many DOS apps instantly available without any changes

Native DOS Emulation

Rexx on Handhelds

Interpreter: Interpreter:

How DOS Emulation Works

PC Hardware

Native operating system

Rexx Scripts

Rexx Interpreter

DOS Operating System

DOS Emulator

Each layer runs on topof the onebelow it

Classic Rexx

Object-Oriented Rexx Means…

Classes and MethodsPLUS

Inheritance & Derivation

Encapsulation

Abstraction

Polymorphism

Huge Class Library

Object Rexx

Object Rexx Adds to Classic Rexx . . .

Complete ObjectOrientation

New Instructions

More Functions New Operators

Built-in Objects,Special Variables,many other features

Classes and Methods

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 side both

Classic Rexx

NetRexx Goes Beyond Classic Rexx…

Changedand Extendedwith . . .

New instructions

Data typing (“types”)

Indexed strings

Special names

Object orientation

Special methods

… and much more …

Java environment integration

Translate NetRexx sourceinto a Java program

Developing and Running NetRexx Scripts

Run

Source scriptEg: hello.nrx

To translate, compile and run in one step enter: nrc -run hello

Java fileEg: hello.java

Compile Java into bytecode

Class fileEg: hello.class

NetRexx interprets and/or compiles. Can generate commented,formatted Java code. Runs under JVM or stand-alone.

V. More Rexx Features

-- Built-in Functions

-- Functions you develop

-- Subroutines

-- Extensions and Function Libraries

-- Operating System Commands

-- Commands to other environments

-- External Programs

-- API Interfaces to external features

-- API into Rexx

How Rexx Supports Modularity

InternalRoutines

Modularity

ExternalResources

String Processing Operations

abc + abc abcabc Concatenation

Joins two or more stringsabcabc

abc abc

Bifurcation

Splits a string

abcabc Parsing

Scans and analyzes a string, may split it into its constituent components

abcdef Pattern Matching

Identifies patterns in strings

Parse Count = 2

Find “def”

Parsing Operations

Separate by words By Words

abc abc abc

Separate , using , commasBy Pattern

By NumericPattern

Columns: 1 5 9

The Two I/O Modes

linein

lineout

lines

Character-oriented

Process one character at a time

charin

charout

chars

+ More portable + Reads “special” characters

Line-oriented

Process one line at a time

QUEUE

The Stack is both a Stack and a Queue

PULL,PARSE PULL

PUSH

Rexx’s Stack is a generalized communications mechanism

Rexx Supports Recursion

Call Script X

End TestFufilled ?

Script X

Yes

No

How Recursion Works

Tip – Steps to Good Programming Style

Spacing & indentation

Good variable names

Limit Nesting

Comments

Structured Code

Modularity

Error checking

Ect !

Capitalization

Debugging Options

SAY Instruction TRACE Instruction in batch mode

Interactive TRACE

+ Quick, informal+ Great for simple problems+ Requires changing code (adding SAY instructions)

+ Resolves challenging problems+ Allows real-time code tests+ Programmer-directed interaction resolves problems+ Quick & easy, but powerful

+ Batch script trace+ Can set trace level based on user input+ Many trace settings available+ Good for “paperanalysis” of a problem

signal on condition name label_name

Condition / Exception Trapping

label_name:

…code of the main routine...

…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

INTERPRETER: DOWNLOAD:Regina http://regina-rexx.sourceforge.net

BRexx http://bnv.home.cern.ch/bnv/

Reginald http://www.borg.com/~jglatt/rexx/rexxuser.htm

Rexx/imc http://users.comlab.ox.ac.uk/ian.collier/Rexx/rexximc.html

Rexx for Palm OS http://www.jaxo.com/rexx/

r4 http://www.kilowattsoftware.com/

roo! http://www.kilowattsoftware.com/

Open Object Rexx http://www.rexxla.org

NetRexx http://www-306.ibm.com/software/awdtools/netrexx/

Rexx Programmer’s Reference at Amazon www.amazon.com/rexx

     

??

? ?

?questions...

?

??

?