Страница 3 из 3
Re: Rust
Добавлено: 16 фев 2018, 21:21
Olej
Ещё один очень важная часть языка, из русскоязычной книги:
Обработка ошибок
Как и многие языки программирования, Rust призывает разработчика определенным способом обрабатывать ошибки. Вообще, существует два общих подхода обработки ошибок: с помощью исключений и через возвращаемые значения. И Rust предпочитает возвращаемые значения.
Это, собственно, то же направление, что и в Go -
новые языки потихоньку отказываются от exeption и их возбуждения, которое было активно введено в C++ Б.Страуструпом ... а далее Java ... и по списку...
И здесь:
16 Обработка ошибок
Это одна из самых интересных частей любого языка программирования!
Re: Rust
Добавлено: 16 фев 2018, 23:24
Olej
Olej писал(а):Это, собственно, то же направление, что и в Go
Вообще то (как это мне кажется, IMHO), между идеологией Rust и Go - очень много общего:
- отказ от exeption в обработке ошибок, и возврат кортежей как значения и результата и кода завершения (типы Option<T> и Result<T, E> в Rust - как более развитое развитие этой техники);
- отказ от объектности, классов и наследования - в смысле C++ & Java, и реализация interface в Go и trait в Rust ... по принципу: каждый тип/структура, для которых реализован такой interface / trait - может его использовать;
- и там и там внутри самой языковой системы предлагается какая-то техника "разработки через тестирование" - создание модульных тестов при отработке кода;
Возможно, кто понимает больше в формализмах, альтернативах и технике реализации ООП - сможет это сформулировать строго терминологически ... но так это выглядит ... невооружённым взглядом
Re: Rust
Добавлено: 18 фев 2018, 12:46
Olej
Olej писал(а):
- и там и там внутри самой языковой системы предлагается какая-то техника "разработки через тестирование" - создание модульных тестов при отработке кода;
Но не нужно сильно обольщаться на счёт тестов:
Тестирование программы может быть очень эффективным способом показать наличие ошибок, но оно безнадёжно неподходяще для доказательства их отсутствия.
© Дейкстра, Эдсгер Вибе, «The Humble Programmer» (1972)
Re: код на Rust
Добавлено: 12 май 2022, 19:49
Olej
Olej писал(а): ↑14 фев 2018, 16:57
14 фев 2018
Есть намерение посмотреть что там произошло за прошедшие 4 года с Rust.
Re: код на Rust
Добавлено: 12 май 2022, 21:33
Olej
Olej писал(а): ↑12 май 2022, 19:49
Есть намерение посмотреть что там произошло за прошедшие 4 года с Rust.
Rust
Код: Выделить всё
olej@R420:~$ rustc --version
rustc 1.60.0 (7737e0b5c 2022-04-04)
Re: код на Rust
Добавлено: 12 май 2022, 21:39
Olej
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
Re: код на Rust
Добавлено: 12 май 2022, 22:12
Olej
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
Re: код на Rust
Добавлено: 13 май 2022, 14:20
Olej
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
Re: код на Rust
Добавлено: 13 май 2022, 14:23
Olej
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)
Тогда непонятно что они нагромоздили в этот размер исполнимого файла?
Re: код на Rust
Добавлено: 27 окт 2022, 20:51
Olej
Линус Торвальдс не исключил возможност ... Linux 5.20
22.06.2022 09:23
На проходящей в эти дни конференции Open-Source Summit 2022 в секции ответов на вопросы Линус Торвальдс упомянул о возможности скорой интеграции в ядро Linux компонентов для разработки драйверов устройств на языке Rust. Не исключается, что патчи с поддержкой Rust будут приняты в ближайшем окне приёма изменений, формирующем состав ядра 5.20, намеченного на конец сентября.
...
Предложенные изменения дают возможность использовать Rust в качестве второго языка для разработки драйверов и модулей ядра. Использование Rust для разработки драйверов позволит с минимальными усилиями создавать безопасные и более качественные драйверы, избавленные от таких проблем как обращение к области памяти после её освобождения, разыменование нулевых указателей и выход за границы буфера.