Блог*
Kanalga Telegram’da o‘tish
Блог со звёздочкой. Много репостов, немножко программирования. Небольшое прикольное комьюнити: @decltype_chat_ptr_t Автор: @insert_reference_here
Ko'proq ko'rsatish1 950
Obunachilar
+2124 soatlar
+227 kunlar
+2230 kunlar
Postlar arxiv
1 950
Using Go is a no-brainer in the sense that one has to have no brain in order to even consider using it
1 950
Вдобавок ко всему тому, что написано в статье, хочу отметить, что Entry API позволяет просто делать то, что в других языках выглядит зачастую весьма неловко: получить значение по ключу и в случае его отсутствия вставить новое значение, сконструированное при помощи функции, которая может завершиться ошибкой.
Пример:
fn get_file_contents(
name: PathBuf,
contents: &mut HashMap<PathBuf, String>,
) -> std::io::Result<&str> {
use std::collections::hash_map::Entry;
Ok(match contents.entry(name) {
Entry::Occupied(e) => e.into_mut(),
Entry::Vacant(e) => {
let file_contents = std::fs::read_to_string(e.key())?;
e.insert(file_contents)
}
})
}1 950
Это индустриальный стандарт. То есть нечто настолько плохое, что те, кто поддались на обманчивую простоту, обиделись достаточно сильно, чтобы заставить также страдать и своих коллег
1 950
#prog #js #ts #abnormalprogramming
github.com/jamiebuilds/json-parser-in-typescript-very-bad-idea-please-dont-use
1 950
Вот чего я не ожидал увидеть в оформлении Мака — так это отсылки к утилите и одноимённому языку для структурированной обработки текста
1 950
#prog #rust #article
Parsing logs 230x faster with Rust
As fantastic gravy on top of this whole situation, after a few days I realized that I needed to know exactly how much it would cost. With each log file taking about 23 seconds, and there being about 500 log files per day, it seemed like I would need about 350,000 seconds of Lambda execution time per month.
Then, when I went to look up Lambda pricing, I noticed that it has a free tier: 400,000 seconds per month. So in the end, it seems like I’m parsing 500GB of logs per day… for free. 😆
1 950
Repost from мне не нравится реальность
Сегодня 8 марта, буду банален: желаю равных прав, равных зарплат, чтобы вещи и пространства были спроектированы с мыслями о вас, поменьше сексизма и побольше безопасности, побольше сил чтобы бороться с ужасами реальности и поменьше ужасов реальности с которыми нужно бороться. Ну и конечно, хоть это и не относится напрямую к феминизму, желаю чтобы война закончилась, желаю чтобы вы и ваши близкие были в порядке, на столько, на сколько это теперь возможно.
/в общем да, вафель как обычно за всё хорошее против всего плохого/
Хотелось бы верить, что всё это близко, но верится с трудом...
Берегите себя, всего хорошего <3
1 950
#prog #abnormalprogramming #article
A regular expression to check for prime numbers
(thanks @nerdlair)
1 950
Repost from PLComp
https://arxiv.org/pdf/1810.07951.pdf
Don't Unroll Adjoint: Differentiating SSA-form Programs
Michael J Innes, 2019
https://proceedings.neurips.cc/paper/2020/file/9332c513ef44b682e9347822c2e457ac-Paper.pdf
Instead of Rewriting Foreign Code for Machine Learning, Automatically Synthesize Fast Gradients
William S. Moses and Valentin Churavy, NeurIPS 2020
Обе статьи посвящены (обратному aka reverse-mode) автоматическому (или алгоритмическому) дифференцированию функций, представленных в форме Single Static Assignment aka SSA. И тем не менее, они описывают существенно различные подходы.
Первая статья даёт краткое введение в обратное дифференцирование и распространённый подход на основе Wengert Lists. Чтобы перейти к SSA форме, к Wengert Lists необходимо добавить метки, условные и безусловные переходы и фи-узлы (φ nodes). Соответственно, статья вводит правила дифференцирования этих управляющих конструкций (control flow constructs). Дополнительно вводятся правила дифференцирования для чтения и записи в ячейки памяти, поскольку основной прицел статьи — императивные языки (и Julia в особенности). Забавно, что на практике (на текущий момент) основанная на описанном подходе библиотека Zygote не поддерживает деструктивную модификацию массивов, несмотря на её (библиотеки) широкое использование, в особенности во фреймворке для машинного обучения Flux. 😊
Несмотря на использование SSA-формы, первая статья подразумевает сравнительно высокоуровневое представление, близкое к исходному языку, до проведения оптимизаций. Вторая же статья рассматривает внедрение автоматического дифференцирования непосредственно в фреймворк LLVM в виде одного из проходов компиляции, выполняемого над низкоуровневым SSA-представлением, не зависящим от исходного языка и прошедшего ряд оптимизаций. Поэтому основное внимание она уделяет низкоуровневым аспектам: теневой памяти (shadow memory), кешам, обработке указателей, в том числе — вызовам функций по указателю, и переиспользованию информации с других проходов, таких как type-based alias analysis.
Стремление проводить автоматическое дифференцирование настолько низкоуровневого представления продиктовано двумя соображениями. Во-первых, немедленная применимость к большому количеству промышленных языков — C, C++, Rust, Julia — без каких-либо изменений в самом языке. Во-вторых, оптимизация исходного кода может сильно упростить и ускорить порождаемый код расчёта градиента функции, в некоторых случаях — понизить сложность с квадратичной до линейной после применения loop-invariant code motion к исходному коду.
Для подтверждения ускорения, авторы провели замеры производительности и сравнения с традиционными подходами на задачах ADBench от Microsoft и нескольких сторонних реализациях численного решателя дифференциальных уравнений. Результаты и графики приведены в статье. 😊
В любом случае, обе работы полагаются на "классические компиляторные техники", такие как dataflow analysis, alias analysis, abstract interpretation, и оптимизации. И потому представляют собой интереснейшее расширение "поля деятельности компиляторщиков" в сравнительно новую, но стремительно набирающую популярность, область.
