rust что значит софткор

Softcore Rust режим: сервера, команды, описание

Рано или поздно, игрокам надоедает какая-то определённая игра. Происходит это из-за того, что спустя определённый промежуток времени геймплей начинает повторяться. Игра становится скучной, хочется чего-то нового. Издателям часто это играет лишь на руку, ведь они могут добавить в игру какое-нибудь платное дополнение, которое купят фанаты. За примером далеко ходить не нужно, возьмём ту же Destiny 2. Это довольно популярная игра, онлайн в которой в одном только Steam держится в районе 80000 игроков. Но без дополнений в этой игре мало чем можно заняться – нет возможности сходить в рейд, невозможно пройти сюжетные кампании, выпущенные в последующие года после выхода игры.

Приходится ограничиваться определёнными локациями и режимами, чтобы прокачать своих персонажей, коих в игре 3, и все разных классов. Без дополнений игра быстро надоедает. Так и в Rust рано или поздно игрокам надоедает заниматься одним и тем же — фармом. Однако, разработчики стараются в каких-то моментах упрощать игру, дабы игроки смогли сфокусироваться на PVP составляющей. В этот раз Facepunch Studios решили ввести «Лайтовый» режим для игры Rust – Softcore.

Режим Softcore Rusе – что это такое?

Если говорить коротко, то режим Softcore в Расте – упрощённая версия игры Rust. На данный момент разработчики внедрили его для того, чтобы понять, будет-ли популярен подобный мод или же нет. Сервера, которые работают в режиме Softcore, помечены специальным тегом, так что можно легко разобраться, какие сервера ванильные, а какие – упрощённые.

Возможности режима Софткор

Ключевая особенность режима – возможность появления в мирном городе или в лагере бандитов после смерти. Стоит отметить, что данный режим отлично подойдёт для команд до 4 игроков, ведь именно такое ограничение на участников команды установлено на серверах Softcore. Благодаря возможности появления в определённых точках карты, игроки смогут быстрее скооперироваться и начать добывать ресурсы совместно, не тратя кучу времени на беготню по всей карте.

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

В случае смерти вы не потеряете весь свой лут. Половина лута будет доставлена в специальные терминалы с надписью «Reclaim». Уточним, что ценность лута никак не влияет на шанс его сохранения – тут чистый рандом. Но вы всегда сможете вернуть себе 50% от потерянного лута.

Ограбить раненного игрока с целью получения его полного лута невозможно. Разработчики предусмотрительно заблокировали инвентарь игрока, когда он ранен.

Что такое RECLAIM

Для сохранения вашего лута есть определенный терминал, который в режиме Softcore на серверах Rust получил название Reclaim. Именно в нем и будут храниться ресурсы всех игроков, которые умерли.

На каких локациях есть RECLAIM

Терминал с выдачей потерянного лута установлен в обоих точках спауна игроков – и в мирном городе, и в лагере бандитов.

Сколько ячеек в RECLAIM

Всего в терминале может поместиться до 42 предметов, каждый из которых занимает полноценную ячейку.

Как долго хранятся ресурсы в RECLAIM

Не стоит торопиться забирать ресурсы из терминала. Они пропадут лишь через 2 часа после их попадания в RECLAIM.

Можно ли забирать вещи, умирая несколько раз

После повторной смерти пропадает лут в терминале RECLAIM? Нет, лут не пропадает. В RECLAIM предусмотрена накопительная система, для которой и были предусмотрены вместительные контейнеры на 42 ячейки, предметы из которых пропадают только через 2 часа после смерти.

Кому подойдёт такой режим

Режим Softcore подойдёт для небольшой команды игроков. Преимущественно игровым режимом должны заинтересоваться DUO, TRIO и QUAD команды, но никак не большие кланы. Режим отлично подойдёт для тех игроков, которые хотят упростить игру в Rust, но при этом не горят желанием развиваться на различных пользовательских серверах. Для таких серверов, кстати, можете посмотреть наши схемы домов в Rust.

Softcore Gamemode – это пусть и облегчённый Rust, но он привносит в игру новые эмоции. Теперь можно не так часто гореть из-за потерянного лута, не нужно часами искать своих товарищей по команде на ранних этапах развития, когда у вас нет даже кибитки. Режим явно не будет лишним, ведь он не вытесняет классику, а наоборот – предоставляет альтернативу, более казуальный Rust.

Источник

Rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

Всем привет! Уже очень давно я задумал серию гайдов для начинающих растеров, в которых я планирую раскрыть множество аспектов игры, начиная от выбора сервера и заканчивая ПВП и рейдами. В этих гайдах я не буду рассказывать о совсем базовых механиках игры вроде добычи ресурсов или крафта, я думаю, что с этим вы и сами разберётесь, тут я постараюсь осветить немного более глобальные вопросы, которые могут поставить в тупик новичка.

Ну что же, усаживайтесь поудобнее, наливайте себе чайку и готовьтесь читать, информации будет много!
А для тех, кому лень читать, вот расширенная видео версия моего гайда 😉

Во-первых, следует понимать, что глобально все сервера делятся на 2 типа:

Перед тем как мы решим, где же нам все таки играть и куда податься, давайте, для начала, зайдём в игру и ознакомимся с меню выбора сервера и его возможностями. Для этого нажмём на вкладку «Play Game» или «Играть» в русской локализации. Мы увидим меню, которое поделено на 6 вкладок. Давайте пробежимся по всем вкладкам и разберёмся для чего они нужны:

1. Вкладка Official

Здесь представлены сервера от разработчиков игры и их партнеров. Все сервера из данной вкладки полностью соответствует классическому геймплею Раста и не имеют каких-либо модификаций и доната. То есть игра в том виде, в котором её задумали разработчики.

2. Вкладка Community
Раньше тут находились в основном классические сервера, но сейчас данная вкладка содержит и классику и модифицированные сервера вперемешку. Однако, здесь всё еще можно найти хорошие сервера без кардинальных изменений в геймплее. Также данная вкладка будет полезна тем, кто ищет классику с ограничением по максимальному количеству игроков в команде.

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

Здесь отображаются сервера, на которых в данный момент играет кто-то из ваших друзей по стиму.

Это «избранное» как в браузере. Предназначена для формирования списка любимых серверов и быстрого доступа к ним. Для этого кликните на звездочку у любого сервера из первых трёх вкладок и он попадёт в избранное.

Данная вкладка отображает сервера на которые вы недавно заходили. Полезна, когда вы нашли какой-то годный сервер, но забыли, как он назывался и не добавили его в избранное.

Я думаю объяснять, что это такое не нужно, подскажу только несколько полезных поисковых запросов:

Vanilla или Classic – поможет найти классические сервера с оригинальным геймплеем
Solo, duo, trio, max 2, max 3, max 5 и т.д – сервера с ограничением по количеству игроков в команде
Weekly, biweekly, monthly – Недельный, двухнедельный и месячный циклы вайпа соответственно
Softcore – сервера с режимом Softcore для новичков. О них я расскажу чуть позже

Теперь, когда мы определились, что играть будем на классике, нам остается только выбрать сервер, где мы будем учиться всем премудростям игры. Я расскажу об основных критериях, по которым можно подобрать подходящий:

Во-первых, выбирать сервер мы будем из вкладок Official и Community, вкладку modded мы игнорируем. Давайте зайдем во вкладку Official.

Во-вторых, сразу отметаем сервера от Facepunch. Да, это официальные сервера от самих разработчиков, но они практически не модерируются и там вы столкнетесь с огромным количеством читеров, которые могут полностью отбить у вас желание играть.

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

Также обращаем внимание на возраст сервера, который показывает сколько времени прошло с последнего вайпа. Очень не рекомендую вам заходить на сервера, вайп на которых прошел совсем недавно, причина все таже, что и с большим онлайном – очень высокая конкуренция. Лучшим выбором будет сервер, на котором прошло 2-3 дня после вайпа.

Ну и последней критерий для выбора сервера – это карта. В игре есть три карты:

Barren / Баррен
По большему счету, это всё таже процедурка, из которой убрали бОльшую часть декораций, таких как трава, различные кустарники и камни, и часть монументов. Карта предназначена для владельцев слабых пк, у которых на процедурке слишком низкий ФПС. Также часто используется на ПВП серверах.

Вот и все критерии, которые нужны для выбора сервера. Следуя им вы исключите все неподходящие сервера и легко сможете подобрать нужный, игра на котором будет максимально комфортной для новичка. Хотя. это все-таки RUST, и слово комфорт не совсем подходит для данной игры 😀

И это, пожалуй, всё, что я хотел рассказать вам о выборе сервера для игры в Rust. Надеюсь эта информация поможет вам найти ТОТ САМЫЙ сервер, который станет для вас домом на многие вайпы 😉
В следующем гайде мы поговорим о том, с чего начинать своё выживание и как выбрать место для постройки своего будущего дома, а на сегодня всё! Спасибо за внимание 🙂

PS: Если вам понравился данный гайд, то не поленитесь оценить его и поделиться им с друзьями, ну и на ютубе лайкосик запилите, мне будет приятно 😉

Источник

Rustafied

On The Pulse of Rust

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

A new game-mode is coming to Rust this week! The first new officially supported mode since inception of the game, Softcore provides a more forgiving environment to play Rust. This article summarizes all the main features of this new type of play.

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

Overview

Softcore will launch with the February 4th update and forced wipe. Keep in mind, this is the first iteration of a brand new functionality. As such, it is highly subject to changes and tweaks. Also, as of testing, some of it isn’t complete. As always, I’ll do my best to keep this article up to date with any changes.

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

Spawn in safe zones

A main feature of Softcore gameplay is the ability to spawn in safe zones. As it stands, the two options available are Compound and Bandit camp. When you die in Softcore, you’ll see two extra bed options for respawn.

These beds have the normal cooldown times and will also display a hostile countdown timer if you’ve acted a fool at either location in the recent past. Now safe zone spawns are nice and all, but let’s be real about why most will respawn there…

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

Recover loot

That’s right! The biggest feature to note in Rust: Softcore is the fact that not all loot is lost upon death. Added to the two safe zones are reclamation centers right near where you spawn. Simply go up to any of these terminals to gain access to a selection of loot from your previous life.

Now this is where it gets a little murky as there appears to be a level of randomization with regards to what’s actually recovered and what isn’t. Below I’ve done my best to cover the main points.

2/2 Edit: You can now also claim your loot in a separate small stash bag found next to your corpse. That means you don’t have to reclaim in a safe zone if it’s more convenient to get to your corpse. This is still a work in progress, more details to come.

How does this work?
On death, some items are transferred from your body to a reclamation terminal which can be accessed at either Bandit Town or Compound. Items not moved will remain on your corpse as per usual.

What items are saved?
It seems like about half of the items in your inventory upon death will be saved. This does appear to be highly randomized as sometimes more is saved and sometimes less. There does not appear to be any priority on higher valued items versus lowered value items (with the exception of the initial rock and torch, which are never saved). So basically, it’s luck of the draw.

What about the items in my hotbar?
They are grouped the same as above. About half, luck of the draw.

What about the clothes I’m wearing?
Those stay on your corpse.

Do items from multiple deaths accrue in the reclamation center?
Yes, it’ll keep adding items to the bottom of the reclamation center inventory.

How long do my items stay at the reclamation center?
Items will last for 2 hours at the reclamation center. After that time, they disappear and are lost forever.

How much does the reclamation center hold?
At the moment there are 42 slots in the reclamation center. There is also a message notifying players when the inventory is full.

Can anyone else access my items in the reclamation center?
No.

Does it matter how I die?
No, it doesn’t. PVP, PVE, and suicide deaths all put items into the reclamation center in the same way.

Can I place items in the reclamation center?
Yes and no. You can’t just drag items from your inventory to the reclamation inventory. That said, if you drag an item from the reclamation inventory on top of another item already in your inventory, the two will switch (essentially letting you deposit). Keep in mind though, there is a two hour limit on any item in this box.

What if I’m downed but not dead yet?
If you’re in the downed (or wounded) state, no items will transfer to the reclamation center. This means players who just downed someone else can loot the entire inventory and downed players will be more incentivized to suicide immediately to protect their loot.

Источник

screenrant.com

Follow ScreenRant.com

Something New

Rust: How to Play The New Softcore Mode (& What’s Different)

Rust has always been a very difficult experience, but particularly for newcomers This guide explains what Softcore Mode is and how to play it.

Survival game Rust has been captivating players for several years at this point. With its focus on brutal and realistic gameplay coupled with hardcore mechanics like thirst and hunger meters, players have a lot to keep track of when they are playing the game if they want to survive. Crafting different items and buildings can help ensure that players can survive longer in the game, but there are still a great many dangers and challenges present for players.

Some players have never quite been able to get into Rust though due to its pretty severe difficulty and learning curve for newcomers. It is hard to want to learn how to play when everyone else is already very well-versed in the game and are constantly eliminating new players. In order to help make the game more accessible to new players, Rust has now added an alternate game mode called Softcore with its newest update. This guide shows players what Softcore mode is and how to access it.

In the normal game mode of Rust players who are killed are basically completely out of luck. They will lose access to all of the items that they were carrying, and most likely these items are going to be taken by whoever killed them. Softcore mode aims to rectify this for the player by allowing them to reclaim half of their inventory at the spot of their death. If they are unable to make it to the place they died, the player also has the option to travel to a Reclaim Terminal in order to reacquire their resources.

Softcore Mode adds in two of these Reclaim Terminals to the map. Players will be able to find one at Bandit Town and the other can be located in The Outpost. All the player has to do is interact with these Terminals to claim their items, and no one else is able to claim said items in their place. Additionally, players can respawn at these safe zones whenever they wish as long as the game has not tagged them as hostile.

There are a couple of other changes as well that make this game mode much more newbie-friendly. For one, the size of teams will now be limited to four players. This will stop large groups of players from teaming up and roaming the land as bloodthirsty bandits. On top of this, players are now only able to view the contents of a wounded player’s inventory rather than take things from them. Over time more features will be added to this game mode, but as of now, these are the basic principles.

Hardcore Rust fans have no need to be worried about the game being made easier. Softcore Rust servers are completely separate from normal servers in the game. Those who want to play Softcore Mode just have to search for one of the ten different Softcore servers when selecting one.

Rust can be played on PC.

Источник

Что делает Rust универсальным языком программирования

rust что значит софткор. Смотреть фото rust что значит софткор. Смотреть картинку rust что значит софткор. Картинка про rust что значит софткор. Фото rust что значит софткор

Долгое время Rust позиционировался исключительно как язык для системного программирования. Попытки использовать Rust для высокоуровневых прикладных задач зачастую вызывали усмешку у значительной части сообщества: зачем использовать инструмент в том качестве, на которое он не рассчитан? Какая польза от возни с типами и анализатором заимствований (borrow checker), если есть Python и Java со сборкой мусора? Но другая часть сообщества всегда видела потенциал Rust именно как языка прикладного, и даже находила его удобным в использовании для быстрого прототипирования — во многом благодаря его особенностям, а не вопреки им.

Шло время, и сейчас использование Rust для высокоуровневых прикладных задач вызывает куда меньше споров, чем раньше. Сообщество накопило практический опыт, и практика показала, что у Rust есть свои преимущества в прикладной сфере. Посмотрите, как менялось официальное определение языка, с такого:

Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety.

Rust — невероятно быстрый язык для системного программирования без segfault’ов и с гарантиями потокобезопасности.

A language empowering everyone to build reliable and efficient software.

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

Думаю, это хорошая иллюстрация смещения акцентов в позиционировании языка.

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

Что понимать под высоким и низким уровнем?

Понятия высокого/низкого уровня, применительно к языкам программирования, уже давно перестали носить абсолютный характер. По сравнению с ассемблером, язык Си — высокоуровневый, а по сравнению с Haskell — низкоуровневый. В случае с Rust ситуация усугубляется тем, что некоторые языковые возможности в нем близки к Haskell, а некоторые — к Си. Чтобы не запутаться, что считать высоким уровнем, а что низким, я предлагаю использовать простое правило: если языковая конструкция скорее выражает что мы делаем в терминах самой задачи, то она более высокого уровня, чем та, которая скорее говорит нам как именно реализуется решение.

Интересно, что с этой точки зрения декларативный подход выше уровнем, чем императивный. Также понятно, что для системного программирования особо важно, чтобы язык мог выражать как нечто работает в системе, потому что именно это как напрямую и есть что главной задачи системного программирования. Можно сказать, что низкоуровневый по отношению к множеству разных задач язык программирования может являться одновременно высокоуровневым предметно-ориентированным языком (DSL) для сугубо системных задач, так как лучшим образом отражает архитектуру системы.

unsafe-блоки

Давайте сразу обратимся к примеру и посмотрим, как в Rust работают итераторы:

Обратите внимание, что структура Iter содержит в качестве своих полей два указателя: ptr и end (строки 2 и 3). Из-за того, что эти указатели — это обычные Си-совместимые указатели (правда NonNull дополнительно требует, чтобы указатель не был нулевым), довольно низкоуровневые ссылочные типы, их время жизни никак не отслеживается borrow checker’ом. Поэтому заданное в объявлении структуры время жизни ссылки ‘a (1) мы вынуждены добавить в «фантомное» поле с типом нулевой размерности PhantomData (4). Иначе время жизни окажется никак не используемым внутри структуры, что приведет к ошибке компиляции. То есть, другими словами: мы хотим сделать безопасный итератор, который ссылается на элементы коллекции, по которой он итерируется, и для того, чтобы он был безопасным, нам нужно учитывать время жизни ссылок. Но наша внутренняя реализация основана на указателях и потому не подразумевает никакого отслеживания времен жизни со стороны компилятора. Поэтому мы должны гарантировать своей реализацией безопасность кода, работающего с указателями (в unsafe-блоках, подобных 5), и тогда можно реализовать безопасный внешний API по всем правилам работы в safe Rust.

Это очень наглядный пример того, что представляет собой Rust на самом деле. Это высокоуровневый, безопасный язык, в котором есть низкоуровневые небезопасные возможности. Тут граница, по которой одно отделяется от другого — это определение типа, а блоки unsafe выступают маркером того, что в реализации используются весьма низкоуровневые и небезопасные средства (на самом деле в общем случае граница проходит через определение модуля: пока в язык не будет добавлена возможность помечать поля как unsafe, потенциально небезопасным становится весь код в пределах модуля, если на поведение unsafe-методов влияет содержимое полей структуры).

Важный вывод, к которому мы здесь приходим, состоит в том, что Rust — самодостаточный язык. Его высокоуровневые возможности вполне реализуются на низком уровне им же самим. И наоборот: из низкоуровневых «кирпичей» в Rust можно конструировать высокоуровневые блоки, скрывая детали реализации за безопасным API.

Теперь должно быть понятно, что unsafe, который тут и там встречается в стандартной библиотеке Rust — это не баг, а фича. Есть довольно популярный упрек к Rust со стороны: дескать, какой же это безопасный и высокоуровневый язык, если у него в std сплошные unsafe-блоки? Он либо тогда должен быть весь unsafe, либо полностью safe. Но преимущество Rust как раз состоит в том, что он позволяет делать и то и другое, при этом отделяя одно от другого. Это одна из причин, почему Rust по-настоящему универсальный язык программирования.

Макросы

Посмотрите, как организуется простейший цикл for на Python:

Они похожи, не правда ли? Но for в Rust — это просто синтаксический сахар к более низкоуровневому представлению. Вот во что разворачивается данный цикл for :

Касательно процедурных макросов: забавно, как возможность делать низкоуровневые вещи открывает языку путь к построению предельно высокоуровневых абстракций. Дело в том, что процедурные макросы в Rust — это своего рода «плагины к компилятору», которые пишутся на самом Rust. Так как Rust — это язык без сборщика мусора, то он может использоваться для создания встраиваемых компонентов. В частности, можно написать динамическую библиотеку, которую подгрузит компилятор при компиляции вашей программы, и которая будет реализовывать ваши собственные расширения языка. Взглянем на пример использования атрибутных процедурных макросов в actix-web :

Здесь #[get(..)] и #[actix_rt::main] — это пользовательские атрибуты, которые приведут при компиляции к преобразованию элементов, на которые они навешены, в соответствии с заданной программой. Вот во что развернется код выше при компиляции:

Здесь макрос позволяет указать разметку в привычном виде, декларативно, на html-подобном языке, с вкраплениями Rust-кода. Похоже на JSX, расширение языка JavaScript. Только Rust изначально обладает средствами для создания подобных расширений, для него они — обычное дело.

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

В отличие от некоторых высокоуровневых языков (таких как Python), которые служат своего рода «клеем» для низкоуровневых компонентов, написанных на других языках, Rust сам выступает и в роли «клея», и в роли инструмента реализации «склеиваемых» компонентов.

Бесплатные абстракции

Удивительно, насколько наличие абстракций с нулевой стоимостью, даже самых элементарных, упрощает прикладную разработку. Посмотрите на следующий код, который написан на языке, считающимся высокоуровневым:

И сравните с тем, как то же самое поведение реализуется в Rust:

Где вам понятнее, что происходит и где, по-вашему, вероятность ошибиться меньше? Мне кажется, что ответ очевиден.

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

Несмотря на то, что оба значения a и b имеют одинаковое числовое представление, они являются объектами разных типов, и поэтому перепутать и подставить одно значение вместо другого не получится. Этот паттерн называется «Новый тип» (New type), и он совершенно бесплатен в использовании. (Подробнее о преимуществах использования паттерна «Новый тип» вы можете прочитать в замечательной статье Передача намерений.)

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

Обобщенные типы

Помимо того, что обобщенные типы избавляют от написания шаблонного кода, они являются отличным инструментом абстрагирования и высокоуровневой спецификации поведения. Вот что я имею в виду:

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

Можно сделать так, что UserId будет возможно сконструировать только с помощью некоего сервиса, который либо выдает новое число из глобальной последовательности идентификаторов, либо десериализует значение UserId из ранее сконструированного и сохраненного. (Подробнее о преимуществах подобного подхода к проектированию типов вы можете прочитать в статье Парсите, а не валидируйте.)

Итак, на границе высокоуровневого и низкоуровневого кода, проходящей через определения обобщенных типов, мы можем столкнуться как с высокоуровневыми, так и с низкоуровневыми ограничениями, причем далеко не всегда просто отделить одни от других. Но помочь с этим может введение новых типажей:

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

Перечисление типов

АТД во многих случаях избавляет программиста от написания низкоуровневого кода для проверки целостности и непротиворечивости типов данных. Что актуально не только для языков с динамической типизацией, но и для статически типизированных языков.

Вообще, enum в Rust используется чуть менее, чем везде — и это прекрасно! Потому что АТД — это абстракция очень высокого уровня, сравнимая с наследованием классов и полиморфизмом подтипов в ООП. Выражение традиционно низкоуровневых концепций в терминах АТД неожиданно делает их не такими уж и низкоуровневыми.

Вот как решается проблема реализации отсутствующего значения в Rust:

Подробнее об АТД и преимуществах их использования, вы можете прочитать в статье Романа Душкина «Алгебраические типы данных и их использование в программировании».

Владение

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

В Java, например, с try-with-resources ответственность за корректное освобождение ресурсов перекладывается на вызывающую сторону. К тому же не всегда использование ресурсов настолько локализовано, что безошибочное использование try-with-resources очевидно. Использование Cleaner улучшает ситуацию и избавляет пользователя от необходимости следить за освобождением в тривиальных случаях, но в более сложных — головной боли не избежать (подробнее о проблемах освобождения ресурсов в Java смотрите в лекции Евгения Козлова «Вы все еще используете finalize()? Тогда мы идем к вам»).

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

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

Реализация подобного сценария желательна не так уж и редко, а в некоторых случаях она крайне необходима. Так что с помощью системы владения Rust защита последовательности смены состояний становится достаточно простым делом.

Заимствование

На низком уровне заимствование означает получение ссылки на объект, время жизни которой компилятор проверит на соответствие времени жизни исходного объекта. Но при взгляде с более высокого уровня, заимствование означает получение некоего представления (view), временно соотнесенного с исходным объектом. Такое представление не обязано быть единственным.

Что же в итоге?

Как видите, Rust — это не просто очередной системный язык программирования по мотивам Си. На системный язык, обогащенный рядом высокоуровневых концепций, можно смотреть и с другой стороны: как на прикладной язык, снабженный низкоуровневым инструментарием.

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

Полагаю, что качество Rust-кода и удобство его доработки будет напрямую зависеть от того, насколько удачно программист решил проблему инкапсуляции низких уровней относительно высоких в рамках своей задачи. Конечно, тут у Rust еще большой простор для совершенствования, но имеющихся средств уже достаточно, чтобы довольно комфортно вести прикладную, высокоуровневую разработку, а не только решать низкоуровневые системные задачи.

Upd.: Отдельное спасибо T_12 за вычитку текста статьи и дельные замечания.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *