Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Какой язык программирования изучать на перспективу

Меня тут недавно спросили — какой язык программирования следует изучить на перспективу. Я ответил в том духе, что никаких формальных признаков того, что язык будет перспективен лет через пять, не существует и до сих пор думаю, что прав. В самом деле, если взять «моду» на языки за последние десять лет, видно, что их успех определяется подводными течениями, которые со стороны увидеть трудно, компании неисповедимы, могут «выстрелить» чем-то, что разрабатывали втихую много лет.

Правда потом, по пути домой я задумался над этим более глубоко и теперь считаю, что популярность должны набирать языки, в которых легко, на уровне языка, делается параллелизация. Дома у меня меня ремонт сейчас и где-то в груде вещей лежит компьютер, который я покупал пять лет назад, там стоит чётвёртый «Пентиум» с тремя гигагерцами, а через шесть лет максимальная частота процессоров «Интел» находится на уровне 3,8 гигагерца (может чуть больше, не принципиально).

Над цифрами выше трудятся уже только оверклокеры, заливая штаны жидким азотом. Гонка частот уже, кажется, остановлена, началась гонка за количество ядер. Недавно был выпущен первый смартфон с четырьмя процессорами, а рабочая станция «Мак Про» поставляется в топовой конфигурацией с 12 процессорами. Сегодня на «Хабре» появилась новость о процессоре GA144, который будет продаваться за шестьсот рублей. У него 144 ядра.

Не говоря уже о GPU, у которых количество ядер приближается к тысячам.

Если взять какой-то язык, который легко умеет параллелиться, имеет более-менее привычный большинству (читай «си-подобный») синтаксис, компилятор или интерпретатор которого умеет использовать GPU в нужных местах (сортировки, поиск и прочее), то он может иметь успех со временем.

Причём «легко» не обязательно даже так, как это сделано в «Гоу» (хотя и желательно) — отдельной конструкцией языка (go), нет нужды сводить к этому всю идеологию языка, как в «Эрланге», просто чтобы это делалось, в тривиальных случаях, в одну-две строки, но было гибко управляемым в случае такой потребности. Нужно понижать порог вхождения в многозадачность, к чёрту подробности, в простейших случаях это должно делаться легко и просто, пусть и не особо эффективно.

Например, на «Пайтоне» как-то так:

@fork
def sort(arr):
    arr.sort()
    return arr

 # тут функция начала фоном работать
result = sort(somearray)

… много кода …

# а тут уже доступны результаты, если недоступны, то будем ждать
print([el for el in result if el])

Да, это не особо эффективно, нас уже приучили разбрасываться памятью, но ещё не приучили с лёгкостью разбрасываться ядрами, ничего привыкнем, когда их станет, как грязи.

Пока, наверное, верится с трудом. Но мой первый Айбиэм-совместимый компьютер имел жёсткий диск на 42 мегабайта, процессор там работал на частоте в пару десятков мегагерц, а памяти было около мегабайта, тогда я бы не поверил, если бы мне кто-то рассказал про терабайты, гигабайты и гигагерцы. Не успеете оглянуться, будем меряться гигаядрами.

9 комментариев
Внутреннее Коралио (kalvado.livejournal.com) 2011

Вопрос — а приходилось играться с системами графического программирования, типа LabView?
Оно конечно заточено под достаточно узкие задачи — и задачи видимо не ваши — но просто интересно мнение профессионала.
Паралеллизация там, кстати, вполне естественным образом получается.

Orcinus Orca (www.orcinus.ru) 2011

А я вот играюсь с микроконтроллерами, у них всего одно ядро, а вот частоты застряли на уровне 1997 года =).

Евгений Степанищев (bolknote.ru) 2011

Комментарий для kalvado.livejournal.com:

Вопрос, а приходилось играться с системами графического программирования, типа LabView?

Нет, не приходилось. Читал и смотрел на эту тему немного, попробую найти время и взглянуть.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для www.orcinus.ru:

А я вот играюсь с микроконтроллерами, у них всего одно ядро, а вот частоты застряли на уровне 1997 года =).

Это очень специфичные штуки, я про мейнстрим говорю.

jimidini (jimidini.ya.ru) 2011

ага… из массово-понятных языков с хорошей параллелизацией сейчас есть: D2, Go, Clojure.

Erlang и Haskell всё-таки сложнее в понимании.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для jimidini.ya.ru:

Clojure

Мне лиспоподобный синтаксис (я его ещё в Университете изучал) кажется неэстетичным. (Скобки (эти (все))

jimidini (jimidini.ya.ru) 2011

Комментарий для Евгения Степанищева:

Ну, не знаю… я довольно быстро перестаю их замечать :)
К тому же в Clojure есть некоторое количество синтаксического сахара позволяющего писать компактнее

Евгений Степанищев (bolknote.ru) 2011

Комментарий для jimidini.ya.ru:

Я как-то не научился их не замечать, как-то их много, даже вот на таком несложном примере:

 (defn run [nvecs nitems nthreads niters]
  (let [vec-refs (vec (map (comp ref vec)
                           (partition nitems (range (* nvecs nitems)))))
        swap #(let [v1 (rand-int nvecs)
                    v2 (rand-int nvecs)
                    i1 (rand-int nitems)
                    i2 (rand-int nitems)]
                (dosync
                 (let [temp (nth @(vec-refs v1) i1)]
                   (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))
                   (alter (vec-refs v2) assoc i2 temp))))
        report #(do
                 (prn (map deref vec-refs))
                 (println «Distinct:»
                          (count (distinct (apply concat (map deref vec-refs))))))]
    (report)
    (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))
    (report)))
 
 (run 100 10 10 100000)

podveg1ved4eka (podveg1ved4eka.livejournal.com) 2011

Теперь не стоит учить Action Script