Программирование на языке высокого уровня
Изобретём велосипед компьютер!
Машинные коды
Ещё пример: числа Фибоначчи
Компиляция…
Компоновка (связывание)…
Интерпретация. Трансляция. Компиляция
Компоновка
Эволюция «уровня» языка программирования
Домашнее задание
260.90K
Категория: ПрограммированиеПрограммирование

Низкоуровневое программирование. Интерпретация, компиляция, компоновка

1. Программирование на языке высокого уровня

Богатов Р.Н.
Программирование
на языке высокого уровня
Лекция 4.
Низкоуровневое программирование.
Интерпретация, компиляция, компоновка.
Кафедра АСОИУ ОмГТУ, 2012

2. Изобретём велосипед компьютер!

• Примитивная машина:
• Ячейки памяти нумеруются 0, 1, …
• Ячейка может содержать любое число (в т.ч. адрес ячейки памяти)
• Процессор имеет один регистр R (ячейку для хранения промежуточных результатов)
• Примитивный низкоуровневый язык:
Инструкция
Действие
move
Запись значения
<куда, что>
Сложение
<куда, сколько>
Вычитание
<откуда, сколько>
Умножение
<что, на сколько>
Деление
<что, на сколько>
Цикл
<счётчик, адрес начала>
Останов
Переход
Вызов процедуры
Возврат из процедуры
add
sub
mult
div
loop
halt
goto
call
ret
• Пример программы:
// ввод значения с клавиатуры
call
Input_Register
// регистр содержит радиус
move
Radius, R
mult
R, Radius
mult
R, 3.1415
// регистр содержит площадь круга
// вывод содержимого регистра на экран
call
Print_Register
halt

3. Машинные коды

Инструкция
Действие
Синтаксис
Машинный код
move
Запись значения
<куда, что>
move R, число
move R, [адрес]
move [адрес], число
move [адрес], R
move [адрес], [адрес]
add R, число
add R, [адрес]
add [адрес], число
add [адрес], R
add [адрес], [адрес]
sub R, число
sub R, [адрес]
sub [адрес], число
sub [адрес], R
sub [адрес], [адрес]

4, число
5, адрес
6, адрес, число
7, адрес
8, адрес, адрес
9, число
10, адрес
11, адрес, число
12, адрес
13, адрес, адрес
14, число
15, адрес
16, адрес, число
17, адрес
18, адрес, адрес
19-23

24-28
add
Сложение
<куда, сколько>
sub
Вычитание
<откуда, сколько>
mult
Умножение
<что, на сколько>
Деление
<что, на сколько>
div
loop
Цикл
<счётчик, адрес начала>
loop R, [адрес]
loop [адрес], [адрес]
29, адрес
30, адрес, адрес
halt
goto
call
ret
Останов
Переход
Вызов процедуры
Возврат из процедуры
halt
goto [адрес]
call [адрес]
ret
0
1, адрес
2, адрес
3
• Пример
программы,
понятной
процессору:
Адрес
0
5
10
15
20
25
30
35
+0
8
28
101
30
8
29
115

+1
112
8
10
3
131
8


+2
27
114
29
8
28
133


+3
8
29
10
130
8
30


+4
113
2
6
27
132
2


4. Ещё пример: числа Фибоначчи

Схема алгоритма и его реализация (программа):
Начало
N
f1 = 1; f2 = 1
f = f1 + f2
N =N –2
f1 = f2 ; f2 = f
N =N –1
f
Конец
Да
N>0
Нет
// ввод N с клавиатуры
call
Input_Register
// регистр содержит N
move
N, R
// инициализация
move
f1, 1
move
f2, 1
// основная часть
sub
N, 2
move
R, f2
A: // начало цикла
add
R, f1
move
f1, f2
move
f2, R
loop
N, A // конец цикла
// регистр содержит искомое,
// выводим его на экран
call
Print_Register
halt

5. Компиляция…

Проверка синтаксиса
2. Трансляция в машинные коды
1.
Адрес
0
2
4
7
10
13
15
17
20
22
25
27
28
29
30
Содержимое ячеек
2, [Input_Register]
7, [N]
28
6, [f1],
29, 11
6, [f2],
30, 11
16, [N],
28, 22
5, [f2]
30
10, [f1]
29
8, [f1],
[f2]
29, 30
7, [f2]
30
30, [N],
[A]
28, 15
2, [Print_Register]
0
0
0
0
Исходные инструкции
call Input_Register
move N, R
move f1, 1
move f2, 1
sub N, 2
move R, f2
A: add R, f1
move f1, f2
move f2, R
loop N, A
call Print_Register
halt
N
f1
f2

6. Компоновка (связывание)…

1.
К программе добавляется код процедур (компоновка)
Адрес Содержимое ячеек
Исходные инструкции
2. Производится
call Input_Register
0
2, 31
[Input_Register]
связывание адресов
move N, R
2
7, 28
4
7
10
13
15
17
20
22
25
27
28
29
30
31
0

57
26
0
58

15
73
6, 29, 1
6, 30, 1
16, 28, 2
5, 30
10, 29
8, 29, 30
7, 30
30, 28, 15
[Print_Register]
2, 58
0
0
0
0


3


3
move f1, 1
Адрес
move f2, 1
0
sub N, 2
5
move R, f2
10
A: add R, f1
15
move f1, f2
20
move f2, R
25
loop N, A
call Print_Register 30
35
halt
40
N
45
f1
50
f2
55

(коды
60

процедуры
ret
Input_Register) 65
70

(коды

ret
процедуры
Print_Register)
+0
2
29
16
10
7
2
0








+1
31
1
28
29
30
58









+2
7
6
2
8
30
0





3



+3
28
30
5
29
28
0








3
+4
6
1
30
30
15
0








7. Интерпретация. Трансляция. Компиляция

• Трансляция программы — преобразование программы,
представленной на одном из языков программирования, в
равнозначную программу на другом языке.
• Компиляция — трансляция программы в машинно-
ориентированный язык.
• Интерпретация — пооператорная обработка и выполнение
исходной программы (без формирования кодов для
последующего исполнения).

8. Компоновка

• Исполнимый модуль (от англ. executable) — файл,
содержащий машинные коды, готовые для исполнения в
определённой операционной системе.
• Объектный модуль (англ. object file) — файл с
промежуточным представлением отдельного модуля
программы, полученный в результате работы компилятора.
• Компоновщик (также редактор связей, линкер — от
англ. link editor, linker) — программа, которая производит
компоновку: принимает на вход один или несколько
объектных модулей и собирает по ним исполнимый модуль.

9. Эволюция «уровня» языка программирования

Домохозяйка 2.0
Машинные коды
Адрес
0
5
10
15
20
25
30
35
+0
8
28
101
30
8
29
115

+1
112
8
10
3
131
8


+2
27
114
29
8
28
133


+3
8
29
10
130
8
30


// прячем
move
move
move
call
// меняем
add
move
// рисуем
move
move
move
move
call
+4
113
2
6
27
132
2


Кружочек:
Спрятаться
Увеличиться чуть-чуть
Цвет красный
Показаться
Ассемблер
окружность
hide_x, c_x
hide_y, c_y
hide_R, c_R
Circle_Hide
радиус и цвет
c_R, 10
c_Color, 3
окружность
show_x, c_x
show_y, c_y
show_R, c_R
show_C, c_Color
Circle_Show
Фантаст 47.0.2RC
Кружочек,
стань чуть больше
и красным
LasyTalk 0.99beta
c:
Hide
Grow Small
Color Red
Show
C++, Java, C# и т.п.
c.Hide();
c.R += SizeDelta.Small;
c_Color = Colors.Red;
c.Show();
Си (без структур)
Circle_Hide(c_x, c_y, c_R);
c_R = c_R + 10;
c_Color = 3;
Circle_Show(c_x, c_y, c_R, c_Color);

10. Домашнее задание

• Написать программу в машинных кодах
для вычисления суммы ряда 1 +
1
1!
+
1
2!
+ ⋯+
1
English     Русский Правила