 Before writing any programs, you should have a broad understanding of what a computer is and how it operates. Any computer can be usefully thought of as a CPU, memory, and what's called I.O., short for input-output. The CPU, the central processing unit, reads and executes the instructions of programs. So, when we write code, ultimately what we are doing is creating a series of instructions for the CPU to run. These instructions are expressed in binary code, and each instruction tells the CPU to do some very small amount of work, something like, say, copy this data from this part of memory here to that other part of memory, or take these two parts of memory and add them together as numbers. Generally, these instructions perform very small basic operations, and at first it can be quite baffling to imagine how these very small basic operations combine to do the sorts of interesting behaviors you see in programs like, say, video games. As you progress through this series, however, this should become less mysterious. The memory of a computer is a location where the data and code of running programs are stored. When the CPU runs a program, it reads the instructions from memory, and during the execution of that program, if the program needs to source some more data, it can store the data in memory as well. The I.O. of the system, the input-output, does not refer to one component, but rather basically to everything else other than the memory in the CPU. Systems typically have many input-output devices. For example, a monitor is an output device, a keyboard and a mouse, those are input devices. A storage drive like a hard drive, that's both an input device and an output device because data goes both in and out. So the relationship between these three parts, the CPU, the memory, and the I.O. devices, is that the CPU is in control. The CPU does its job by reading instructions found in memory, and those instructions may tell the CPU to send instructions to input-output devices, effectively telling those input-output devices what to do. While a CPU will not execute instructions directly from an input-output device, typically what happens is that programs are loaded from a stored file, like say on a hard drive, then copied into memory, and then the CPU executes that program in memory. So in a sense, CPUs do execute instructions off of input-output devices, they just don't do so directly. The reason for this, as we'll discuss later, mainly has to do with performance. The CPU typically can read data from memory much, much faster than it can read from input-output devices, like say a hard drive. Now, as we mentioned, the instructions which the CPU executes are binary codes. They're just a series of zeros and ones. Or, more accurately, they're a series of electrical impulses in one of two states, and we represent these states with the symbols zero and one. The obvious problem is that these binary codes are extremely unfriendly for humans. Humans just aren't very good at reading and writing a long series of zeros and ones. Writing a program as a bunch of zeros and ones would be extremely tedious. The solution to this problem is to create programming languages. In a programming language, the programmer writes code in a form that's more human-friendly. It's of course not a human language like English, but rather a formal language, a language with formal rules specifying exactly how the code must be written to be understood by the machine. The computer, however, cannot directly execute such code, because the code is written as a bunch of text instead of binary instructions. So the text written by the programmer has to be translated into binary instructions, an actual, runnable program. Programs which do this translation are called compilers and interpreters. The distinction between compilers and interpreters we'll discuss in a later video. For now, we'll just use the generic term translator. Now, you might be wondering where translators come from. Well, of course, originally people had to write these translators in machine code directly, but once translators existed, people could use them to write subsequent translators. So now that you hopefully have a concept of what a programming language is, you can introduce an elementary programming language. This language is in fact one I myself made up, and I call it Pigeon. I created Pigeon explicitly for educational purposes by making it as reductively simple as I believe possible. This doesn't mean, however, that Pigeon is unrepresentative of real programming languages. All of the concepts you'll learn with Pigeon directly correlate to the most essential features of real programming languages.