1. Реализация алгоритмов на компьютере

Скачать презентацию 1. Реализация алгоритмов на компьютере Скачать презентацию 1. Реализация алгоритмов на компьютере

1-1-2_PRG.ppt

  • Количество слайдов: 28

>  1. Реализация алгоритмов на компьютере   Программирование – основные понятия Программирование 1. Реализация алгоритмов на компьютере Программирование – основные понятия Программирование направлено на реализацию алгоритмов на компьютере. Алгоритм - это последовательность команд, предназначенная исполнителю, в результате выполнения которой он должен решить поставленную задачу. Пример: написать на доске что-то Запись алгоритма на формальном языке называется программой. Основополагающий принцип программирования - совместное хранение команд и данных в памяти компьютера (Архитектура фон Неймана)

>     Реализация алгоритмов на компьютере   Выполнение двухадресной команды Реализация алгоритмов на компьютере Выполнение двухадресной команды Компьютер построен из следующих составных частей: • процессор - производит все вычисления и отдает команды всем остальным компонентам компьютера; • оперативная память (RAM - Random Access Memory) хранит как программу, так и данные (т. е. значения переменных). • канал связи (шина) - это канал передачи команд и данных между всеми составными частями компьютера. • внешние устройства подключаются к шине компьютера. Выполнение двухадресной команды на машине традиционной архитектуры: 1. Запросить команду по адресу 3 2. Команда КО 1 О 2 К — код операции, O 1 и O 2 — адреса данных 3. Запрос данных 4. Выполнение команды Разместить по адресу 10 h число 12 h e 10 12

>     Реализация алгоритмов на компьютере     Реализация алгоритмов на компьютере Процессор - большая микросхема, содержащая внутри себя сотни тысяч или даже миллионы элементов. Любой процессор имеет устройство, выполняющее команды, и собственную внутреннюю память, реализованную внутри микросхемы процессора. Она называется регистрами процессора. Имеется следующие типы регистров: • общие регистры хранят целые числа или адреса. Размер общего регистра совпадает с размером машинного слова и в 32 -разрядной архитектуре равен четырем байтам; • регистр PC, что означает Program Counter, по-русски его называют счетчиком команд; • регистр SP — Stack Pointer, т. е. указатель стека. • регистр флагов содержит биты, которые устанавливаются в единицу или в ноль в зависимости от результата выполнения последней команды; • плавающие регистры содержат вещественные числа. В простых процессорах аппаратная поддержка арифметики вещественных чисел может отсутствовать. В этом случае плавающих регистров нет, а операции с вещественными числами реализуются программным путем.

>   Реализация алгоритмов на компьютере    Алгоритм работы процессора выглядит Реализация алгоритмов на компьютере Алгоритм работы процессора выглядит следующим образом: цикл до бесконечности выполнять | прочесть команду с адресом PC из оперативной памяти; | увеличить содержимое PC на длину прочитанной команды; | выполнить прочитанную команду (если надо, прочесть данные); конец цикла

>   Реализация алгоритмов на компьютере   Память (логическое устройство) Однородность памяти. Реализация алгоритмов на компьютере Память (логическое устройство) Однородность памяти. Память машины рассматривается как вектор, состоящий из одинаковых ячеек, способных принимать (от процессора) любые значения. Значение в ячейке, с точки зрения процессора, является последовательностью битов фиксированной длины без каких бы то ни было ограничений. Линейная адресация. Ячейки памяти идентифицируются адресами: числами от нуля до максимально возможной для данной машины величины (обозначающей последнюю ячейку). Из однородности памяти следует, что команды и данные (перерабатываемые значения) располагаются в единой общей памяти и одинаково адресуются. Пассивность памяти. Ячейка памяти всегда содержит какое-то значение. Полученное ячейкой значение не может быть изменено иначе как при выполнении специальной команды процессора, предназначенной для этого действия, - команды засылки, или присваивания, значения. Изменяемая ячейка указывается своим адресом.

>    Реализация алгоритмов на компьютере     Внешние устройства Реализация алгоритмов на компьютере Внешние устройства Наиболее распространенные внешние устройства - это жесткий диск, клавиатура, монитор, сетевая карта, модем и т. п. Ни одно из них не является обязательным. Но какие-то внешние устройства всегда присутствуют, поскольку через них осуществляется связь компьютера с внешним миром. Произвольный или последовательный доступ • ЗУ с произвольным доступом отличаются возможностью передать любые данные в любое время. Оперативное запоминающее устройство, ОЗУ и винчестер — примеры такой памяти. • ЗУ с последовательным доступом, напротив, могут передавать данные только в определённой последовательности. Ленточная память и некоторые типы флэш-памяти имеют такой тип доступа. Блочный или файловый доступ. На винчестере, используются 2 типа доступа. Блочный доступ предполагает, что вся память разделена на блоки одинаковых размеров с произвольным доступом. Файловый доступ использует абстракции — папки с файлами, в которых и хранятся данные.

>  2. Типы данных и ассемблер Программирование в кодах, проблемы:  1. необходимо 2. Типы данных и ассемблер Программирование в кодах, проблемы: 1. необходимо помнить коды команд 2. необходимо помнить адреса данных Результат: очень большая трудоемкость. Выход - разработка ассемблера: 1. определение типов данных и правил работы с ними(переменные) 2. определение мнемоники команд 3. определение названий переменных и косвенная адресация

>     Типы данных и ассемблер    Целочисленные переменные Типы данных и ассемблер Целочисленные переменные Тип переменной определяется множеством значений, которое она может принимать. Кроме того, тип определяет операции, которые возможны с переменной. Например, с численными переменными возможны арифметические операции, с логическими - проверка, истинно или ложно значение переменной и т. п. Целочисленные переменные Двоичные данные : 0 b - 1111 b Шестнадцатиричные данные : 0 h - FFh Десятичные данные : 0 - 255 знаковый бит ==>11110110 = -10 00001010 = +10 Сложение и вычитание : 16 - 23 = -7 00010000 11101001 11111001

>    Типы данных и ассемблер   Вещественные переменные Вещественное число Типы данных и ассемблер Вещественные переменные Вещественное число r имеет вид: r = ± 2 e*m • знак числа - плюс или минус. Под знак числа отводится один бит в двоичном представлении, он располагается в старшем, т. е. знаковом разряде. • показатель степени e указывает степень двойки, на которую домножается число. Под e отводится фиксированное число двоичных разрядов, обычно восемь или одиннадцать • мантисса m представляет собой фиксированное количество разрядов двоичной записи вещественного числа в диапазоне от 1 до 2. Фактически двоичный код хранит только разряды дробной части мантиссы. Примеры: 1. 0 = +20*1. 0 0. 625 = +2 -1*1. 25 100. 0 = +26*1. 5625

>    Типы данных и ассемблер   Символьные переменные и строки Типы данных и ассемблер Символьные переменные и строки Символьные переменные ASCII (American Standard Code for Information Interchange) Пример: 'ABC 123' - 41 h, 42 h, 43 h, 31 n, 32 h, 33 h Кодировки: Windows CP-1251, КОИ-8, Unicode и т. п. Логические переменные и выражения - "истина" или "ложь" (true и false). Сравнение величин: <, >, <=. Логические "И", "ИЛИ" и т. п. Массивы : при описании массива указывается тип и число его элементов Текстовые строки - массивы символов Существуют два способа указания длины строки: • строка заканчивается символом с нулевым кодом, • строка в качестве первого элемента (байта или двух байтов) содержит общее число символов.

>      Типы данных и ассемблер    Типы данных и ассемблер Язык Assembler Программирование в кодах - команды, или инструкции, процессора состоят из кода операции и операндов Ассемблер Мнемоника команд, например, MOV - перемещение, ADD - сложение и т. п. Переменные - названия переменных и косвенная адресация Пример: В двухадресной архитектуре команда сложения выглядит следующим образом: add X, Y что означает X : = X + Y, т. е. один из аргументов команды является одновременно и ее результатом. Этот аргумент называется получателем (destination). Аргумент, который не меняется в результате выполнения команды, называется источником (source). В действительности с именами переменных X, Y связаны адреса, отсылающие к ячейкам, в которых хранятся значения переменных. Эти операнды загружаются в процессор, где и осуществляется сложение.

>    Типы данных и ассемблер     Пример: Типы данных и ассемблер Пример: алгоритм Евклида вычисления наибольшего общего делителя цел алгоритм НОД(вх: цел m, цел n) | дано: целые числа m, n, хотя бы одно отлично от нуля | надо: вычислить наибольший общий делитель пары (m, n) начало алгоритма | цел a, b, r; | // инициализация | a : = m; b : = n; // a = 102 b = 8 ab a%b // 12 6 | утверждение: НОД(a, b) == НОД(m, n); // 8 6 1 2 | // 6 2 3 0 | цикл пока b != 0 | | инвариант: НОД(a, b) == НОД(m, n) | | r : = a % b; // находим остаток от деления a на b | | a : = b; b : = r; // заменяем пару (a, b) на (b, r) | конец цикла | | утверждение: b == 0 и НОД(a, b) == НОД(m, n); | ответ : = a; конец алгоритма

>   3. Языки высокого уровня Программирование на ассемблере, проблемы:  очень большая 3. Языки высокого уровня Программирование на ассемблере, проблемы: очень большая трудоемкость. Выход - разработка языков высокого уровня: 1. обоснование новых принципов программирования (процедурное программирование и т. п. ) 2. обоснование синтаксиса языка, ориентированного на достижение конкретных целей 3. разработка компиляторов языка

>      Языки высокого уровня     Основные Языки высокого уровня Основные понятия Языки высокого уровня, т. е. языки, не зависящие от конкретной архитектуры компьютера Специальная программа, выполняющая перевод с языка высокого уровня (исходный код) на машинный язык (объектный код), называется транслятором. Компилятор - программа, выдающая результат в виде исполняемого файла. Важной исторической особенностью компилятора, отраженной в его названии (англ. compile — собирать вместе, составлять), являлось то, что он мог производить и компоновку (то есть содержал две части — транслятор и компоновщик). Интерпретатор исполняет программу после разбора (в этом случае в роли объектного кода выступает внутреннее представление программы интерпретатором). Исполняется она построчно. Редактор связей - программа, которая производит компоновку — принимает на вход один или несколько объектных модулей и собирает по ним исполняемый модуль.

>     Языки высокого уровня Конструкции традиционных языков высокого уровня Оператор: Языки высокого уровня Конструкции традиционных языков высокого уровня Оператор: + - : и т. п. — основная конструкция, выражающая действия, Присваивание значений: = — наиболее часто встречающийся вид операторов. Присваивание предназначено для локального запоминания результата вычислений. Структура управления. Если явно не предписано иначе, то операторы выполняются последовательно друг за другом. Оператор перехода трактуется как явное указание того оператора, который должен выполняться следующим. То же можно сказать и о ситуациях, когда вычисления определяют, какой оператор будет выполняться следующим (условные операторы, циклы и т. п. ). Приведение. В традиционных языках обычным является употребление значения одного типа, которое присваивается переменной другого типа. В языках со строгой типизацией (таких как Pascal) такое присваивание запрещено. Подпрограмма — группа операторов, имеющая собственное имя. К такой последовательности можно обращаться неоднократно.

>     Языки высокого уровня      FORTRAN Языки высокого уровня FORTRAN -2 - Фортран (Fortran) — первый реализованный язык программирования высокого уровня. Создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса (John Backus) в корпорации IBM. Fortran - это сокращение от двух английских слов FORmula TRANslator - что переводится как "транслятор формул". Отличался большой скоростью выполнения программ. Основу языка составляли арифметические операторы, соответствующие по своему синтаксису традиционной записи математических выражений. В дополнение к этому в языке имелись средства разбиения сложных алгоритмов на более простые за счет явного определения подпрограмм (SUBROUTINE) и функций (FUNCTION). Одно из преимуществ Фортрана — большое количество написанных на нём программ и библиотек подпрограмм

>      Языки высокого уровня     Языки высокого уровня FORTRAN -3 - ^^^^^^PROGRAM hello ^^^^^^PRINT*, 'Привет, друг!' ^^^^^^END Первые 6 пробелов в строке досталиьсь "по наследству" от старого Фортрана, что отражено на перфокарте. Здесь располагались метки. Огромное количество меток, которые использовались как в операторах безусловного перехода GOTO , так и в операторах циклов, являются своего рода «визитной карточкой» старого Фортрана. Если программу пишет не очень опытный программист многочисленные переходы на метки, запутывают программу до полной "нечитаемости". Современный Фортран (Fortran 95 и Fortran 2003) позволяет применять современные технологии программирования, в частности, ООП.

>    Языки высокого уровня     ALGOL  Языки высокого уровня ALGOL -1 - Algol - разработан комитетом по языку высокого уровня IFIP в 1958 — 1960 гг. как реализация идеи представления алгоритмов, одновременно понятного и для компьютеров, и для человека. В Algolе появилось представление о программе не как о свободной последовательности команд, а как о блочной структуре, состоящей из чётко описанных и отделённых друг от друга частей. Программа на Algolе состоит из главной программы и набора подпрограмм. При их построении используются блоки - наборы описаний и последовательности операторов, ограниченные "скобками" begin и end. Структуры данных, созданные внутри блока, локальны в его пределах и при выходе из блока уничтожаются. Тем самым была изобретено стековое распределение памяти в программах, которое с тех пор повсеместно используется при реализации языков программирования.

>     Языки высокого уровня      ALGOL Языки высокого уровня ALGOL -2 - BEGIN FILE F (KIND=REMOTE); EBCDIC ARRAY E [0: 15]; REPLACE E BY "Привет, друг!"; WHILE TRUE DO BEGIN WRITE (F, *, E); END; END. Сравнить с программой на Фортране. Язык большого успеха не имел, но сыграл большую роль в дальнейшем развитии языков.

>     Языки высокого уровня      BASIC Языки высокого уровня BASIC -1 - BASIC ( Beginner All-purpose Symbolic Instruction Code ), 1963 год, Дортмундский колледж. При проектировании языка использовались следующие восемь принципов: новый язык должен: 1. быть простым в использовании для начинающих ( отказ от типов (почти), интерпретатор ) 2. быть языком программирования общего назначения 3. предоставлять возможность расширения функциональности, доступную опытным программистам 4. быть интерактивным 5. предоставлять ясные сообщения об ошибках 6. быстро работать на небольших программах 7. не требовать понимания работы аппаратного обеспечения 8. защищать пользователя от операционной системы

>     Языки высокого уровня 10 CLS 'Очистка экрана  Языки высокого уровня 10 CLS 'Очистка экрана BASIC -2 - 20 PRINT "Привет, друг!" ' Обращение в первой строке 30 'Цикл, выводящий линию на всю ширину экрана 40 FOR I=1 TO 80 50 PRINT "="; 60 NEXT I 65 'Ввод символьных данных от пользователя 70 INPUT "Ваше имя: ", N$ 80 INPUT "Фамилия: ", S$ 90 INPUT "Отчество: ", T$ 95 'Вырезаем копию первых символов из имени и отчества 100 N 2$=LEFT$(N$, 1, 1) 110 T 2$=LEFT$(T$, 1, 1) 120 'Выводим результат 130 PRINT "Ваше имя кратко: "; S$; " "; N 2$; ". "; T 2$". " 140 INPUT "Повторить программу? (Y/N) ", $U 150 IF U$="Y" THEN GOTO 10 160 END Особенности программы: не объявляем типы переменных никаких структур (хотя подпрограммы были предусмотрены)

>     Языки высокого уровня      Языки высокого уровня BASIC -3 - Несмотря на то, что язык уже использовался на нескольких миникомпьютерах, его настоящее распространение началось с его появления на микрокомпьютере Altair 8800. В 1975 году Майкрософт (тогда это были лишь двое — Билл Гейтс и Пол Аллен, при участии Монте Давидова) выпустила Altair BASIC. В 1980 г. одна из версий (ROM BASIC) была включена в ПЗУ IBM PC — компьютер мог автоматически загружаться в Бейсик. Начало 80 -х годов : Майкрософт продавала несколько версий Бейсик для MS-DOS/PC-DOS, включая BASICA, GWBASIC (модификация BASICA, не требующая «прошивки» от IBM). Borland в 1985 выпустила Turbo BASIC 1. 0, а Майкрософт - Quick BASIC, в которых были предусмотрены возможности процедурного программирования (локальные переменные, функции и т. п. ) Некоторые другие языки использовали хорошо известный синтаксис Бейсика в качестве основы, на которой строилась совершенно иная система (например, GRASS или Avenue для Arc. View ).

>    Языки высокого уровня     PASCAL Pascal был Языки высокого уровня PASCAL Pascal был создан Николаусом Виртом в 1970 г. , после его участия в работе комитета разработки стандарта языка Алгол-68. Язык создан так, чтобы поддержать написание хороших программ (в понимании, которое сложилось к концу шестидесятых годов). Особенностями языка являются строгая типизация и наличие средств структурного (процедурного) программирования. program Hello(output); begin { Начало программы } Write. Ln('Привет, друг!'); { Выводим надпись } end. { Конец программы } Наиболее известной реализацией Паскаля является система Turbo Pascal (выросшая затем в Borland Pascal и далее в Delphi) фирмы Borland

>    Языки высокого уровня      C Языки высокого уровня C -1 - Си (C) — стандартизованный, машинно-ориентированный, процедурный язык программирования, разработанный в начале 1970 -х годов сотрудниками Bell Labs Кеном Томпсоном и Денисом Ритчи (легенда о том, почему делался быстрый язык) Язык программирования Си отличается минимализмом. Главное - компактность языка, экономия памяти и быстрота работы программы. Код на Си можно легко писать на низком уровне абстракции, почти как на ассемблере. #include int main(void) { printf("Привет, друг!n"); return 0; }

>      Языки высокого уровня     Языки высокого уровня C -2 - Си имеет следующие важные особенности: • простую языковую базу, из которой вынесены в библиотеки многие существенные возможности, вроде математических функций или функций управления файлами; • ориентацию на процедурное программирование, обеспечивающую удобство применения структурного стиля программирования; • систему типов, предохраняющую от бессмысленных операций (слабая типизация - дополнительные возможности - байт может быть и char и integer); • непосредственный доступ к памяти компьютера через использование указателей (указатель - адрес в памяти, массив - непрерывная область памяти, локальные переменные - это переменные, в аппаратном стеке. Это обеспечивает с одной стороны, скорость работы, с другой, кошмарные ошибки); • минимальное число ключевых слов; • передачу параметров в функцию по значению, а не по ссылке (при этом передача по ссылке выполняется с помощью указателей);

>     Языки высокого уровня     C Языки высокого уровня C -3 - #include int adder(int ix, int iy); void main() { char ia = 2; // нестандартное объявление целых чисел char ib = 3; int ic; ic = adder(ia, ib); // сложение 2 чисел printf("%d + %d = %dn", ia, ib, ic); // результат } int adder(int ia, int ib) { int iz; iz = ia + ib; ia = 7; // изменение значения слагаемого, return(iz); // которое не влияет на результат } Результат, который выводится на экран: 2 + 3 = 5

>     Языки высокого уровня      Языки высокого уровня C -4 - Язык программирования С стал вершиной разработок в рамках парадигмы процедурного программирования. Процедурное программирование — это методология программирования, основанная на концепции вызова процедуры. Процедуры, также известны как подпрограммы, методы или функции. Что дает? надежность программирования и снижение трудоемкости. Отказ от goto Структурное программирование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Разработка программы ведётся методом «сверху вниз» , с выделением самостоятельных блоков - процедур и функций. Парадигма процедурного программирования сменилась в середине 80 -х годов объектно-ориентированным программированием, но в области системного программирования до сих пор она лидирует, и язык C является основным языком программирования

>Спасибо за внимание!! Спасибо за внимание!!