Search This Blog

Thursday, November 19, 2009

Amazing Grace!

No not the song... I'm of course referring to Adm. Grace Hopper. Quick: Do you know when the first and accurate COBOL compile took place? Bonus Points: On what machine? I'll answer this in a little bit but I first wanted to expand on Roberts' post about National Computer Science Education Week in America and Adm. Hopper.

If you haven't read a good book lately I have an excellent one to recommend. It's "Grace Hopper and the Invention of the Information Age" by Kurt W. Beyer. It was published in September 2009 and provides a fascinating review of Adm. Hoppers early years in technology, as well as the early years of technology. It's amazing to read about the early machines and the limitations they dealt with. Kurt Beyer has done an excellent job presenting the Admirals early years. While we always tend to remember the best things in our past, there are some things we tend to forget. Mr. Beyer reviews the Admirals years at the Hardvard Computational Labratory during the war years (that's World War 2) working under Dr. Howard Aiken (then Commander Aiken, as this was a Navy installation) and the wrok she did on the original Mark 1 computer. At the time the Mark 1 was a rather advanced piece of machinery. It was 3 feet wide, 51 feet long and wieghed 9,445 pounds! Definately not a laptop by any means. And it had electro-mechanical gates! Input was from paper tape and had no disk storage. Everything was read in from the tape. The Admiral was the person who in essecense perfected the operation of coding the machine and wrote the operations manual, which was in essence the first coding manual. She was instrumental in bringing not only the Mark1, but Mark 2 and Mark 3 to life.

Mr. Beyer's book further goes on to her life after leaving Harvard and some of the trials and tribulations she experienced. Her main goal in life was to expand the use of the computer to people who were not in the mathmatical field. You see at the time only people with a math degree were able to work on computers. Admiral Hopper had the unthinkable notion that computers could be used by people not in mathematics for say accounting, inventory, health care, anything that required gathering and processing large amounts of data. Imagine that, a computer for something other than math.

Mr. Beyer presents a wealth of information about the early years of the information age. He has also presented a significant amount of facts on why the Admiral deserves more recognition for her role, and the role of other women, who were the early pioneers in our field.

Winter is getting close and the snow isn't far away. Get ahold of this book, a nice warm cup of coffee or hot chocolate and enjoy! Oh, and the date of that first compile? It's in the book!

Monday, November 16, 2009

National Computer Science Education Week in America!!!!

One of my collegues, Peter Anderton (in the UK believe it or not), posted a link on his Twitter account.  Not that I was visiting Twitterville mind you.  I just noticed his link to Twitter on LinkedIn. *smile*

According to his post, the U.S. House of Representatives passed a resolution declaring the week of December 7th National Computer Science Education Week.  The date was picked in honor of Grace Hopper's birthday.  Here is the link for the resolution

Hmmm...

Follow my thinking process for a sec if you don't mind.

Grace helped invent COBOL. 

Because of this, Grace became synonymous with COBOL.

So, Grace = COBOL correct?

So is it safe to say that National Computer Science Education Week is also a tribute to COBOL?


The plan for everyone to realize that COBOL rules the world is coming together nicely.  *smile*

Now if we can get Al Gore to endorse COBOL (since he invented the internet) we can move my plan to stage II (add maniacal laughter here).

So, make sure everyone celebrates National Computer Science Education COBOL Week starting December 7th!

Friday, October 30, 2009

Understanding COBOL for .Net Data Types


How many feel like maybe you must of drank those 99 bottles of beer?  Head spinning like a top?

COBOL?  That can't be COBOL code Alex posted.  Or is it?

My favorite email on Alex's post had a comment which I'm sure applies to many

"...if that is COBOL, I'm in deep !#$!"

Well, I have good news and bad news.  Good news is that it is COBOL. 

Or was that the bad news? *grin*

Never fear.  You too can read and write latin errr COBOL for .Net.  How you ask?

Well, let's start at what I consider the basics (some may argue), data types.

All of us are familiar with the syntax of defining COBOL variables using things like PIC X(11) and PIC S9(04) COMP, etc. For instance, defining a COBOL variable containing a string of text is as simple as:

01  WS-VAR1              PIC X(11) VALUE "HELLO WORLD".

More good news...  In the COBOL of today, this still works just fine.  However, to facilitate working in the .Net world, a few new data types have been added to the language.  I've listed them out below, along with their corresponding COBOL equivelant.

  • binary-char  --->  PIC S9(2) COMP-5
  • binary-char unsigned ---> PIC 9(2) COMP-5
  • binary-short ---> PIC S9(4) COMP-5
  • binary-short unsigned ---> PIC 9(4) COMP-5
  • binary-long ---> PIC S9(9) COMP-5
  • binary-long unsigned ---> PIC 9(9) COMP-5
  • binary-double ---> PIC S9(18) COMP-5
  • binary-double unsigned ---> PIC 9(18) COMP-5
  • float-short ---> USAGE COMP-1
  • float-long ---> USAGE COMP-2
  • object ---> USAGE OBJECT REFERENCE  
So, when you see a line of code in a COBOL for .Net program which looks like this:

01  WS-VAR1 BINARY-SHORT.

You can translate it to what you are familiar with:

01  WS-VAR1  PIC S9(4) COMP-5.

Simple enough huh?  *smile*
 
I believe these new data types were created to help you and I make sure we move the data into the right field with the proper sizing already figured out.  I can recall quite a few times where I was trying to mix languages such as C and COBOL and having to manually write what I called a bridge routine to convert a C data type to fit into the appropriately defined COBOL variable.  With these new data types, the guesswork is taken out of it.  Working with a C# binary long field and need to call a COBOL program?  Not a problem.  Just use a COBOL variable defined like so:

01  WS-VAR1 BINARY-LONG.

and then call your COBOL program passing it the data from the C# routine to the COBOL program appropriately (Rick covers the how on some of his postings).

Ok, now for the twist...  There have also been a handful of new data types added which just didn't exist in the COBOL of yesteryear.  I've listed them below and their equivelent C# data type.
 
  • character ---> char
  • condition-value ---> bool
  • decimal ---> decimal
  • string ---> string

These "new" data types have some pretty interesting features which you will want to look at.  And believe it or not, I think you might find them handy.  First we will take a look at the COBOL data type of "character".  Character is for defining and storing a single character of data.  That's it.  Nothing more to it. 

But what if you need to define a string of characters?  Traditional COBOL would maybe have you put something like Character(11) or some such together.  That would require you to know how many characters you wished to store in the field.  So, toss that out.

In the COBOL for .Net world, you would use the data type "string" for storing text, that is, a number of characters. Just like in C#, a COBOL string is immutable (say that fast 5 times), which means that a string is never changed after it has been created. When using routines which change a string, the actual string is not changed - a new string is returned instead.

01  WS-VAR1  STRING

Several of you are probably thinking "But what about an internal table" and how does it work.  That is straight forward as well, probably even better than you would expect.  Take a look:

01 WS-ARRAY-OF-LONGS     BINARY-LONG OCCURS ANY.

This statement declares a table or array (a better description) of Binary-Longs, but notice the word ANY appearing at the end.  This allows the length/size of the array to be decided at runtime.


01 WS-ARRAY-OF-STRINGS   STRING OCCURS ANY.

Same thing with the statement above.  Cool stuff huh?

Next up, an item I think long over due,  the boolean variable type "condition-value".

01  WS-TRUE-FALSE-FLAG                 PIC X(01).
      88  WS-TRUE                                    VALUE "T".
      88  WS-FALSE                                  VALUE "F".

With the "condition-value" this same statement could be done a bit differently.

01  WS-TRUE-FALSE-FLAG   CONDITION-VALUE.

To reference WS-TRUE-FALSE-FLAG in your program you just check to see if it is True or False.

The "decimal" data type is interesting to me due to it's versatility.  How often have you needed to define a field in Working-Storage to hold a number, but did not know how large the value might be?  Some would probably claim "poor design" but what if the size could not be predicted?

By using a "decimal" data type, you are defining a 128 bit variable to represent values within the range 1E-28 to 7.9E+28.  I believe the decimal data type was specifically created to deal with decimal values when dealing with money.

There are of course several restrictions on the usage of these new data types that you'll need to read up on.  You can find out the real nitty gritty in this online documentation.

So, if you revisit the code sample that Alex provided, you'll see a couple of things which may make a bit more sense now.  At least in the variable declarations portions anyway.



We'll get more into the other items another day once this soaks in.  ;)

Any questions?

Wednesday, October 21, 2009

Doing The Waltz

What a great post on dancing COBOL. Here is some more COBOL dancing to build on the idea. Recursion, local scope, classes and beer all in the same program!



Thanks for the mention of the 99 bottle code Robert. I saw your post and thought I should raise the bar. I few comments on my post on 99 bottles (here) suggested that local variable scope, recursion and other cool stuff is missing from COBOL. Totally untrue! Here is a COBOL program which shows off the new 'quoteless' type syntax which we are working on and at the same time shows off a few of the OO features in the standard Micro Focus COBOL for .net product which is already out there:




$set sourceformat(free)

class-id. "Singer".

method-id. "main" public static.
procedure division.
invoke type Singer::SayLine(by value 100)
end method "main".

method-id. "SayLine" public static.

01 bottle-word string.
01 count-word string.

procedure division using by value bottles as binary-long.
if bottles equals 0 then
display "Go to the store and buy some more, 99 bottles of beer on the wall."
goback
end-if
add -1 to bottles
evaluate bottles
when 0
move "No" to count-word
move "bottles" to bottle-word
when 1
move bottles to count-word
move "bottle" to bottle-word
when 2 thru 99
move bottles to count-word
move "bottles" to bottle-word
end-evaluate

if bottles not equals 99 then
display "Take one down and pass it around, " count-word::"ToLower"()
" more " bottle-word " of beer on the wall."
end-if

display count-word " " bottle-word
" of beer on the wall, " count-word::"ToLower"()
" " bottle-word " of beer."

invoke type Singer::SayLine(bottles)
end method "SayLine".

end class "Singer".

As you can see, this is a pure recursive implementation demonstrating the local scope of the method variables.

Tuesday, October 20, 2009

Making COBOL Dance!



Hey folks!

When was the last time you learned something new about COBOL?

Yesterday?  Last week?  A year?  Ten years ago?

A fair question that I believe every single developer should seriously consider.  I'm betting that the average COBOL developer hasn't spent much time learning "new" things about the language they have made their living supporting or writing.  However, you ask someone who is writing C#, Java or VB.Net applications and they will probably point to the three or four books on their desk which they refer to on a fairly regular basis.

Why is this?

Any professional in IT will tell you that the one thing that stays the same is the fact that technology continues to change.  And that to stay current or marketable in their role, they have to constantly expand their knowledgebase.

So, why is it that the typical COBOL developer seems to stick with the version of COBOL they learned in college?

I would like to issue a challenge to you.

I challenge you to learn COBOL, specifically object oriented COBOL and or COBOL.Net.

I can count on both hands the number of people I personally know who are proficient with this single most significant exstension to the language.   Ever since Grace found her first bug people have been making COBOL dance.  My question to you...

Learned any new steps lately?



You've seen the code sample Alex posted showing how to solve the 99 Bottles of Beer programming puzzle.  Pretty slick stuff huh?  Even remotely curious?  Could it be time to revisit COBOL and expand your knowledge?

Here is a very straight forward online tutorial on the subject to get you started.

Additionally, Rick Malek has been an avid poster of articles for years out on C# Corner which are intended for the C# developer to understand COBOL.Net.  Take a look at his examples for an introduction into some of the things you can do with COBOL and .Net above and beyond what you probably know today.

 "Ah, but Robert, there are only a handful of books on the subject...".  Yep.  I noticed that as well. 

Hmmm... I wonder how those other books got written?  Think they just copied what someone else wrote?  Nah, they dug into the subject material, made themselves experts, and then decided to put their knowledge down on paper.  Seems to me with the sheer number of COBOL developers out there, there could be a decent market for a new book or two.  Any aspiring authors out there?

Ok.  The challenge has been issued.  *grin*

Any questions?

Tuesday, September 29, 2009

99 Bottles Of Beer In COBOL for .net

Robert was kind enough to let me post to this great blog - here is my first effort!

By: Alex Turner

You may or may not know that there is a fabulous website dedicated to the song 99 bottles of beer. The idea being to show how to print out the lyrics to this song in as many languages as possible. Traditional COBOL is OK at this, but I have to admit - a bit clunky. So, our team at Micro Focus spent a few minutes showing just how clean an implementation in COBOL for .net (and for that matter other managed environments - but that is another store) can be.

Well, today my submission (though a team effort) got accepted, here is the link to the 99 bottles website:

http://www.99-bottles-of-beer.net/language-micro-focus-cobol-for-.net-2173.html

Also, here is a link to a post discussing the concepts and giving some tweaks:

http://nerds-central.blogspot.com/2009/09/cobol-for-net-better-than-c-at.html

Wednesday, September 23, 2009

COBOL and Twitter?



A buddy of mine, Mike Bleistein, has created a COBOL routine to post tweets out in Twitterville.  Check out the video he created of it out on YouTube.  Once he posts the code for it somewhere out on the web, I'll point you to it.

Cool stuff huh?