Я расскажу на простейших примерах как функционирует современный компьютер, какие языки программирования бывают, для чего они используются, какие парадигмы лежат в их основе. По сути, язык программирования это инструмент, с помощью которого можно рассказать машине, чего же мы от неё хотим, тем самым воплотив свои мысли.
2. Оглавление 2
• Как работает современный компьютер
• Немного истории
• Алгоритмы
• Внутреннее устройство
• Языки программирования
• Какие бывают
• Чем отличаются
• Для чего используются
• Python
• Философия
• Основные конструкции
• Примеры
О чем я буду говорить
4. Вычислительные машины 4
Вычислительная машина, счётная машина — механизм, электромеханическое
или электронное устройство, предназначенное для автоматического
выполнения математических операций
Они были очень давно
5. Алгоритм 5
Алгоритм — набор инструкций, описывающих порядок действий исполнителя для достижения
некоторого результата.
Свойства алгоритма:
• Дискретность
• Детерминированность
• Понятность
• Завершаемость
• Массовость
• Результативность
Все знают, но боятся сказать
6. Машина Тьюринга 6
Машина Тьюринга — абстрактная вычислительная машина. Способна имитировать всех
исполнителей, каким-либо образом реализующих процесс пошагового вычисления, в котором
каждый шаг вычисления достаточно элементарен.
Состоит из:
• Неограниченная в обе стороны лента, разделённая на ячейки
• Управляющее устройство
• Головка
Конкретная реализация требует:
• Алфавит, включающий пустой символ
• Множество состоянии головки
• Правила перехода
Звучит круто, может быть дело в слове «машина»
8. Архитектура фон Неймана 8
Архитектура фон Неймана — широко известный принцип совместного хранения команд и
данных в памяти компьютера.
Звучит еще круче чем «машина Тьюринга»
9. Архитектура фон Неймана 9
Основные принципы:
• Принцип однородности памяти
• Принцип адресности
• Принцип программного управления
• Принцип двоичного кодирования
12. Язык программирования 12
Язык программирования — формальный язык, предназначенный для записи компьютерных
программ. Язык программирования определяет
набор лексических, синтактических и семантических правил, определяющих внешний вид
программы и действия, которые выполнит исполнитель (обычно — ЭВМ) под её управлением.
А что это?
13. Парадигмы программирования 13
Императивное программирование — это парадигма программирования для которой
характерно следующее:
• в исходном коде программы записываются инструкции (команды);
• инструкции должны выполняться последовательно;
• при выполнении инструкции данные, полученные при выполнении предыдущих инструкций,
могут читаться из памяти;
• данные, полученные при выполнении инструкции, могут записываться в память.
Декларативное программирование — это парадигма программирования, в которой
задаётся спецификация решения задачи, то есть описывается, что представляет собой
проблема и ожидаемый результат.
Классификация
15. Процедурное программирование 15
Процедурное программирование — программирование на императивном языке, при котором
последовательно выполняемые операторы можно собрать в подпрограммы, то есть более
крупные целостные единицы кода, с помощью механизмов самого языка.
Примеры:
• C
• Pascal
Классификация
16. Функциональное программирование 16
Функциональное программирование - раздел дискретной математики и
парадигма программирования, в которой процесс вычисления трактуется как вычисление
значений функций в математическом понимании последних (в отличие от функций как
подпрограмм в процедурном программировании).
Примеры:
• Erlang
• Hasckell
Классификация
17. Логическое программирование 17
Логическое программирование - парадигма программирования, основанная на
автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий
принципы логического вывода информации на основе заданных фактов и правил вывода.
Примеры:
• Planner
• Prolog
Классификация
18. Объектно-ориентированное программирование 18
Объектно-ориентированное программирование — методология программирования,
основанная на представлении программы в виде совокупности объектов, каждый из которых
является экземпляром определенного класса, а классы образуют иерархию наследования
Примеры:
• Java
• C#
• C++
Классификация
19. Уровень Абстракции 19
Уровень Абстракции — один из способов сокрытия деталей реализации определенного набора
функциональных возможностей. Применяется для управления сложностью проектируемой
системы при декомпозиции, когда система представляется в виде иерархии уровней
абстракции.
Пример уровней абстракции.
• Слой аппаратных абстракции
• Прошивка
• Язык ассемблера
• Ядро операционной системы
• Приложения
Классификация
22. История 22
• Создатель Гвидо Ван Россум
• Появился после того, как Гвидо работал над учебным языком ABC в конце 80х годов
• Первую версию опубликовал в 1991 году.
• Текущая версия 3.7 ( 14 августа 2017 года)
23. Философия 23
• Красивое лучше, чем уродливое.
• Явное лучше, чем неявное.
• Простое лучше, чем сложное.
• Сложное лучше, чем запутанное.
• Плоское лучше, чем вложенное.
• Разреженное лучше, чем плотное.
• Читаемость имеет значение.
• Особые случаи не настолько особые, чтобы нарушать правила.
• При этом практичность важнее безупречности.
• Ошибки никогда не должны замалчиваться.
• Если не замалчиваются явно.
• Встретив двусмысленность, отбрось искушение угадать. Должен существовать один — и,
желательно, только один — очевидный способ сделать это.
• Хотя он поначалу может быть и не очевиден, если вы не голландец.
• Сейчас лучше, чем никогда.
• Хотя никогда зачастую лучше, чем прямо сейчас.
• Если реализацию сложно объяснить — идея плоха.
• Если реализацию легко объяснить — идея, возможно, хороша.
• Пространства имён — отличная штука! Будем делать их побольше!
24. Утиная типизация ( Duck Typing) 24
Если это выглядит как утка, плавает как утка и крякает как утка, то это, возможно, и есть утка.
25. Переменные 25
Переменная — это простейшая именованная структура данных, в которой может быть сохранён
промежуточный или конечный результат работы программы.
Пример:
a = 10
b = 3.1415926
c = "Hello"
d = [1, 2, 3]
Типы переменных (объектов):
• Целочисленные (int) Список (list)
• С плавающей точкой (float) Словарь (dict)
• Строки (юникод строки) (str) Множество (set)
• None
26. Операторы 26
Большинство предложений (логических строк) в программах содержат выражения. Простой
пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды.
Операторы – это некий функционал, производящий какие-либо действия, который может быть
представлен в виде символов, как например +, или специальных зарезервированных слов.
Операторы могут производить некоторые действия над данными, и эти данные
называются операндами. В нашем случае 2 и 3 – это операнды.
Примеры операторов:
• +,-,*,/ - операторы математических действий
• >,<,<=,>=, == - операторы сравнения
• not, and, or – логические операторы
• x[индекс] – обращение по индексу
• f(аргумент, …) – вызов функции
27. Условные операторы 27
if test1:
state1
elif test2:
state2
else:
state3
if test1:
state1
else:
state2
if test1:
state1
28. Циклы 28
for i in range(0,5):
print(i * 2)
0 2 4 6 8
i = 5
while i < 15:
print(i)
i = i + 2
5 7 9 11 13
29. Функции 29
Фукнция - последовательность инструкций, возвращающая некое значение.
def add(x, y):
return x + y
>>> add(1, 10)
11
>>> add('abc', 'def')
'abcdef’
Анонимные функции:
>>> (lambda x, y: x + y)(1, 2)
3
>>> (lambda x, y: x + y)('a', 'b')
'ab'
Additional information
30. Классы и объекты 30
Класс – тип, описывающий устройство объектов.
Объект — это экземпляр класса.
Класс можно сравнить с чертежом, по которому создаются объекты.
В Python все абсолютно является объектами.
>>> class Car:
def move(self): # self - обязательный аргумент, содержащий в себе экземпляр
# класса, передающийся при вызове метода,
# поэтому этот аргумент должен присутствовать
# во всех методах класса.
return “Car is moving”
>>> my_car = Car()
>>> my_car.move()
“Car is moving”
31. Пример 31
Задача. Создать список студентов. Реализовать возможность выводить отсортированный по
возрастанию среднего бала список.
Выглядит не сложно
32. Пример 32
Описываем студента
class Student:
description = "This is shared attribute for all instances of students"
def __init__(self, name, group_id):
self.name = name
self.avg_grade = 0
self.group_id = group_id
self.marks = []
def describe(self):
print("My name is %s, I'm studing in group %d and my average_grade is %.2f»
%(self.name, self.group_id, self.avg_grade))
def get_marks(self):
for i in range(0,10):
mark = random.randint(1,10)
self.marks.append(mark)
self.recalculate_avg()
def recalculate_avg(self):
self.avg_grade=sum(x for x in self.marks)/len(self.marks)
33. Пример 33
Создаем студентов
NAMES = ["Olga", "Petr", "Natalia", "Fedor", "Vlad", "Maksim"]
GROUPS = [121,221]
def create_student(name, group_id):
s = Student(name,group_id)
s.get_marks()
s.describe()
return s
if __name__ == '__main__':
students = []
print ("Creating students")
while len(NAMES) >0:
name = NAMES.pop()
random_group_id = random.randint(0,1)
student = create_student(name, GROUPS[random_group_id])
students.append(student)
34. Пример 34
Сортируем студентов
print ("Ordered students by avg mark")
sorted_students = sorted(students,key=lambda student:student.avg_grade)
for s in sorted_students:
s.describe()
Creating students
My name is Maksim, I'm studieng in group 221 and my average_grade is 7.10
My name is Vlad, I'm studieng in group 221 and my average_grade is 6.40
My name is Fedor, I'm studieng in group 221 and my average_grade is 4.60
My name is Natalia, I'm studieng in group 121 and my average_grade is 5.50
My name is Petr, I'm studieng in group 221 and my average_grade is 6.20
My name is Olga, I'm studieng in group 121 and my average_grade is 5.10
Order students by avg mark
My name is Fedor, I'm studieng in group 221 and my average_grade is 4.60
My name is Olga, I'm studieng in group 121 and my average_grade is 5.10
My name is Natalia, I'm studieng in group 121 and my average_grade is 5.50
My name is Petr, I'm studieng in group 221 and my average_grade is 6.20
My name is Vlad, I'm studieng in group 221 and my average_grade is 6.40
My name is Maksim, I'm studieng in group 221 and my average_grade is 7.10
35. Вместо вывода 35
• Существует огромное количество различных языков программирования
• Язык программирования – это инструмент, который позволяет «сказать» машине, что ей
нужно сделать
• Самыми простыми для восприятия и пользования являются процедурные языки
• Многие современные языки совмещают в себе несколько парадигм программирования
• Само по себе кодирование не является сложной задачей ( на мой взгляд скоро тут человека
заменит ИИ)
• Более сложной и интересной задачей является описание сущностей, связей между ними и
построение систем.
• Написание кода это навык – пробуйте, тренируйтесь и вы сможете облегчить себе и другим
жизнь, поручив машине выполнять рутинную работу.
Машина Беббиджа. Адда Лавлейс вычисление числе Бернулли.
Вычислительные алгоритмы и управляющие.
Попытки формализации: рекурсивные функции, лямда исчесления, нормальный алгоритм Маркова, Машина Тьюринга
30ые годы.
Тезис Чёрча — Тьюринга
Конечный автомат
А какое дальнейшее развитие вы видите?
А как сейчас пытаются обойти ограничения модели фон Неймана
Привести пример использования функционального языка на практике. Телекоммуникации, лямбда-исчесления. Нет переменных! Мы оперируем только понятием функция.