Программирование для многоядерных процессоров подразумевает параллельное исполнение, с которым сопряжены принципиальные сложности, напомнил Брэй, выступая в июле на конференции O’Reilly Open Source Convention (OSCON 2010).
«Параллелизм — это трудно. С ним связано множество проблем, сложных для понимания, — заявил Брэй. — Игнорирование особенностей параллельного исполнения приводит к ошибкам и появлению узких мест производительности».
Однако функциональное программирование, реализуемое языками наподобие Erlang и Clojure, предосталяет способы справиться с параллелизмом, утверждает он.
«Идея функционального программирования строится на том, что данные незыблемы. Их нельзя использовать совместно, — указал Брэй. — А когда данными нельзя пользоваться совместно, разработчикам не надо заботиться о возможности одновременного изменения данных двумя разными процессами. Принцип незыблемости дает возможность пользоваться указателями вместо реальных данных».
Erlang, по утверждению Брэя, «пуленепробиваем» и высокопроизводителен. Изначально он был создан для программирования крупных телефонных коммутаторов с сотнями тысяч процессоров. В Erlang нет классов, объектов и переменных, и обработка файлов реализована на примитивном уровне, но у него все же есть масса преимуществ.
Clojure, как объяснил Брэй, представляет собой диалект Lisp, который работает на виртуальных машинах Java и компилируется в байткод Java, что делает язык чрезвычайно быстрым.
Исторически считалось, что программировать для параллельных процессоров необходимо с использованием потоков, однако потоки допускают множественный доступ к данным и возможность их изменения, а, как уверен Брэй, «разработчики приложений не умеют программировать потоки, не понимают, как это делать, и никогда не поймут».