d10. Нотация Дейкстры <–> d11. Типы данных <–> d12. Файлы, блоки <–> d13. Критика фон Неймана, рекурсия
d1. Раскладки клавиатур, кодировки <–> d6. Системы программирования <–> d9. Железки (1-12) <–> d14. Железки (13-35) <–> d15. Железки (36-74)
Принстон
— программы и данные на одном устройстве памяти. Небезопасно.Гарвард
— раздельная реализации памяти для программ и для данных, что безопаснее.Программа
— текст, включающий в себя инструкции описания объектов, ввода, обработки, вывода данных.Недетерминированность ветвления
— выбор истинного ветвления не определяется порядком записи.Ветвление
— разбиение на альтернативные ветки.Альтернативные
— когда другие ветки не рассматриваются в случае успеха одной.Массив
— структурный тип данных, совокупность компонентов одного и того же скалярного типа.индексам
.Индекс
— функция, которая по значениям количества компонентов определяет их адрес.© У нас форма распространения знаний устная!
Машина фон Неймана состоит из управляющего устройства, памяти и регистров.
Для работы в её памяти должны быть объекты:
Объекты связаны с адресами памяти специальными ячейками.
Правильность работы программы зависит от программиста, поскольку память — хранилище слов без какой-либо интерпретации.
Принстонская архитектура
названа в честь института, в котором преподавал фон Нейман. Она отличается совместным размещением программы и данных в памяти, лишь на регистре процессора их можно различить. Такая реализация хорошо своей скоростью выполнения сгенерированной в памяти программы, но её недостаток — уязвимость к вирусам.
Гарвардская архитектура
основана на раздельной реализации памяти для программ и для данных, что безопаснее (ценой аппаратурных затрат).
Составление таблицы имён можно автоматизировать правками текста программы, а для полной автоматизации процесса надо указать тип процессора обработки данных.
Для упрощения помещаем таблицу имён в начало программы.
Для обработки объект должен иметь значение, отличное от боттом
_|_
(знак неопределённости — перевёрнутая Т).
int i, j, k;
Данные в памяти недоступны для восприятия человеком, т.е. представлены внутренне
.
Их надо преобразовать во внешнее
представление на доступном человеку носителе — произвести вывод данных
.
Инструкции ввода и вывода могут находиться в любом месте программы. При этом важно, чтобы результат обработки данных предшествовал их выводу.
Программа
машины фон Неймана — текст, включающий в себя инструкции описания объектов, ввода, обработки, вывода данных.Машина обрабатывает данные покомандно
.
Операнды вызываются на регистры из памяти, и команда выполняет действия над ними, оставляя результат на регистрах.
Основная инструкция обработки данных любого ЯП — инструкция присваивания.
x = a
x
— имя объекта, a
— действие над операндами, =
— знак присваивания.Всё, что в левой границе присваивания — lvalue
.
Значение переменной копируется на свободный регистр, а с регистра — в ячейку памяти, сопоставленную с lvalue
.
На практике проверка на неопределённость значения переменно не выполняется — это замедляет исполнение программы.
Операнды в выражении выражаются словами одного типа, иначе — согласуются, что происходит перед отправкой копии в ячейку lvalue
.
Обобщение инструкции присваивания задаёт одновременную замену значений нескольких объектов.
Левая часть присваивания будет списком объектов, а правая — выражения, соответствующие левым объектам.
На Pascal символ присваивания составной: :=
, а в Си — атомарный =
На языке СИ нельзя присваивать массивы или структуры! Есть лишь константный указатель на память, который должен быть в левой части присваивания.
А также в Си есть условное присваивание, в Pascal его нет:
Композиция
— составная инструкция, при которой значения одной функции используются как аргументы для другой.Для минимизации вычислений процесс разбивают на ряд последовательных подвыражений, разделённых точкой с запятой.
В Си композиция инструкций скрепляется знаками { }
При параллельной композиции знаком разделения ветвей будет ||
.
Охраняемую инструкцию
используют для возможности разрешать/запрещать выполнение инструкции в зависимости от выполнения условий.
Она снабжена предохранителем
.
Предохранитель используют в ветвлении и цикле.
Это обычно называют
тернарным оператором
Правила выполнения ветвления (инструкции IF-FI):
1) Предохранители и предикаты одновременно и независимо вычисляются.
2) Чтобы ветвление разветвилось, должна быть хотя бы одна истинная ветка, иначе аварийный отказ. Ошибка при планировании ветвления лежит на плечах программиста.
3) Допустимо наличие более чем 1 истинного предиката.
Выбор истинного ветвления не определяется порядком записи — предохранители не упорядочены.
Это называют недетерминированностью ветвления
.
У них свои наборы регистров и переменных, не влияющие друг на друга.
Но компилятор вряд ли может обнаружить ошибку, поскольку она проявляется лишь в процессе runtime.
© Клянусь мамой, программа работает!
- Ставлю печать!
- Программист должен страдать над ветками ветвления.
- Составляя их, он должен думать, чтобы ветвление анализировало предикаты.
Ветвление
— разбиение на альтернативные ветки.Альтернативные
— когда другие ветки не рассматриваются в случае успеха одной.Выбрать и выполнить ветку — одно из основных назначений ветвления.
Если отдых, то отправляемся в Сочи.
- Если неважно,
- самолётом или на поезде,
- тогда проявляется
- недетерминированнось.
При неалгоритмическом ветвлении ветка выбирается не случайно!
- И не по весу, не по цене!
- Случайная ветка не является детерминированной.
- Недетерминированное программирование облегчает выполнение задач.
Ветвление на 2 ветки выполняется одним предикатом и никогда не отказывает (двузвенное ветвление). Ветвление выбирает одну из двух альтернативных ветвей.
© Язык СИ — это птичий,
- более лаконичный язык.
- В нём больше скобочек, значков.
Что в нём плохого:
© Нужны бойцовские качества! Надо уметь ругать языки — тогда вы выплывете на любом собеседовании!
- Когда попадает к вам язык, необходимо узнать его с точки зрения Дейкстры (ветвлений), что в нём роскошного.
Цикл
— средство организации многократного выполнения вычислений до момента превышения заданного значения.
Цикл содержит условие завершения в форме предиката.
Правила выполнения цикла:
1) Ветка выполняется, если предохранитель истинный
.
2) Количество истинных предохранителей может быть более 1.
3) При отсутствии истинных веток цикл может не работать
.
4) Выполнение каждой охраняемой инструкции приводит к изменению аргументов.
Предохранитель в IF FI обеспечивает более защитное программирование, отказ обнаруживается раньше.
- Цикл с предусловием может не работать.
- do while — постусловие
- while do — предусловие
Pascal — untill not (двойное отрицание, использовалось, чтобы формулировка цикла была точной. При отрицании условия — просто Untill, при согласии — двойное отрицание).
Данные — сообщения в машинно-читаемом операбельном виде.
Тип данных
— множество слов алфавита с правилом интерпретации для сопоставления значений слов с атрибутами
другого или того же типа.
Атрибуты данных
— отношения и функции над значениями этого типа.
Атрибуты данных:
1) Перечислением множества изображений. Сводятся к начальному отрезку натурального ряда.
2) Заданием характеристической функции (предиката), истинного, когда изображение относится к данному типу.
3) С помощью системы аксиом, содержащих свойства изображений.
Первая отечественная ЭВМ БЭСМ.
Она также представляла собой МТ и была неудобной: на ней также приходилось моделировать числа вещественного типа.
Всего было 4 пришествия МТ:
- Первой МТ была она сама;
- Второй МТ — первые компьютеры;
- Третья МТ — бортовые компьютеры;
- Четвёртая МТ — первое появление микроархитектуры.
И всё это делали умные люди, с математическим подходом!
- Они знали матанализ!
Перечислимый тип
основан на задании слов, пронумерованных в порядке описания и несущих смысловую нагрузку.
Соответствующий тип может быть задан отрезком, или диапазоном
.
Массив
— структурный тип данных, совокупность компонентов одного и того же скалярного типа.
Компоненты массива обозначены явно и доступны по индексам
.
Индекс
— функция, которая по значениям количества компонентов определяет их адрес.
_ | _
это знак неопределённости. Он описывает класс ситуаций, когда результат не имеет осмысленной интерпретации._ | _
обозначается как NULLЕсли в машинном слове хотя бы одна единица, то истина.
Из курса алгебры знаем — это множество целых чисел вида 0-+1+-2, образующих алгебраическое кольцо
относительно сложения и умножения (деление разрывает кольцо — 7/2 не является целым числом).
Эффективная вычислимость требует замены бесконечного числа чисел на конечный отрезок (множество), в который войдут числа между MIN MAX.
0 входит в положительную часть, поэтому диапазон несимметричен.
Т
— переопределённое значение, депутат. Вместе с неопределённым значением _ | _
они войдут в целый тип.
Отношения являются операциями если в результате получается тот же тип данных. А рациональные числа - размыкание целого типа.
- Деление - медленная операция.
- Алгоритм деления - не алгоритм. В нём есть элемент прикидки, эвристического подбора. Деление сводится к вычитанию с эвристическим подбором.