Зачем обычному программисту знать языки, на которых...
DESCRIPTION
Алексей Воинов, Яндекс Закончил МГТУ им. Н.Э.Баумана в 1998 году. Посвятил часть своей жизни свободному программному обеспечению. Замечен в любви к языкам, как к алгоритмическим, так и к человеческим, как к естественным, так и к искусственным. Работает в Яндексе с 2009 года, занимается разработкой Яндекс.Почты. Тема доклада Зачем обычному программисту знать языки, на которых почти никто не пишет. Тезисы Есть категория алгоритмических языков, которые большинство программистов считает в лучшем случае странными. Это такие языки как Haskell, *ML, Lisp, Q. «Странные» языки не приживаются в промышленной разработке софта, потому что они не дают возможности писать стандартный «промышленный» код. Однако они бывают очень хороши для придумывания приёмов, которые помогают улучшить промышленный код. Впоследствии многие из них становятся стандартными промышленными. Знание «странных» языков очень полезно, когда в силу внешних обстоятельств сделать промышленный код радикально лучше невозможно, но его можно улучшать небольшими шагами.TRANSCRIPT
YaC, Москва, 19 сентября 2011 года
разработчик-экспертАлексей Воинов
Зачем изучать языки,на которых почти не пишут
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
gambit-c(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)))))
(scheme)
13
whitespace ......».».$...»».»»»»$...»».»»..$...»».»»..$...»»..».»$...»..»...$»$..»$..»$..»$..»$..»$..$$$ 14
(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("%d\n", (int *)2 + 3));
movl $2, %eax addl $12, %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf
19
С++ / 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
Scheme + Erlang
(let ((me (self))) (spawn (lambda () (! me "Hello, world!"))))
(?)
= Termite
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
Зачем учить?Спокойный сонБольше информацииТренировка умаХорошие решенияЧистый кодПризнание и авторитет
40