Pascal Programming/Beginning
In this chapter you will learn:
- How a Pascal source code file is structured
- Basic terminology
Programs
editAll your programming tasks require one source code file that is called in Pascal a program
.
A program
source code file is translated by the compiler into an executable application which you can run.
Let’s look at a minimal program
source code file:
program nop;
begin
{ intentionally empty }
end.
- The first line
program nop;
indicates that this file is a Pascal source code file for a program. - The
begin
andend
mark a frame. We will explain this in detail as we move on. { intentionally empty }
is a comment. Comments will be ignored by the compiler, thus do not contribute in any way how the executable program looks or behaves.- And the final dot
.
after the finalend
informs the compiler about the program source code file’s end.
If you feel overwhelmed by the pace of this book, the Wikibook Programming Basics might be more suitable for you. |
Compilation
editIn order to start your program you need to compile it.
First, copy the program shown above. We advise you to actually type out the examples and not to copy and paste code.
Name the file nop.pas
.
nop
is the program’s name, and the filename extension .pas
helps you to identify the source code file.
Once you are finished, tell the compiler you have chosen to compile the program:
fpc
followed by a (relative or absolute) file name path to the source code file:fpc nop.pas
Target OS: Linux for x86-64
Compiling nop.pas
Linking nop
4 lines compiled, 0.1 sec
nop
. This is the executable program you can start.
gpc
followed by a (relative or absolute) file name path to the source code file:gpc nop.pas
gpc
will not report any errors, but there will be a new file (by default) called a.out
.
Finally, you can then execute the program by one of the methods your OS provides.
For example on a console you simply type out the file name of the executable file:
./nop
(where ./
refers to the current working directory in Unix-like environments)
As this program does (intentionally) nothing, you will not notice any (notable) changes.
After all, the program’s name nop
is short for no operation.
The computer speaks
editCongratulations to your first Pascal program! To be fair, though, the program is not of much use, right? As a small step forward, let’s make the computer speak (metaphorically) and introduce itself to the world:
program helloWorld(output);
begin
writeLn('Hello world!');
end.
Program header
editThe first difference you will notice is in the first line.
Not only the program name changed, but there is (output)
.
This is a program parameter.
In fact, it is a list.
Here, it only contains one item, but the general form is (a, b, c, d, e, …)
and so on.
A program parameter designates an external entity the OS needs to supply the program with, so it can run as expected.
We will go into detail later on, but for now we need to know there are two special program parameters:
input
and output
.
These parameters symbolize the default means of interacting with the OS.
Usually, if you run a program on a console, output
is the console’s display.
Writing to the console
editThe next difference is writeLn('Hello world!')
.
This is a statement.
The statement is a routine invocation.
The routine is called writeLn
.
WriteLn
has (optional) parameters.
The parameters are, again, a comma-separated list surrounded by parentheses.
Routines
editRoutines are reusable pieces of code that can be used over and over again.
The routine writeLn
, short for write line, writes all supplied parameters to the destination followed by a “newline character” (some magic that will move the cursor to the next line).
Here, however, the destination is invisible.
That is, because it is optional it can be left out.
If it is left out, the destination becomes output
, so our console output.
If we want to name the destination explicitly, we have to write writeLn(output, 'Hello world!')
.
WriteLn(output, 'Hello world!')
and writeLn('Hello world!')
are identical.
The missing optional parameter will be inserted automatically, but it relieves the programmer from typing it out.
In order to use a routine, we write its name, as a statement, followed by the list of parameters. We did that in line 2 above.
String literals
editThe parameter 'Hello world!'
is a so-called string literal.
Literal means, your program will take this sequence of characters as it is, not interpret it in any way, and pass it to the routine.
A string
literal is delimited by typewriter (straight) apostrophes.
Reserved words
editIn contrast to that, the words program
, begin
and end
(and many more you see in a bold face in the code examples) are so-called reserved words.
They convey special meaning as regards to how to interpret and construct the executable program.
You are only allowed to write them at particular places.
Nevertheless, you can write the string literal 'program' . The string delimiters “disable” interpretation.
|
Behavior
edithelloWorld.pas
, copy the source code (by typing it manually), compile and run it:
program helloWorld(output);
begin
writeLn('Hello world!');
end.
Hello world!
Hello world!
, without the straight quotation marks, on an individual line to the console. Isn’t that great?
program helloWorld(input, output);
begin
writeLn('Hello world!');
readLn();
end.
readLn()
will make your program stall, so the program is not considered done. After you hit ↵ Enter the terminal window should close again.
This type of program, by the way, is an example of a class of “Hello world” programs. They serve the purpose for demonstrating minimal requirements a source code file in any programming language needs to fulfill. For more examples see Hello world in the WikiBook “Computer Programming” (and appreciate Pascal’s simplicity compared to other programming languages).
Comments
editWe already saw the option to write comments. The purpose of comments is to serve the programmer as a reminder.
Comment syntax
editPascal defines curly braces as comment delimiting characters:
{ comment }
(spaces are for visual guidance and have no significance).
The left brace opens or starts a comment, and the right brace closes a comment.
“Inside” a comment you cannot use the comment closing character as part of your text. The first occurrence of the proper closing character(s) will be the end of the comment. |
However, when Pascal was developed not all computer systems had curly braces on their keyboards.
Therefore the bigramms (a pair of letters) using parentheses and asterisks was made legal, too:
(* comment *)
.
Such comments are called block comments.
They can span multiple lines.
Delphi introduced yet another style of comment, line comments.
They start with two slashes //
and comprise everything until the end of the current line.
Delphi, the FPC as well as GPC support all three styles of comments.
Helpful comments
editThere is an “art” of writing good comments.
Comments should not repeat what can be deduced from the source code itself.
program helloWorld(output);
begin { This is where the program begins }
writeLn('Hello world!');
end. (* This is where the program ends. *)
|
Comments should explain information that is not apparent:
program nop;
begin
{ intentionally empty }
end.
|
|
When writing a comment, stick to one natural language.
In the chapters to come you will read many “good” comments (unless they clearly demonstrate something like below).
Terminology
editFamiliarize with the following terminology (that means the terms on the right printed as comments):
program demo(input, output); // program header
// ───────────────────────────────────┐
const // ────────────────────┐ │
answer = 42; // constant definition ┝ const-section│
// ────────────────────┘ │
type // ────────────────────┐ │
employee = record // ─┐ │ │
number: integer; // │ │ │
firstName: string; // ┝ type definition │ │
lastName: string; // │ ┝ type-section │
end; // ─┘ │ │
// │ │
employeeReference = ^employee; // another type def. │ │
// ────────────────────┘ ┝ block
// │
var // ────────────────────┐ │
boss: employeeReference; // variable declaration┝ var-section │
// ────────────────────┘ │
// │
begin // ────────────────────┐ │
boss := nil; // statement │ │
writeLn('No boss yet.'); // another statement ┝ sequence │
readLn(); // another statement │ │
end. // ────────────────────┘ │
// ───────────────────────────────────┘
Note, how every constant and type definition, as well as every variable declaration all go into dedicated sections.
The reserved words const
, type
, and var
serve as headings.
A sequence is also called a compound statement. The combination of definitions, declarations and a sequence is called a block. Definitions and declarations are optional, but a sequence is required. The sequence may be empty, as we already demonstrated above, but this is usually not the case.
Do not worry, the difference between definition and declaration will be explained later. For now you should know and recognize sections and blocks.
Tasks
editprogram commentDemo;
begin
{ (* Hello { { { }
(* (* { (* Foo }
{ (* Bar *)
The first comment-ending character(s) demarcate the end of the entire comment, regardless whether it started with {
or (*
. That means, here the compiler will complain:
{ start (* again? } *)
Line comments are immune to this, since they do not have an explicit end delimiter. This will compile without errors:
// *) } { (*
end.
writeLn
(note the lack of a parameter list) do?WriteLn
without any supplied parameters prints an empty line to the default destination, i. e. output
.
program
that shows this (or similar):
#### ####
######## ########
## ##### ##
## # ##
## ILY ##
## sweetie ##
### ###
### ###
### ###
###
#
program valentine(output);
begin
writeLn(' #### ####');
writeLn(' ######## ########');
writeLn(' ## ##### ##');
writeLn(' ## # ##');
writeLn(' ## ILY ##');
writeLn(' ## sweetie ##');
writeLn(' ### ###');
writeLn(' ### ###');
writeLn(' ### ###');
writeLn(' ###');
writeLn(' #');
end.
Note, the program parameter list (first line) only lists output
.
Beware, while the exact number of spaces do not matter in your code, they do matter in string literals.