Welcome back to Foundations of Computer Science. This is the first course in the introduction to computer programming with Visual Basic specialization. We're now in our fourth module, and in this module we're going to talk about system software, databases, and automation. These are really important topics we have not touched on yet to understand the place of the software we're going to develop in Visual Basic in the remaining courses, so sit back, relax, let's have some fun. Some objectives for this module. Upon completion, I want you to be able to explain the benefits of writing programs in assembly language rather than machine language, I want you to be able to describe how an assembler translates the assembly language programs into machine instructions, I want you to be able to describe the relational database model, you should be able to write some simple queries in SQL to retrieve information from one or more tables in a relational database, you should be able to describe some of the types of artificial intelligence, and lastly, you should be able to explain the benefits of different knowledge representation methods. Let's jump into lesson 1, assembly language. Let's start back at the naked machine. A naked machine has no tools or programs to help the operator. The operator had to write instructions in binary, the operator had to write the data in binary, the operator had to load instructions into memory one cell at a time, and the operator had to initiate the program run. This does not sound fun. I started programming in high school with punch cards and that was not fun. We were doing it on paper, at least, here they had to do it all in binary. This quickly became too difficult for an operator to do. An interface had to be developed to hide the details and make the computer easier to use if we're going to have more people using computers. This leads us to system software. System software is a layer of abstraction between application software and the hardware it's made up of the operating systems, device drivers that talk to the hardware, things like network cards, modems, that sort of thing, and utility software. To give you a sense of this, if you think about Linux, if you've heard of Linux, Linux is more than just the kernel. The kernel is really that piece of the operating system that was developed by Linus Torvalds. But the utility software existed beforehand, it was from the Free Software Foundation. He built these utilities over the years that they were open source and can be combined, so we think of Linux as an operating system, but really it's a combination of the kernel as a layer of abstraction plus all that software that was built over the years that made it successful. An operating system is a layer of abstraction between software and hardware made up of several things: a user interface, memory managers, input and output systems, utilities, and language services, information managers, and a scheduler. Now, this leads us to assembly language. This is a low-level programming language. Instructions map one-to-one to machine language. Machine language is the binary instructions that a CPU understands. At a high-level language, each instruction may be dozens of low-level machine language instructions. Here it's one-to-one. We use symbolic op codes, not the binary instructions, so things like add, jump, that sort of thing, and we use symbolic addresses for instructions and data. We have pseudo-ops for data generation and more, so data is in human-friendly terms. Some advantages over machine code is clarity, it' readability, and its maintainability. It can be placed at different locations in memory. The process with assembly language is essentially we take a source program that's written in assembly language, it's translated to the assembler, or translated by the assembler to object program, which is machine language, the loader places it in memory, and then the program is executed. Then the outputs are displayed or sent to, whatever the output is, could be a printer, could be a terminal, that sort of thing. Here's a simple example of an assembly command, so essentially we've got several parts here. On the left-hand side is a label, that's the MYSTART. That's just something you make up as a label, it's an optional name for this instructions location. Then we have an op code, this is a mnemonic, which is the LOAD in this example, and the address field that's going to be translated to machine language, so here the address is 20, or the value 20 in this case. We're going to load 20 and we're going to put it into a register. That last part is a comment, that's for the human to make it more readable, or maintainable. Now, often when you write a program in your first language what we're going to do, we get to Visual Basic, you write, "Hello, World", which just spits out "Hello, World" to the console. What you see in front of you is "Hello, World" written in x86 assembler, so x86 is the CPU family for x86, and so there's essentially machine instructions and remember it's a one-to-one mnemonic, so you'll see here, essentially we have labels and we have instruction mnemonics and addresses. I'm not going to read through this code for you, but I want you to refer back to this later on. When you write your first" Hello, World" in Visual Basic, come back to this course, come back and look at how much easier it is in a higher level language than a low-level language. Just a little review for this lesson: Operating systems are designed to be a layer of abstraction between applications and the hardware. Assembler instructions map one-to-one to the machine language instructions. Lastly, assembler provides easier readability over machine language. All right, I'll see you in the next lesson.