620 likes | 724 Views
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 Programmer’s Reference Find the book at www. Amazon.com/rexx
E N D
FreeRexx ! 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 Programmer’s 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 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 Why Scripting ? Why Rexx ? Rexx Tutorial Further Info
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
What’s a Scripting Language ? Rexx: • 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 • Interpreted • High-level • Glue language
Scripting Vs. Traditional Languages Scripting Traditional -- Lower level -- Compiled -- More detail-oriented -- Manual variable management -- Pre-declared variables -- More programmer effort -- “Coding” languages -- Optimize execution speed -- 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 C/C++, COBOL, Java, Pascal, others
When to Use Rexx Yes No -- 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.)
Performance 3M Ratio of compiler to interpreter speed remains constant while processor speeds increase exponentially 200k 10k 4k 70 Year-- 1981 1988 1993 1998 2005 Mhz-- 4.77 8 66 266 3 ghz CPU-- 8088 386 486 PII PIV
“Easy but Powerful” “Easy but Powerful” Why Rexx Vs Other Scripting Languages ? 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 code’s longevity • Saves your company $$$
Why Rexx Vs Other Scripting Languages ? Power Simplicity Conflict ! Rexx uses specific technologies to tie them together
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 PowerThroughSimplicity by…
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 Learn from the inside out 70 Built-in Functions Other Features OS commands, external functions, DLLs, APIs, widgets, etc.
Linux-- all versions Unix-- all versions BSD-- all versions Windows-- all versions Mac OS-- all versions DOS all versions (32- and 16- bit), IBM PC-DOS 2000 and 7 Handhelds-- 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 Runs Everywhere… Rexx predominates on systems in red
Perl Critical mass Python Rexx Has Critical Mass... Rexx, Tcl/Tk, Ruby Many other good languages (Korn, C-shell, bash, Bourne, Lua, Mumps, etc) Do not have critical mass Open source, general purposescripting languages with critical mass -- * Run everywhere (on all major OS’s 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 BRexx Regina Rexx/imc All major operating systems Windows, DOS (32/16 bit), Windows CE, Linux, Unix, Mac OS, AmigaOS, others Unix, Linux, BSD Rexx for Palm OS Reginald r4 Windows Palm OS Windows Open Object Rexx OOP extensions roo! NetRexx Any Java Environment Linux, Windows, Solaris, AIX 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 . . .
Example Script # 1… /*******************************************************************/ /* 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
Minimal syntax • Minimal special characters and variables • Free format • Use spaces & blank lines however desired • Case-insensitive (capitalize however you want) • No explicit filedefinition • 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 Simplicity in this script…
Is it the number of Lines of Code (LOC) ? • Can reduce LOC by nesting functions • But why write a complex “fortune-cookie” script ? What is “Power” ? 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
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 The Power of Glue Languages
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 Signal (goto)
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 Rexx Functions…
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
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 Simplicity in this script…
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. */ 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'
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.j end
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 Discussion DO I = 1 TO n BY m WHILE condition FOR x DO UNTIL … DO FOREVER DO n IF condition THEN DO . . . END ELSE DO . . . END DO IF Enclose multiple statements within a DO END pair
Create Any Data Structure With Rexx Arrays : 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 Element 1 Key 1 Value 1 Key 2 Value 2 Element 2 Key 3 Value 3 Element 3 Key 4 Value 4 A Simple List or Look-up Table Key-value Pairs b.1 b.1.1 b.1.2 b.2 b.2.1 b.2.2 b.3 b.3.1 b.3.2 b.1 b.1.1 b.2 b.2.1 b.2.2 b.2.3 b.3 b.4 A Multi-level Tree (unbalanced) Also: linked list, doubly linked list, stack, queue, dequeue, etc... Balanced Tree Un-Balanced Tree
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
Why Rexx Vs Other Scripting Languages ? For a language that “lacks data structures,” Rexx sure has a lot of them! Power thru Simplicity!
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 Early 90s 1990 1996 1985 TRL-1 TRL-2 SAA ANSI Language Level 4.00 5.00 3.50
The Evolution of Rexx Object-oriented Rexx Early 1980s Mid 1990s Standard or “Classic” Rexx NetRexx (for Java environments)
Rexx on Handhelds Native DOS Emulation Interpreter: Interpreter: Windows CE BRexx Palm OS Rexx for Palm OS Symbian / EPOC32 Regina PocketDOS XTM others BRexx + Integrates with... + DOS Services + DOS Applications + Many DOS apps instantly available without any changes + Faster + Integrates with native services
How DOS Emulation Works Rexx Scripts Rexx Interpreter DOS Operating System DOS Emulator Native operating system Each layer runs on top of the one below it PC Hardware
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 Built-in Objects, Special Variables, many other features Object Rexx New Instructions And Much More More Functions New Operators
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… Java environment integration Classic Rexx 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 Class file Eg: hello.class Source script Eg: hello.nrx Java file Eg: hello.java Compile Java into bytecode Run NetRexx interprets and/or compiles. Can generate commented, formatted Java code. Runs under JVM or stand-alone.
How Rexx Supports Modularity Modularity Internal Routines External Resources -- Extensions and Function Libraries -- Operating System Commands -- Commands to other environments -- External Programs -- API Interfaces to external features -- API into Rexx -- Built-in Functions -- Functions you develop -- Subroutines