Обновить
224
Алексей@PsyHaSTe

Зигохистоморфирующий

280
Подписчики
Отправить сообщение

Приходится думать о том, о чем в сервисах часто думать не надо — например о расположении данных в памяти и тп. Тривиальнейший код уровня:


async function logger(fn) {
   console.log("Start");
   const result = await fn();
   console.log("Finish");
   return result
}

Превращается в неконтролируемого монстра с трудно поддерживаемыми лайфтаймами


use actix_web::{web, App, HttpRequest, HttpServer, HttpResponse};
use serde_json::json;
use futures::Future;

trait MyFn<T>: FnOnce(T) -> <Self as MyFn<T>>::Fut {
    type Fut: Future;
}

impl<T, F: FnOnce(T) -> Fut, Fut: Future> MyFn<T> for F { type Fut = Fut; }

fn logger<F: Future<Output=HttpResponse>, FN: FnOnce(HttpRequest) -> F>(inner: FN) -> impl MyFn<HttpRequest> {
    move |req| async move {
        println!("Start");
        let result = inner(req).await;
        println!("Finish");
        result
    }
}

(Надо ли говорить, что этот код не компилируется иззза лайфтаймов, его нужно дальше дописывать/править, но мне стало лениво, чтобы оценить обьем требуемых усилий кажется достаточно. На это ушло минут 20 экспериментов, на код который выдает меньше всего ошибок. Офк боксинг не предлагать).


В общем, забивать микроскопом гводи плохая идея, и в молоток рассматривать микробов — тоже.

Стоит уточнить, что вы имеете в виду под «ссылкой» и где они быть могут висячими. Если брать терминологию раста, то ссылка по определению всегда указывает на обьект, т.к. борровчекер не позволит ссылке пережить обьект никаким образом.
Если бы их можно было миксовать, причем доказав что мы получили не микс где слушают как раз все, а тот, где все опасные части взаимно уничтожились, то было бы неплохо. Но мне не очень понятно как этого добиться.

Говорить о таких проблемах — хорошо и правильно, но имхо в миллионах строках кода можно запрятать что угодно при желании, условную стеганографию никто не отменял, и что безобидные на первый взгляд функции в определенном порядке образуют определенный функционал проверить в такой кодбазе нереально. Поэтому не вижу что можно тут сделать, честно говоря.
Это была достаточно толстая отсылка на эту самую историю, я думал это очевидно
Ну либо так, либо после универа на год служить, либо через аспирантуру сидеть до 29 лет. Но как показывает практика досидеть я бы не успел, так что все правильно сделал.
Речь о том, что самое сильное племя умба-юмба которое столетиями писало трактаты о боевом применении палки-копалки и философских основаниях «у кого палка того и правда» можно поставить в перпективу защиты от конкистадоров с пушками, и пронаблюдать силу философии «сиди у реки и жди труп врага».
Спасибо за статью, хотя по некоторым пунктам есть некоторое несогласие. Например «No more» или скажем «refuge» я бы ни в коем случае не стал считать устаревшими, постоянно их встреечаю в том или ином виде. Насчет Longstanding — standing можно достаточно неплохо перевести как (со)стояние. Тогда перевод получается практически прямой. semblance я лично для себя обычно перевожу как «подобие», видимость это все же нечто другое: первое это неудачные попытки что-то делать, а видимость это скорее потемкинские деревни где и попыток нет. Хотя это может быть мое личное восприятие. Не очень часто, но все же встречаю периодически в текстах, так что насчет неупотребительного тоже бы поспорил. calculated moves Я бы перевел как «расчетливыми действиями» или около того. Вопрос не в том что они там такие злые сидят и с линейкой/циркулем тангенсы считают, а сидят в креслах и думают как бы напакостить.

seen first-hand пропал из перевода, мне кажеется это достаточно важный эмоциональный нюанс всей арки про подлых пришельцев.

> Мы объединим все наши силы в единое войско, которое будет преклоняться лишь перед одним троном!

Честно говоря, я совсем иначе это для себя переводил. indivisible whole мне кажется это нечто большее, чем просто армия.

> Let no Terran agency conspire against this new beginning.

Все же восстания это больше про uprising/revolt. А conspire это больше про 5 колонну, которая прямо ни в какую конфронтацию не вступает, а только исподтишка вредит и замышляет всякое нехорошее.

> And let no man consort with alien powers.

Вариант с обратится мне кажется не передающим изначального тона предложения. Более подходящим было бы «заигрывать»/«сдружиться»/… как мне кажется.

> no matter the cost!

> и никто не посмеет остановить нас!

Ну тут уже совсем что-то странное.

----

Я сам чукча-читатель, и английский у меня по моему внутреннему ощущению более чем «средненький», поэтому просьба если я где-то очевидную фигню написал просто объяснить, в чем я не прав. Статья хорошая, мои скромные +2.
В субурбии, где я живу, соседка работает фитнес-тренером и имеет плавающий график, её бойфренд вообще всё время дома сидит, сосед с другой стороны, видимо, возит детей на кружок условно по пятницам в час дня и остальное время не имеет предсказуемого расписания. Хотя бы одна машина у каждого второго-третьего дома всё время стоит.

Ну а вот в небольшом городе в Израиле все чутка иначе: в 8 утра все едут по заводам, после этого тишина, нигде никого нет, вечером обратно. Учитывая что я днем во второй половине дня обычно свободен то с 2 до 5-6 часов и закупиться и пойти в любую больничную кассу без очереди — совершенно прекрасно можно.


Почему фантазии? Легальный фреймворк для этого уже есть, если бы у меня с соседями были чуть более близкие, канонично американско соседские отношения, то не было бы никаких преград получить от соседа бумажку с его подписью

Как я уже говорил, не знаю как с этим в штатах. По моему опыту это тяжело. Я например недавно переехал, и хотя весь дом милые лапочки с которыми я в хороших отношениях, мы пока недостаточно знакомы чтобы давать такие бумажки если бы они были. Получается приходи кто хочет бери что хочет)


Копы каждое такое сразу побегут расследовать, ага. Сразу после де-факто декриминализованных краж до 850 баксов в Коммифорнии (где даунгрейд преступления, условно, с felony до misdemeanor привёл к тому, что они де-факто перестали расследоваться при де-юре наличествующем наказании), или после де-факто нерасследуемых сексуальных преступлений в Сиэттле.

То есть ты это одобряешь? Иначе как это аргумент против "с этим нужно бороться" мне не очень понятно )

Не ну если чисто формально подходить тогда конечно всё можно проверять:


use typenum::{N1000, IsGreater};
use generic_array::{ArrayLength, GenericArray, arr};

fn p<F: ArrayLength<i32> + IsGreater<N1000>>(a: &GenericArray<i32, F>)
{
    println!("{}", a[1000]);
}

fn main()
{
    let a = arr![i32; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ];
    p(&a);
}

Другое дело что так конечно никто не пишет.


Чуть более адекватный вариант мог бы выглядеть так:


const fn p<const N: usize>(a : &[i32; N]) -> i32
{
    a[1000]
}

fn main()
{
    const a: [i32; 25] = [0; 25];
    const _: i32 = p(&a);
}

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


Впрочем, очевидно изначально человек чутка приукрасил действительнность и выдал проверки уровня "1 экспрешн" за какую-то более умную систему. На практике такие случаи умел детектировать даже паскаль.

Я прост не очень понимаю что предлагается с этим делать? Делать полностью замкнутую на себя систему производства всего, начиная от выплавки стали, а то мало ли какие бекдоры туда влили, может при определенной частоте направленного излучения крышка сделанная из такой стали начнет вибрировать и передавать данные о вычислениях? Повеситься с горя? Я не вижу способа с этим что-то сделать, а значит и обсуждать смысла нет.

Ну как бы сложновастенько написать такую штуку как аллокатор на safe подмножестве, об этом и речь.

Есть трейдофы. Сейф подмножество ради сейфти вносит ограничения, которые могут влиять. Упирается ли написание аллокатора на них — наверняка, насколько сильно? Вопрос


А если бы можно было просто "грепнуть и посмотреть", то все бы так и делали, и ошибок было бы ровно 0.

Не было бы. От того, что ошибку легко грепнуть и исправить не значит, что они исчезли. Просто условно вместо 200 открытых ишшуев с мемори сейфти проблемами в проекте будет 20. И пока эти 20 будут чинить найдут ещё 30 (а в параллельной вселенной без этого открыли бы 300).

Как говорил Линус "фак стандарт". Стандарт это шашечки.


Главное что в физической железке под названием "компутер" эти штуки различаются, на стеке аллокать не стоит ничего, но нужно следить за размеров обьектов, у кучи другие трейдофы. Если стандарт это не учитывает то это минус к стандарту же, потому что он должен описывать жизнь, а не жизнь под него подстраиваться.

А, ну опасенцам рептилоидов ничего не поможет.

Относительно плюсов раст кажется даже более экономный по времени. Если сравнивать с языками с ГЦ типа жабы там да, раст менее продуктивный. Но с плюсами — раст по сути это те же плюсы, только который чуть подкрутили, чтобы статический анализатор работал корректно. Можно полистать как раст выглядел в 2010 году, как промежуточная форма эволюции уши плюсов там торчат буквально отовсюду.
Если конечно не считать auto foo(int x) -> fn foo(x: i32) огромным изменением

В реальном коде на расте (а не в сферическом safe-only коде в вакууме) ошибки при работе с памятью вполне себе встречаются (это из относительно свеженького), и последствия вполне себе фатальны — всякие там use-after-free, out-of-bounds reads/writes, полный букет. Да по-другому и не могло быть. И количество подобных проблем будет только расти с увеличением массы кода на расте (невольный каламбур получился, хехе). И хертблиды разные никуда не денутся, будут у раста свои собственные (а скорее всего уже есть, просто о них пока никто не знает — ну может кроме АНБ :)).

Глянул ссылку — везде в глаза бросается ансейф и его некорректное использование. Что ж, это конечно печально, но хорошо когда есть кейфорд по которому можно грепнуть и посмотреть все места где может быть ошибка. Сильно экономит время.


Если бы можно было обойтись без unsafe, его бы не добавляли в раст. Но увы и ах в реальности совсем обойтись без него нельзя, и результат как известно на лице. Впрочем в расте до сих пор есть проблемы с лайфтаймами, приводящие к use-after-free без всяких unsafe.

Можно пример такой проблемы? По первой ссылке что вы привели если что не оно — там лайфтайм так же ансейфом крафтится, и соответственно его корректность полностью на совести разработчика, так же как если ансейф код вместо nonzerou32 вернул 0 то не виноват язык который будет считать вне скоупа что значение 0 никогда не принимает и использует это для оптимизаций.


Кстати напомните, почему в расте до сих пор нет адекватного аналога плюсовому placement new? Не потому ли, в том числе, что нет механизма дать вызывающему коду понять, был ли все-таки сконструирован объект или нет? В C++ конструктор может выбросить исключение (со всеми RAII гарантиями), а в расте такого механизма нет.

Так вроде есть. Почему не стабилизируют можно почитать там же в комментах.

И хотя, всё это существует уже довольно давно в nightly-версии компилятора, многие всё равно сидят на stable-версии по многим причинам, и очень этого ждут.

Очень жаль этих товарищей. Просто глянул список своих расширений в открытом щас проекте:


#![allow(incomplete_features)]
#![feature(allocator_api)]
#![feature(associated_type_defaults)]
#![feature(backtrace)]
#![feature(concat_idents)]
#![feature(const_option)]
#![feature(const_result_drop)]
#![feature(const_trait_impl)]
#![feature(const_try)]
#![feature(core_intrinsics)]
#![feature(generic_associated_types)]
#![feature(generic_const_exprs)]
#![feature(inline_const)]
#![feature(let_else)]
#![feature(map_first_last)]
#![feature(try_blocks)]
#![feature(type_alias_impl_trait)]
#![feature(scoped_threads)]

Ну… Мээ… Ждать мне до второго присшествия пока все стабилизируют. Раст на стейбле это не раст, а какая-то смешная игрушка, уж извините все, Кого обидел.


Что-то кстати стабилизировали в последние полгода, список можно подсократить на пару позиций, но все равно писать без этого больно.

Замените "язык" на что угодно, например "лифт" или "мост" и посмотрите, изменится ли ваше мнение или быстрый лифт который иногда падает это не лучшая идея.

А С на чем написан? Только не говорите что на си, а то у нас получается рекурсия без выхода или что его боги с небес спустили. Это логика какого уровня?

Речь шла про человека "самого по себе", т.е. без средств статического анализа. В примере использовалась сишка, в которой их почти нет, недаром его иногда называют портируемым ассемблером.


А с помощью анализа конечно же можно обеспечить себе сколь угодно большое количество гарантий, в пределах всяких умных теорем. Но и даже их часто можно обойти, убрав квантор универсальности и оставив "достаточно хорошие случаи".

Про эффект второй системы когда-нибудь слышали? А вообще звучит как "я не знаю зачем это все нужно, поэтому не могу ответить на вопрос. Но чувствую что точно есть лишнее!"

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность