Зачем изучать языки,
на которых почти не пишут
Алексей Воинов
разработчик-эксперт



YaC, Москва, 19 сентября 2011 года
О чём это?




             2
Функциональные
   vs Императивные

Промышленные
   vs Академические
                  3
О чём это?




             4
О чём это?




             5
6




    6
6+1




      7
8
Зачем учить?
  Любопытство
  Видение мира
  Понимание
  Заимствование
  Общение
  Работа
                  9
Любопытство




              10
clojure
(def N (atom 0))
(defn foo [] (dotimes [i 100000]
               (swap! N inc)))
(defn start-threads []
  (let [t1 (Thread. foo)
        t2 (Thread. foo)]
    (do (.start t1)
        (.start t2)
        (.join t1)
        (.join t2))))

(defn main [] (start-threads) @N)
                                    11
haskell     или        q?

fact 0 = 1;
fact N = N * fact (N - 1);




                         12
gambit-c                         (scheme)
(define fifo (open-vector))

(define (suspend-and-die!)
  (call-with-current-continuation
   (lambda (k)
     (write (call-with-output-string
             '()
             (lambda (p)
               (output-port-readtable-set!
                 p
                 (readtable-sharing-allowed?-set
                   (output-port-readtable p)
                   'serialize))
               (write obj p))) fifo)
     (newline fifo)
     (force-output fifo)
     (thread-terminate! (current-thread)))))       13
whitespace   ......».».$
             ...»».»»»»$
             ...»».»»..$
             ...»».»»..$
             ...»»..».»$
             ...»..»...$
             »$
             ..»$
             ..»$
             ..»$
             ..»$
             ..»$
             ..$
             $
             $             14
Зачем учить?
  Любопытство
  Видение мира
  Понимание
  Заимствование
  Работа
  Общение
                  15
Видение мира




               16
Первый взгляд
(define (factorial n)
  (letrec ((helper
            (lambda (n a)
              (if (<= n 1) a
                 (helper (- n 1)
                         (* a n))))))
    (helper n 1)))


                                        17
Что видят лисперы
(define (factorial n)
  (letrec ((helper
            (lambda (n a)
              (if (<= n 1) a
                 (helper (- n 1)
                         (* a n))))))
    (helper n 1)))


                                        18
С + Assembly
printf("%dn", (int *)2 + 3));


         movl    $2, %eax
         addl    $12, %eax
         movl    %eax, 4(%esp)
         movl    $.LC0, (%esp)
         call    printf

                                 19
Зачем учить?
  Любопытство
  Видение мира
  Понимание
  Заимствование
  Работа
  Общение
                  20
Понимание   21
С++ / Scheme
std::for_each(str.begin(), str.end(),
  phx::if_(phx::bind(std::isalpha<char>, _1,
      phx::construct<std::locale>()))
  [
    phx::let(_a = phx::ref(char_counts)[_1])
    [
      ++_a
    ]
  ]);


                                               22
Больше слов




              23
Зачем учить?
  Любопытство
  Видение мира
  Понимание
  Заимствование
  Работа
  Общение
                  24
Заимствование




                25
Haskell + C++




                26
Scheme + Erlang
          = Termite
(let ((me (self)))
  (spawn
   (lambda ()
     (! me "Hello, world!"))))

(?)
                        Hello, world!

                                        27
…?key=value&...
string::size_type s = 0;
string::size_type e = src.find("=");
while(e != string::npos) {
  string::size_type a = src.find("&");
  if(a != string::npos) {
    ...



                                         28
…?key=value&...
typedef iterator_range<string::iterator> Ir;
std::vector<Ir> params;
split(params,
      make_iterator_range(src.begin(),
                          src.end()),
      _1 == '&');
BOOST_FOREACH(Ir& ir, params) {
  ...



                                               29
…?key=value&...
lazy_split_iterator
  s(src.begin(), src.end(), '&'),
  e;
for_each(s, e,
  ...




                                    30
Зачем учить?
  Любопытство
  Видение мира
  Понимание
  Заимствование
  Работа
  Общение
                  31
Мы пишем
плохой код


             32
Есть причины
   некогда думать
   унаследованный код
   лень



                        33
Знаем больше
  больше видим
  лучше понимание
  знаем новые идеи
  не боимся их применять


                           34
Работаем лучше
  пишем чище
  пишем быстрее
       больше времени
       лучше код


                        35
Зачем учить?
  Любопытство
  Видение мира
  Понимание
  Заимствование
  Работа
  Общение
                  36
Круг общения




               37
Повод похвастаться




                 38
Y-combinator




               39
Зачем учить?
  Спокойный сон
  Больше информации
  Тренировка ума
  Хорошие решения
  Чистый код
  Признание и авторитет
                          40
Учите языки




              41
Спасибо
     Алексей Воинов
     voins@yandex-team.ru
     http://voins.program.ru/yac.html




            Вопросы?

Зачем обычному программисту знать языки, на которых почти никто не пишет. Алексей Воинов, Яндекс