🔥

Тред (@chicoxyzzy-2)


@jsunderhood Интересно было бы почитать про твой опыт работы с WebKit
Что ж, с него и начну тогда, хотя это и самое новое моё увлечение. На самом деле я хотел оптимизировать удаление элементов списка в истории и некоторых других частях интерфейса, но всё вышло по-другому :) twitter.com/myshov/status/…

Склонировав репозиторий, я всё равно полез в JavaScriptCore и попытался для начала собрать отдельно его, не собирая весь WebKit. Поймал ошибку компиляции. Ошибка была связана с тем, что отсутствовала библиотека ICU. Я уже сидел на бете Big Sur для разработчиков, так что...

...предположил, что ошибка связана с этим. И действительно, ICU (и некоторые другие либы) стали теперь tbd вместо dylib и были перенесены в другое место. Ну и я починил cmake, чтобы собиралось как на Big Sur, так и на предыдущих версия macOS. github.com/WebKit/WebKit/…

Как видно, патч достаточно простой, и я смог по ошибке компиляции догадаться в чём может быть проблема, проверить ченжлог Big Sur, открыл документацию по cmake и внёс нужные изменения. Я убедился, что и полный WebKit компилируется, но отправился дальше изучать файлы сборки JSC

Попробовав что-то поменять и позапускать тесты, я уже забыл зачем изначально пришёл (оптимизировать один кейс в UI) и начал изучасть исходники JS-движка. Потом задумался, что бы такого попробовать реализовать, чтобы было несложно, но в целом полезно.

Возможно стоило бы взять какой-то из падающих тестов WPT или ecma262 и попробовать пофиксить его (что я и рекомендую новичкам), но я не мог перестать думать о директории wasm и решил, что хочу реализовать какой-нибудь WebAssembly пропозал.

К тому же, я участвую в созвонах W3C WebAssembly CG с самого зарождения, внимательно слежу за всем, что там происходит, мейнтейню репозиторий с пропозалами github.com/WebAssembly/pr…, вносил некоторые правки в спеку, улучшал загрузчик wasm в Kotlin Native и тд, и тп.

В чате t.me/webassembly_ru я поинтересовался у @MaxGraey (AssemblyScript core team) какие фичи им хотелось бы использовать, но эти фичи не реализованы в JSC. Макс сказал, что было бы круто иметь Non-trapping float-to-int conversions. github.com/WebAssembly/no…

Этот пропозал уже почти год как вмержен в спеку, но пока не был реализован в JSC. Перед тем, как добавить этот пропозал, надо было обновить тесты. В некоторых тестах используется JavaScript порт wabt (github.com/WebAssembly/wa…), который пришлось обновить. github.com/WebKit/WebKit/…

wabt — это целый тулчейн для работы с WebAssembly, в данном случае использовался генератор текстового формата WebAssembly в бинарный — wat2wasm. Обновление потребовалось так как в старой версии еще не было поддержки нужных опкодов.

Также генерация wasm стала асинхронной, поэтому потребовалось обновить и некоторые старые тесты. По пути, изучая исходники и сверяясь со спецификацией wasm, я заметил, что опкоды двух операций из другого пропозала, который еще под флагом, и поправил их github.com/WebKit/WebKit/…

Теперь можно было вернуться к Non-trapping float-to-int. К счастью, есть общие тесты для разных фич WebAssembly. Первым делом надо было апнуть их скриптом, который я нашел рядом в исходниках и добавить комментарии о незаимплеменченных фичах. github.com/WebKit/WebKit/…

Через некоторое время я осознал, что для реализации выбранного пропозала нужно обновить парсер wasm. Те операции, которые я должен был реализовать, имеют коды от 0xFC00 до 0xFC07, а там уже были реализованы опкоды от 0xFC08 и выше, для другой группы операций.

Все занятые wasm опкоды можно посмотреть в удобной табличке вот тут pengowray.github.io/wasm-ops/ Такие изменения в парсере потребовали бы достаточно значительного рефакторинга, так что это мне показалось слишком сложной задачей для новичка как я, который только знакомится с кодобазой

Взглянув на webassembly.org/roadmap/, я увидел, что есть пропозал полегче, который также еще не реализован — Sign-extension operators. github.com/WebAssembly/sp… У них опкоды всего один байт и всего таких операций меньше! Выглядело прям как то, что нужно для начала!

JavaScriptCore состоит из интерпретатора LLInt и компиляторы Baseline JIT, DFG JIT, FTL JIT, которые используют много промежуточных представлений. Очень длинная и подробная статья об этом есть в блоге WebKit webkit.org/blog/10308/spe…

В общем, пришлось немного посидеть поизучать всё это дело, а также вспоминать C++, Ruby, почитать доки по инструкциям процессоров x86, x86_64 и arm64, но все получилось. github.com/WebKit/WebKit/… github.com/WebKit/WebKit/…

После некоторого перерыва я мог вернуться к Non-trapping float-to-int conversions, и даже прислал полурабочий патч с dummy имплементацией одной из операций. Тут хочется сказать спасибо @dbezhetskov, который помог разобраться с парсингом!

Кстати, сам Дмитрий в это время реализовал в JavaScriptCore пропозалы Bulk memory operations и Reference Types! Он тоже вел этот аккаунт, вот его неделя jsunderhood.ru/dbezhetskov/

К сожалению, я потом так и не успел довести non-trapping float-to-int до конца, и ребята из Apple доделали его сами, указав меня в дескрипшне коммита. github.com/WebKit/WebKit/…
Ой, как-то случайно оборвал тред. Продолжение тут twitter.com/jsunderhood/st…