Содержание
- Сложность изучения
- В итоге
- Почитать
- Компоненты
- Расширения языка
- NPCs
- Wounded
- Stability
- Locks
- Разное
- Что такое шаблон?
- Синтаксис
- Начало игры
- Акт номер 5: Яваскрипт
- Постройка дома и распределение обязанностей
- Акт номер 7: И где же rust?
- Акт номер 0xFF: Учимся
- Установка
- Too Cold & Too Hot
- Wet & Drowning
- Resources
- Компоненты
- Wounded
- А также
- В чём идея языка Rust
- Акт номер 3: Сиииии и Сипипииии
Сложность изучения
Долгий процесс изучения Rust во многом следует из предыдущего раздела. Перед тем как написать вообще хоть что-то придется потратить время на освоение ключевой концепции владения памятью, т.к. она пронизывает каждую строчку. К примеру, простейший список у меня занял пару вечеров, в то время как на Kotlin то же самое пишется за 10 минут, при том что это не мой рабочий язык. Помимо этого многие привычные подходы к написанию алгоритмов или структур данных в Rust будут выглядеть по другому или вообще не сработают. Т.е. при переходе на него понадобится более глубокая перестройка мышления, просто освоить синтаксис будет недостаточно. Это далеко не JavaScript, который все проглотит и все стерпит. Думаю, Rust никогда не станет тем языком, на котором учат детей в школе программирования. Даже у С/С++ в этом смысле больше шансов.
В итоге
Мне показалась очень интересной идея управления памятью на этапе компиляции. В С/С++ у меня опыта нет, поэтому не буду сравнивать со smart pointer. Синтаксис в целом приятный и нет ничего лишнего. Я покритиковал Rust за сложность реализации графовых структур данных, но, подозреваю, что это особенность всех языков программирования без GC. Может быть, сравнения с Kotlin было и не совсем честным.
Почитать
Если вас заинтересовал Rust, то вот несколько ссылок:
- Programming Rust: Fast, Safe Systems Development — хорошая книга, есть так же в электронном варианте
- Rust Documentation — официальная документация, есть примеры
- Idiomatic Rust code — список статей
- ruRust/easy и ruRust/general — каналы в Gitter
- r/rust/ — Reddit
Компоненты
БрезентБронированный модульБронированный пассажирский модульВеревкаДорожные знакиКабина с двигателемКарбюратор высокого качестваКарбюратор низкого качестваКарбюратор среднего качестваКлапаны высокого качестваКлапаны низкого качестваКлапаны среднего качестваКлейКоленчатый вал высокого качестваКоленчатый вал низкого качестваКоленчатый вал среднего качестваКорпус винтовкиКорпус пистолет-пулеметаКорпус полуавтоматаЛистовой металлМеталлическая пружинаМеталлическая трубаМеталлическое лезвиеМодуль двигателя автомобиляМодуль двигателя транспортаМодуль для Большого ГрузовикаМодуль задних сиденийМодуль кабины транспортаМодуль таксиНабор для шитьяОтбеливательПалочкиПассажирский модульПоршни высокого качестваПоршни низкого качестваПоршни среднего качестваПропановый баллонСвеча зажигания высокого качестваСвеча зажигания низкого качестваСвеча зажигания среднего качестваСкотчСтарые микросхемыТопливный бакШестерниЭлектрический предохранитель
Расширения языка
Можно расширить язык Rust с помощью процедурного макро-механизма.
Процедурные макросы используют функции Rust, которые выполняются во время компиляции, для изменения потока токенов компилятора. Это дополняет определяемый пользователем механизм макросов, который использует сопоставление с образцом для достижения аналогичных целей.
Процедурные макросы бывают трех видов:
- Функциональные макросы
- Создать макросы
- Макросы атрибутов
Макро является примером функции, как макро и является широко используемым библиотека для генерации кода для чтения и записи данных в различных форматах , таких как JSON . Атрибут макросов обычно используются для языка привязок , таких как библиотеки на наличие ржавчины привязки к R .
Следующий код показывает использование , и получить процедурные макросы для выполнения чтения и записи в формате JSON, а также возможность форматирования структуры для отладки.
useserde_json::{Serialize,Deserialize}; # struct Point{ x: i32, y: i32, } fn main(){ letpoint=Point{x: 1,y: 2}; letserialized=serde_json::to_string(&point).unwrap(); println!("serialized = {}",serialized); letdeserialized: Point=serde_json::from_str(&serialized).unwrap(); println!("deserialized = {:?}",deserialized); }
NPCs
Several different NPC (Non-playable Character) classes can be found in Experimental Rust. They used to be divided into two categories — Hostile and Peaceful. This was until a recent update, Devblog 155, where even peaceful animals turned hostile when approached.
Hostile
Hostile NPCs are aggressive towards the player. They will generally attempt to engage players, who attack or approach them.
Hostile NPCs include:
- Bears
- Bradley APC
- Scientist
- Wolves
- Attack Helicopters
- Boars
Note: In Legacy Rust it is possible for a player to encounter hostile Rad (Irradiated) Wolves and Bears as well. Those have not been implemented in Experimental Rust yet. Nonetheless, the implementation is still subject to discussion.
Peaceful
Peaceful NPCs are usually quite passive towards the player, they will generally avoid the player but when approached, they can often attack — even chickens.
Peaceful NPCs include:
- Horses
- Deer
- Chicken
Wounded
Wounded is a neutral effect that is applied whenever the player is mortally wounded. Sometimes, instead of dying, the player is wounded instead, leaving them defenselessly on the ground with 5 HP. While wounded, the player either slowly regenerates or keeps losing health, depending on the circumstances. If the player reaches 0 HP, be it an animal or player finishing them off, or another status effect slowly decreasing their health, they will die. However, there is also the possibility of another player helping them up, or the player getting up again on their own — the latter being much smaller than dying.
Stability
Main Article: Stability
Stability is a reflection of a structure’s endurance; the more stable, the less likely it is to fall apart, if it reaches zero, it will break instantly upon placement. A stability percentage is visible when mousing over a building object at melee range. An easy way to add stability to a structure is to add pillars before placing walls. This should be the second step when building a house, after completing the foundation. Pillars can only be placed if there are no other objects in their path, and if there is a foundation underneath. When building pillars on the second floor or higher, there must be pillars placed below as well.
Locks
Locks are used to keep people from accessing valuables. Locks can be placed on doors, containers (storage boxes and vending machines) and the Tool Cupboard. There are two different types of locks: the Key Lock which can be crafted with Wood, and the Code Lock which requires Metal Fragments. Both are available to craft by default.
To place a Key Lock, select it and left click on the target. Once deployed, target the lock, hold down the Use key (default «E») and select Lock; only the person who locks the door can open it. To create keys to allow other people through the door, hold down the Use key and select Create Key (requires 25 Wood). Multiple key copies can be created either whoever placed the lock initially or anyone with a key. Other players can kill those who have keys in their inventory and will therefore gain access your base, so keep them safe!
The other lock is the code lock, (100 Metal Fragments) which uses a 4 digit code instead of a key.
Разное
Ёлочная гирляндаЁлочная звездаБольшой мешок с добычейБольшой набор свечейБольшой подарокБронзовое ЯйцоГенератор снегаГигантские декоративные леденцы на палочкеГробДверной ключДекоративная карамельная тростьДекоративная мишураДекоративные елочные игрушкиДекоративные шишкиДекоративный пряничный человечекДеревянный крестЖуткий громкоговорительЗаметкаЗеленая карта доступаЗеленое яйцо ФабержеЗолотое ЯйцоКладбищенский заборКлюч от машиныКорзина для ЯицКрасная карта доступаКрасное яйцо ФабержеМаленький мешок с добычейМаленький подарокНабор малых свечНадгробиеОгромный декоративный леденецОкрашенное ЯйцоПаутинаПроклятый котелокРемкомплект для вертолетаРемкомплект для коптераРемонт воздушного шараСеребряное ЯйцоСерпСинее яйцо ФабержееСиняя карта доступаСредний мешок с добычейСредний подарокСтробоскопическая лампаТыквенное ведроФиолетовое яйцо ФабержеФоггер-3000ФотографияХэллоуинские сладостиЧертежЯйцо Фаберже — Слоновая Кость
Что такое шаблон?
Шаблоны — это удобный способ вставлять на разные страницы одно и то же сообщение. Также они используются для создания инфобоксов и навигационных строк. Шаблоны дают возможность новым и неопытным участникам использовать продвинутый дизайн, новые функции и расширения, при этот им не нужно разбираться в сложном коде.
Все шаблоны можно найти на странице Служебная:Allpages, в пространстве имен «Шаблоны».
Шаблон может быть помещен на страницу с помощью вики-разметки {{Название шаблона}}, после чего страница будет включать в себя содержание этого шаблона. Если внести изменения в шаблон, все страницы, на которые он помещен, автоматически поменяются. Во время редактирования страницы, содержащей шаблон, его содержимое не может быть изменено, хотя внизу страницы при редактировании всегда можно посмотреть список шаблонов, используемых на ней.
Другой вариант использования шаблонов с помощью {{subst:Название шаблона}}. В этом случае после сохранения страницы {{subst:Название шаблона}} будет заменено на содержание шаблона, которое позже может быть заменено, а все изменения, вносимые в шаблон, не будут отображаться на этой странице.
Для того, чтобы сделать простой шаблон, текст, который нужно будет помещать в разные статьи, нужно поместить на страницу в пространстве имен «Шаблоны». То есть нужно создать страницу {{Шаблон:Пример шаблона}}, после чего в другие статьи надо будет вставлять {{Пример шаблона}}, и текст шаблона будет автоматически помещен туда.
Инструкция по использованию шаблона может находится
- на странице документации шаблона `doc`;
- внутри самого шаблона (инструкция должна быть ограничена тэгами «noinclude»);
- на странице обсуждения шаблона.
Синтаксис
Вот и «Привет, мир!» программа написана на Rust. Макрос выводит сообщение на стандартный вывод .
fn main(){ println!("Hello, World!"); }
Синтаксис ржавчины похож на C и C ++ , с блоками кода , ограниченным , и управление потоком ключевыми слов , таким как , , , и , хотя конкретный синтаксис для определения функций больше похож на Pascal . Несмотря на сходство с C и C ++, синтаксис Rust ближе к синтаксису языков семейства ML и языка Haskell . Почти каждая часть тела функции является выражением , даже операторы потока управления. Например, обычное выражение также заменяет тернарное условное выражение языка Си , идиому, используемую АЛГОЛОМ 60 . Как и в Лиспе , функция не должна заканчиваться выражением: в этом случае, если точка с запятой опущена, последнее выражение в функции создает возвращаемое значение , как показано в следующей рекурсивной реализации факториальной функции:
fn factorial(i: u64)-> u64 { matchi{ =>1, n=>n*factorial(n-1) } }
Следующая итеративная реализация использует оператор для создания включающего диапазона:
fn factorial(i: u64)-> u64 { (2..=i).product() }
Начало игры
Итак, вы приобрели Rust и вам уже не терпится сражаться и охотиться. Для начала желательно собрать компанию (3-5 человек — наиболее оптимально). Можно, конечно, выживать и одному. Всё зависит от вас. Но не стоит забывать, что Rust — онлайн игра, здесь вы не сможете в одиночку перевалить шестерых человек (разве что вы действительно невероятно круты). Да и выживать веселее в компании.
Следующий этап — поиск сервера. Тут тоже всё зависит от ваших предпочтений. Однако, советую сервера с 20-30 онлайном, больше — месиво. Также желательно выбирать сервер, открывшийся 1-2 дня назад — так есть возможность первыми получить всё самое лучшее.
Вы в игре. Как видите, с вами лишь обломок скалы, два бинта для остановки кровотечения да факел. Немного. Самым полезным из этого является именно обломок скалы. Факел можно сразу выкинуть. Нашим единственным инструментом мы можем добывать дерево из деревянных кучек, камни из скал и убивать животных. И тут мы сталкиваемся с неожиданной проблемой. Если вы — новичок, то, скорее всего, ориентироваться будет невозможно — карты в Rust нет. Остаётся только надеяться на более опытных товарищей. Тактика такая: все собирают ресурсы, лутают радиоактивные города, а затем — встречаются на условленном месте. Главное на этом этапе — собрать побольше дерева и еды.
Акт номер 5: Яваскрипт
Но тут можно пойти ещё дальше. Зачем компилировать код вообще? Почему бы просто не выполнять инструкции одна за другой? Так и сделали. Так появился javascript.
Код не компилировался вообще. Каждая строка программы последовательно читалась одна за другой и выполнялась как есть. Всё это было вообще шикарно. Никакой мороки с компиляторами, процессорами и оптимизацией. Код просто выполняется.
Но, со временем, мы начали понимать, что javascript должен не только выполняться, но выполняться быстро. Посему программу, которая запускает ваш скрипт начали пилить. Всё это началось с войны браузеров в далёких 2000х. Тогда самым-самым браузером был Internet Explorer 6. Он победил всех. На сцену вышли Mozilla и Google. Началась война. Все боролись за скорость работы сайтов. Javascript начал компилироваться для ускорения производительности. Появились движки для javascript. V8, движок из Google Chrome, в итоге победил всех и вся. Осталось дождаться, когда Firefox переключится на него и вторую войну браузеров можно считать закрытой.
После этого какой-то умелец взял V8 и запилил на нём Node.js. Зачем запускать javascript в браузере? Можно и без браузера. Научился писать на скриптах – пиши на них и серверную часть.
В итоге у нас появилась новая платформа. Вам, как разработчику, вообще чихать на процессор, который установлен на клиенте. Вам чихать на размер экрана и операционную систему. У вас есть доступ к странице, на которой всё это запускается и всё! Победа. Один код запускается на абсолютно разных машинах с максимальной скоростью.
Всё замечательно. Типа того. Количество кода и размер фреймворка начинают пугать. Чистый С компилируется практически без каких-либо издержек. Несколько функций стандартной библиотеки и всё. Java и .net тянут за собой порядка 200 мегабайт кода фреймворка, который надо установить на конечную машину. А уж накладные расходы javascript на память вселяют ужас.
Конечно, компьютеры становятся мощнее и мощнее с каждым годом, и если в 1990х мы могли рассчитывать только на 8,000,000 операций в секунду, то в 2010 мы уже говорили о 3,000,000,000 в секунду. А сейчас мы хоть и опустились до 2,000,000,000, но зато у нас у всех под капотом по 8-16 ядер, которые выполняют эти операции одновременно, да ещё и видеоадаптер, который дополняет всю эту армию вычислительных машин. Так что, по большому счёту нам на скорость начхать. Какая разница если мы получим данные и покажем их на экране за 25 миллисекунд или за 250 миллисекунд? Пользователь всё равно не заметит разницы.
Так и есть. Только это в ваших бизнес-приложениях он не заметит разницы. А вот если вы пишете игру, то разница между 25-ю и 250-ю миллисекундами очень даже заметна. Просто жесть как. Посему приходится выбирать.
Постройка дома и распределение обязанностей
Встретившись со своими компаньонами, приступайте к постройке дома. Вопреки советам многих, я рекомендую сразу начинать строить большой дом, пропустив деревянное укрытие (Wooden Shelter). Место для дома может быть выбрано заранее (уже строили там дом/приглянулось на другом сервере). В любом случае, не стройте рядом со Small Rad Town. Если вы опытный игрок, то сами знаете, почему.
В остальном же — ничего нового. Рядом — ресурсы, животные и город(а). НЕ СТРОЙТЕ ДОМ НА ОТКРЫТЫХ ПОЛЯНАХ И РЯДОМ С ДОРОГОЙ.
Отдайте всё дерево кому-то одному. Он должен заняться постройкой. Для начала — скрафтите нужное количество фундаментов. Установив их, можно поставить верстак и печку. Двери нужны сразу металлические, так что пока железо плавится, установите стены, потолок, дверные проёмы
Обращайте внимание на требования к установке каждой из частей. Например, стена должна быть размещена между двумя балками
Желательно, установите лестницу на второй этаж. Скрафтите и поставьте металлические двери.
В это время остальные члены команды, скрафтив лук и стрелы, отправляются на охоту. Нужно убивать радиоактивных животных и собирать лут с городов. Сейчас ваша цель — наборы исследования и огнестрельное оружие. Опасайтесь других игроков и не ходите поодиночке.
Акт номер 7: И где же rust?
И тут появляется rust. LLVM был просто средой компиляции. Работа с памятью как была проблемой программиста, так ею и осталась. Но ребята из Mozilla решили попробовать что-то новое. В 2010 они написали новый язык программирования, который использовал LLVM как компилятор.
Язык был си-образным и очень низкоуровневым. В нём не было примочек в виде сборщика мусора или фреймворка на 200+ мегабайт.
Но в язык была зашита принципиально новая система работы с памятью. Вместо того чтобы плодить БСОДы направо и налево, вам был дан borrow-checker. (Проверяльщик заимствования? Я не знаю, как правильно это перевести. Я его так и буду называть borrow-checker). Вшитый прямо в компилятор. Подход заключается в следующем: вы пишите код как будто у вас есть сборщик мусора. Вы просто объявляете строку и память для неё появляется автоматически. А после того как вы эту переменную используете, память освобождается сама по себе.
Но это всё не происходит потому что у вас есть сборщик мусора. Компилятор сидит и запихивает куда нужно команды, которые запрашивают память у системы и освобождают эту память. Это не создаёт проблем с производительностью, ибо сходный код на С был бы так же быстр. Вам всё так же пришлось бы запрашивать память и освобождать её. Разница в том что вам не надо постоянно смотреть на БСОДы и Appcrash repots. Компилятор даст вам знать, что вот тут, в строке номер 10 у вас есть потенциальная ошибка памяти. Так что сидите и правьте.
Следующая важная фича rust называется zero-cost abstractions. Это подход к разработке языка. Если вы даёте пользователю какую-то специальную функцию, то это функция не должна ничего стоить.
Например, для того чтобы создать новый поток в С вы выполняете команду fork(). После того как вы выполнили эту команду процессор запускает две идентичные копии вашей программы. Теперь у вас есть два потока и программа выполняется дважды. Всё очень быстро. Но если вы пытаетесь создать новый поток в .net то всё будет не так уж просто. .net может создать несколько потоков при старте программы, а когда вы пытаетесь создать новый поток, .net может впихнуть туда много проверок на то, сколько потоков уже запущенно и можно ли запускать ещё несколько или нужно просто использовать уже созданные потоки. Короче, команда fork() в С создаст две копии вашей программы, в два потока. Команда System.Threading.Thread.Start() в С# может выполнить 50+ других команд создавая ваш поток.
Когда вы создаёте новый поток в rust, то он не будет «тяжелее» fork(). Может быть в вашем коде вы увидите следующее:
Выглядит это всё круто, но под капотом этого странного способа создавать замыкания в rust (||) вы найдёте fork(). Rust сам по себе не будет писать менеджер потоков за вас. Посему, писать всё придётся самому. Если тебе нужен менеджер соединений с базой данных, пожалуйста, вот тебе чистый лист, пиши. (Либо ищи и качай его с crates.io)
Что мы получили в итоге? Rust это язык, который является относительно быстрым и не нуждается в гигантском фреймворке, который надо таскать с собой на конечную систему пользователя. Он позволяет вам предотвратить ошибки управления памятью в процессе написания программы. Вариантов словить утечку намного меньше. Всё прекрасно, так?
Да. Всё прекрасно. Но rust это не простой язык для изучения. Вам надо очень хорошо разбираться в архитектуре компьютеров и понимать как на самом деле работает память. Вам надо хорошо знать системное программирование и иметь хорошее представление о том как работает heap и stack в операционной системе. Rust не прощает ошибок. Но, в отличие от C и C++, rust не прощает ошибок с памятью на этапе компиляции.
Итог: Rust это хороший язык в сообществе Cи-образных языков, который позволяет писать удивительно быстрый код и предотвращает большое количество ошибок работы с памятью.
Акт номер 0xFF: Учимся
Если вы решили учить rust для WEB программирования, но ещё никогда им не пользовались, то для начала я рекомендую выучить rust, читая официальное руководство. Я очень сильно не советую пытаться начать пилить серверную часть на rust если вы никогда ничего на этом языке не писали.
Для начала, напишите хотя-бы парсер текста. Простой grep, например. Потом разберитесь, как эту программу распарралелить. Когда вы научитесь пользоваться областями видимости и без проблем будете создавать замыкания и новые потоки, можно будет переключаться именно на WEB программирование на rust.
После того как язык перестанет быть для вас полной кашей, можете обратиться к “Fullstack Rust” by Andrew Weiss. Я никакого отношения к этой книге не имею, за исключением того, что я её прочитал, и она в деталях объясняет, как правильно писать WEB сервер на rust, как пользоваться wasm и так далее. Не пытайтесь читать эту книгу, если вы ничего про rust не знаете.
А если не хотите обзаводиться этой книгой, что же, не проблема! Мы лёгких путей не ищем!
В попытках выучить всё это вы наткнётесь на кучу различных пакетов, про которые стоит знать. Натыкайтесь. Будет весело.
Читать дофига, учиться и того больше. Ставим компилятор rust и начинаем эксперименты.
Установка
Из репозитория
Для установки последней стабильной версии Rust из официальных репозиториев Arch Linux, установите пакет . Он установит компилятор rustc.
С помощью Rustup
Преимуществом использования Rustup вместо обычной устаноки Rust из репозитория является возможность установки нескольких toolchains (stable, beta, nightly) для нескольких целевых платформ (windows, mac, android) и архитектур (x86, x86_64, arm).
Есть два способа установки rustup: официально поддерживаемый разработчиками Rust и поддерживаемый Arch Linux.
Скачайте скрипт установки с помощью , просмотрите его: и запустите: для установки. Для обновления rustup в будущем запускайте .
Также пакет доступен в официальных репозиториях Arch Linux
Обратите внимание, что при установке с помощью этого пакета обновление с помощью работать не будет, и для обновления rustup следует обновлять этот пакет с помощью pacman.
Теперь нужно установить сам Rust. По умолчанию будет установлена стабильная версия для вашей архитектуры.
Примечание: Добавьте $HOME/.cargo/bin в переменную окружения PATH перед выполнением команды rustup.
$ rustup default stable
Проверим версию Rust с помощью :
$ rustc -V
rustc 1.13.0 (2c6933acc 2016-11-07)
Если вы хотите использовать nightly, выполните:
$ rustup install nightly $ rustup default nightly
$ rustc -V
rustc 1.15.0-nightly (c80c31a50 2016-12-02)
Проверка после установки
Давайте убедимся, что Rust установился корректно, написав простую программу:
~/hello.rs
fn main() { println!("Hello, World!"); }
Затем скомпилируйте её с помощью , введя это:
$ rustc hello.rs && ./hello
Hello, World!
Too Cold & Too Hot
The «Too Cold» effect as seen in-game.
Too Cold is a disadvantageous effect that is applied as soon as a player’s body temperature drops below 5°C. After that point, the player starts taking damage over time, scaling with the player’s decreasing body temperature and eventually leading to death. The latter can be caused by various things, most commonly:
- the night,
- swimming in water (see also the effect)
- the
When the body temperature drops below -4°C, an icy effect will develop around the edges of the screen.
The «Too Hot» effect as seen in-game.
Too Hot is a disadvantageous effect that is applied as soon as a player’s body temperature rises above 40°C. After that point, the player starts taking damage over time, scaling with the player’s increasing body temperature and eventually leading to death. The latter can be caused by various things, most commonly:
- warming
- nearby heat sources like a Camp Fire or a Barbeque. (However not Furnaces!)
- the
Wet & Drowning
The «Wet» effect as seen in-game.
Wet is a neutral effect that is applied whenever the player comes in contact with bodies of water. Depending on how deep the body of the player is submerged in water, the wetness bar will rise, causing the player’s body temperature to drop. This can be beneficial if the player is too hot, or disadvantageous if the player is too cold. When leaving water, the player usually dries on their own, the speed scaling with the body temperature. Note that being close to the effect will prevent the character from drying.
The «Drowning» effect as seen in-game.
Drowning is a disadvantageous effect that is applied whenever the player fully submerges into water and their wetness reaches 100. While under its effect, the player quickly loses health and eventually dies.
Resources
Ahh, our good old friend resources! It is both my Hypothesis and my suspicion that resources (Wood Stack, Stone, Metal) are more likely to spawn where there are people playing. I have evidence that playing on a 128 cap server, there was almost no stone to be found, except when in large areas with other players. On a smaller server, with a cap of about 50, there were no lack of resources. (Nope, the resource nodes only spawn in particular areas of the map. The lack of resources is due to more players harvesting the nodes, leading to a perceived shortage)
Whichever the server you play on, I am here to tell you that if you manage them well, it does not matter how many people will play. You have to know how long your current supplies will last, as well as if you are in an area that will be populating soon/ever.
Resources include the following:
Wood | Stone | Metal |
Animals (+Reds) |
Airplanes |
---|---|---|---|---|
Tree WoodStack |
Stone |
Metal |
|
|
Mentioned above are the main resource spawns. These do not include the other ones that are not as common.
Компоненты
Rust включает в себя большое количество компонентов, которые расширяют набор функций Rust и упрощают разработку на Rust. Установка компонентов обычно управляется rustup, установщиком инструментальной цепочки Rust, разработанным проектом Rust.
Груз
Cargo — это система сборки и менеджер пакетов Rust . Cargo обрабатывает загрузку зависимостей и построение зависимостей. Cargo также действует как оболочка для clippy и других компонентов Rust. Это требует, чтобы проекты следовали определенной структуре каталогов.
Зависимости для пакета Rust указаны в файле Cargo. toml вместе с требованиями к версии , сообщая Cargo, какие версии зависимости совместимы с пакетом. По умолчанию Cargo свои зависимости из пользовательского реестра но репозитории и пакеты Git в локальной файловой системе также могут быть указаны как зависимости.
Rustfmt
Rustfmt — это программа для форматирования кода для Rust. Он принимает исходный код Rust в качестве входных данных и изменяет пробелы и отступы для создания отформатированного кода в соответствии с руководством по стилю Rust или правилами, указанными в файле rustfmt.toml. Rustfmt можно запускать как отдельную программу или в проекте Rust через Cargo.
Clippy
Clippy — это встроенный в Rust инструмент линтинга для улучшения корректности, производительности и читаемости кода Rust. По состоянию на 2021 год в Clippy действует более 450 правил, которые можно просматривать в Интернете и фильтровать по категориям. Некоторые правила по умолчанию отключены.
СБН
RLS — это языковой сервер, который предоставляет интегрированным средам разработки и текстовым редакторам дополнительную информацию о проекте Rust. Он обеспечивает проверку линтинга через Clippy , форматирование через Rustfmt, автоматическое завершение кода через Racer и другие функции. Развитие Racer было замедлено в пользу анализатора ржавчины .
Wounded
Main Article: Wounded_(aka_Downed)
Once a player’s Health is reduced to 0 the player is «wounded» or «downed». Whilst in this state, the player will not be able to move, but will remain conscious and their health will be temporarily set to 1. Nearby players can either help the player up or the player could die. However, there is a chance that a player can get back up on their feet after this state.. A wounded player’s inventory can be freely accessed by all players, so they will take even your pants.
To prevent group fights from unnecessarily prolonging, the wounded status will be available only once every 60 seconds at most. Being mortally wounded more than twice in those 60 seconds will cause the player to die the second time.
А также
Я не ставлю себе целью написать учебник по Rust, а просто хочу подчеркнуть его особенности. В этом разделе опишу, что еще есть полезного, но, на мой взгляд, не такого уникального:
- Любители функционального программирования не будут разочарованы, для них есть лямбды. У итератора есть методы для обработки коллекции, например, filter и for_each. Чем-то похоже на стримы из Java.
- Конструкция match так же может быть использована для более сложных вещей, чем обычные enum, например, для обработки паттернов
- Есть большое количество встроенных классов, например, коллекций: Vec, LinkedList, HashMap и т.д.
- Можно создавать макросы
- Есть возможность добавлять методы в существующие классы
- Поддерживается автоматическое выведение типов
- Вместе с языком идет стандартный фреймворк для тестирования
- Для сборки и управления зависимостями используется встроенная утилита cargo
В чём идея языка Rust
Автору языка нравилась скорость работы и всемогущество языка C++ и надёжность Haskell. Он поставил перед собой задачу совместить оба этих подхода в одном языке, и за несколько лет он собрал первую версию языка Rust.
Rust позиционируется как компилируемый системный мультипарадигмальный язык высокого уровня. Сейчас поясним, что это значит.
Компилируемый язык означает, что готовая программа — это отдельный файл, который можно запустить на любом компьютере с нужной операционной системой. Для запуска не нужно устанавливать среду разработки и компилятор, достаточно, чтобы скомпилированная версия подходила к вашему компьютеру.
Системный — это когда на языке пишут программы для работы системы в целом. Это могут быть операционные системы, драйверы и служебные утилиты. Обычные программы тоже можно писать на Rust — от калькулятора до системы управления базами данных. Системный язык позволяет писать очень быстрые программы, которые используют все возможности железа.
Мультипарадигмальный значит, что в языке сочетаются несколько парадигм программирования. В случае Rust это ООП, процедурное и функциональное программирование. Причём, ООП в Rust пришло из C++, а функциональное — из Haskell. Программист может сам выбирать, в каком стиле он будет писать код, или совмещать разные подходы в разных элементах программы.
Акт номер 3: Сиииии и Сипипииии
Чем же С был так хорош? Ну, давайте заменим определённые последовательности ассемблеровского кода более удобочитаемыми командами. Например, если мы хотим сравнить два числа и выполнить разный код по результатам этого сравнения, то мы можем заменить это
Вот этим
Ваш код становится намного более удобочитаемым. Плюс мы все знаем, что считывать данные с клавиатуры и писать данные на экран это то, что практически всякая программа будет делать по умолчанию. Посему мы можем написать стандартную библиотеку команд, которые будут доступны каждому, кто пишет на С.
После всего этого мы передаём нашу текстовую программу компилятору, который собирает эту программу в объектный файл. Этот объектный файл передаётся linker (линкеру), который прикручивает ваш код куда надо.
Так, стоп, а это откуда здесь взялось? Куда чего надо прикручивать? Так, ты в своём коде использовал printf? Да, использовал. Код printf это часть стандартного набора команд. Этот код – функция, которая была скомпилирована в отдельный объектный файл. Когда ты эту функцию вызываешь надо чтобы твой программный код заставил процессор прервать выполение твоей программы, выяснить, где в памяти находится printf, выставить регистр исполняемой команды процессора в определённое значение и вызвать нужное прерывание, чтобы процессор бросил твою команду и ринулся выполнять printf. После выполнения процессор должен вернуться к твоей программе. Опять прыгание по памяти и всё такое.
Писать всё это руками было бы очень муторно, но линкер решает эти проблемы. Он собирает все объектные файлы (куски исполняемой программы) в один большой исполняемый бинарник. Выясняет все имена функций и проставляет все адреса в памяти как надо. Тобишь всё складывается воедино линкером и он выдаёт тебе в руки один исполняемый файл. Ты его клик-клик и программа запускается!
Магия.
Чем же так хорош С? Тем что он был достаточно прост, стандартен и позволял быстро писать программы не заморачиваясь тем, как работает ваш процессор. Компиляторов (обычно под этим понимается компилятор+линкер) для С было написано столько, что ныне их уже не счесть. С всегда был стандартным языком. В нём точно говорится, что если в программе написано if то в итоге код должен делать такое-то ветвление. (А если в программе написано봎볈볬, то твой код должен выпускать демонов из ноздрей.) Посему, если вы написали программу для своего любимого, на тот момент компьютера PDP-11, то её можно было бы скомпилировать и на нынешнем Intel Core i11.
Ух ты! Вот тут у нас и появляется концепт программы, которая пишется не для определённого процессора, и даже не для определённой операционной системы. Такую программу можно запустить на всём что под руку попадётся, главное чтобы у вас в руках был компилятор.
И компиляторы были и есть. Их в С более 50ти популярных. Просто утопия. Типа того. На самом деле, не всё ТАК уж прям утопично. Код, написанный для 32х битных систем может скомпилироваться, а может и не скомипилироваться на 64х битных системах. А вот код который дёргает 64х битные функции точно рухнет на 32х битных системах. Это ещё что. Windows, unix и MacOS имеют разные подсистемы управления памятью. Что-то может заработать на маке и выдать замечательное приветствие на винде:
Ну, эти проблемы в С решили. У нас есть система под названием makefile. Это программный комплекс который управляет процессом компиляции. Когда файлов у вас в проекте сотни и последовательность компилирования может меняться, когда надо сделать так чтобы система собиралась по-разному на Windows и Unix или проверяла, если сборка делается на 64х разрядном компьютере, вы пишите makefile.
Всё это становится очень утомительным. В добавок ко всему, С хорош в написании функций, но вот мы-то работаем с объектами. Посему пришлось писать улучшенную версию С, которая называется С++. Плюсы позволили создавать тръу ООП программы с классами, бллк-джеком и куртизанками. (Уж простите меня на ужасное утрирование. Разница между С и С++ достойна не то что отдельной статьи, можно будет и книгу написать. Но статья-то про rust, так что мы будем опускать детали.)