Надъязыковый подход к изучению языков программирования

5 причин необходимости изучения концепций языков программирования

*  Больше возможности для выражения идей

*  Более обоснованный выбор подходящего языка

*  Повышение способности к изучению новых языков

*  Углубление понимания важности реализации

*  Повышение способности к разработке новых языков

Области применения программирования

*  Научные приложения

*  Коммерческие приложения

*  Искусственный интеллект

*  Системное программирование

*  Языки подготовки сценариев

*  Специализированные языки программирования

Категории языков программирования

*  Императивные

*  Декларативные

*  Объектно-ориентированные

История развития языков программирования

*  40гг. – первые цифровые компьютеры – программирование путем коммутации проводов.

*  программирование на машинном языке

*  появление ассемблеров – машинные команды получают мнемонические имена (LOAD, STORE, ADD, …)

*  конец 50х – создание первого компилятора для языка FORTRAN (FORmula TRANslator – транслятор формул)

n  более удобное средство для написания формул, чем ассемблер

n  переносимость кода

Исторические требования к ЯП

*  Архитектура языков программирования должна быть максимально приближена к архитектуре компьютеров для наиболее эффективного использования его ресурсов.

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

НЕ нашли? Не то? Что вы ищете?

Парадигма языка программирования

*  Компьютер представляется в виде туповатого исполнителя, тем не менее поддающегося обучению.

*  Исполнитель может исполнять некоторые простейшие команды.

*  Обучение происходит путем формирования процедур из команд и использования их в дальнейшем вместо повторения последовательности команд.

*  Программа описывает процесс последовательного, пошагового решения задачи.

Наклонения предложений в грамматике

*  изъявительное (повествовательные)

*  вопросительное

*  повелительное (императивное)

Исторически первыми сформировались императивные

(директивные, процедурные) языки программирования

Программирование в повествовательном наклонении

*  Стиль программирования, в котором программа представляется в как совокупность утверждений получил название декларативный.

*  Программа на императивном языке программирования предписывает, как достичь требуемую цель; декларативная программа заявляет (декларирует), что должно быть достигнуто в качестве цели.

Предположим, требуется пройти в городе из пункта А в пункт Б.

*  Декларативная программа - это план города, в котором указаны оба пункта, плюс правила уличного движения. Руководствуясь этими правилами и планом города, курьер сам найдет путь от пункта А к пункту Б.

*  Императивная программа - это список команд примерно такого рода: от пункта А по ул. Садовой на север до площади Славы, оттуда по ул. Пушкина два квартала, потом повернуть направо и идти до Театрального переулка, по этому переулку налево по правой стороне до дома 20, который и есть пункт Б.

Характеристики и свойства языков программирования

*  Характеристики

n  Мощность

n  Уровень

n  Концептуальная целостность

*  Экономия понятий

*  Ортогональность понятий

*  Единообразие понятий

*  Универсальные и специализированные языки

*  Свойства

n  Надежность

n  Удобочитаемость

n  Полнота

n  Гибкость

n  Простота

n  Мобильность

n  Эффективность

Характеристики, свойства и требования

Методы реализации

*  Компиляция

*  Интерпретация

*  Смешанные системы реализации

Этапы разработки программ

*  Технический взгляд

n  Определение требований

n  Проектирование

n  Кодирование

n  Тестирование

n  Отладка

n  Документирование

*  Психологические этапы

n  Смятение

n  Понимание сути

n  Понимание способа реализации

n  Реализация основной функции

n  Реализация всех функций

n  Подготовка к отчуждению

n  Подготовка документации

Основные понятия ЯП

*  Базовые определения

*  Объекты данных

*  Типы данных

*  Выражения и операторы

*  Блоки и подпрограммы

*  Абстрактные типы данных

*  Дополнительные возможности

Базовые определения

*  Язык программирования – множество текстов (последовательностей символов) некоторого алфавита, удовлетворяющих правилам синтаксиса и задающих порядок вычисления в соответствии с правилами семантики.

*  Алфавит ЯП – набор символов, включающий буквы, цифры и специальные знаки (пунктуации, операций и т. д.).

*  Синтаксис ЯП – совокупность правил записи, которым должна удовлетворять любая программа.

*  Семантика ЯП – правила, определяющие, какие операции и в какой последовательности должна выполнить ЭВМ, работая по программе.

Состав языков программирования

Базовые определения

lЯзык программирования – множество текстов (последовательностей символов) некоторого алфавита, удовлетворяющих правилам синтаксиса и задающих порядок вычисления в соответствии с правилами семантики.

lАлфавит ЯП – набор символов, включающий буквы, цифры и специальные знаки (пунктуации, операций и т. д.).

lСинтаксис ЯП – совокупность правил записи, которым должна удовлетворять любая программа.

lСемантика ЯП – правила, определяющие, какие операции и в какой последовательности должна выполнить ЭВМ, работая по программе.

Семантика ЯП

Семантика ЯП задается определением средств описания данных и действий.

Типы данных

lРанние языки

nВспомогательный прием для облегчения работы компилятора

lСовременные языки

nВыражение задачи с большей ясностью

nОбеспечение высокой надежности

Типичные классы ошибок

lОбъектам данных могут присваиваться логически некорректные значения

lК объекту данных может быть применена логически некорректная операция

Типы данных

lПростые

nЦелые

nДействительные

nСимвольные

nЛогические

lСтруктурные

nМассивы

nЗаписи

nОбъединения

Пример описания переменных и записи операция над данными различных типов

I: integer := 1;

С: character := '1';

В: boolean := true;

1+1

1<=2

С > 'А‘

В and false

В or true

Пример использования массива и записи

A: array (1..5) of integer;

R: record

I: integer;

C: character;

B: boolean;

end record;

U: union

integer;

character;

boolean;

end union;

lA(4) – обращение к 4-му элементу массива А

lR. В – обращение к переменной B записи R

lU := ‘A’ присваивание переменной U символьного значения

Массив

Запись

Объединение

Требования к средствам описания действий

lДолжны быть надежны (минимум ошибок при написании программы)

lСмысл должен быть очевиден и однозначен (чтобы можно было легко понять общую структуру программы)

lДолжны обеспечивать достаточную гибкость (чтобы программист мог выразить свой алгоритм просто и эффективно)

Требования противоречивы – при разработке языков пытаются достичь компромисса

Выражение и присваивание

lВиражение — это формула для вычисления значения некоторого типа. В общем случае выражение представляет собой один или несколько операндов, разделенных знаками операций

lОператор присваивания “:=“ Слева от знака оператора указывается тот объект данных, которому в качестве значения присваивается значение стоящего справа выражения

I, J: integer;

PI: constant real := 3.;

В: boolean;

A: array (1..5) of real;

R: record

K: integer;

D: character;

end record;

I:=I+J*2;

J:=3*(I-J)+R. K;

B:=B and (A(3)<PI) and (R. D=‘A’);

A(5):=PI**2+A(5);

Операторы управления

lОператор «if» - условное выполнение операторов.

Проверяет некоторое условие и в зависимости от истинности или ложности его выполняет те или иные операторы.

lОператор «while» - циклическое выполнение операторов.

Выполняет заданные операторы до тех пор, пока истинно заданное условие, причем условие проверяется перед выполнением операторов.

Подсчет суммы положительных элементов массива

A: array (1..100) of integer;

SUM: integer;

I: integer;

SUM:=0;

while I<= 100 do

if A(I)>0 then

SUM:=SUM+A(I);

end if;

J:=I+1;

end do;

Необходимость структурирования программы

lВыделение логических единиц

lОсвобождение памяти от ненужных переменных

lУправление областью видимости имен

lПриближение места описания переменных к месту использования

lПовторное использование кода

Решение проблем – введение в язык понятий блока и подпрограммы

Блок

lПрограммная единица состоящая из:

nописания всех локальных (или внутренних) объектов данных и
глобальных (или внешних) объектов данных

nописания действий, которые должен выполнить блок

block

TEMP: integer;

use I, J: in out integer;

begin

TEMP:=I;

I:=J;

J:=TEMP;

end block;

Процедуры

lПроцедура – описание действий, которые необходимо выполнить в какой-то момент выполнения программы

lДля выполнения действий, описанных в процедуре используется вызов процедуры

block

I, J: integer;

procedure ПЕРЕСТАВИТЬ is

TEMP: integer;

begin

TEMP:=I;

I:=J;

J:=TEMP;

end procedure;

begin

I:=l;

J:=2;

ПЕРЕСТАВИТЬ;

ПЕРЕСТАВИТЬ;

end block;

Использование процедур с параметрами

lПараметры процедуры – специальная конструкция языка, позволяющая указывать переменные, которые должны обрабатываться в функции

block

I, J,K: integer;

procedure ПЕРЕСТАВИТЬ

,N: in out integer)is

TEMP: integer;

begin;

TEMP:=M;M=N;N:=TEMP;

end procedure;

begin

I:=1; J:=2; K:=3;

ПЕРЕСТАВИТЬ(I,J); //2,1,3

ПЕРЕСТАВИТЬ(J, К); //2,3,1 ПЕРЕСТАВИТЬ(К,I); //1,3,2

end block;

Функции

Функция — это специальная форма процедуры, предназначенная для вычисления одного значения.

block

I, J,K: integer;

МАХ2: integer;

function MAX

(PAR1,PAR2: in integer)

return(REZ:out, integer) is

begin

if PAR1 > PAR2 then

REZ:=PAR1;

else

REZ:=PAR2;

end if;

end function;

begin

MAX2 := 2*MAX(K, MAX(I, J));

end block;

Пакеты

lПакет – средство языка программирования для представления совокупности логически связанных вычислительных ресурсов

lПакеты могут объединять как подпрограммы, так и объекты данных и даже типы данных.

Абстрактные типы данных

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

Дополнительные возможности

lОбработка файлов

lОбработка исключений

lПараллельная обработка

lМакрообработка

.

Типизация языков программирования

Основные вопросы

lПонятие типа

lОпределение типа

lСпособы контроля типов

lВиды и уровни типизации

lЭквивалентность типов

lПоколения языков программирования

Понятие типа

lПервоначально:

nТип предназначался для выбора компилятором наиболее эффективное представление для объекта.

nС машинной точки зрения тип объекта — это форма представления его значений в памяти и определяемый этой формой способ доступа.

lСовременные языки:

nЭффективность реализации как функция механизма типов отодвинута на второй план.

nБольшее значение:

lвозможность выбирать естественные структуры данных

lделать программу более понятной

lменее подверженной ошибкам

lлегче проверяемой (в т. ч. компилятором) и исправляемой

Предшествующие определения типа

lКак множество значений, которые могут принимать объекты данного типа.

nНедостаточно точно – не дает однозначного пути для построения типов

lаггауof integer и

larrayof integer (различны или нет?)

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

nНе решается проблема однозначности:

lРазличны или нет типы двух списков, если их определения налагают разные ограничения на максимальное число элементов?

Определение типа

lТип данных - множество с операциями (алгебра), учитывающая следующее:

nесли дан новый тип, то можно описывать и инициализировать переменные этого типа;

nесли дана переменная некоторого типа, то можно определить и изменить ее текущее значение;

nесли даны два значения определенного типа, то можно сравнить их, по крайней мере на равенство или неравенство;

nописание типа дает некоторую интерпретацию определяемым синтаксисом языка символам, которые вводятся для обозначения констант.

lЕсли два типа отличаются по любым из перечисленных факторов, то такие типы считаются разными

Запись определения нового типа

type имя_типа is описание_типа;

Контроль типов

lКонтроль типов - определение типов выражений и их согласованности с типами, которые требуются по правилам языка в данном контексте программы

n(например, согласованности типов аргументов и параметров процедур)

Синтаксически правильная программа

lПрограмма называется синтаксически правильной, если она удовлетворяет правилам синтаксиса языка, т. е. не содержит синтаксических ошибок.

lОпределение синтаксической правильности программ производится на этапе компиляции.

lОбозначим множество программ этого класса через Ls.

Типово-правильная программа

lПрограмма называется типово-правильной, если она удовлетворяет правилам типизации языка.

lПравила типизации

nприписывание типов переменным и константам,

nопределение типов выражений по типам их частей

nсогласование типов частей языковых конструкций (например, операторов присваивания)

n…

lОпределение типовой правильности программ также производится на этапе компиляции.

lОбозначим множество программ этого класса через Lt

lLt – подмножество Ls.

lЕсли Lt не определено – язык не типизированный, иначе – типизированный.

Типовые ошибки

lПрограмма называется программой без типовой ошибки, если при ее выполнении не возникает типовой ошибки

nОбозначим множество программ этого класса через Le.

nLe входит в Lt

lПрограмма называется программой с выловленными типовыми ошибками, если все возникающие при ее выполнении типовые ошибки обнаруживаются при контроле типов.

nОбозначим множество программ этого класса через Ld.

lLd Í Lt \ Le

Классификация языков по способу контроля типов

lЕсли Lt = Le , т. е. типово-правильные программы не могут содержать типовых ошибок, то язык называется языком с полным статическим контролем типов.

lЕсли Ls=Lt, т. е. правила типизации языка очень слабые или их нет совсем (все синтаксически правильные программы являются типово-правильными), и, следовательно, вся работа по контролю типов производится во время выполнения программ, то язык называется языком с динамическим контролем типов.

lЕсли при этом Ld = Lt \ Le, т. е. все типовые ошибки обнаруживаются при динамическом контроле типов, то язык называется языком с полным динамическим контролем типов.

lЕсли Le Ì Lt Ì Ls, т. е. не все синтаксически правильные программы являются типово-правильными и типово-правильные программы могут содержать типовые ошибки, то язык называется языком со смешанным контролем типов.

lЕсли при этом Ld = Lt \ Le, то язык называется языком с полным смешанным контролем типов.

Классификация ЯП по способу определения семантики языковых конструкций

lЕсли семантика каждой языковой конструкции (например, операций) определяется по тексту программы, а не во время ее выполнения, т. е. статически, язык называется статически типизированным, в противном случае — динамически типизированным.

lСтатически типизированные языки:

nслабо типизированный, если информация о типе используется только для обеспечения корректности программы на машинном уровне;

nсильно типизированный, если осуществляется полный контроль типов (статический, динамический или смешанный);

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

Проблемы слабо типизированных языков

lОперация, которая может восприниматься машиной как корректная, может быть некорректной на абстрактном уровне программы

С: character;

С:=4;

С:=‘4’;

lНеявное преобразование типов может привести к непредсказуемым результатам

X, Y: real;

I, J,K: integer;

K:=X-J;

lИз-за использования неявного преобразования типов программа может иметь законную но не очевидную интерпретацию

1<2<3 – истина и 3<2<1 – истина

Сильно типизированные языки

Используется операция явного преобразования типа

X: real;

I: integer;

В: boolean;

С: character;

Х:=rеаl(I);

C:=character(10);

Эквивалентность типов

lТребования к реализации

nинтуитивная привлекательность

nлегкость реализации

nэффективность выполнения

lЭквивалентность по структуре (структурная эквивалентность) – совпадают описания типов

lЭквивалентность по имени (именная эквивалентность) – типы с разными именами считаются разными

type TAБЛ1 is array (1..10) of integer;

type ТАБЛ2 is array (1..10) of integer;

X: array(lof integer;

Y: ТАБЛ1;

Z: ТАБЛ2;

lВ случае эквивалентности по структуре типы переменных X, Y, Z будут считаться одинаковыми, а в случае эквивалентности по имени — различными

Преимущества эквивалентности типов по имени

lСильно упрощается распознавание эквивалентности типов по имени

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

Поколения языков

lКонкретная система типов представляет собой компромисс между эффективностями реализации и контроля типов.

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

nПредоставляют лишь средства для описания переменных простых типов и массивов; никаких новых типов вводить нельзя.

nФортран, Алгол-60.

lВторое поколениеязыки, предоставляющие программисту основные конструкторы типов: массивы, записи, объединения

nПЛ/1, Алгол-68, Паскаль, С

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

nВсе операции над типами данных предопределенные — определяемые языком, а не программистом.

nНовые типы могут получать имена, но с ними нельзя связывать новых, специально вводимых операций.

lТретье поколение – языки, предоставляющие программисту средства определения абстрактных типов данных

nС++, C#, Java

nТипы понимаются как множества с операциями.

Простые типы данных

Простые типы данных

Объекты простых типов не имеют внутренней структуры, они могут содержать лишь одно неделимое значение.

Числовые типы

lЦелые числа – бесконечное множество дискретных значений.

lДействительные числа - неограниченный континуум значений

Целые типы

l Описание типа имеет вид

ntype имя_типа is integer range нижняя_граница..верхняя_граница;

lПеременные такого типа могут принимать любые целые значения в указанном диапазоне

lУказание диапазона позволяет:

nповысить надежность и удобочитаемость

nвыбрать компилятору наиболее эффективный способ представления значений

Эффективность реализации

lУказание диапазона позволяет строить мобильные программы, сохраняя эффективность их реализации.

lЖелание отказаться от указания диапазона сталкивается со сложностью реализации.

type BIG_INT is integer

range -..,
INT is integer range -32768..32767,

SMALLINT is integer range -128..127;

Атрибуты целого типа

lАтрибуты типа – конструкция языка, позволяющая получить информацию о свойствах типа

lимя_типа'FIRST

lимя_типа'LAST

или

lимя_переменной'FIRST

lимя_переменной'LAST

Операции над переменными целых типов

lсложение (+)

lвычитание (-)

lумножение (*)

lделение (/)

lостаток от деления (mod)

lвозведение в степень (**)

lсравнение на равенство (=)

lсравнение на неравенство (/=)

lсравнение на меньше (<)

lсравнение на меньше или равно (<=)

lсравнение на больше (>)

lсравнение на больше или равно (>=)

lунарный плюс (+)

lунарный минус (-)

lабсолютное значение (abs)

Деление и остаток от деления

lРезультат операции деления всегда целый

lОкругление производится в сторону нуля как для положительных, так и для отрицательных значений

lОстаток от деления

X mod У = Х-(Х/У)*У

Действительные типы

lОписание имеет вид

ntype имя_типа is real range нижняя_граница..верхняя_граница digits количество значащих цифр;

nили

ntype имя_типа is real

range нижняя_граница..верхняя_граница delta абсолютная_точность;

lВ случае если диапазон не указан предполагается, что значения лежат в некотором предопределенном диапазоне, зависящем от конкретной реализации

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

type

FLOAT is real range -7.2E75..7.2E75

digits 6,

FIXED is real range -2.0..2.0 delta 0.01;

Атрибуты действительных типов

lвместо имени типа можно указывать имя переменной

lимя_типа' FIRST — нижняя граница значений
имя_типа' LAST — верхняя граница значений

lимя_типа' DIGITS — количество цифр мантиссы

lимя_типа' EPSILON — абсолютное значение разности между 1.0 и ближайшим к 1.0 большим его числом данного типа

lимя_типа' SMALL — значение минимального положительного числа

lимя_типа' LARGE — значение максимального положительного числа

lимя_типа' DELTA — абсолютная точность

Запись констант

lзапись с точкой:

n10.4

n-0.

lзапись с порядком:

n104Е-1

n-145Е-12

lзапись с точкой и порядком:

n1.04Е1

n-1.45Е-10

Операции над переменными действительных типов

lсложение (+)

lвычитание (-)

lумножение (*)

lделение (/)

lвозведение в степень (**)

lсравнение на равенство (=)

lсравнение на неравенство (/=)

lсравнение на меньше (<)

lсравнение на меньше или равно (<=)

lсравнение на больше (>)

lсравнение на больше или равно (>=)

lунарный плюс (+)

lунарный минус (-)

lабсолютное значение (abs)

Особенности округления

lПри вычислении выражения с действительными числами с конечной точностью представления возникают погрешности, которые могут оказать существенное влияние на получаемые результаты

lСледует сравнивать действительные числа лишь на приближенное равенство и неравенство, например

if abs(X-Y)<0.00001*abs(X) then...

Уменьшение погрешностей вычислений

·  складывать наименьшие члены сумм первыми;

·  определять все положительные и отрицательные слагаемые и складывать их поочередно;

·  избегать вычитания двух почти равных чисел; если это все же необходимо, производить вычитание до умножения или деления (т. е. лучше записать А*(В-С), чем А*В-А*С);

·  избегать показателей степени в форме действительных чисел, так как в этом случае степень вычисляется через log и ехр; напротив, G**2 (если такая операция допускается) вычисляется как G*G;

·  использовать операцию извлечения квадратного корня sqrt (если она есть) вместо G**0.5, так как sqrt обычно вычисляется точнее;

·  использовать в процессе вычисления максимально возможную точность, если это необходимо;

·  уменьшать число операций;

·  избегать цепочек операций, в которых используются неточные значения;

Перечислимые типы

lОписание типа имеет вид:

ntype имя-типа is

(значение1, значение2, ... );

ntype АЛФАВИТ is (БУКВЫ, ЦИФРЫ, СПЕЦ_СИMB);

ntype ДНИ_НЕДЕЛИ is (ПН, ВТ, СР, ЧТ, ПТ, СБ, ВС);

lПеременная такого типа может принимать значения только из списка в описании типа.

Операции над переменными перечислимых типов

lВсегда определены

nсравнение на равенство (=)

nсравнение на неравенство (/=)

lОпределены в некоторых языках

nсравнение на меньше (<)

nсравнение на меньше или равно (<=)

nсравнение на больше (>)

nсравнение на больше или равно (>=)

Атрибуты перечислимых типов

lвместо имени типа можно указывать имя переменной

lимя_типа' POS — функция с одним параметром перечислимого типа, значением которой является порядковый номер значения параметра

lимя_типа' VAL — функция с одним параметром любого целого типа, значением которой является значение перечислимого типа, чьим порядковым номером является значение параметра

lимя_типа' FIRST — минимальное значение указанного типа имя_типа' LAST — максимальное значение указанного типа имя_типа' SUCC — функция с одним параметром перечислимого типа, значением которой является следующее по порядку значение этого перечислимого типа

lимя_типа' PRED — функция с одним параметром перечислимого типа, значением которой является предыдущее по порядку значение этого перечислимого типа

Логический тип

lОписание типа имеет вид:

ntype boolean is (false, true);

lОперации

nсравнение на равенство (=)

nсравнение на неравенство (/=)

nлогическое дополнение (not)

nлогическое И (and)

nлогическое ИЛИ (or)

Подтипы

lПодтипы используются для ограничения множества значений типа

lНапример:

type ДНИ_НЕДЕЛИ is (ПН, ВТ, СР, ЧТ, ПТ, СБ, ВС);

subtype РАБОЧИЕ ДНИ is ДНИ_НЕДЕЛИ range ПН. . ПТ;

X: РАБОЧИЕ ДНИ;

lОбъекты типа РАБОЧИЕ_ДНИ могут свободно смешиваться с объектами типа ДНИ_НЕДЕЛИ, не требуя явного применения преобразования типа

Анонимные типы

lЕсли нет необходимости вводить имя нового типа (будут описаны лишь один или два объекта этого типа) можно записать определение типа в том месте, где требуется имя типа.

lНапример:

type КЛЮЧ is (ВКЛ,ВЫКЛ);

P,Q: КЛЮЧ;

можно описать, используя механизм анонимных типов:

P.Q: (ВКЛ. ВЫКЛ);

Эквивалентность анонимных типов

lПеременные P и Q имеют один тип

P.Q: (ВКЛ. ВЫКЛ);

lПеременные P и Q имеют различные типы

Р: (ВКЛ. ВЫКЛ);

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7