код на Rust

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

код на Rust

Непрочитанное сообщение Olej » 13 фев 2018, 19:27

Здесь буду писать всё, что касается программного кода на языке Rust.
Относительно установки, начала использования, и справочных источников по Rust - было (и будет дополняться) здесь: Rust.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код на Rust

Непрочитанное сообщение Olej » 13 фев 2018, 19:33

Olej писал(а):Относительно установки, начала использования, и справочных источников по Rust - было (и будет дополняться) здесь:
Вот как интересно (красочно :lol: ) выглядят в терминале Linux сообщения об ошибках при компиляции программы Rust!
Вложения
r1.png

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код на Rust

Непрочитанное сообщение Olej » 14 фев 2018, 11:31

Программа вычисления факториала, которая используется для сравнения скорости кода, написанного на разных языках:

Код: Выделить всё

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 ) );
}
Ручная компиляция (консольная команда ... хотя в технологии Rust предлагается другая техника - проект):

Код: Выделить всё

[olej@dell rust]$ rustc -O fibo.rs
А теперь ... внимание! - выполнение в сравнении с таким же кодом на C, компилированном GCC с опциями максимальной оптимизации:

Код: Выделить всё

[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 байт) 143 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код на Rust

Непрочитанное сообщение Olej » 14 фев 2018, 13:13

Вот здесь: Implementing Rosetta Code problems in Rust. - огромное число развивающихся демонстрационных проектов, которые очень помогают в освоении тонких особенностей синтаксиса Rust:

Код: Выделить всё

[olej@dell rust]$ ls -lR rust-rosetta-master | wc -l
4207
Берём любой проект и собираем ... Или просто файл main.rs из любого проекта компилируем и выполняем:

Код: Выделить всё

[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 » 14 фев 2018, 14:07

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());
}
Как добавлять эти вот crate-ы я пока не понимаю.

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

Непрочитанное сообщение Olej » 14 фев 2018, 14:39

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

P.S. Читать это а). без достаточного профессионализма в программировании вообще и б). без более-менее уверенного знакомства с синтаксисом Rust - не рекомендуется.
Отложите это на потом! ;-)

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код на Rust

Непрочитанное сообщение Olej » 14 фев 2018, 14:50

Olej писал(а): Как добавлять эти вот crate-ы я пока не понимаю.
Crates
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

Непрочитанное сообщение Olej » 14 фев 2018, 15:00

Попалась на глаза вот такая потрясающе интересная штука (просто нельзя не отметить! ;-) ):
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
Это означает, что из Rust можно элементарно просто использовать практически все существующие библиотеки C!
Вложения
ccomplex.rs
(1.19 КБ) 140 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код на Rust

Непрочитанное сообщение Olej » 14 фев 2018, 16:44

Olej писал(а): Как добавлять эти вот crate-ы я пока не понимаю.
В составе проекта (для cargo) :

Код: Выделить всё

[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"
Это всё само подтягивается с GitHub, обновляется и работает:

Код: Выделить всё

[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 » 14 фев 2018, 16:57

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

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей