не удобно менять через не очень удобный шорткат, который надо жать на каждую asm инструкцию, и ввод, который странно работает требует ввод имени инструкции и именно заглавными буквами, что прямо бред
Я для минимальных изменений джампов обычно в шестнадцатиричном редакторе тупо ищу эту последовательность байт (с небольшим запасом, чтоб была уникальная) и меняю руками, а уж опкоды типа там 74, 75 я просто ниазусть помню. Опять же если патчер потом делать, то это для самоконтроля хорошо. Не сказать, что удобнее, но мне как-то привычнее что ли.
Человек уже понимал, что не укладывается в срок, но продолжал молчать
<...>
отсылает к книге Джорджо Нардонэ и Джулио Де Сантиса «Патологическое сомнение. Мыслю, следовательно страдаю».
Есть ещё одна замечательная книжка, которая даёт ответ на вопрос «как так получилось, что мы профукали сроки на несколько месяцев?». Это «Мифический человеко-месяц» Фредерика Брукса. Там есть золотые слова «в начале ваш проект задержался ровно на один день». И вот способность распознать этот день, и не молчать — и есть признак хорошего менеджера.
У меня есть пример — пару лет назад мы делали очередную систему для рентгеновского неразрушающего контроля, моя задача была автоматизировать хитрый механический сменный фильтр с парой шаговых моторов. В каждой системе есть что-то специальное. И вот, значит, привезли в цех новенькую кабину радиационной защиты, цех у нас двумя этажами ниже, я практически ежедневно наблюдал, как её неспеша собирают и в какой-то момент увидел, что несколько дней с ней ничего не происходило, стоит, пылится. Пошёл к менеджеру — почему задержка? Он мне объяснил, что у нас на складе внезапно кончились спец болты для сдвижной двери (а она весит больше тонны), и у поставщика их нет, и вот — ждём-с, абы какие туда не вкорячить. Я ему сразу сказал — что мы в опасносте, а он мне — да нифига, наверстаем, проект рассчитан почти на год, неделя-другая роли не играет. Короче, три недели ждали этих болтов, в итоге там получился снежный ком проблем, весь график улетел в тартары, и по итогу систему сдали с задержкой на четыре месяца, заказчик был сильно недоволен. Точнее поставили её в срок, но в полуживом состоянии, потому что признаваться в проблемах никто не хотел, опять же конец года, и уже зафрахтован кран и контейнер для перевозки, и всё такое. А два сервис инженера провели многие недели в одной жаркой стране на пусконаладке. Я с тех пор всегда этот пример привожу всем юным менеджерам — как так вышло что ты на двенадцать недель выбился из графика? А вначале был день первый, вот тот самый, когда на стеллаже не оказалось нужных болтов.
Я это к тому, что не только «многие сотрудники откладывали разговор, чтобы избавиться от собственных сомнений», но тут ещё чуть глубже проблема — у сотрудников вообще может не быть сомнений, они могут не видеть зарождающейся проблемы, а когда она реально возникает, то вот тогда пытаются героически её решить, самостоятельно в том числе, со всеми сопутствующими сомнениями, но поезд уже ушёл, а сомнений как таковых вначале вообще никаких не было.
«Старая жёсткая схема управления не заработала, поэтому перешли на гибкие методы. Наняли специалиста по процессам, начали проводить регулярные встречи и следить за производительностью команды. Похоже, компания всё больше движется в сторону модных подходов к управлению. Правда, руководитель команды уже устал и хочет взять длительный отпуск.» 🤣
Про бирюзу вот не сразу понял, но копилот пояснил, так что закинул себе в читалку Reinventing Organizations Фредерика Лалу, на досуге полистаю, спасибо.
Спасибо за статью, хотя каждодневное использование std::collections::HashMap - зависит от решаемых задач, я пользовался за последние пару лет ровно один раз.
Единственно - Вы показали кусочки кода, было б здорово, если б куда-нибудь, там на гитхаб или под спойлеры закинули полноценные примеры, желательно с бенчмарками, в идеале criterion. Сейчас, кстати, в свежем RustRover 2026.2 завезли удобный запуск criterion прямо из проекта и тут же и результаты и бенчмаркать "не отходя от кассы" стало ещё удобнее.
Капаситете тасков принято мерять в стори поинтах, где применяются числа Фибоначчи (ну там 1, 2, 3, 5, 8, и 13 и так далее). Консёрны надо бустить, конечно, иначе потом появится много ишью. У нас (дело в Германии происходит), чтобы не мешать немецкий и английский на созвонах просто перешли на английский, ну как-то само так получилось.
А учитывая стандартную противофазу на НЧ, в стереосигнале - при схлопывании в моно
А как тогда работает дешёвая акустика 2.1 с сабвуфером? Я не думаю, что там проц стоит, который всё это разруливает, просто высокие отфильтровали, тупо смешали оба канала и на выход, разве нет?
То есть только при включенных оптимизациях, так что с точки зрения языка программирования не считается
А да, верно. Я хотел было возразить, мол как тогда отлаживаться, но проверил — оно и в дебаге так, и в точки останов мы в таких функциях вообще не влетаем, всё честно:
Чисто математически waveform, конечно изменится, вопрос только в том - насколько. У меня есть проигрыватель Technics и High-Res плеер Surfans F35, и когда я слушаю пластинку или её же, но хорошо оцифрованную, то разница лишь в тембральной окраске, но в качестве я её не улавливаю. Немного напрягшись я ещё могу отличить зажатые в MP3 16-bit/44.1kHz от 24-bit/192kHz FLAC, но скажем, дискретизацию 96kHz от 192kHz на 24-х битах мои уши не различают, по крайней мере на той технике, что у меня есть. Возможно на системе неприличной стоимости она станет заметна на слух, да и то только после тщательнейшего прогрева проводов из бескислородной меди, уж не иначе. Некоторые любители качественного звука вообще утверждают, что проводникам нужно от нескольких дней до недель работы для «улучшения» звучания, чтоб все waveformы пришли в норму.
error: constant evaluation is taking a long time
--> src\main.rs:5:27
|
5 | _ => fib(n - 1) + fib(n - 2),
| ^^^^^^^^^^
|
= note: this lint makes sure the compiler doesn't get stuck due to infinite loops in const eval.
If your compilation actually takes a long time, you can safely allow the lint
help: the constant being evaluated
--> src\main.rs:10:2
|
10 | const N: u64 = fib(50);
| ^^^^^^^^^^^^
= note: `#[deny(long_running_const_eval)]` on by default
Экспериментально я выяснил, что оно по умолчанию работает до 29:
Тогда ошибка превратится в предупреждение и надо будет довольно долго ждать компиляции.
И, кстати, да, там не всё можно использовать, если скажем так:
const fn fib(n: u32) -> u64 {
if n <= 1 {
return n as u64;
}
let mut a: u64 = 0;
let mut b: u64 = 1;
for _ in 2..=n {
let next = a + b;
a = b;
b = next;
}
b
}
То получим по лбу:
error[E0015]: cannot use `for` loop on `std::ops::RangeInclusive<u32>` in constant functions
--> src\main.rs:9:14
|
9 | for _ in 2..=n {
| ^^^^^
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
For more information about this error, try `rustc --explain E0015`.
Кстати, Си компиляторы тоже считают на этапе компиляции, и даже в непростых случаях.
Вот смотрите, на днях мы тут налетели вот на такой баг в распоследней Студии:
Вот этот код даёт неверный результат в июльской VS2026, v.18.8.1 (тикет):
#include <stdio.h>
#include <immintrin.h>
__declspec(noinline)
__m512i bug() {
__m512i x = _mm512_set1_epi16(4);
__m512i m = _mm512_set1_epi32(~0u);
return _mm512_add_epi16(m, _mm512_add_epi16(m, x));
}
int main() {
short lanes[32];
__m512i v = bug();
_mm512_storeu_si512((__m512i*)lanes, v);
for (int i = 0; i < 32; i++) {
printf("lane[%2d] = %d\n", i, lanes[i]);
}
return 0;
}
Должны быть все двойки, а мы получим 2 3 2 3 2..., потому что константа будет неверная. Я проверил свежие gcc и Intel OneAPI, и там всё корректно, но каково же было моё изумление, когда я заглянул в бинарники, а там Интеловский компилятор заменил всё тело константой, реально вычислив вот это вот всё на этапе компиляции, хотя казалось бы, тут интринсики... Но да.
Пользуясь случаем хочу выразить благодарность за эти три статьи, завидую глубине погружения в тему.
Эх, мне вот тоже всегда хотелось иметь "хороший звук", я с завистью смотрел на всякие S90, Амфитоны и дорогущие катушечные магнитофоны у однокурсников, но студенческая стипендия не позволяла всё это заиметь, а началось всё с того, что давным-давно отец купил магнитофон-кассетник "Весна 211" , вот такой:
Там в комплекте две колонки из тонюсенького пластика с парой 4ГДШ35 вроде бы. Их можно было переключать последовательно или параллельно кнопкой на задней стенке, таким образом или 2 ома или 8. В "качестве" акустического оформления сомнений не возникало, там не было ни баса ни высоких, и поэтому первое, что я сделал после истечения гарантийного срока - в библиотеке политеха собрал все книжки, до которых смог дотянуться, журнал Радио опять же, я его всегда выписывал, и на калькуляторе МК61 рассчитал новые корпуса. Я выбрал фазонверторы, и сделал из двух четыре двухполосные системы из ДСП, рассчитав фильтры, настолько хорошо, насколько позволяли мои знания в радиотехнике. Для намотки индуктивностей я даже купил станочек со счётчиком. Венцом моего аудиостроения был четырёхканальный квадрофонический усилитель, вначале на П210А (по схеме, кажется из журнала Моделист-Конструктор, там для тыловых каналов вроде сдвиг фазы был), а потом, поднакопив денег на радиодетали, оконечные каскады я собрал по схеме Сухова, это был конец восьмидесятых где-то. Звук был хороший. Мне потом S30 подарили и моя самопальная акустика была даже лучше. Но потом я переехал, однако тема многоканального звука не отпускала, так что я по случаю купил шестиканальный комплект Eltax Summit, это датская компания, вот этот:
Она недорогая совсем, сто двадцать евро, но напольные четырёхклеммные, можно бивайринг или биампинг сделать. Минус там в том, что фазоинверторы у них сзади, вплотную к стенке не поставить.
И потом сабвуфер той же фирмы добавил, и подкинул это всё к ресиверу Denon AVR 1707, смотреть фильмы с многоканальным звуком стало приятнее, я кинотеатр сделал с проектором. А, у ресивера в комплекте есть микрофончик на длинном проводе - кладёшь его там, где будешь сидеть, жамкаешь на кнопку, и он сам пищит и гудит во все каналы и самонастраивается. Я б не сказал, что звук был прям бомбический, но приятный и не утомительный, акустика за сотню играет на свои деньги, но не более. Для фильмов - норм, для музыки, пожалуй нет.
А потом случилось прекрасное, в газете в разделе "отдам даром" я увидел объявление, что чувак дарит пару колонок Kenwood, неисправных. Ну как я мог упустить такой шанс, мне всегда хотелось здоровенные S90, так что я немедленно их забрал.
Беда их заключалась в том, что низкочастотники пришли в состояние "хоронили тёщу — порвали два баяна" (извините за чёрный юмор), у них рассыпались подвесы, просто от старости:
В принципе трагедии этом нет, за тридцать серебрянников продаются ремкомплекты, и я уже был готов потренироваться в аккуратности центрирования диффузора, но погуглив, обнаружил, что продаются сабвуферы KFC-PS2516W, подходящие по типоразмеру вообще один-в-один.
Я решил, что ничем не рискую и хуже всё равно не сделаю, так что вообще не проверяя, насколько они по добротности и остальным параметрам подходят к этим ящикам, просто купил и вкорячил вместо старых, встали туда почти как родные. И наступило счастье. Извините за "пыльную" фотку, просто фотик так грязь вытянул, на самом деле они не такие ушатанные, хотя им почти сорок лет.
Это реально тот самый "тёплый" звук с мягким обволакивающим басом, можно весь день напролёт слушать. Формально ящик LS-880 им великоват, но он там звукопоглотителем заполнен, я думал, что придётся повозиться с настройкой фазоинвертора и фильтров, но нет в "стоковом" варианте меня всё устраивает (хотя если их дотошно замерить, то не думаю, что там всё хорошо, технически наверняка возникнут вопросы). Но тут важно просто субъективное восприятие, когда дома никого нет, я их иногда включаю погромче, что б прям как на концерте, и оно реально звучит как на концерте. С удовольствием слушаю хорошие качественные оцифровки с грампластинок, чтоб чуть-чуть шуршало, хотя и вертушка у меня тоже есть. Хотя я без фанатизма, акустическим оформлением помещения я вообще не заморачиваюсь, у меня комнатушка десяток квадратных метров где-то. Жалко, что на работу я их не могу оттащить, и хотя у меня отдельный кабинет, но в в соседних офисах тоже работают люди, так что тут у меня маленькие полочники, сначала были Wharfedale, старенькие, но неплохие, а недавно я по случаю проапгредился на Q Acoustics 3010, у них кстати, бас заметно лучше, но я больше на дизайн купился - они как бы кожей обклеены. Вот теперь я побаиваюсь, что после следующей статьи меня таки настигнет волна аудиофилии, там и до лампового усилка недалеко.
Да, конечно, StringZilla SIMD и есть, просто писать поиск подстрок с нуля - это "переизобретение колеса" в какой-то мере, кроме того есть ещё разные алгоритмы (ну там Кнут-Моррис-Пратт и т.д), в принципе под какие-то специфические данные можно повозиться, а вот в общем случае имеющиеся библиотеки типа этой потребности покрывают. А про i9-10900KF - я прочитал статью слишком быстро и мне показалось, что там "эмулируемый" в камушке AVX512, которого в природе не существует. Так-то у меня есть пара Xeon с AVX-512, может на досуге гляну.
Эх, было бы ещё здорово рассмотреть то, как роботы программируются (ну там ABB RAPID, Kuka KRL, Fanuc KAREL, что там ещё?), где собственно крутится управляющая программа, и то, как они потом общаются с внешним миром - с ПЛК или промышленным компом, там OPC UA, полевые шины, АСУ ТП, СКАДА, вот это вот всё. В принципе там прям особых принципиальных отличий между марками нет, но есть нюансы. Самое классное, что видел - на выставке в Ганновере к Куке приделали пару кресел и катали там людей, как на аттракционе, но я не рискнул, зная что там в реалтайме крутилась Windows XP, хоть и с навешенным Wind River VxWorks, хотя это не подводило ни разу на моей памяти. На самом деле они довольно надёжные, как по аппаратной, так и по программной части.
для получения лицензии пожарного <...> разработал приложение на основе искусственного интеллекта, которое работает со смарт-очками. Мужчина хотел проверить, сможет ли приложение генерировать правильные ответы в режиме реального времени.
Вот то ли всё совсем плохо с трудоустройством программистов, то ли это просто тестировщик-фрилансер сейчас получит по шапке, то ли кандидаты в пожарные с очень широким набором знаний пошли, либо напротив, любой пожарный может нынче разработать такое приложение, то ли просто решил сменить профессию... Тема не раскрыта, короче.
Варианта "другое" не хватает в опросе. У меня StringZilla живёт, в общем не жалуюсь. Правда не .net, а LabVIEW и Раст. А вот то, что у i9-10900KF нет аппаратного AVX512 — не знал, надо будет побенчмаркать на досуге, если до такого камушка доберусь.
замедление времени — всё это стоит на обычном школьном синусе, которому угол сделали мнимым.
Ну то есть мы можем, пользуясь такими синусами честно и численно показать аномальное смещение перигелия Меркурия, которое 43 угловые секунды? Было бы любопытно взглянуть на расчёты.
Не, я думаю там не на llvm основное время уходит, им-то многие компиляторы пользуются, и там всё резвее. Тут дело в том, что ещё до llvm производится несколько проходов. Если вы в курсе основных фишек Раста, я имею ввиду владение, заимствование, мутабельность и время жизни, вот это вот всё, то вы поймёте почему так, там всё это чекается на предварительных проходах.
Вот смотрите, допустим такой примитивный код, тут восемь строчек всего:
fn main() {
let mut x = 10; // создаём изменяемую переменную x со значением 10
add_one(&mut x);// передаём изменяемую ссылку на x (mutable borrow)
println!("x after mod: {x}"); // выводим значение x после изменения
}
fn add_one(n: &mut i32) {
*n += 1; // разыменовываем ссылку и увеличиваем значение на 1
}
Вначале при компиляции идёт стадия HIR (High‑Level IR) - преобразование в высоко-уровневое промежуточное представление. С некоторой натяжкой его можно назвать "препроцессор", тут разворачиваются макросы, код очищается от "сахара", вот что получится, это всё ещё Раст:
extern crate std;
#[attr = PreludeImport]
use std::prelude::rust_2024::*;
fn main() {
let mut x =
10; // создаём изменяемую переменную x со значением 10
add_one(&mut x); // передаём изменяемую ссылку на x (mutable borrow)
// выводим значение x после изменения
// разыменовываем ссылку и увеличиваем значение на 1
{
::std::io::_print({
super let args = (&x,);
super let args = [format_argument::new_display(args.0)];
unsafe {
format_arguments::new(b"\rx after mod: \xc0\x01\n\x00",
&args)
}
});
};
}
fn add_one(n: &'_ mut i32) { *n += 1; }
Затем идёт вторая стадия, THIR (Typed High‑Level IR), тоже высокоуровневая, тут я только кусочек покажу:
Следом идёт средняя промежуточная стадия MIR (Mid‑Level Intermediate Representation), тут мы ближе к llvm, и как раз на этом этапе разбираются заимствования, владения, времена жизни, и Miri, кстати, работает как раз на этом уровне:
Вот что происходит всего с восемью строчками кода. Я полагаю, что основное время затрачивается на этапе THIR, но как-то руки не доходили проверить, да и не знаю как.
лучше не выдавать один гигантский крейт, в котором содержится всё и сразу. Вместо этого мы откорректировали наш компилятор, преобразующий SQL в Rust, так, чтобы он распределял вывод на несколько более мелких крейтов.
Это первое, что пришло в голову, даже недочитав до этого места, ведь хорошо известно, что проект с сотней-другой крейтов при компиляции после cargo clean занимает многоядерник на всю катушку:
У меня возник вопрос — если тут транспилятор на другой язык, то почему именно Раст? Ведь можно с таким же успехом и в Си перегонять, но вижу, что это просто перевод.
Я для минимальных изменений джампов обычно в шестнадцатиричном редакторе тупо ищу эту последовательность байт (с небольшим запасом, чтоб была уникальная) и меняю руками, а уж опкоды типа там 74, 75 я просто ниазусть помню. Опять же если патчер потом делать, то это для самоконтроля хорошо. Не сказать, что удобнее, но мне как-то привычнее что ли.
Есть ещё одна замечательная книжка, которая даёт ответ на вопрос «как так получилось, что мы профукали сроки на несколько месяцев?». Это «Мифический человеко-месяц» Фредерика Брукса. Там есть золотые слова «в начале ваш проект задержался ровно на один день». И вот способность распознать этот день, и не молчать — и есть признак хорошего менеджера.
У меня есть пример — пару лет назад мы делали очередную систему для рентгеновского неразрушающего контроля, моя задача была автоматизировать хитрый механический сменный фильтр с парой шаговых моторов. В каждой системе есть что-то специальное. И вот, значит, привезли в цех новенькую кабину радиационной защиты, цех у нас двумя этажами ниже, я практически ежедневно наблюдал, как её неспеша собирают и в какой-то момент увидел, что несколько дней с ней ничего не происходило, стоит, пылится. Пошёл к менеджеру — почему задержка? Он мне объяснил, что у нас на складе внезапно кончились спец болты для сдвижной двери (а она весит больше тонны), и у поставщика их нет, и вот — ждём-с, абы какие туда не вкорячить. Я ему сразу сказал — что мы в опасносте, а он мне — да нифига, наверстаем, проект рассчитан почти на год, неделя-другая роли не играет. Короче, три недели ждали этих болтов, в итоге там получился снежный ком проблем, весь график улетел в тартары, и по итогу систему сдали с задержкой на четыре месяца, заказчик был сильно недоволен. Точнее поставили её в срок, но в полуживом состоянии, потому что признаваться в проблемах никто не хотел, опять же конец года, и уже зафрахтован кран и контейнер для перевозки, и всё такое. А два сервис инженера провели многие недели в одной жаркой стране на пусконаладке. Я с тех пор всегда этот пример привожу всем юным менеджерам — как так вышло что ты на двенадцать недель выбился из графика? А вначале был день первый, вот тот самый, когда на стеллаже не оказалось нужных болтов.
Я это к тому, что не только «многие сотрудники откладывали разговор, чтобы избавиться от собственных сомнений», но тут ещё чуть глубже проблема — у сотрудников вообще может не быть сомнений, они могут не видеть зарождающейся проблемы, а когда она реально возникает, то вот тогда пытаются героически её решить, самостоятельно в том числе, со всеми сопутствующими сомнениями, но поезд уже ушёл, а сомнений как таковых вначале вообще никаких не было.
За наводку на книжку спасибо, полистаю на досуге.
У меня есть (дело в Германии), но я скептически на это смотрю - на рекламу много раз давил через Report ad, но она всё лезет.
В качестве компенсации просто зафолловил кучу очаровательных девушек вяких разных и лента уже не так скучно выглядит.
«Старая жёсткая схема управления не заработала, поэтому перешли на гибкие методы. Наняли специалиста по процессам, начали проводить регулярные встречи и следить за производительностью команды. Похоже, компания всё больше движется в сторону модных подходов к управлению. Правда, руководитель команды уже устал и хочет взять длительный отпуск.» 🤣
Про бирюзу вот не сразу понял, но копилот пояснил, так что закинул себе в читалку Reinventing Organizations Фредерика Лалу, на досуге полистаю, спасибо.
Спасибо за статью, хотя каждодневное использование std::collections::HashMap - зависит от решаемых задач, я пользовался за последние пару лет ровно один раз.
Единственно - Вы показали кусочки кода, было б здорово, если б куда-нибудь, там на гитхаб или под спойлеры закинули полноценные примеры, желательно с бенчмарками, в идеале criterion. Сейчас, кстати, в свежем RustRover 2026.2 завезли удобный запуск criterion прямо из проекта и тут же и результаты и бенчмаркать "не отходя от кассы" стало ещё удобнее.
Капаситете тасков принято мерять в стори поинтах, где применяются числа Фибоначчи (ну там 1, 2, 3, 5, 8, и 13 и так далее). Консёрны надо бустить, конечно, иначе потом появится много ишью. У нас (дело в Германии происходит), чтобы не мешать немецкий и английский на созвонах просто перешли на английский, ну как-то само так получилось.
А как тогда работает дешёвая акустика 2.1 с сабвуфером? Я не думаю, что там проц стоит, который всё это разруливает, просто высокие отфильтровали, тупо смешали оба канала и на выход, разве нет?
А да, верно. Я хотел было возразить, мол как тогда отлаживаться, но проверил — оно и в дебаге так, и в точки останов мы в таких функциях вообще не влетаем, всё честно:
Чисто математически waveform, конечно изменится, вопрос только в том - насколько. У меня есть проигрыватель Technics и High-Res плеер Surfans F35, и когда я слушаю пластинку или её же, но хорошо оцифрованную, то разница лишь в тембральной окраске, но в качестве я её не улавливаю. Немного напрягшись я ещё могу отличить зажатые в MP3 16-bit/44.1kHz от 24-bit/192kHz FLAC, но скажем, дискретизацию 96kHz от 192kHz на 24-х битах мои уши не различают, по крайней мере на той технике, что у меня есть. Возможно на системе неприличной стоимости она станет заметна на слух, да и то только после тщательнейшего прогрева проводов из бескислородной меди, уж не иначе. Некоторые любители качественного звука вообще утверждают, что проводникам нужно от нескольких дней до недель работы для «улучшения» звучания, чтоб все waveformы пришли в норму.
Но ведь компилятор в некоторых случаях и без const фолдит несложные вычисления в константы.
Ну вот как пример, совсем примитивно, без всяких констант:
Компиляем в релиз, вот так самое простое:
лезем в ассемблер, смотрим:
С Фибоначчи такой фокус не прокатит:
Там всё честно
Теперь если мы вкорячим const, оставив 50
то результата вообще не получим, ибо
Экспериментально я выяснил, что оно по умолчанию работает до 29:
Тогда да, причём оно вот сюда попадает и вот так используется:
Ну или выставить allow(long_running_const_eval)
Тогда ошибка превратится в предупреждение и надо будет довольно долго ждать компиляции.
И, кстати, да, там не всё можно использовать, если скажем так:
То получим по лбу:
Кстати, Си компиляторы тоже считают на этапе компиляции, и даже в непростых случаях.
Вот смотрите, на днях мы тут налетели вот на такой баг в распоследней Студии:
Вот этот код даёт неверный результат в июльской VS2026, v.18.8.1 (тикет):
Должны быть все двойки, а мы получим 2 3 2 3 2..., потому что константа будет неверная. Я проверил свежие gcc и Intel OneAPI, и там всё корректно, но каково же было моё изумление, когда я заглянул в бинарники, а там Интеловский компилятор заменил всё тело константой, реально вычислив вот это вот всё на этапе компиляции, хотя казалось бы, тут интринсики... Но да.
Пользуясь случаем хочу выразить благодарность за эти три статьи, завидую глубине погружения в тему.
Эх, мне вот тоже всегда хотелось иметь "хороший звук", я с завистью смотрел на всякие S90, Амфитоны и дорогущие катушечные магнитофоны у однокурсников, но студенческая стипендия не позволяла всё это заиметь, а началось всё с того, что давным-давно отец купил магнитофон-кассетник "Весна 211" , вот такой:
Там в комплекте две колонки из тонюсенького пластика с парой 4ГДШ35 вроде бы. Их можно было переключать последовательно или параллельно кнопкой на задней стенке, таким образом или 2 ома или 8. В "качестве" акустического оформления сомнений не возникало, там не было ни баса ни высоких, и поэтому первое, что я сделал после истечения гарантийного срока - в библиотеке политеха собрал все книжки, до которых смог дотянуться, журнал Радио опять же, я его всегда выписывал, и на калькуляторе МК61 рассчитал новые корпуса. Я выбрал фазонверторы, и сделал из двух четыре двухполосные системы из ДСП, рассчитав фильтры, настолько хорошо, насколько позволяли мои знания в радиотехнике. Для намотки индуктивностей я даже купил станочек со счётчиком. Венцом моего аудиостроения был четырёхканальный квадрофонический усилитель, вначале на П210А (по схеме, кажется из журнала Моделист-Конструктор, там для тыловых каналов вроде сдвиг фазы был), а потом, поднакопив денег на радиодетали, оконечные каскады я собрал по схеме Сухова, это был конец восьмидесятых где-то. Звук был хороший. Мне потом S30 подарили и моя самопальная акустика была даже лучше. Но потом я переехал, однако тема многоканального звука не отпускала, так что я по случаю купил шестиканальный комплект Eltax Summit, это датская компания, вот этот:
Она недорогая совсем, сто двадцать евро, но напольные четырёхклеммные, можно бивайринг или биампинг сделать. Минус там в том, что фазоинверторы у них сзади, вплотную к стенке не поставить.
И потом сабвуфер той же фирмы добавил, и подкинул это всё к ресиверу Denon AVR 1707, смотреть фильмы с многоканальным звуком стало приятнее, я кинотеатр сделал с проектором. А, у ресивера в комплекте есть микрофончик на длинном проводе - кладёшь его там, где будешь сидеть, жамкаешь на кнопку, и он сам пищит и гудит во все каналы и самонастраивается. Я б не сказал, что звук был прям бомбический, но приятный и не утомительный, акустика за сотню играет на свои деньги, но не более. Для фильмов - норм, для музыки, пожалуй нет.
А потом случилось прекрасное, в газете в разделе "отдам даром" я увидел объявление, что чувак дарит пару колонок Kenwood, неисправных. Ну как я мог упустить такой шанс, мне всегда хотелось здоровенные S90, так что я немедленно их забрал.
Беда их заключалась в том, что низкочастотники пришли в состояние "хоронили тёщу — порвали два баяна" (извините за чёрный юмор), у них рассыпались подвесы, просто от старости:
В принципе трагедии этом нет, за тридцать серебрянников продаются ремкомплекты, и я уже был готов потренироваться в аккуратности центрирования диффузора, но погуглив, обнаружил, что продаются сабвуферы KFC-PS2516W, подходящие по типоразмеру вообще один-в-один.
Я решил, что ничем не рискую и хуже всё равно не сделаю, так что вообще не проверяя, насколько они по добротности и остальным параметрам подходят к этим ящикам, просто купил и вкорячил вместо старых, встали туда почти как родные. И наступило счастье. Извините за "пыльную" фотку, просто фотик так грязь вытянул, на самом деле они не такие ушатанные, хотя им почти сорок лет.
Это реально тот самый "тёплый" звук с мягким обволакивающим басом, можно весь день напролёт слушать. Формально ящик LS-880 им великоват, но он там звукопоглотителем заполнен, я думал, что придётся повозиться с настройкой фазоинвертора и фильтров, но нет в "стоковом" варианте меня всё устраивает (хотя если их дотошно замерить, то не думаю, что там всё хорошо, технически наверняка возникнут вопросы). Но тут важно просто субъективное восприятие, когда дома никого нет, я их иногда включаю погромче, что б прям как на концерте, и оно реально звучит как на концерте. С удовольствием слушаю хорошие качественные оцифровки с грампластинок, чтоб чуть-чуть шуршало, хотя и вертушка у меня тоже есть. Хотя я без фанатизма, акустическим оформлением помещения я вообще не заморачиваюсь, у меня комнатушка десяток квадратных метров где-то. Жалко, что на работу я их не могу оттащить, и хотя у меня отдельный кабинет, но в в соседних офисах тоже работают люди, так что тут у меня маленькие полочники, сначала были Wharfedale, старенькие, но неплохие, а недавно я по случаю проапгредился на Q Acoustics 3010, у них кстати, бас заметно лучше, но я больше на дизайн купился - они как бы кожей обклеены. Вот теперь я побаиваюсь, что после следующей статьи меня таки настигнет волна аудиофилии, там и до лампового усилка недалеко.
Да, конечно, StringZilla SIMD и есть, просто писать поиск подстрок с нуля - это "переизобретение колеса" в какой-то мере, кроме того есть ещё разные алгоритмы (ну там Кнут-Моррис-Пратт и т.д), в принципе под какие-то специфические данные можно повозиться, а вот в общем случае имеющиеся библиотеки типа этой потребности покрывают. А про i9-10900KF - я прочитал статью слишком быстро и мне показалось, что там "эмулируемый" в камушке AVX512, которого в природе не существует. Так-то у меня есть пара Xeon с AVX-512, может на досуге гляну.
Эх, было бы ещё здорово рассмотреть то, как роботы программируются (ну там ABB RAPID, Kuka KRL, Fanuc KAREL, что там ещё?), где собственно крутится управляющая программа, и то, как они потом общаются с внешним миром - с ПЛК или промышленным компом, там OPC UA, полевые шины, АСУ ТП, СКАДА, вот это вот всё. В принципе там прям особых принципиальных отличий между марками нет, но есть нюансы. Самое классное, что видел - на выставке в Ганновере к Куке приделали пару кресел и катали там людей, как на аттракционе, но я не рискнул, зная что там в реалтайме крутилась Windows XP, хоть и с навешенным Wind River VxWorks, хотя это не подводило ни разу на моей памяти. На самом деле они довольно надёжные, как по аппаратной, так и по программной части.
Вот то ли всё совсем плохо с трудоустройством программистов, то ли это просто тестировщик-фрилансер сейчас получит по шапке, то ли кандидаты в пожарные с очень широким набором знаний пошли, либо напротив, любой пожарный может нынче разработать такое приложение, то ли просто решил сменить профессию... Тема не раскрыта, короче.
Варианта "другое" не хватает в опросе. У меня StringZilla живёт, в общем не жалуюсь. Правда не .net, а LabVIEW и Раст. А вот то, что у i9-10900KF нет аппаратного AVX512 — не знал, надо будет побенчмаркать на досуге, если до такого камушка доберусь.
— А о чём, товарищи, эта книга? — осведомился он.
— Да ни о чём, — сказал я.
Купите мощный UV фонарь, где-то 400 нм вроде, выйдите на поиски вечером и попробуйте поискать по флуоресценции.
Ну то есть мы можем, пользуясь такими синусами честно и численно показать аномальное смещение перигелия Меркурия, которое 43 угловые секунды? Было бы любопытно взглянуть на расчёты.
Не, я думаю там не на llvm основное время уходит, им-то многие компиляторы пользуются, и там всё резвее. Тут дело в том, что ещё до llvm производится несколько проходов. Если вы в курсе основных фишек Раста, я имею ввиду владение, заимствование, мутабельность и время жизни, вот это вот всё, то вы поймёте почему так, там всё это чекается на предварительных проходах.
Вот смотрите, допустим такой примитивный код, тут восемь строчек всего:
Вначале при компиляции идёт стадия HIR (High‑Level IR) - преобразование в высоко-уровневое промежуточное представление. С некоторой натяжкой его можно назвать "препроцессор", тут разворачиваются макросы, код очищается от "сахара", вот что получится, это всё ещё Раст:
Затем идёт вторая стадия, THIR (Typed High‑Level IR), тоже высокоуровневая, тут я только кусочек покажу:
Так-то там восемьсот(!) с лишним строк
Следом идёт средняя промежуточная стадия MIR (Mid‑Level Intermediate Representation), тут мы ближе к llvm, и как раз на этом этапе разбираются заимствования, владения, времена жизни, и Miri, кстати, работает как раз на этом уровне:
Полностью
И лишь затем идёт собственно llvm, это четвёртая стадия, там видно как наша константа 10 с инкрементом "сфолдилась" в 11:
.LLVM полностью:
LLVM
На а дальше ассемблер, тут просто по итогу печатаем 11 в консоль, вот здесь:
Ассемблер
полный листинг
Вот что происходит всего с восемью строчками кода. Я полагаю, что основное время затрачивается на этапе THIR, но как-то руки не доходили проверить, да и не знаю как.
Это первое, что пришло в голову, даже недочитав до этого места, ведь хорошо известно, что проект с сотней-другой крейтов при компиляции после cargo clean занимает многоядерник на всю катушку:
У меня возник вопрос — если тут транспилятор на другой язык, то почему именно Раст? Ведь можно с таким же успехом и в Си перегонять, но вижу, что это просто перевод.