код на Rust
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
код на Rust
Здесь буду писать всё, что касается программного кода на языке Rust.
Относительно установки, начала использования, и справочных источников по Rust - было (и будет дополняться) здесь: Rust.
Относительно установки, начала использования, и справочных источников по Rust - было (и будет дополняться) здесь: Rust.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: код на Rust
Вот как интересно (красочно ) выглядят в терминале Linux сообщения об ошибках при компиляции программы Rust!Olej писал(а):Относительно установки, начала использования, и справочных источников по Rust - было (и будет дополняться) здесь:
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: код на Rust
Программа вычисления факториала, которая используется для сравнения скорости кода, написанного на разных языках:
Ручная компиляция (консольная команда ... хотя в технологии Rust предлагается другая техника - проект):
А теперь ... внимание! - выполнение в сравнении с таким же кодом на C, компилированном GCC с опциями максимальной оптимизации:
Код: Выделить всё
use std::env;
fn fibo( x: u64 ) -> u64 {
if x < 2 { 1 }
else { fibo( x - 1 ) + fibo( x - 2 ) }
}
fn main() {
let args: Vec<String> = env::args().collect();
let num: u64 = args[ 1 ].trim().parse().unwrap();
println!( "{}", fibo( num ) );
}
Код: Выделить всё
[olej@dell rust]$ rustc -O fibo.rs
Код: Выделить всё
[olej@dell ManySpeed.exmpl]$ time ./fibo_c 45
1836311903
real 0m5.127s
user 0m5.067s
sys 0m0.002s
[olej@dell rust]$ time ./fibo_rs 45
1836311903
real 0m6.684s
user 0m6.603s
sys 0m0.002s
- Вложения
-
- fibo_rs.rs
- (259 байт) 167 скачиваний
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: код на Rust
Вот здесь: Implementing Rosetta Code problems in Rust. - огромное число развивающихся демонстрационных проектов, которые очень помогают в освоении тонких особенностей синтаксиса Rust:
Берём любой проект и собираем ... Или просто файл main.rs из любого проекта компилируем и выполняем:
Код: Выделить всё
[olej@dell rust]$ ls -lR rust-rosetta-master | wc -l
4207
Код: Выделить всё
[olej@dell rust]$ rustc -O main.rs
[olej@dell rust]$ ./main
123
123
456
456
^C
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: код на Rust
Но этот же огромный архив информации показывает / подсказывает много любопытных вещей:Olej писал(а):Вот здесь: Implementing Rosetta Code problems in Rust. - огромное число развивающихся демонстрационных проектов, которые очень помогают в освоении тонких особенностей синтаксиса Rust:
- многие проекты там по дате обновления: "7 days ago" ... и подобное, по разному...
- и они не компилируются из-за синтаксических ошибок
- это происходит в последней стабильной версии Rust:
Код: Выделить всё
[olej@dell rust]$ rustc -V
rustc 1.23.0 (766bd11c8 2018-01-01)
- а это значит, что конкретный пример из архива: а). либо не поспевает обновляться за версиями Rust, б). либо пример отрабатывается на последних нестабильных, девелоперских версиях Rust
- и в том и в другом случае это напоминает о том, что реализации Rust ещё очень молодые (< 3-х лет), и обещанная совместимость снизу вверх пока ещё сильно преувеличена
И ещё, изучение архива (даже самое поверхностное) даёт очень интересные вещи (или предположения ... которые ещё нужно подтверждать):
1. Похоже, что эти примеры отрабатывались в Windows реализациях? ... тогда это может говорить о некоторых несовместимостях из-за платформы (хотя обещают...)
2. В дефаултной установке Rust нет некоторых библиотечных пакетов?
Такие вот объявления, которые порождают ошибки:
Код: Выделить всё
extern crate rand;
Код: Выделить всё
extern crate num;
use num::complex::Complex;
fn main() {
let a = Complex::new(-4.0f32, 5.0);
let b = Complex::new(1.0f32, 1.0);
println!("a = {}", a);
println!("b = {}", b);
println!("a + b = {}", a + b);
println!("a * b = {}", a * b);
println!("1 / a = {}", Complex::new(1.0f32, 0.0) / a);
println!("-a = {}", -a);
println!("conj a = {}", a.conj());
}
3. Такие вот ... "директивы" ( ) 1-й строкой файла main.rs (это очень напоминает директиву использования языка во всех скриптовых языках):
Код: Выделить всё
#![feature(slice_patterns)]
Код: Выделить всё
[olej@dell rust]$ rustc -O ex6.rs
error[E0554]: #![feature] may not be used on the stable release channel
--> ex6.rs:1:1
|
1 | #![feature(slice_patterns)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: код на Rust
Здесь вот: Темное искусство продвинутого и небезопасного программирования на Rust - перевод книги, сделанный 2016-м годом, описывающий совершенно хакерские штуки и трюки в коде Rust, и потенциальные случаи небезопасности.
P.S. Читать это а). без достаточного профессионализма в программировании вообще и б). без более-менее уверенного знакомства с синтаксисом Rust - не рекомендуется.
Отложите это на потом!
Вот фрагмент из начала книги:
P.S. Читать это а). без достаточного профессионализма в программировании вообще и б). без более-менее уверенного знакомства с синтаксисом Rust - не рекомендуется.
Отложите это на потом!
Вот фрагмент из начала книги:
Это очень интересно!Все еще хуже, если вы захотите иметь дело напрямую с операционной системой и вам придется разговаривать на небезопасном языке: Си. Си вездесущ и неизбежен. Это лингва-франка мира программирования. Все безопасные языки на самом деле используют интерфейсы Си для общения с внешним миром! Как бы вы ни хотели, как только ваша программа начинает взаимодействовать с Си, она перестает быть безопасной.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: код на Rust
CratesOlej писал(а): Как добавлять эти вот crate-ы я пока не понимаю.
A crate is a compilation unit in Rust. Whenever rustc some_file.rs is called, some_file.rs is treated as the crate file. If some_file.rs has mod declarations in it, then the contents of the module files would be inserted in places where mod declarations in the crate file are found, before running the compiler over it. In other words, modules do not get compiled individually, only crates get compiled.
A crate can be compiled into a binary or into a library. By default, rustc will produce a binary from a crate. This behavior can be overridden by passing the --crate-type flag to rustc.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: код на Rust
Попалась на глаза вот такая потрясающе интересная штука (просто нельзя не отметить! ):
Это означает, что из Rust можно элементарно просто использовать практически все существующие библиотеки C!
С примером использования:Foreign Function Interface
Rust provides a Foreign Function Interface (FFI) to C libraries. Foreign functions must be declared inside an extern block annotated with a #[link] attribute containing the name of the foreign library.
Код: Выделить всё
use std::fmt;
// this extern block links to the libm library
#[link(name = "m")]
extern {
// this is a foreign function
// that computes the square root of a single precision complex number
fn csqrtf(z: Complex) -> Complex;
fn ccosf(z: Complex) -> Complex;
}
// Since calling foreign functions is considered unsafe,
// it's common to write safe wrappers around them.
fn cos(z: Complex) -> Complex {
unsafe { ccosf(z) }
}
fn main() {
// z = -1 + 0i
let z = Complex { re: -1., im: 0. };
// calling a foreign function is an unsafe operation
let z_sqrt = unsafe { csqrtf(z) };
println!("the square root of {:?} is {:?}", z, z_sqrt);
// calling safe API wrapped around unsafe operation
println!("cos({:?}) = {:?}", z, cos(z));
}
// Minimal implementation of single precision complex numbers
#[repr(C)]
#[derive(Clone, Copy)]
struct Complex {
re: f32,
im: f32,
}
impl fmt::Debug for Complex {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.im < 0. {
write!(f, "{}-{}i", self.re, -self.im)
} else {
write!(f, "{}+{}i", self.re, self.im)
}
}
}
Код: Выделить всё
[olej@dell rust]$ rustc ccomplex.rs
[olej@dell rust]$ ./ccomplex
the square root of -1+0i is 0+1i
cos(-1+0i) = 0.5403023+0i
- Вложения
-
- ccomplex.rs
- (1.19 КБ) 168 скачиваний
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: код на Rust
В составе проекта (для cargo) :Olej писал(а): Как добавлять эти вот crate-ы я пока не понимаю.
Код: Выделить всё
[olej@dell complex]$ pwd
/home/olej/2018_WORK/own.BOOKs/ManyLang/rust/rust-rosetta-master/tasks/arithmetic/complex
[olej@dell complex]$ cat Cargo.toml
[package]
name = "complex"
version = "0.1.0"
[package.metadata.rosettacode]
url = "http://rosettacode.org/wiki/Arithmetic/Complex"
[dependencies]
num = "0.1"
Код: Выделить всё
[olej@dell complex]$ cargo build
Updating registry `https://github.com/rust-lang/crates.io-index`
Updating registry `https://github.com/rust-lang/crates.io-index`
Downloading num v0.1.41
Downloading num-iter v0.1.34
Downloading num-rational v0.1.40
Downloading num-complex v0.1.41
Downloading num-bigint v0.1.41
Downloading num-traits v0.1.41
Downloading num-integer v0.1.35
Downloading rustc-serialize v0.3.24
Downloading rand v0.3.20
Downloading libc v0.2.35
Compiling num-traits v0.1.41
Compiling libc v0.2.35
Compiling rustc-serialize v0.3.24
Compiling rand v0.3.20
Compiling num-integer v0.1.35
Compiling num-iter v0.1.34
Compiling num-complex v0.1.41
Compiling num-bigint v0.1.41
Compiling num-rational v0.1.40
Compiling num v0.1.41
Compiling complex v0.1.0 (file:///home/olej/2018_WORK/own.BOOKs/ManyLang/rust/rust-rosetta-master/tasks/arithmetic/complex)
Finished dev [unoptimized + debuginfo] target(s) in 18.13 secs
[olej@dell complex]$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `/home/olej/2018_WORK/own.BOOKs/ManyLang/rust/rust-rosetta-master/target/debug/complex`
a = -4+5i
b = 1+1i
a + b = -3+6i
a * b = -9+1i
1 / a = -0.09756097-0.12195122i
-a = 4-5i
conj a = -4-5i
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: код на Rust
И вот где оно это всё после обновления оказывается:Olej писал(а): Это всё само подтягивается с GitHub, обновляется и работает:
Код: Выделить всё
[olej@dell rust-rosetta-master]$ pwd
/home/olej/2018_WORK/own.BOOKs/ManyLang/rust/rust-rosetta-master
[olej@dell rust-rosetta-master]$ tree target/
target/
└── debug
├── build
├── complex
├── complex.d
├── deps
│ ├── complex-d31843c062db5acc
│ ├── liblibc-e5d15e2dd1f6d9b4.rlib
│ ├── libnum-81c9c05433349247.rlib
│ ├── libnum_bigint-d1cc116193b9aca8.rlib
│ ├── libnum_complex-3aae3620f5df861d.rlib
│ ├── libnum_integer-57c79c389e9bc502.rlib
│ ├── libnum_iter-ed0d7c6d5e519bf5.rlib
│ ├── libnum_rational-c5118a8ab68d2e88.rlib
│ ├── libnum_traits-7ac63177061a0ce2.rlib
│ ├── librand-ac0d6e7c8ce6a500.rlib
│ └── librustc_serialize-3daf7fbbbeb27b1f.rlib
├── examples
├── incremental
└── native
6 directories, 13 files
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей