Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Яп

.pdf
Скачиваний:
28
Добавлен:
15.03.2023
Размер:
6.44 Mб
Скачать

ЯЗЫКИ ПРОГРАММИРОВАНИЯ

Программа. Язык программирования. Стандарты языков программирования.

Романов АлександрСергеевич, канд. техн. наук, доцент каф. КИБЭВС

1

Общие моменты

ТУСУР – не основное место работы

Тратить время на долгистудентов не стану

Форма отчетности – зачет

Кто все вовремя сдал – автомат

Защита лабы – сдал / не сдал (без баллов)

Но на защите лабыспрашиваю по всем лекциям, что былик текущему моменту

Выборочнобуду проверять на плагиат

Не успел сдать, оставил на последниймомент– проблемыстудента, а не преподавателя

3

2/27/2023

Знакомимся

Романов Александр Сергеевич, к.т.н., доцент каф. КИБЭВС

Тема диссертации: «Методика и программный комплекс для идентификации автора неизвестного текста»

Сферы интересов:

ИБ

Языки программирования и Теория формальных языков

Системное и сетевое администрирование

Анализ текста (плагиат, автороведческаяэкспертиза, определение авторства исходных кодов, профилирование автора)

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

Не люблю:

Прогульщиков и опаздывающих

Оставляющих все на последний момент

Ценю свое время и время других и жду взаимности.

2

Литература

1. Мещеряков, Р. В., Давыдова, Е. М. Языки программирования:

Учебник / Р. В. Мещеряков, Е. М. Давыдова. - 2-е изд., перераб. и

доп. – Томск.: В-Спектр. 2007. - 290с. (100 экз.)

2. Орлов, С. А.Теория ипрактика языков программирования [Текс т] : учебник / С. А. Орлов ; ред. Ю. Сергиенко ; рец.: Б. В. Соколов, А. Я. Пасмуров. - СПб. : ПИТЕР, 2014. - 688 с. (1 экз.)

3. Гради, Буч Объектно-ориентированный анализ и проектирование с примерами приложений на С++ / перевод с англ. И. Романовского и Ф. Андреева.- М: "Бином", СПб.: "Невский диалект". - 558с. (1 экз.)

4. М. Бен-Ари Языки программирования. Практический сравнительный анализ

5. Себеста, Р.У. Основные концепции языков программирования

4

1

2/27/2023

Цель и задачи дисциплины

Цель дисциплины - изучение основных принципов построения языков программирования и программирования на языках высокого уровня.

Знать:

общие принципы построения и использования современных языков программирования высокого уровня;

Язык высокого уровня и объектно-ориентированное программирование.

Уметь:

работать с интегрированной средой разработки ПО;

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

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

Владеть:

навыками разработки, документирования, тестирования и отладки программ;

навыками разработки алгоритмов решения типовых профессиональных задач. 5

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

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

Программа – последовательность символов, определяющих вычисление.

Исходный код – запись программы на языке программирования.

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

ПОЧЕМУЯЗЫКОВ ПРОГРАММИРОВАНИЯТАК МНОГО?

7

2

2/27/2023

9

11

10

Принцип абстрагирования

Различныеязыки программированиявыводят нас на разные уровни абстракции:

Ассемблеры – уровень команд процессора

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

Объектно-ориентированные языки – уровень операций объектов предметной области

SQL – операции над объектами БД и т.д.

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

Основной принцип – чем больше уровень абстракции, тем больше деталей скрыто от программиста.

Плюсы: меньше затрат если уже есть готовые модули.

Минусы: повышение уровня абстракции приводит к скрытию

деталей реализации.

12

3

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

Язык должен быть стандартизирован, чтобы поддерживаться разными вендорами, а смена компилятора не вызывала дополнительных проблем.

Например, язык C++ один, а компиляторов много (Microsoft, Borland, MinGW).

Два вида стандартов:

1.Частный – сюда входят определения, сделанные той компанией, которая разработала язык и имеет на него авторские права.

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

2.Согласительный – созданные специальными организациями документы, основанные на соглашении всех заинтересованных участников.

Согласительный стандарт является основным способом обеспечения единообразия различных реализаций языка.

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

• Основные организации – IEEE, ANSI, ISO, IEC.

13

С99

Встраиваемые функции(объявленные с ключевым словомinline).

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

Несколько новых типов данных, включая longlongint, дополнительные расширенные целые типы, явный логический тип данных, а также комплексный тип.

Массивы переменной длины.

Поддержка однострочных комментариев, начинающихся с //.

Новые библиотечные функции,как, например, snprintf.

Новые заголовочные файлы, такие как stdbool.h и inttypes.h.

Типовые математические функции (tgmath.h).

Улучшена поддержка стандарта IEEE 754-2008 (числа с плавающей точкой).

Составные константы (function((struct point){4,2})).

Поддержка вариативных макросов.

15

2/27/2023

Си С++ отличия

Язык C++ создан на основе языка С.

Базовый стандарт языка С - ANSI X3.159-1989 «Язык программированияC».

C++ включает в себя весь язык С. Добавлены новые свойства и возможности, разработанные для поддержки объектноориентированного программирования, многопоточности и т.д.

Все программы (за некоторым исключением), написанные на языке С, можно считать программами на языке C++.

С99 - Современный стандарт С++ - ISO/IEC 9899:1999/Cor 3:2007 от

2007-11-15. Полностью ни одним компилятором не поддерживается.

C11 - стандарт языка, принятый в 2011 году как ISO/IEC 9899:2011. Полностью ни одним компиляторомне поддерживается.

С14 – стандарта «International Standard ISO/IEC 14882:2014(E) Programming Language C++». Полностью ни одним компилятором не поддерживается.

C17 – последняя версия стандарта

14

С11

Выражения, не зависящие от типа (_Generic).

Поддержка многопоточности (_Thread_local,<threads.h>).

Атомарные операции доступа к памяти (_Atomic, <stdatomic.h> .

Улучшенная поддержка Unicode(добавлены типы char16_t и char32_t).

Интерфейсы для проверки границ массива.

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

Привилегированный режим создания и открытия для функции fopen(..x). Используется для блокировки файлов;

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

• Макросы для создания комплексных чисел и т.д.

16

4

С14

Разделяемые мьютексы и блокировки

Гетерогенный поиск в ассоциативных контейнерах

Добавлены новые пользовательские литералы

Адресация к кортежам по типу

Обобщение работы с лямбда функциями и функциональным программированием.

Разделители разрядов в числах

auto integer_literal = 1’000’000’000; auto floating_point_literal= 0.000’015’3;

17

Низкоуровневые языки

Довольно примитивны и ориентированы на численные расчеты: математические, физические расчеты для оборонной промышленности.

Программы представляют собой линейные последовательности элементарных операций с регистрами, в которых хранятся данные.

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

т.е. зависят от среды вычисления.

Как правило не стандартизированы (но современные ассемблеры стандартизированы).

19

2/27/2023

Классификация языков программирования

Самые первые языки появились относительно недавно (30е-40е года XX века).

Каждый год появляется несколько новых популярных языков.

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

и высокоуровневые.

18

Низкоуровневые языки

Низкоуровневое программирование – программирование,

основанное на прямом использовании возможностей и особенностей конкретной вычислительной системы.

Нужно знать:

1.Структуру и функционирование системы в целом;

2.Организацию оперативной памяти;

3.Состав внешних устройств, их адреса и форматы регистров;

4.Организацию и функционирование процессора, состав и форматы его регистров, способы адресации, системы команд;

5.Систему прерываний;

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

20

5

Низкоуровневые языки

Исторически четыре разновидности низкоуровневых языков 1. Машинные коды.

2. Мнемокоды.

3. Ассемблеры.

4. Макроассемблеры.

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

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

21

Низкоуровневые языки

Ассемблер – отличается от мнемокодов обширным набором директив транслятора, существенно упрощающих процесс кодирования программы, включая директивы оформления программы в виде логически законченных элементов

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

23

2/27/2023

Низкоуровневые языки

Пример - Добавление двухбайтового слова с адресом 36 к слову с адресом 32

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

Мнемокоды

Адрес

Код

mov ax, ds:[32]

0000

A1

addax,ds:[36]

0001

20

mov ds:[32],ax

0002

00

 

0003

03

 

0004

06

 

0005

24

 

0006

00

 

0007

A3

 

0008

20

 

0009

00

 

22

Высокоуровневые языки

Повышение эффективности труда разработчиков за счет абстрагирования от конкретных деталей аппаратного обеспечения.

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

Операторы и ключевые слова более осмысленные, чем цифровые последовательности кодов.

Возможность повторного использования написанных ранее блоков посредством их идентификации и последующего обращения к ним

– функции и процедуры.

Снижение уровня зависимости реализации от аппаратного обеспечения ->

Появление программ, преобразующих инструкции языков в коды той или иной машины – трансляторы ->

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

Высокая переносимость программ.

24

6

Классификация языков программирования

Функциональные

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

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

Рефлексивные

Стековые

Описания интерфейсов

Процедурные

Прототипные

Векторного

Логического

 

программирования

 

программирования

Аспектно-ориентированные

Параллельного

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

 

программирования

Динамические

Сценарные

Учебные

Эзотерические

25

Императивный и декларативный подход к программированию

27

2/27/2023

Императивный и декларативный подход к программированию

26

Императивный подход

• В императивных (процедурных) языках программа представляется как набор директив, обращенных к процессору. Является отражением архитектуры традиционных ЭВМ, предложенных Д. фон Нейманом (Машина Тьюринга).

• Программа состоит из последовательности операторов, задающих процедуру решения задачи. Основной - оператор присваивания, служащий для изменения содержимого областей памяти.

• Основная концепция - память как хранилище значений, содержимое которого может обновляться операторами программы.

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

• Ада, Бейсик (версии начиная с QuickBasic до появления Visual

Basic),Си, КОБОЛ, Фортран, Модула-2, Паскаль, ПЛ/1, Рапира, REXX

28

7

Пример программы на Haskell (сортировка списка)

Декларативный подход к программированию

В декларативных языках программа представляет собой множество отношений между некоторыми сущностями (объектами) решаемой задачи и описание действий (не набор команд!), которые надо совершить.

Декларативный подход прозрачнее формализуется математическими средствами. Следовательно, программы проще проверять на наличие ошибок (тестировать) , а также на соответствие заданной технической спецификации

(верифицировать).

Программы работают медленнее, но могут решать более абстрактные задачи с меньшими трудозатратами.

29

Функциональные языки

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

Сложные программы строятся посредством агрегирования функций. При этом некоторые аргументы можно также рассматривать как функции – модульность.

Краткость и простота с позиции математики.

Строгая типизация.

Чистота (отсутствие побочных эффектов).

Отложенные (ленивые) вычисления.

Автоматизированное динамическое распределение памяти.

Прозрачное написание рекурсивных функций.

Нелинейная структура программы и невысокая эффективность реализации

Первый язык - Lisp. Вариант данного языка широко используется в системе автоматизированного проектирования AutoCAD и называется

AutoLISP.

Haskell, ML,Flang,Erlang,Prolog (функционально-логический)

31

2/27/2023

Близость языков программирования к естественному языку

30

rl:: Int -> [Int]

rlsize = take size randSeq nextRand:: Int -> Int

nextRandn = (multiplier * n + increment) `mod` modulus randSeq:: [Int]

randSeq = iterate nextRandseed seed :: Int

multiplier :: Int increment :: Int modulus :: Int seed = 17489 multiplier = 25173 increment = 13849 modulus = 65536

qsort[] = []

qsort(p:xs) = qsort xs1 ++ [p] ++ qsort xs2 where xs1 = [x | x <- xs, x <= p]

xs2 = [x | x <- xs, x > p]

32

8

Пример функционального пр. в Python

• Вариант через лямбда-функцию

33

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

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

Предполагает:

1.точнообозначенныеуправляющие структуры,

2.программныеблоки,

3.отсутствие инструкций безусловногоперехода(GOTO), автономные подпрограммы,

4.поддержкарекурсии и локальных переменных.

Языки структурного программированияАлгол(1958),

Паскаль(1970),Си(1972)

35

2/27/2023

Стековые языки

Стековый язык (англ. stack-oriented programming language) -

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

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

Языки:

1.Forth

2.PostScript

3.Java

4.C#

34

Аспектно-ориентированное программирование

Аспектно-ориентированноепрограммирование(АОП) -

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

Примеры:

1.Трассировка.

2.Контрактноепрограммирование,в частностипроверка пред- и постусловий.

3.Обработкаошибок.

4.Реализациясистембезопасности.

36

9

Динамические языки

Динамический язык позволяетопределятьтипы данных и осуществлять синтаксический анализ и компиляцию «на лету», непосредственнона этапе выполнения.

Динамические языки большеподходятдля быстрой разработки приложений.

К динамическимязыкам относятся: Python, PHP, Ruby, JavaScript.

37

Объектно-ориентированные языки программирования

Объект - объединяет в себе поля данных (атрибуты) и методы (выполняемые объектом действия).

Программа – описание объектов, их свойств (атрибутов), совокупностей (классов),отношений между ними, способов их взаимодействия и операций над объектами (методов), при этом классы образуют иерархию.

Наследование - создание нового класса объектов путем добавления новых элементов (методов).

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

Полиморфизм - некоторые части (методы) родительского класса заменяются новыми, реализующими специфические для данного потомка действия. Таким образом, интерфейс классов остаётся

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

2/27/2023

PHP идинамическая типизация

$res = "string1"; echo $res.'\n';

// выводит "string1" - переменная имеет строковый тип.

$res = 1; echo $res.'\n';

// выводит "1" - переменная преобразуется в целочисленный тип.

$res += 2;

echo $res.'\n';

// выводит "3" - результат операции: целочисленная переменная.

$res += "string2"; echo $res.'\n';

//выводит "3string2" - переменная преобразуется в строковый тип

ивыполняется конкатенация.

38

Объектно-ориентированные языки программирования

Типизация - позволяет устранить многие ошибки на момент компиляции, операции проводятся только над объектами подходящего типа.

Концептуальная близость к предметной области произвольной структуры и назначения.

Поддержка механизма обработки событий, которые изменяют атрибуты объектов и моделируют их взаимодействие в предметной области.

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

Объекты, классы и методы могут быть полиморфными => гибкость и универсальность.

Сложность адекватной формализации объектной теории => трудность тестирования и верификации ПО.

Java, C#, C++, Objective-C, Object Pascal (Delphi), VB.NET, Perl, PHP,

Python, Scala, JavaScript, Ruby, Smalltalk, Ada

40

10