office

связь

На днях оповещения от ЖЖ перестали приходить мне на почту (у кого-нибудь еще такое наблюдается? Upd: разобрался, проблема была в настройках моего сервера), заглянул в список сообщений тут на сайте, внезапно увидел персональное сообщение, которое было отправлено 2 месяца назад, но ЖЖ счел его подозрительным и на почту не продублировал.

Чтобы такого впредь не случалось, всем, кому это может понадобиться, сообщаю: мне можно (и лучше) писать на info@ мой ник тут .com.

(написано в марте 2015, пост поднят вверх для заметности)
office

London night life

Холода закончились, ставлю время от времени камеру во дворе. Интересно, будут ли в этом году новые лисята. Пока не видно.

office

A fast interpreter in < 90 lines

У меня новая игрушка. Недавно в рамках праздных раздумий о языкостроении пошел я с пустым ведром зачерпнуть мудрости у лиспоакадемиков. Стал смотреть на Racket (который вырос из PLT Scheme), почитал книжку Beautiful Racket и немного поигрался с описанными там инструментами. А тут еще как раз Racket 8 вышел с новым бэкендом. В предыдущих версиях там компилятор делал байткод, а тот уже в рантайме JITился. А в 8.0 они перешли на компилятор и бэкенд от Chez Scheme, где сразу нативный код генерится.
Сам Racket преподносится как платформа для создания языков. И стандартный рецепт, которому придерживается Beautiful Racket, это если захотел ты сделать свой бэйсик, то регистрируешь свой пакет basic из двух определенных частей (парсер и экспандер), потом пишешь исходник на бейсике, ставишь в нем первой строчкой #lang basic и используешь компилятор Racket. Тот видит первую строчку, достает твой пакет, скармливает остаток файла твоему парсеру (тут у тебя полная свобода по синтаксису), твой парсер производит parse tree, которое передается второй части твоего пакета, которая то дерево преобразует в дерево кода на самом Рэкете. Полученный код на Рэкете уже компилируется, и вот твой бэйсик и скомпилирован.
Но есть один момент, который та книжка почти не упоминает, но который позволяет не опираться на компилятор Рэкета. Дело в том, что в Рэкете есть eval, и вся машинерия компилятора уже содержится в твоем бинарнике. Можно сделать свой один бинарник, который будет парсить новый язык, также разворачивать его в конструкции Рэкета, и тут же выполнять через eval. Под капотом там генерация нативного кода, и скорость получается ничуть не хуже.
В качестве proof of concept сделаем интерпретатор, который сможет выполнять код такого вида:
fac(n) => if n < 2 then 1 else n * fac(n-1);

fib(n) => 
  if n < 2 then 1 
  else {
    a = fib(n-1);
    b = fib(n-2)
    in a + b 
  };

loop(x) => 
  if x < 20 then {
    print(fib(x), fac(x))
    in loop(x+1)
  } else 0;

loop(1)
Collapse )
office

Чемииннын онорыль пеупсида

Я раньше любил изучать какие-нибудь экзотические языки программирования и потом тут про них рассказывать, будь то Clean, ATS, CPL, Idris, Dafny и пр. Но некоторое время назад обнаружил, что как-то больше не вижу особо интересных ЯП, одни языки все повторяют один и тот же набор фич, другие углубляются в направления для меня не шибко интересные.
Но зуд-то остался. Пришла мысль, что хорошо бы поучить интересный язык не программирования. Настоящий. Только европейские языки какие-то скучные. Японский слишком большой. Китайский в чем-то проще, но тоже зубрить тысячи иероглифов, плюс сложная фонетика, плюс тона, а тонов мне в тайском хватило, больше не хочется. Зато вон есть японокитайский-лайт: корейский. Там нет тонов, там письменность, которая хоть внешне и похожа на иероглифы, на самом деле очень простая и учится за час. Там вполне доступная/привычная для русского человека фонетика (мы умеем говорить "ы"!) А больше я про него ничего и не знал на тот момент. Но решил попробовать.

К слову о фонетике, вот в меру разборчивый и не слишком быстрый пример. Кажется, что текст можно было бы записать русскими буквами, ничего особенно сложного в произношении не заметно.

(тут субтитры тайскими буквами, не обращайте внимания)

Поставил на телефон обучающие приложения, начал и... увлекся! В отличие от европейских языков, где нам многие слова знакомы и понятны, тут все поначалу максимально незнакомо, язык выглядит как шифр, как пазл. Тем интересней этот пазл решить, научиться этот шифр понимать. О чем поют корейские красавицы? Какие слова и обороты используют? Если просто взять перевод песни, видишь уже конечный результат трансляции, результат черного ящика, а интересно же понять внутреннюю логику языка, что конкретные слова означают и как соединяются в фразы. О занятных находках сегодня и поговорю.

В процессе оказалось, что многие слова все-таки знакомы. Вот слово звучит как монада. Вот слово звучит как JSON, теперь мы знаем как он переводится, похоже на правду. :) А вот "пукан" - так южнокорейцы называют Северную Корею. Collapse )
office

M1

Позапускал тут одну свою программку (тупое решение Project Euler #300, много простых операций с интами, умещающимися в кэше) на двух ноутах. На одном Intel Core i7, на другом Apple M1. Так вот, даже в режиме эмуляции x86_64 M1 немного быстрее. А в родном для него arm64 - много быстрее.



                        L=13 1-thread  parallel ; L=14 parallel
 Intel Core i7 2.6 GHz           20.0      4.06 ;         22.02
 M1 running x86_64              15.65      3.15 ;         18.06
 M1 running arm64               11.84      2.44 ;         13.7
                                       time in seconds

https://gist.github.com/thedeemon/ec45c44e14c3205075f66d4bc3f92abf
Компилятор на обоих - LDC (LLVM-based).

Кстати, про Project Euler. Вы решили задачку #100? Я чего-то туплю, не решил пока.
office

GC for tabs

Месяца полтора назад меня навели на мысль поискать что-то по этой теме. В браузере на тот момент было открыто около 150 вкладок, многие висели там месяцами или дольше, будучи когда-то открытыми, недочитанными и так оставленными когда-нибудь потом к ним вернуться. Это, конечно, самообман. Новые открытые вкладки добавляются в этот reading list быстрее, чем я к ним возвращаюсь, процесс не сходится. Поискав совсем чуть-чуть, быстро нашел расширение для браузера под названием Tab Wrangler. Он есть и для хрома, и для файрфокса. Принцип работы простой: если вкладка открыта где-то фоном, но на нее не переключались уже больше некоторого времени Т, то скорее всего там что-то не очень-то и нужное. Тогда она тихонько закрывается, а ссылка помещается в специальный список. В любой момент можно этот список посмотреть и если там все же что-то нужное, открыть оттуда вкладку обратно. Есть там так же настраиваемый белый список сайтов, которые он закрывать не будет, например, то что чисто по работе.
Я себе сделал период Т = 1 сутки. К чему сутки не возвращался, то тихонько исчезает из поля зрения и больше глаза не мозолит. Доставать что-то из списка закрытых, по моему опыту, приходится довольно редко. После шести недель в таком режиме, пожалуй, я доволен. Голова разгружается, фокус улучшается, хлам не хламится. Рекомендую!
office

Магнитный барабан

Мой старый ноут с HDD последнее время работал все медленнее и медленнее во всем, что касалось работы с диском, особенно после перезагрузки долгие минуты был неюзабелен, да и сама перезагрузка занимала много времени. Несколько лет назад все было нормально, а потом медленно и плавно стало хуже. Я уж было думал, это винда виновата, совсем там разработчики расслабились на SSD и не проверяют, как ужасно все на HDD работает. Совсем там многочисленные фоновые сервисы жить не дают. Но потом меня все же осенило посмотреть S.M.A.R.T. диагностику. Оказалось, это просто жесткий диск захворал и потихоньку собирался загнуться. Узнал, что на амазоне можно за сотню денег взять терабайтный SSD и USB-SATA проводок и в домашних условиях спокойно переписать данные и заменить диск. Для замены оперативки там в ноуте есть маленькая дверца с винтиком, но оказалось, что для замены диска нужно снимать все днище. Раскрутил все винтики по периметру, но крышка не снималась, что-то продолжало держать. Хорошо на ютюбе есть ролик на любую тему, в том числе про нужную мне операцию. Там подсказали, что есть еще пара секретных винтиков, например один скрыт под резиновой ножкой, которую надо снять сперва. В итоге, все получилось, заменил HDD на SSD, теперь все летает.

professor

Kerr

Интернет удивил с утра. Помните решение Керра, описывающее вращающуюся черную дыру? Найденное им в 60-х и использованное в том числе для рендера в Интерстелларе (только там редшифт выключили). Оказывается, если квора не врет, Рой Керр еще жив и активно что-то пишет и лайкает!



https://www.quora.com/profile/Roy-Patrick-Kerr
dab

Почти медаль :)

Ура, долгие часы прокрастинации на youtube оказались вознаграждены: персональное упоминание с занесением в почетный список бездельников на канале Fermilab. https://youtu.be/ZoJeWwtfdmQ?t=397

Предыдущее достижение моей карьеры в ютюб-физике - упоминание на The Science Asylum https://youtu.be/t0nGy2rsXYY?t=351 :)

Кстати, если кто интересуется популярными роликами вокруг физики и еще не знает эти каналы, рекомендую. А еще больше рекомендую PBS Space Time.
faculty of numbers

Abstract Data Types vs. Objects

On Understanding Data Abstraction, Revisited
http://www.cs.utexas.edu/~wcook/Drafts/2009/essay.pdf

Занятный легко читаемый обзор о том, как сильно отличаются абстрактные типы данных (ML-style) от объектов (OOP-style). При выбранных определениях довольно четкая картина вырисовывается.
Показывает, в каком смысле "the typical object-oriented program makes far more use of higher-order values than many functional programs."
Рассказывает, что Reynolds еще в 70-х описывал Expression Problem задолго до того, как Вадлер ей дал название.
Показывает, как некоторые принципы, которые могли казаться фольклором / best practices, тут выходят естественными математическими следствиями. "In a pure object-oriented style, classes are only used to construct objects, and interfaces are used for types."
Становится видно естественное тяготение динамически типизированных языков к ООП.
Что значат в этом ключе autognosis и complex operations.
Тайпклассы хаскеля тоже затрагиваются.

Ничего особого нового, но приводит мысли в порядок. Особенно, если свой язык дизайнить собираешься.