Originally published by Robert Beisert at fortcollinsprogram.robert-beisert.com

CS 101 – Evolution of Programming

Programming makes our lives easier, but most people don’t fully understand how much easier.

Programming began with gears

That’s right, folks. Long ago, when you wanted to do math quickly, you had to use something like an abacus or slide rule. Sure, you had geniuses like Babbage with his mechanical adding machine, but these were very simple tools that could only solve one kind of problem.

Imagine if you needed a different computer to read blogs, watch YouTube, browse Google, check email, etc. There is now way we would have our modern society without the developments that follow.

Welcome, wires

As we developed further understanding of electricity, we began to build the most basic computers. These are devices like the ENIGMA, a Nazi typewriter which created a very complex encryption that could be easily decrypted with…another ENIGMA. This machine required the operator to connect wires up by hand for every code; the wires you chose controlled which gears would turn, and therefore what code you would use.

This is also how phone switchboards worked. Combined, they created a very large but very simple computer that connected people in a network. The internet does exactly the same thing, but with billions of computers, and instantly.

Modern Computers: Binary

When we developed transistors, we gained the ability to have a computer connect the wires for us. Early programming required the use of punch cards – special cards which either allowed or restricted electricity flow. This was the first binary programming, and it was slow going.

Many computers today run programs that are Gigabytes long. Most punch cards could hold about 900 bits (~112 bytes). To build these programs, you would have to hand-punch millions of cards, each of them exactly perfect.

No thanks.

Symbolic Languages

This is where programming starts to get good. Grace Hopper (the patron goddess of programming) developed a way for us to represent binary machine code using letters and symbols. We call these symbolic languages, because they use symbols to represent machine instructions.

All modern assembly languages are symbolic languages. You’re hard pressed to find a single programmer willing to go down to the binary anymore.

High Level Languages

Pretty much every programming language we use these days is a high level language. These languages hide the nitty-gritty of what the computer is doing behind functions, data types, objects, and the like.

C is one of the oldest high level languages in use (and, yes, it is a high level language, professors). Also known as “the portable assembler”, C allows you to create as much abstraction as you want while still giving you access to the most basic machine operations.

C++ is like C, but adds on pre-programmed abstraction levels. C++ does this through what we call object oriented programming design, which creates a (long) list of rules that allow the computer to make decisions on how it will run.

Java is like C++, only it doesn’t give you any access to the basic machine operations. It creates an abstraction layer over the computer, and hides every dangerous (useful) computer detail from the programmer.

Python, Perl, and PHP are scripting languages – languages which modify programs which are already running. In the first two cases, the languages are used to perform tasks the operating system or interpreter are able to access (reading and writing files, manipulating data, etc). In the case of PHP, the language is designed to manipulate a web server, which provides nifty features for web clients and web browsers.

Lisp/scheme is a functional language, which makes all programs look like math functions. This abstraction hides all the program details from the programmer, so they can focus on the problem they want to solve.

Prolog is a logical language, which makes all programs look like logic proofs. This language is very specialized, and is commonly used in machine learning applications.

The Future

Programmers have spent lifetimes pursuing the holy grail of programming: natural language programming. A natural language is a language you use in daily life (like English, Chinese, Esperanto, etc). With natural language programming, we could literally tell our computers what we want, like we would tell a person, and the computer would obey!

Unfortunately, there are enormous problems with this paradigm, so we won’t likely see natural language programming in our lifetimes.

More recently, quantum programming has become an obsession for many academics. This programming would employ the principles of quantum mechanics to manipulate a quantum computer, which has three states (ON, OFF, and ON/OFF). Personally, I think this paradigm is absurd, but lots of smart people are enthusiastic about it. I guess we’ll see.