Rating@Mail.ru

Форум по операционной системе GNU/Linux и свободному программному обеспечению


Текущее время: 19 июн 2018, 04:12

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: код на Rust
Непрочитанное сообщениеДобавлено: 13 фев 2018, 19:27 
Не в сети
Писатель
Аватара пользователя

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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: код на Rust
Непрочитанное сообщениеДобавлено: 13 фев 2018, 19:33 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10806
Откуда: Харьков
Olej писал(а):
Относительно установки, начала использования, и справочных источников по Rust - было (и будет дополняться) здесь:

Вот как интересно (красочно :lol: ) выглядят в терминале Linux сообщения об ошибках при компиляции программы Rust!


Вложения:
r1.png
r1.png [ 28.4 КБ | Просмотров: 458 ]
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: код на Rust
Непрочитанное сообщениеДобавлено: 14 фев 2018, 11:31 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10806
Откуда: Харьков
Программа вычисления факториала, которая используется для сравнения скорости кода, написанного на разных языках:
Код:
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 байт]
Скачиваний: 9
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: код на Rust
Непрочитанное сообщениеДобавлено: 14 фев 2018, 13:13 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10806
Откуда: Харьков
Вот здесь: 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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: код на Rust
Непрочитанное сообщениеДобавлено: 14 фев 2018, 14:07 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10806
Откуда: Харьков
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 (это очень напоминает директиву использования языка во всех скриптовых языках):
[/code]#![feature(slice_patterns)][/code]
Что порождает ошибку:
Код:
[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

По тексту сообщения - это не применимо в стабильной версии языка, а что-то относящееся только к девелоперской версии.


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: код на Rust
Непрочитанное сообщениеДобавлено: 14 фев 2018, 14:39 
Не в сети
Писатель
Аватара пользователя

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

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

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

Это очень интересно!


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: код на Rust
Непрочитанное сообщениеДобавлено: 14 фев 2018, 14:50 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10806
Откуда: Харьков
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.


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: код на Rust
Непрочитанное сообщениеДобавлено: 14 фев 2018, 15:00 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10806
Откуда: Харьков
Попалась на глаза вот такая потрясающе интересная штука (просто нельзя не отметить! ;-) ):
Цитата:
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 КБ]
Скачиваний: 9
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: код на Rust
Непрочитанное сообщениеДобавлено: 14 фев 2018, 16:44 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10806
Откуда: Харьков
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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: код на Rust
Непрочитанное сообщениеДобавлено: 14 фев 2018, 16:57 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10806
Откуда: Харьков
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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
[ Time : 0.289s | 21 Queries | GZIP : On ]