Micro web-framework for COBOL
github.com
github.com
"You don't have any Cobol, PL/1, OS360 Assembly Language or APL on here", he observed.
"I am going to focus on C, Unix and operating systems. I want to write compilers for microprocessor based computers".
When he finished laughing, he called me "unemployable" and said, "microprocessors will never be used for anything but toys. Take COBOL!"
Since then, I have made a point of not even looking at COBOL code. I have been in the presence of COBOL, but have averted my eyes.
I also ended up writing the Emacs integration for it. Please give it a try.
The mainframe programmer then began to describe his system to his friend, saying, "The mainframe sits like an ancient Sage meditating in the midst of the Data Center. Its disk drives lie end-to- end like a great ocean of machinery. The software is as multifaceted as a diamond, and as convoluted as a primeval jungle. The programs, each unique, move through the system like a swift-flowing river. That is why I am happy where I am."
The personal computer programmer, upon hearing this, fell silent. But the two programmers remained friends until the end of their days.
The Tao of Programming, 8.3 http://www.mit.edu/~xela/tao.html
The Tao gave birth to machine language. Machine language gave birth to the assembler.
The assembler gave birth to the compiler. Now there are ten thousand languages.
Each language has its purpose, however humble. Each language expresses the Yin and Yang of software. Each language has its place within the Tao.
But do not program in COBOL if you can avoid it.
The Master was explaining the nature of Tao to one of his novices.
"The Tao is embodied in all software -- regardless of how insignificant," said the Master.
"Is the Tao in a hand-held calculator?" asked the novice.
"It is," came the reply.
"Is the Tao in a video game?" asked the novice.
"It is even in a video game," said the Master.
"Is the Tao in the DOS for a personal computer?" asked the novice.
The Master coughed and shifted his position slightly. "The lesson is over for today," he said.
"Look at all of this code!" he exclaimed. "I'll never be able to fix it all in time!"
Horrified by the media depictions of apocalypse brought by financial meltdown and software-launched nuclear warheads, all because of the Y2K bug, he became very anxious.
So, he went to the cryogenic freezing facility and told them, "Wake me up when Y2K is over."
He laid in the cryotube and gently fell asleep as the cold began to overtake him.
The next thing he knew, he was laying on a bed in a warm room, bright lights and white walls giving the room a certain sterility. A doctor in a lab coat was standing over him holding a clipboard.
"Oh, thank heavens!" said the programmer. "We've made it out alive!"
"Yes," said the doctor. "The year is 2999, and it says in your chart you know COBOL?"
1) EE was the sole teacher of FORTRAN and I decided against that also, more from a teacher problem than a lack of desire to learn FORTRAN which I later did (without the all caps).
1) my Dad did IT on an AS/400, I still hear "wand in" instead of login.
[edit] looks like the new requirements are a bit more inline with today's world http://business.und.edu/undergraduate/school-of-entrepreneur...
They kind of do sometimes. I know a guy who makes part of his living maintaining the emulation system that runs COBOL.
Meh, I'm down with that. I would be a much richer man today had I chosen more wisely. But I would not be a happier man.
Maybe I was "unemployable".
Despite my comment to the (somewhat) contrary, as long as you're not specialist in BeOS or the like, in software you'll almost always make money doing what you like to do. Again, whatever ends up winning, the abstractions and concepts you pick up will generally prove useful where ever you end up. You might not be raking in the Benjamins like your SAP buddy over there pulling down $350K/year, but you'll be relatively wealthy and happy.
Her reply was interesting, if I looked at it as a general-purpose language like C++/C#/Java, then, yes, it sucks really hard. But if you look at COBOL as a DSL for building specific business applications, it does not look all that bad.
Having never used COBOL beyond a simple HELLO-WORLD, I am not sure I can judge it either way. But her reply sounded surprisingly pragmatic to me.
Plenty of people get by swinging a hammer all day and not a Swiss army knife. COBOL is one person's hammer. For me, at one point, it was RPG. You think COBOL is "domain specific"? RPG has the DSL right in the name: "Report Program Generator". Yuppers, RPG is a report writer. And when you're writing banking software or the like, which is just inputs munged into outputs, RPG did the job. Why use a language with shitty, dangerous string handling, no syntactic sugar for the task at hand, whose output keyword consists of "printf", dragging along a runtime with crap I'll never use, and other "general purpose" language problems when you can use a language crafted specifically for what you're trying to do?
I made plenty of money back in the day writing FoxPro. FoxPro sucks for embedded systems and writing an operating system. But ya know what it doesn't suck at? Taking some data, transforming it, do a little munging, and print some output. Which was precisely what customers were paying me to do at the time, and not writing a Windows competitor.
I was in the other side of xBase languages, did some dBase III Plus stuff, Clipper Summer '87 followed by OOP with Clipper 5.x, hurray!
High level programming in MS-DOS and were just perfect for crushing out database frontends.
Three years ago I had to do some maintenance on an old-ish C++ application (also a one-of-a-kind-thing) that used a dBase backend for storage. I was lucky, though, the code was very well-written and, let's say, humble - it avoided unneccessary complexities whenever possible, and even without comments or any other documentation, I was able to figure out how it worked (at least the part that I was supposed to modify).
Part of the fun was getting a development environment to work with an ancient version of Visual Studio, but the second fun part was accessing that dBase database. I tried a couple of programs, none of them overly helpful, until I realized that ____ing Excel could open them. I don't know how well Excel supports interacting with these, but it worked well enough for inspection. ;-)
Indexes were some form of B+ Trees.
Back in those days I toyed with the idea of porting it to Turbo Pascal for Windows, but then never got to do it actually.
During my training I once had a supervisor who spent years writing reports in RPG on an AS/400. She had interesting stories to tell, but unfortunately, she was always far too busy to actually tell them. :-(
Interestingly, Lisp is (slightly) older than COBOL and is actually truly living up to the DSL thing - at least nowadays.
Both languages are actually centered around data structures - kind of, but while COBOL is massively built on fixed structures and boilerplate, lisp is built around dynamic structures of lists (and pairs - or CONS) .
It's interesting that they were invented more or less at the same time, as COBOL feels as dated as anything can be, and Lisp feels rather ok. Scheme (a dialect) is more than 40 years old and is actually rather fun to program in, and feels modern in more or less every sense.
Lisp data structures are varied. CLOS objects, multi-dimensional arrays, hash tables, strings, bit fields, ...
My point is that, yes, Scheme as a concept originated in the mid 70s, but it has been updated many times over the years. The Scheme of today isn't 40 years old.
>> the-values hold information about variables received. At the moment, these come from PATH (GET and POST are on the way). You can access them in the same order they occur in path.
Well, this is kinda the crux of the situation isn't it? Query parameter parsing, and POST body parsing, can't do much without these. Is this to be implemented in cobol? I really hope not, parsing anything is quiet untenable in cobol. I believe gnu/open cobol has pretty good .so binding, so you could conceivable use third party utilities like apache apr request parsing.
Why is parsing untenable in cobol? Becuase idomatic cobol doesn't provide dynamic memory allocation, or associative arrays, so you have to build up all that infrastructure from scratch.
But, the absence of dynamic memory allocation is also a characteristic that makes cobol extremely stable and safe, and mainframe applications legendarily bullet proof. All memory is required to be statically declared at compile time (similar to c-sects in assembler). So the runtime can ensure user programs play nice with each other.
I'd have thought they're to be implemented in Rexx, which is really great for writing parsers in.
I've worked for a big financial corp. I was in one of their mainframe teams for a year or so [1]. There's still a lot I don't know but I sure know Rexx is the most fun you can have on a mainframe. It's kind of like the polar opposite of JCL, or getting stuck on a TSO command line.
The first reason why Rexx is great for parsing is the fact that variables equal themselves. There's no "string" data type. If you type "myvar" then that's the name and the contents of your variable (unless you assign it another value):
DO INDEX = 1 TO 10 BY 2
SAY HELLO
END
/* Outputs:
HELLO
HELLO
HELLO
HELLO
HELLO
***
*/
Skipping the assignment reduces clutter and makes it very easy to see what you're dealing with. Unless you mess it up later, obviously.Second, for parsing, Rexx has a keyword instruction called ...(drumroll)... PARSE that essentially implements pattern-matching, of some sort, probably as a regular automaton like regexes but without the regex syntax which is actually really nice. Instead, you define a pattern as a string with literals and variables and the special symbol '.' (a period) to indicate any token, (that's similar to the regex '.' but it matches between spaces).
Here's an example from my notes from that time (spaces delimit literals and variables) [2]:
/* Fun with patterns at the REXXREPL*/
BANDS = 'SLAYER, BATHORY, MOTORHEAD, VENOM'
PARSE VAR BANDS ABAND ', ' BEST ', ' REST
SAY ABAND
SLAYER
SAY BEST
BATHORY
SAY REST
MOTORHEAD, VENOM
PARSE VAR BANDS . ', ' BEST ', ' REST /* Skipped Slayer */
SAY BEST
BATHORY
SAY REST
MOTORHEAD, VENOM
You can also use numbers to indicate positions in a string (absolute, in the example below, but there's also relative ones): DIGITS = '11001011'
PARSE VAR DIGITS FIRSTTWO 3 NEXTFOUR 7 LAST
SAY FIRSTTWO
11
SAY NEXTFOUR
0010
SAY LAST
11
On top of that, Rexx has "compound variables", a data structure that (to me) resembles a tree and lets you compose hierarchical structures. For instance, here's part of a program that reads in JCL files (formatted to a standard format with another Rexx program so that everything of the same kind is in the same column) and stores their DD, dataset, step and program names in such a structure: /*PARSE JOBNAME OFF FIRST LINE IN JCL FILE*/
PARSE VAR CA.1 '//' JOBNAME .
/*PARSE OTHER NAMES INTO A STEM CALLED 'MATCHES.'
EACH TYPE OF NAME GOES INTO ITS OWN TAIL
TAILS FOR DDNAMES AND DATASET NAMES ARE INDEXED IN TANDEM
SAME FOR TAILS WITH STEP AND PROGRAM NAMES
IN OTHER WORDS, MATCHES. IS STRUCTURED AS FOLLOWS:
TAIL INDEX CONTENTS
---------- --------
MATCHES.DDNAMES.N N'TH DD NAME FOUND IN JCL FILE
MATCHES.DSNAMES.N DATASET NAME FOR N'TH DD NAME
MATCHES.STEPNAMES.M N'TH STEP NAME
MATCHES.PROGNAMES.M PROGRAM NAME FOR N'TH STEP NAME
SO, TO GET THE DATASET NAME THAT CORRESPONDS
TO THE 5TH DD AND DATASET NAME
FOUND IN THE JCL FILE, YOU LOOK INTO:
MATCHES.DDNAMES.5
MATCHES.DSNAMES.5
*/
DO INDEX = 2 TO CA.0 BY 1
PARSE VAR CA.INDEX '//' DDNAME . 'DSN=' DSNAME ','
/* IF DD NAME IS EMPTY, DON'T ASSUME DDNAME='DD'*/
IF DDNAME = 'DD' THEN
DDNAME = ''
PARSE VAR CA.INDEX '//' STEPNAME . 'EXEC' PROGNAME ','
IF DSNAME ¬= ''
THEN
MATCHES.DDNAMES.INDEX = DDNAME
MATCHES.DSNAMES.INDEX = DSNAME
IF PROGNAME ¬= ''
THEN
MATCHES.STEPNAMES.INDEX = STEPNAME
MATCHES.PROGNAMES.INDEX = PROGNAME
END
(The above will probably make more sense if you've seen a jcl script before).The point is that all of that is very hard to do with COBOL, and, I believe, impossible with JCL [3]. In Rexx on the other hand, it's a doozy.
I also note that all of the above is nice to have in any language and that not very many of the languages popular outside of mainframes let you parse strings that easily, without explicitly calling a regex library or such.
_______________
[1] I raised hell until they put me in one of those teams. I could get plenty of experience with Spring and Hibernate outside of that corp. Since I was there, I figured I might as well learn something I couldn't learn anywhere else as easily. Still, people looked to me as if I was mad. "You want to be on a mainframe team? Why?".
Dude. Big computers. Millions of users. What the hell?
[2] Note that the "REXXREPL" in my comment is a Rexx program running on TSO (the Z/OS command line, ish):
/* REXX INTERPRET */
REPLPROMPT = "SAY '>>'"
INTERPRET REPLPROMPT
DO FOREVER
PULL USERINPUT
IF USERINPUT = "END" THEN EXIT 0
INTERPRET USERINPUT ; END
The INTERPRET instruction is another funky bit of Rexx that's real cool to have on a mainframe.[3] Though I'm sure there's someone, somewhere still on this planet who would laugh in my face for saying that. But probably no more than four or five people.
"Since I was there, I figured I might as well learn something I couldn't learn anywhere else as easily. Still, people looked to me as if I was mad. "You want to be on a mainframe team? Why?". Dude. Big computers. Millions of users. What the hell?"
I like your style. Same excuse I had for trying (but failing sigh) to get onto a team with SGI NUMA machines. They were confused about why I'd want to do tedious work tweaking numerical applications. For 256 CPU's and 3TB of RAM in one machine? Obviously...?
Note: I imagined it had time in between jobs and a quota system not designed with people like me in mind, too. ;)
Of course, it can also make programs curiously limited.
If you have a COBOL program that loads its configuration into memory before processing data, you may find that too much configuration (think things like rules, transaction codes, etc) results in your program no longer running because the array that holds it isn't big enough.
You can clearly see how it contains the foundations for more 'modern' languages.
Well done for taking the time to explore something that's now off the beaten path.
If you haven't clicked through to the inspiration (http://www.coboloncogs.org/HOME.HTM) then it's well worth a look. Although the Rails page doesn't look like that any more, so it's not quite as funny.
That's ADABAS you hipsters, MongoDB was 30yrs late to the party
It works very well, very fast and is under active development. Although the backend can be written in COBOL, making porting to the web quite easy, the language it actually uses is called 'Z'.
How about Brainfuck on Rails, then? https://github.com/cookjj/Brainfuck-on-Rails