АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Модуль 2. Языки программирования

Читайте также:
  1. DBASe-подобные реляционные языки
  2. I. ИНДОЕВРОПЕЙСКИЕ ЯЗЫКИ
  3. I. Організація та проведення модульного і підсумкового контролю
  4. Б. Восточная группа: нахско-дагестанские языки
  5. Варіанти питань до модульної контрольної роботи
  6. Варіанти питань до модульної контрольної роботи
  7. Варіанти питань до модульної роботи
  8. Восточногерманские языки
  9. Встроенные языки программирования (часть 1).
  10. Высокоуровневые языки программирования
  11. Геометрическая интерпретация задачи линейного программирования.
  12. Геометричне зображення комплексного числа. Модуль та аргумент комплексного числа


Программным обеспечением называют совокупность программных средств, необходимых при работе на компьютере. Частью ПО является язык программирования.

  1. Основные понятия.
    Язык программирования - это множество текстов некоторого алфавита, удовлетворяющих правилам синтаксиса и задающих порядок вычислений в соответствии с правилами семантики.
    Алфавит языка программирования - набор символов, включающий буквы, символы и спец. знаки.
    Синтаксис языка программирования - совокупность правил записи, которым должна удовлетворять любая программа. Включает также правила ввода текстов программ в ЭВМ.
    Семантика языка программирования - это правила, определяющие какие операции и в какой последовательности должна выполнять ЭВМ, работая по программе.
  2. Общая характеристика языков программирования.
    Первыми языками были машинные языки. Они задавались системами команд ЭВМ.
    Языки высокого уровня способны выразить задачу более лаконично и сжато, позволяя программисту более четко представлять свои задачи и разрабатывать эффективные методы из решения.
    Языки машинно-ориентированные позволяют использовать особенности машин для повышения эффективности программ.
    Такие языки как Си часто применяют для повышения эффективности программ.
    Многолетняя история развития языков программирования позволила сформулировать ряд принципов, которым должны следовать современные языки.
    Принцип сокрытия информации позволяет использовать определенные средства языка, не зная подробностей их устройства.

Основные шаги:

  1. Абстракция данных, т.е. представление данных, позволяющее использовать их, не зная подробностей их организации и создания.
  2. Абстракция действий в виде процедур, когда фрагмент программы может быть использован другими пользователями, знающими функцию, которую этот фрагмент реализует и способ определения ее параметров.
  3. Абстракция типа данных.
  4. Абстракция объектов породила ООП.

Принцип сокрытия информации сочетается в языках программирования с принципом определения интерфейсов.
Существуют специально разработанные для определенной области производства языки программирования (ЯП). Например, на "Авиастар-СП" разработан язык Casius. Это язык геометрического моделирования и программирования обработки деталей для станков с ЧПУ.
Характеристики и свойства языков программирования.
Основными характеристиками, позволяющими сравнивать языки программирования, являются: мощность, уровень и концептуальная целостность.
Мощность характеризуется количеством и разнообразием задач, алгоритмы решения которых можно записать, используя этот язык. Самым мощным является машинный язык. Любую задачу, запрограммированную на каком-либо языке можно запрограммировать и на машинном языке.
Уровень языка характеризуется сложностью решения задач с использованием этого языка. Чем проще записывается решение задач, чем более непосредственно реализуются сложные операции и понятия, чем меньше объем получаемых программ, тем выше уровень языка.
Концептуальная целостность языка характеризуется свойствами совокупности понятий, служащих для описания этого языка и включает 3 взаимосвязанных аспекта:

  • экономию понятий
  • ортогональность понятий
  • единообразие понятий

Экономия понятий предполагает достижение максимальной мощности языка с помощью минимального числа понятий.
Ортогональность означает, что между понятиями не должно быть взаимного влияния. Если какое-либо понятие используется в различных контекстах, то правила использования должны быть одни и те же.
Единообразие понятий требует согласованного, единого подхода к описанию и использованию всех понятий.
Обычно чем меньше мощность языка, тем выше его уровень. По этой причине, наряду с универсальными языками разрабатываются специализированные в некоторой конкретной области.
Чем мощнее язык, тем труднее обеспечить концептуальную целостность.
Свойства:
Надежность языка обеспечивает минимум ошибок при написании программы. Например, благодаря наличию в языке требования, чтобы все переменные были объявлены до использования, ошибки связанные с неправильным написанием имен выявляются при компиляции, т.е. автоматически.
Удобочитаемость языка - свойство, которое обеспечивает легкость восприятия программ человеком.
Полнота языка обеспечивает описание на языке решения задач определенной предметной области.
Гибкость языка обеспечивает легкость выражения на языке необходимых для решения задач действий.
Простота обеспечивает легкость понимания семантики языковых конструкций и запоминания синтаксиса.
Мобильность языка позволяет обеспечивать независимость его от аппаратных средств. Можно переносить программное обеспечение с машины на машину с относительной легкостью.
Эффективность языка обеспечивает эффективную реализацию языка.
Эффективность программ.
Основной задачей программирования является создание правильных, а не эффективных программ. Эффективная программа не нужна, если она не обеспечивает правильных результатов.
Правильную, но не эффективную программу можно оптимизировать и сделать эффективной.


2.1. Способы и методы оптимизации.

Обычно большая часть времени расходуется на выполнение очень небольшой части программы (примерно 5% ее объема), но наиболее часто используемой, называемой, критической областью.
Как правило, только критическая область программы оптимизируется программистом вручную. Для обнаружения этих критических областей используются спец. средства, названные профилировщиками.
Для больших программ на стадии проектирования определяются требуемые параметры, включающие время и емкость памяти.
Существует 3 типа программ:

  1. Часто используемые программы (ОС, компиляторы, постпроцессоры). Эффективность - первостепенная задача.
  2. Производственные программы. Эффективность существенна.
  3. Программы, написанные не программистами. Эффективность нужна если есть ограничения по памяти или по времени.

Удобочитаемость более существенна чем ее эффективность.
Программу делают более эффективной лишь в особых случаях:

  1. Программа не помещается в памяти.
  2. Программа слишком долго выполняется.
  3. Программа должна быть включена в библиотеку и часто использоваться.


2.2. Оптимизация программы.

Оптимизация программы - это процесс построения по исходной программе эквивалентной программы, обладающей лучшими характеристиками времени работы и/или объема занимаемой ОП.

  1. Сегментация программы.
    Программу, подлежащую оптимизации следует разделить на подпрограммы и ответить на 3 вопроса:
    • какой процент общего времени использует каждая подпрограмма
    • насколько в % отношении оптимизируется каждая подпрограмма
    • сколько человеко-часов необходимо для достижения этой цели
  2. Время работы подпрограммы.
    Необходимо установить фактическое время работы каждой подпрограммы. Если это невозможно, применяется другой подход. Он заключается в подсчете количества операторов в подпрограммах по распечатке. Операторы, включенные в тело цикла, учитываются многократно.
    В первую очередь необходимо оптимизировать подпрограмму, которая используется больше других.
3. Пример:
  1. Процент общего улучшения программы.
    После того, как определен % общего времени, используемый подпрограммой,следует оценить ее возможное улучшение.
  2. Необходимые усилия.
    Для каждой подпрограммы можно вычислить следующий коэффициент:



    Подпрограммы с самым высоким коэффициентом оптимизируются в первую очередь.
    При оптимизации вручную, существует 2 подхода:
    • "чистка"
    • "перепрограммирование"


2.3. Структурное программирование.

Структурное программирование сосредоточено на логике программы и включает 3 главные составляющие:

  1. Проектирование сверху вниз.
  2. Модульное программирование.
  3. Структурное кодирование.

Проектирование сверху вниз.
Этот метод предусматривает сначала определение задачи в общих чертах, а затем постепенное уточнение структуры, путем внесения более мелких деталей. На каждом шаге такого уточнения необходимо выявить основные функции, которые нужно выполнить. Таким образом данная задача разбивается на ряд подзадач, пока эти подзадачи не станут на столько простыми, что каждой из них будет соответствовать один модуль. Действия каждого модуля должно быть описано одной фразой.
Проектирование должно быть завершено до начала программирования.
Модульное программирование - это процесс разделения программы на логические части (модули) и последовательное программирование каждой из них.
Каждый модуль должен иметь свое назначение, быть замкнутым, вход и выход должны быть точно определены.
Воздействие изменения в одном модуле на другую часть программы называется "волновым эффектом".
Избегать использования глобальных переменных. Использование модулей приводит к уменьшению сложности.
Методы проектирования программ, основанные на модульном принципе, делятся на 3 группы:

  1. Методы нисходящего проектирования.
  2. Методы расширения ядра.
  3. Методы восходящего проектирования.

Структурное кодирование - это метод написания хорошо структурированных программ, который позволяет получать программы более удобные для тестирования, модификации и использования. Логическая структура базируется на строго доказанной теореме о структурировании. Эта теорема утверждает, что любую правильную программу можно написать с использованием только следующих структур:

  • последовательности (линейности)
  • выбора (ветвления)
  • повторения (цикла)


2.4. Вычисление констант.

Инициирование переменных.
Программы становятся удобочитаемыми, если в них используются выражения, включающие константы.
Для выполнения вычислений, содержащих только константы, применяют множество различных методов компилирования. Некоторые компиляторы вычисляют все выражения с константами во время компилирования и запоминают результат. Другие компиляторы запоминают константы, а вычисления выполняются во время выполнения.
Второй способ неэффективен, если выражение находится внутри цикла.
Процесс выполнения операторов, значения которых известны на стадии компилирования, что позволяет не выполнять их во время работы программы, называют сверткой.
Инициирование переменных.
Если начальные значения присваиваются одновременно с объявлением переменных, то экономится время выполнения, т.к. переменные получают начальные значения во время компилирования, а не во время выполнения.
Инициирование переменных во время их объявления, облегчает документирование программ и помогает избежать ошибок, которые могут возникнуть, если начальные значения не были присвоены.
Арифметические операции.
Арифметические операции выполняются с различной скоростью.
В порядке возрастания времени:

  • +, -
  • *
  • / (деление)
  • возведение в степень
Пример: 3*I = I + I + I

Преобразование может привести к исключению операции:

X = 2*Y + (A-1)/P + 2*TX = 2*(Y + T) + (A-1)/P A/50 = A*0,2 A = 1.0/X RX = 1.0/X A = RXC = B + D/X C = B + D*RX

При возведении в степень важно правильно задавать тип показателя степени. При возможности использовать целые типы.

X = Y + A/B*CZ = W + A/B*CABC = A/B*CX = Y + ABCZ = W + ABC

Организация цикла.

y = a1x3+a2x2+a3x+a4POLY = A[1]FOR I = 2 TO 4 DO POLY = POLY*X + A[I] POLY = ((A[1]*X + A[2])*X + A[3])*X + A[4]
  1. Экономим время на выполнении и инициировании переменных.
  2. Один из способов уменьшения количества циклов состоит в объединении двух или более циклов в один.
  3. Значительная часть времени при использовании циклов тратится на инициирование и проверку индекса цикла.
Пример 1: инициирование выполняется:1 for i:=1 to 20 do20 for j:=1 to 10 do200 for k:=1 to 5 do221 раз {тело цикла}

Тело цикла выполняется 20*10*5=1000 раз.
Проверка условий завершения цикла выполняется 1000+200+20=1220 раз.
Путем реорганизации циклов (которая не всегда возможна) можно сократить число инициирований и завершений цикла.

Пример 2: инициирование выполняется:1 for i:=1 to 5 do5 for j:=1 to 10 do50 for k:=1 to 20 do56 раз {тело цикла}

Тело цикла выполняется 5*10*20=1000 раз.
Проверка условий завершения цикла выполняется 1000+50+5=1055 раз.
Внешний цикл должен иметь наименьшее число итераций, по отношению к внутреннему.

Пример 3: оптимизировать.for i:=1 to 50 do for j:=1 to 50 do A[i, j]:=0; for k:=1 to 50 do A[k, k]:=1; for i:=1 to 50 do for j:=1 to 50 do if i=j then A[i, j]:=1 else A[i, j]:=0;

Чистка цикла:

for i:=1 to 10 do for j:=1 to 10 do X:=X+Y*Z+C[i, j];

Оптимизированный цикл:

YZ:=Y*Z; // инвариантные выражения - не зависящие от циклаfor i:=1 to 10 do for j:=1 to 10 do X:=X+YZ+C[i, j];

Метод развертывания цикла:

for i:=1 to 1000 do A[i]:=0; for i:=1 to 500 dobegin A[i]:=0; A[i+500]:=0;end;

Метод развертывания заключается в том, что один и тот же оператор, стоящий в теле цикла, записывается для нескольких различных значений управляющей переменной и, таким образом, сокращается число итераций.

for i:=1 to 100 do A[i]:=5*i; A[1]:=5;for i:=2 to 100 do A[i]:=A[i-1]+5;Пример 4: выполнить развертку.for i:=1 to 10 do for j:=1 to 10 do A[i, j]:=0; for i:=1 to 5 do for j:=1 to 10 do begin A[i, j]:=0; A[i+5, j]:=0; end; for i:=1 to 5 do for j:=1 to 5 do begin A[i, j]:=0; A[i+5, j]:=0; A[i, j+5]:=0; A[i+5, j+5]:=0; end; i:=1; j:=1;repeat repeat A[i, j]:=0; A[i+1, j]:=0; A[i, j+1]:=0; A[i+1, j+1]:=0; j:=j+2; until j>10; i:=i+2;until i>10;Пример 5: записать на Паскале отношение, истинное при выполнении условия и ложного в противном случае:1.Натуральное N является полным квадратом:if sqrt(N) = round(sqrt(N)) then …2.Целое K делится на 7 без остатка:if K mod 7 = 0 then … 3.X - максимальный из X, Y, Z:if (X>Y) and (X>Z) then …


2.5. Оптимизирующие компиляторы.

Компилятор - это программирующая программа, предназначенная для перевода (трансляции) описания алгоритмов с одного формального языка на другой. Первый из этих языков называется входным, второй - выходным или объектным. Наиболее распространены трансляторы с языков процедурно-ориентированных в языки машинные и языки машинно-ориентированные.
Транслятор является одним из основных средств автоматизации программирования.
Обычно транслятор состоит из ряда блоков, выполняющих независимые функции:

  1. Синтаксический анализ программ.
  2. Анализ описаний данных и преобразование их в удобную для хранения и дальнейшего использования форму (в т.ч. вычисление констант).
  3. Распределение памяти для используемых в программе объектов.
  4. Установление соответствия между конструкциями входного языка и эквивалентными им конструкциями выходного языка.
  5. Печать в отредактированном виде текста исходной программы.
  6. Сообщение об обнаруженных в процесс трансляции ошибках в исходной программе.
  7. Эквивалентные преобразования на уровне входного языка с целью оптимизации программы.

Для одного и того же входного языка целесообразно иметь несколько трансляторов, один из которых позволяет осуществить быструю трансляцию, выдавая менее эффективные программы. Такой транслятор можно использовать для отладки программ. Компиляторы, создающие эффективную объектную программу обычно бывают большими и работают медленно.
Оптимизирующий транслятор, применяя различные методы оптимизации может получить более качественную объектную программу, используемую для многократных расчетов.
Шаги оптимизации:

  1. Оптимизирующий компилятор.
  2. Определить критические области, подлежащие оптимизации.
  3. Применить локальную оптимизацию в критических областях (наиболее часто используемых частях программы).

Оверлейность программы. Под оверлейностью понимают возможность перенесения подпрограмм во время работы программы в быстродействующую память из некоторого другого типа памяти таким образом, что несколько подпрограмм в различное время занимают одну и ту же область памяти.
Недостатки:

  • выигрыш в памяти за счет времени
  • дополнительные усилия программиста
  • сохранение промежуточных результатов

Возможность оверлейности реализуется также при использовании виртуальной памяти.
Если машина имеет виртуальную память, то ОС автоматически делит программу на части фиксированной длины, называемые страницами. Кроме того, ОС, в случае необходимости, пересылает страницы в ОП. Таким образом проблема организации оверлейности перестает быть обязанностью программиста и возлагается на машину.

Содержание данной главы


1 | 2 | 3 | 4 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.)