код на Rust

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

Модератор: Olej

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

Re: Rust

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

Ещё один очень важная часть языка, из русскоязычной книги: Обработка ошибок
Как и многие языки программирования, Rust призывает разработчика определенным способом обрабатывать ошибки. Вообще, существует два общих подхода обработки ошибок: с помощью исключений и через возвращаемые значения. И Rust предпочитает возвращаемые значения.
Это, собственно, то же направление, что и в Go - новые языки потихоньку отказываются от exeption и их возбуждения, которое было активно введено в C++ Б.Страуструпом ... а далее Java ... и по списку...

И здесь: 16 Обработка ошибок

Это одна из самых интересных частей любого языка программирования!

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

Re: Rust

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

Olej писал(а):Это, собственно, то же направление, что и в Go
Вообще то (как это мне кажется, IMHO), между идеологией Rust и Go - очень много общего:
- отказ от exeption в обработке ошибок, и возврат кортежей как значения и результата и кода завершения (типы Option<T> и Result<T, E> в Rust - как более развитое развитие этой техники);
- отказ от объектности, классов и наследования - в смысле C++ & Java, и реализация interface в Go и trait в Rust ... по принципу: каждый тип/структура, для которых реализован такой interface / trait - может его использовать;
- и там и там внутри самой языковой системы предлагается какая-то техника "разработки через тестирование" - создание модульных тестов при отработке кода;

Возможно, кто понимает больше в формализмах, альтернативах и технике реализации ООП - сможет это сформулировать строго терминологически ... но так это выглядит ... невооружённым взглядом ;-)

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

Re: Rust

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

Olej писал(а): - и там и там внутри самой языковой системы предлагается какая-то техника "разработки через тестирование" - создание модульных тестов при отработке кода;
Но не нужно сильно обольщаться на счёт тестов:
Тестирование программы может быть очень эффективным способом показать наличие ошибок, но оно безнадёжно неподходяще для доказательства их отсутствия.
© Дейкстра, Эдсгер Вибе, «The Humble Programmer» (1972)

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

Re: код на Rust

Непрочитанное сообщение Olej » 12 май 2022, 19:49

Olej писал(а):
14 фев 2018, 16:57
14 фев 2018
Есть намерение посмотреть что там произошло за прошедшие 4 года с Rust.

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

Re: код на Rust

Непрочитанное сообщение Olej » 12 май 2022, 21:33

Olej писал(а):
12 май 2022, 19:49
Есть намерение посмотреть что там произошло за прошедшие 4 года с Rust.
Rust

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

olej@R420:~$ rustc --version
rustc 1.60.0 (7737e0b5c 2022-04-04)

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

Re: код на Rust

Непрочитанное сообщение Olej » 12 май 2022, 21:39

Olej писал(а):
12 май 2022, 19:49
Есть намерение посмотреть что там произошло за прошедшие 4 года с Rust.
Простенький проект с помощью менеджера проектов cargo:

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

olej@R420:~$ cargo build --help
cargo-build 
Compile a local package and all of its dependencies

USAGE:
    cargo build [OPTIONS]

OPTIONS:
    -q, --quiet                     Do not print cargo log messages
    -p, --package [<SPEC>]          Package to build (see `cargo help pkgid`)
        --workspace                 Build all packages in the workspace
        --exclude <SPEC>            Exclude packages from the build
    -v, --verbose                   Use verbose output (-vv very verbose/build.rs output)
        --all                       Alias for --workspace (deprecated)
        --color <WHEN>              Coloring: auto, always, never
    -j, --jobs <N>                  Number of parallel jobs, defaults to # of CPUs
        --frozen                    Require Cargo.lock and cache are up to date
        --lib                       Build only this package's library
        --bin [<NAME>]              Build only the specified binary
        --locked                    Require Cargo.lock is up to date
        --bins                      Build all binaries
        --offline                   Run without accessing the network
        --config <KEY=VALUE>        Override a configuration value (unstable)
        --example [<NAME>]          Build only the specified example
        --examples                  Build all examples
    -Z <FLAG>                       Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for
                                    details
        --test [<NAME>]             Build only the specified test target
        --tests                     Build all tests
        --bench [<NAME>]            Build only the specified bench target
        --benches                   Build all benches
        --all-targets               Build all targets
    -r, --release                   Build artifacts in release mode, with optimizations
        --profile <PROFILE-NAME>    Build artifacts with the specified profile
        --features <FEATURES>       Space or comma separated list of features to activate
        --all-features              Activate all available features
        --no-default-features       Do not activate the `default` feature
        --target <TRIPLE>           Build for the target triple
        --target-dir <DIRECTORY>    Directory for all generated artifacts
        --out-dir <PATH>            Copy final artifacts to this directory (unstable)
        --manifest-path <PATH>      Path to Cargo.toml
        --ignore-rust-version       Ignore `rust-version` specification in packages
        --message-format <FMT>      Error format
        --build-plan                Output the build plan in JSON (unstable)
        --unit-graph                Output build graph in JSON (unstable)
        --future-incompat-report    Outputs a future incompatibility report at the end of the build
        --timings[=<FMTS>...]       Timing output formats (unstable) (comma separated): html, json
    -h, --help                      Print help information

Run `cargo help build` for more detailed information.

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

olej@R420:~/2022/Rust$ pwd
/home/olej/2022/Rust

olej@R420:~/2022/Rust$ cargo new fibo --bin
     Created binary (application) `fibo` package
Пустой проект:

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

olej@R420:~/2022/Rust$ tree fibo
fibo
├── Cargo.toml
└── src
    └── main.rs

1 directory, 2 files

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

Re: код на Rust

Непрочитанное сообщение Olej » 12 май 2022, 22:12

Olej писал(а):
12 май 2022, 21:39
Пустой проект:
Изменяю main.rs на свой простенький код:

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

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@R420:~/2022/Rust$ cd fibo

olej@R420:~/2022/Rust/fibo$ cargo build --release
   Compiling fibo v0.1.0 (/home/olej/2022/Rust/fibo)
    Finished release [optimized] target(s) in 1.19s

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

olej@R420:~/2022/Rust/fibo$ tree ./
./
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    ├── CACHEDIR.TAG
    └── release
        ├── build
        ├── deps
        │   ├── fibo-64c8d795c9a2b60e
        │   └── fibo-64c8d795c9a2b60e.d
        ├── examples
        ├── fibo
        ├── fibo.d
        └── incremental

7 directories, 8 files
Число Фибоначчи:

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

olej@R420:~/2022/Rust/fibo$ target/release/fibo 40
165580141
Вложения
main.rs
(245 байт) 1 скачивание

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

Re: код на Rust

Непрочитанное сообщение Olej » 13 май 2022, 14:20

Olej писал(а):
12 май 2022, 22:12
Число Фибоначчи:
Сравнение:

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

olej@R420:~/2022/Go/compare/fibo$ make
gcc -O3 fibo_c.c -o fibo_c
g++ -O3 fibo_cc.cc -o fibo_cc
clang++ -O3 fibo_cc.cc -o fibo_cl
go build -o fibo_go fibo_go.go
javac -Xlint:deprecation fibo.java
go build -o fibom fibom.go
go build -o fibos fibos.go
- C :

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

#include <stdio.h>
#include <stdlib.h>

unsigned long fib(int n) {
   return n < 2 ? 1 : fib(n - 1) + fib(n - 2);
}

int main(int argc, char **argv) {
   unsigned long num = atoi(argv[1]);
   printf("%ld\n", fib(num));
   return 0;
}
Компиляторы GCC и Clang при максимальной оптимизации:

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

olej@R420:~/2022/Go/compare/fibo$ time ./fibo_c 45
1836311903

real    0m4,690s
user    0m4,686s
sys     0m0,004s

olej@R420:~/2022/Go/compare/fibo$ time ./fibo_cl 45
1836311903

real    0m4,955s
user    0m4,954s
sys     0m0,001s
- Go :

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

package main
import ("os"; "strconv")

func fib(n int) int {
        if n < 2 { return 1
        } else { return fib(n-1) + fib(n-2)
        }
}

func main() {
        n, _ := strconv.Atoi(os.Args[1])
        println(fib(n))
}

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

olej@R420:~/2022/Go/compare/fibo$ time ./fibo_go 45
1836311903

real    0m8,582s
user    0m8,588s
sys     0m0,016s
- Rust, только что собранный:

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

olej@R420:~/2022/Rust/fibo/target/release$ time ./fibo 45
1836311903

real	0m4,949s
user	0m4,941s
sys	0m0,001s

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

Re: код на Rust

Непрочитанное сообщение Olej » 13 май 2022, 14:23

Olej писал(а):
13 май 2022, 14:20
Сравнение:
И в отношении размера:
- Go:

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

olej@R420:~/2022/Go/compare/fibo$ ls -l fibo_go 
-rwxrwxr-x 1 olej olej 1356772 мая 13 14:04 fibo_go
Здесь сборка статическая:

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

olej@R420:~/2022/Go/compare/fibo$ file fibo_go 
fibo_go: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=rS1h5a2iuAoFYip6Cg8q/OT2pYiQiycO3JJwcGu4t/hsujvQD79-OVjJre3lPP/uRoCc0lnv7-kLlSnC1JE, with debug_info, not stripped
- Rust:

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

olej@R420:~/2022/Rust/fibo/target/release$ ls -l fibo 
-rwxrwxr-x 2 olej olej 3737104 мая 12 22:06 fibo
Здесь сборка динамическая:

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

olej@R420:~/2022/Rust/fibo/target/release$ file fibo 
fibo: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=b71e871996e3262d54ff7dc7ed8ec3f50f7f5cd5, for GNU/Linux 3.2.0, with debug_info, not stripped

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

olej@R420:~/2022/Rust/fibo/target/release$ ldd fibo 
	linux-vdso.so.1 (0x00007fffcd945000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8cdc532000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8cdc50f000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8cdc509000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8cdc317000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8cdc5c4000)
Тогда непонятно что они нагромоздили в этот размер исполнимого файла?

Ответить

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

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

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