Created
March 22, 2010 14:07
-
-
Save ryukzak/340102 to your computer and use it in GitHub Desktop.
Erlang план лекции
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Erlang | |
=============== Заглавие ========== | |
О чём будет данная лекция. | |
- описание области, о которой пойдёт речь. | |
- описание стилистики изложения (сравнение с традиционными | |
методами). | |
- причины для развития инструментария. (Дейкстра) | |
- почему сегоднешнее положение дел именно такое. | |
=============== Инструментарий, Дейкстра ========== | |
- да кто он собственно такой, этот Дейкстра. | |
- "смиренный программист". | |
- сложность решаемых задач. | |
- ограниченность человека. | |
- ограничения и абстракция. | |
- пример абстракции - ООП. Пример ограничения - структурное | |
программирование. | |
=============== История ========== | |
- Два подхода к описанию вычислительного процесса. | |
- Тьюринг (машина тьюринга). Практический подход. Развитие идеи | |
машины Тьюринга (лента заменена памятью, бегающая головка | |
заменена управляющим устройством и АЛУ). Императивный стиль | |
описания алгоритма. Строгое разделение программы и данных. | |
- Алонзо Чёрч (лямбда исчисление). Вычесление само по | |
себе. Аппликативный стиль описания алгоритмов. Отсутствие | |
строго разделения программы и данных. | |
- причины сегодняшнего положения дел. Детские | |
болезни. Привычка. Подстверждение эффективности опытом. | |
Желание получить всё и сейчас без продумывания наперёд. | |
- Erlang - пример варианта решения практической задачи с учётом | |
теоретических выводов. Доказанность эффективности в | |
промышленности. | |
=============== История Erlang-а ========== | |
- описание задачи, стоящей перед Erricson. (комутация телефонии, | |
отказоустойчивость, распределённость, многопоточность) | |
- история языка. 7 лет проект предшественник на базе Prolog и | |
С. 3 года проекта на Erlang-е и результат. | |
=============== Многопоточность в традиционных языках ========== | |
- принципы многопоточности в традиционных системах. | |
- разделяемые, общие состояния. | |
- принципиальный недетерминизм подобных систем. (deadlock) | |
- синхронизация и блокировки. | |
- побочные эффекты. Множественные, не синхронизированные точки | |
входа. (речь о том, что код может быть запущен очень много | |
откуда) | |
=============== Многопоточность в Erlang. теория ========== | |
- Выбор принципиально другой модели параллельных вычислений. Сети | |
процессов Кана. | |
- Клиент - серверная модель. | |
- Строго определены точки входа и выхода процессов, они | |
синхронизированы. | |
- Выбор функциональной парадигмы программирования. Навязывание | |
детерминизма. Упрощение отладки. | |
=============== Многопоточность в Erlang. практика ========== | |
- Реализация многопоточности в Erlang. Требования к памяти на | |
процесс (309 слов включая 233 для кучи). | |
- Рост производительности с ростом количества ядер. (до 20 штук | |
45 градусов) | |
- Тысячи потоков на 1-ом узле - норма. Низкая цена их содния. | |
- Local, Global пространства имён. Прозрачное для программиста | |
работа со множеством узлов. | |
- Пример кода, с пояснением pattern matching. | |
<code> -- пишется пока расказываются предыдущие пункты. | |
-module(counter). | |
-export(next/0, reset/0, start/0, stop/0). | |
next() -> | |
counter ! {next, self()}, | |
receive | |
X when is_integer(X) -> {ok, X}; | |
_ -> {error, incorrect_value} | |
after 10 -> {error, timeout} | |
end. | |
reset() -> | |
counter ! reset. | |
start() -> | |
spawn(counter, counter, []). | |
stop() -> | |
counter ! stop. | |
counter() -> | |
register(counter), | |
loop(0). | |
loop(N) -> | |
receive | |
{next, Pid} -> Pid ! N, | |
loop(N + 1); | |
reset -> loop(0); | |
stop -> ok | |
end. | |
</code> | |
- Пример на традиционном языке. Имхо, надо показать в развитие, | |
подчёркивая потенциально упущенные моменты. Можно спросить, | |
есть ли тут ещё косяки? | |
<code> | |
int next(){ | |
int tmp; | |
lock(L); | |
tmp = count; | |
count++; | |
unlock(L); | |
return tmp; | |
} | |
int reset(){ | |
lock(L); | |
count = 0; | |
unlock(L); | |
} | |
</code> | |
<code> | |
int next(){ | |
int tmp = -1; | |
try{ | |
lock(L); | |
tmp = count; | |
count++; | |
}final{ | |
unlock(L); | |
} | |
return tmp; | |
} | |
int reset(){ | |
try{ | |
lock(L); | |
count = 0; | |
}final{ | |
unlock(L); | |
} | |
} | |
</code> | |
=============== Функциональное программирование ========== | |
- Общее положение дел с функциональным программированием. | |
- Отсутствие переменных. | |
- Декларативный стиль программирования. (его элементы в случае с Erlang) | |
<code> | |
foreach x in list1 | |
if (x < n) then list2.add(x); | |
List2 = [X | X <- List1, X < N]. | |
</code> | |
;; Второй пример строго определён в отсутствие контекста в отличие | |
;; от первого. Возможные ошибки следующие из контекста. (побочный | |
;; эффект) | |
- Рекурсия, хвостовая рекурсия. | |
<code> | |
;; Решение идёт накапливанием с первых элиментов последоватлеьноти. | |
;; Необзодимо напомнить, что такое последовательность фибоначи. | |
fib(0) -> 1; | |
fib(1) -> 1; | |
fib(N) -> fib(N, 2, 1, 1). | |
fib(N, N, A, B) -> A + B; | |
fib(N, C, A, B) -> fib(N, C+1, B, B + A). | |
fib(N) -> fib(N-1) + fib(N-2). | |
</code> | |
- Функционалы. Замыкания. | |
<code> | |
max List = max_sub 0 List. | |
max_sub(Max, []) -> Max; | |
max_sub(Max, [Head|Tail]) when Max < Head -> max_sub(Head, Tail); | |
max_sub(Max, [Head|Tail]) -> max_sub(Max, Tail); | |
</code> | |
<code> | |
max(List) = fold(fun (Max, Next) when Max < N -> Next; | |
(Max, Next) -> Max | |
end, 0, List). | |
</code> | |
- Пример реализации транзакций. | |
<code> | |
read_from_table(TableName, Key) -> | |
Fun = fun() -> mnesia:read({TableName, Key}) end, | |
mnesia:transaction(Fun). | |
</code> | |
=============== Open Telecom Platform ========== | |
OTP - Open Telecom Platform | |
Фреймворк для реализации распределённых, отказо-устойчивых систем. | |
Необходимые свойства подобных систем: | |
- Отказоустойчивость. | |
- Горячая замена кода. (в том чиле и с учётом ffi и быстрых откатов на старые версии) | |
- Расширяемость и распределённость. | |
Основные модули: | |
- gen_server | |
- super_visor (вот как раз тут можно сделать пример относительно mess) | |
- application, distribution application | |
- release | |
=============== Ограничения ========== | |
Отметка относительно области применения Erlang-a, дабы не было впечатления | |
универсальности. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment