Сколько ты себя помнишь, компьютеры и электроника привлекали тебя. К моменту твоего совершеннолетия ты уже верно стоял на пути профессионального программиста. Первая интернетская золотая лихорадка была в самом разгаре, и вас, нердов, повсюду величали героями Новой Экономики на обложках журналов Fast Company и Wired, и нерды гребли деньги лопатой, делая то же, что любишь делать ты.
В начале 80-х я работал в исследовательском отделе местной телефонной компании Кремниевой долины. Мой отдел состоял в основном из кандидатов наук и одаренных хакеров. Как вы понимаете, контора была UNIX-ориентированной.
Менеджер группы был исключением: ни научного звания, ни технического образования. Он явно отдавал себе в этом отчет. Мы подозревали, что он (ошибочно, как мы думали) не очень уверен в уровне своего образования и ума. Однажды произошла история, которая подтвердила наши подозрения: он сообщил нам, что его пугает учёность нашего отдела, и что он будет предпринимать шаги, чтобы что-то сделать с этим. Выход он нашел неожиданный: “Мне надо повышать уровень интеллекта”, сказал он, “Я собираюсь выучить UNIX.”
Эксперимент GEO600, Ганновер. В чистом поле — две перпендикулярные траншеи, покрытые металлом. Внутри — детектор, длиной 600 метров. Последние 7 лет там искали (не нашли) гравитационные волны, испускаемые нейтронными звездами и черными телами. Ученые в лаборатории не знали, как объяснить странный шум в результатах измерений. Внезапно появился некий Хоган (Hogan, USA) с объяснением. По его словам, GEO600 наткнулась на фундаментальное ограничение пространства-времени — точку, где континуум уже не может быть представлен как сплошной (по Эйнштейну), а ведет себя как «зерна», типа зернистости фотографии в газете. «GEO600 замеряет квантовые колебания пространства-времени. Если там происходит именно это то, то мы все живем в большой космической голограмме», говори Хоган.
Эксперимент GEO600, Ганновер. В чистом поле — две перпендикулярные траншеи, покрытые металлом. Внутри — детектор, длиной 600 метров. Последние 7 лет там искали (не нашли) гравитационные волны, испускаемые нейтронными звездами и черными телами. Ученые в лаборатории не знали, как объяснить странный шум в результатах измерений. Внезапно появился некий Хоган (Hogan, USA) с объяснением. По его словам, GEO600 наткнулась на фундаментальное ограничение пространства-времени — точку, где пространство-время уже не может быть представлено как сплошной континуум Эйнштейна, а ведет себя как «зерна», типа зернистости фотографии в газете. «GEO600 замеряет квантовые колебания пространства-времени. Если в лаборатории GEO600 происходит именно это то, то мы все живем в большой космической голограмме», говори Хоган.
Что еще осталось? Мы пропустили место, в котором два смежных опкода превращаются в один. Что мы имели? По спецификации проходили следующие операции:
flag = m20 > 0
if (flag) m222 = m3 else m222 = m4
Исследуя бинарные файлы на предмет того, как эти конструкции используются, мы поняли, что они ходят парой Cmp, затем Phi. Наверняка, потому что так скомпилировались организаторами из каких-то их исходных формул ихним каким-то компилятором. Ну, раз так, то мы их немножко склеим в одну операцию:
Это императивный кусок, потому что с файлами так в основном и работают. withBinaryFile открывает файл, выполняет указанную ей «пользовательскую» функцию, передав ей handle, и закрывает файл, и возвращает то, что вернула ей пользовательская функция. Вот, после знака $ мы описали «пользовательскую» функцию с одним параметром h (от handle). Эта функция получает размер файла, аллоцирует буфер, читает в буфер и возвращает сам буфер и его длину (в байтах). Заметим, что «пользовательская функция» здесь не имеет имени и начинается так:
Здесь мы будем разбирать по буквам некую программу (компилятор VM) на Хаскеле. На вход этому компилятору дается бинарный файл с инструкциями некоего процессора, где в этих инструкциях описываются некие вычисления. На выходе нашего компилятора получается текст программы, тоже на Хаскеле, которая производит те же самые вычисления, с большой скоростью. Возможно, это не компилятор, а декомпилятор, не знаю. Сравнение работы результирующих программ на Haskell/Java приводится в предыдущем посте.
Сегодня на хабре проходила статья про Nemerle и ICFP 2009. Я хотел бы поделиться собственными изысканиями на эту тему, которые сделал недавно. Моей задачей было написать идеальный компилятор VM из задания, сделать это на Хаскеле, а главное, сравнить скорости результирующего кода на Java и на Haskell. Здесь не приводится полное решение задачи для ICFP, потому что задача эта переборная, и VM в ней — самое внутреннее место, от которого зависит производительность переборного решения, этим она и интересна.