42
[email protected] Денис Бугарчев ШРИ 2013 Языки программирования

2013 09 21 языки программирования

  • Upload
    yandex

  • View
    3.188

  • Download
    4

Embed Size (px)

Citation preview

Page 1: 2013 09 21 языки программирования

[email protected]

Денис Бугарчев

ШРИ 2013 Языки программирования

Page 2: 2013 09 21 языки программирования

Общая структура лекции

Какие бывают языки, чем они отличаются?

Зачем они нужны, зачем их учить?

О, круто, давайте учить!

Page 3: 2013 09 21 языки программирования

Что такое программирование?

Написание программ :)

Решение задач с помощью компьютера

Page 4: 2013 09 21 языки программирования

Что такое программирование?

Как работает компьютер?

Последовательное выполнение простейших инструкций.

Самые базовые языки, asmы и машинный код

Page 5: 2013 09 21 языки программирования

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

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

Уровни тоже бывают разные от C до JS

Классификация

Page 6: 2013 09 21 языки программирования

Способ исполнения кода

Компиляция и интерпретация

Page 7: 2013 09 21 языки программирования

Способ исполнения кода

Компиляция и интерпретация

текст программы --> машинный код, который исполняется

или исполняется интерпретатор

Page 8: 2013 09 21 языки программирования

Способ исполнения кода

Компилируемые: C, C++, Delphi,...

Интерпретируемые: Lua, XSLT,...

Java?

PHP?

Page 9: 2013 09 21 языки программирования

Языки высокого уровня

Почему их так много?

Page 10: 2013 09 21 языки программирования

Языки высокого уровня

Почему их так много?

Зависть, лень, жадность как двигатели прогресса.

Page 11: 2013 09 21 языки программирования

Языки высокого уровня

Клонирование других языков (лучше, по-своему)

Желание писать меньше кода (более специфичный, подходящий к задачам)

Экономия времени и денег (время выполнения время разработки)

+объективная реальность: развитие платформ, масштабируемость

Page 12: 2013 09 21 языки программирования

Языки высокого уровня

манипулируют абстракциями, но абстракция у каждого своя

Много классификаций про то как писать

Page 13: 2013 09 21 языки программирования

Подход aka парадигма

процедурные (Ada, Pascal,..)

объектно-ориентированные (Java, Ruby,..)

функциональные (Erlang, Haskell,..)

логические (Prolog, Curry,..)

смешанные (LISP, Lua, JS)

Page 14: 2013 09 21 языки программирования

Стиль управления

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

Python, Java, Ruby, .........

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

make, XSLT, логические, ....

Page 15: 2013 09 21 языки программирования

Специализация

Универсальные

C++, JS, ...

Предметные

RegExp, make, учебные, ...

Page 16: 2013 09 21 языки программирования

Зачем учить (другие) языки?

Бубубу, мне ничего не надо, я знаю (?) javascript

Page 17: 2013 09 21 языки программирования

Зачем учить языки?

Это интересно

Page 18: 2013 09 21 языки программирования

Зачем учить языки?

Это интересно

Расширяет горизонт

Page 19: 2013 09 21 языки программирования

Зачем учить языки?

Это интересно

Расширяет горизонт

Помогает писать на основном языке

Page 20: 2013 09 21 языки программирования

Зачем учить языки?

Это интересно

Расширяет горизонт

Помогает писать на основном языке

Лучше понимаете современные подходы

Page 21: 2013 09 21 языки программирования

Зачем учить языки?

Это интересно

Расширяет горизонт

Помогает писать на основном языке

Лучше понимаете современные подходы

Расширяете доступный вам контент

Page 22: 2013 09 21 языки программирования

Зачем учить языки?

Это интересно

Расширяет горизонт

Помогает писать на основном языке

Лучше понимаете современные подходы

Расширяете доступный вам контент

Можно, наконец, определиться со специализацией

Page 23: 2013 09 21 языки программирования

Вопросы

Page 24: 2013 09 21 языки программирования

Практика

Смотрим на Haskell

функциональный, популярный, необычный

Page 25: 2013 09 21 языки программирования

Haskell

Типы данных

Работа с листами

Функции

Рекурсия

Page 26: 2013 09 21 языки программирования

-- Числа

3 -- 3

1 + 1 -- 2

10 * 2 -- 20

35 / 4 -- 8.75

35 `div` 4 -- 8 (деление без остатка)

Page 27: 2013 09 21 языки программирования

-- Булевские переменные

True

False

not False -- True

1 == 1 -- True

1 /= 1 -- False

Page 28: 2013 09 21 языки программирования

-- строки и символы

"это строка"

'a' -- символ

'строки только в двойных кавычках' -- error!

-- конкатенация

"Hello " ++ "world!" -- "Hello world!"

-- строка - лист символов

"СТРОКА" !! 0 -- 'С'

-- !! - обращение к индексу

Page 29: 2013 09 21 языки программирования

-- листы базовая структура

[1, 2, 3, 4, 5]

[1..5]

['a'..'z']

-- могут быть бесконечными!

[1..]

[1..] !! 999 -- 1000 (soo lazy)

Page 30: 2013 09 21 языки программирования

-- сложение

[1..5] ++ [6..10]

-- добавление в начало

0:[1..5] -- [0, 1, 2, 3, 4, 5]

-- базовые операции

head [1..5] -- 1

tail [1..5] -- [2, 3, 4, 5]

init [1..5] -- [1, 2, 3, 4]

last [1..5] -- 5

Page 31: 2013 09 21 языки программирования

-- list comprehensions (генераторы листов)

[x*2 | x <- [1..5]] -- [2, 4, 6, 8, 10]

-- возможно условие

[x*2 | x <- [1..5], x*2 > 4] -- [6, 8, 10]

Page 32: 2013 09 21 языки программирования

-- Tuple (кортеж)

-- в кортежах тип данных любой, но

-- длина фиксирована

("haskell", 1)

-- доступ к элементам

fst ("haskell", 1) -- "haskell"

snd ("haskell", 1) -- 1

Page 33: 2013 09 21 языки программирования

-- Теперь о функциях

-- определяем функцию

add a b = a + b

-- используем

add 1 2 -- 3

-- можно так

1 `add` 2 -- 3

Зачем?

Page 34: 2013 09 21 языки программирования

-- определяем свой оператор!

(//) a b = a `div` b

(//) a b = div a b

35 // 4 -- 8

К рекурсии!

Page 35: 2013 09 21 языки программирования

-- Числа Фиббоначи (guard)

fib x

| x < 2 = x

| otherwise = fib (x - 1) + fib (x - 2)

-- Числа Фиббоначи (pattern)

fib 1 = 1

fib 2 = 2

fib x = fib (x - 1) + fib (x - 2)

Page 36: 2013 09 21 языки программирования

-- Карринг(currying)

-- прокидывает недостающие аргументы

add a b = a + b

foo = add 10 -- на основе нашей функции

foo 5 -- 15

И это только самые основные основы!

Page 37: 2013 09 21 языки программирования

Пример

Как работает qsort (сортировка Хоара)?

Page 38: 2013 09 21 языки программирования

Пример на JS

function sort(array, less) { function swap(i, j) { var t=array[i]; array[i]=array[j]; array[j]=t } function quicksort(left, right) { if (left < right) { var pivot = array[(left + right) >> 1]; var left_new = left, right_new = right;

Page 39: 2013 09 21 языки программирования

Пример на JS

do { while (less(array[left_new], pivot) left_new++; while (less(pivot, array[right_new]) right_new--; if (left_new <= right_new) swap(left_new++, right_new--); } while (left_new <= right_new);

Page 40: 2013 09 21 языки программирования

Пример на JS

quicksort(left, right_new); quicksort(left_new, right); } } quicksort(0, array.length-1); return array; }

Page 41: 2013 09 21 языки программирования

Haskell qsort

qsort [] = []

qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater

where lesser = filter (< p) xs

greater = filter (>= p) xs

Page 42: 2013 09 21 языки программирования

Задание

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

1) на хаскелле

2) на любом незнакомом языке (лучше не функциональном чтоб интереснее)