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

Preview:

Citation preview

begebot@yandex-team.ru

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Java?

PHP?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C++, JS, ...

Предметные

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вопросы

Практика

Смотрим на Haskell

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

Haskell

Типы данных

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

Функции

Рекурсия

-- Числа

3 -- 3

1 + 1 -- 2

10 * 2 -- 20

35 / 4 -- 8.75

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

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

True

False

not False -- True

1 == 1 -- True

1 /= 1 -- False

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

"это строка"

'a' -- символ

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

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

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

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

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

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

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

[1, 2, 3, 4, 5]

[1..5]

['a'..'z']

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

[1..]

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

-- сложение

[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

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

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

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

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

-- Tuple (кортеж)

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

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

("haskell", 1)

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

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

snd ("haskell", 1) -- 1

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

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

add a b = a + b

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

add 1 2 -- 3

-- можно так

1 `add` 2 -- 3

Зачем?

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

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

(//) a b = div a b

35 // 4 -- 8

К рекурсии!

-- Числа Фиббоначи (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)

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

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

add a b = a + b

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

foo 5 -- 15

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

Пример

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

Пример на 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;

Пример на 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);

Пример на JS

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

Haskell qsort

qsort [] = []

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

where lesser = filter (< p) xs

greater = filter (>= p) xs

Задание

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

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

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

Recommended