BG Development


Страници: (23) [1] 2 3 ... последна »

Bender++ Публикувана на: 28-04-2025, 09:32

Мнения: 68
Преглеждания: 2212
Има някакъв проект, но аз не пиша ЦПП и. нямам лично наблюдения: https://cxx.rs/
  Форум: Други  ·  Преглед: #502451

Bender++ Публикувана на: 27-04-2025, 22:24

Мнения: 68
Преглеждания: 2212
QUOTE

бях направил "смарт" указател, който на всеки * на указателя му правеше assert. Работеше не просто бавно а ужасно бавно


Тук всичко е compile-time,което прави ръст толкова привлекателен.

В рънтайм има други проверки - примерно в дебъг решим компилатора инжектира асърти за over/under-flow при математически операции, които липсват в release режим.
  Форум: Други  ·  Преглед: #502445

Bender++ Публикувана на: 27-04-2025, 22:13

Мнения: 68
Преглеждания: 2212
Ръст има енъми които представляват tagged unions. Например в Ц може да направиш мещо такова (llm code ahead):

CODE

#include <stdio.h>

// Enum to tag the union
typedef enum {
   INT,
   FLOAT
} ValueType;

// Tagged union
typedef struct {
   ValueType type;
   union {
       int i;
       float f;
   } value;
} Number;

int main() {
   // Create an integer Number
   Number n1 = {INT, .value.i = 42};
   
   // Create a float Number
   Number n2 = {FLOAT, .value.f = 3.14};

   // Access values based on tag
   if (n1.type == INT) {
       printf("Integer: %d\n", n1.value.i);
   }
   
   if (n2.type == FLOAT) {
       printf("Float: %.2f\n", n2.value.f);
   }

   return 0;
}


И разбира се нищо не ти пречи да игнорираш така и да интерпретираш данните грешно.

Ръст първо като синтаксис го прави по-елегантно, а също е невъзможно да интерпретираш данните грешно:
CODE

// Define the enum to represent either an integer or a float
enum Number {
   Int(i32),
   Float(f32),
}

fn main() {
   // Create an integer Number
   let n1 = Number::Int(42);
   
   // Create a float Number
   let n2 = Number::Float(3.14);

   // Match to access values
   match n1 {
       Number::Int(i) => println!("Integer: {}", i),
       Number::Float(f) => println!("Float: {}", f),
   }
   
   match n2 {
       Number::Int(i) => println!("Integer: {}", i),
       Number::Float(f) => println!("Float: {}", f),
   }
}


А от друга страна прави определени оптимизации. Има едно нещо което наричат "ниша" и това е стойност, която е невалидна за даден тип. Примерно, Box<T> в Ц ще го напишеш като *Т. Тъй като в Ръст няма NULL, това че *T може да лиспва ще го напишеш като Option<Box<T>>. Съответно компилатора знае, че null е невалидна стойност и ще ползва тази ниша за да реализира Option::None варианта.

Тази оптимизация разбира се я няма за всички типове, но я има за поинтер и файл дескриптори, което ти дава същия машинен код като в Ц, само че е тайп-сейф.

За тези типове, които нямат такава "ниша" се ползва допълнителен таг, и размера на Option<T> става по-голям от колкото само на T заради тага и падинга.

----

Mинус на грешките като return values вместо exceptions е че имаш един бранч който винаги трябва да проверяваш на практика на почти всяко извикване на функция без значение дали има грешка или не. В ръст този бранч е красиво скрит зад ? оператора, докато в голанг, гофърите пишат 3 реда if err != nil за всяко извикване на функция. Но и в двата случая присъства. Докато с exceptions. плащаш за грешката само ако се случи, и хепи пътя остава чист.

Минус на изцепшъните е ,че не работят добре с функционалния стил, който е доста популярен напоследък
  Форум: Други  ·  Преглед: #502444

Bender++ Публикувана на: 27-04-2025, 19:05

Мнения: 68
Преглеждания: 2212
QUOTE

https://doc.rust-lang.org/std/panic/fn.catch_unwind.html

Не е препоръчително, но може да прихващаш паникьосвания според документацията.


Според зависи. На някои платформи, примерно embedded няма stack undwinding и съответно catch_unwind() няма да направи нищо icon_smile.gif Отделно в конфигурацията на проекта може да се напише panic=abort, което не unwind-ва стека

QUOTE

This function might not catch all Rust panics. A Rust panic is not always implemented via unwinding, but can be implemented by aborting the process as well. This function only catches unwinding panics, not those that abort the process.
  Форум: Други  ·  Преглед: #502438

Bender++ Публикувана на: 26-04-2025, 12:11

Мнения: 68
Преглеждания: 2212
QUOTE
гръмва изцепка и отключването се прескача. нещото остава заключено, разни нишки увисват върху него и край,


за това в Джава има try-finally:

CODE

lock.lock()
try{
   // throw
} finally{
   lock.unlock()
}


но да, с деструктори е по-лесно и няма толкова бойлерплейт, въпреки че има други проблеми, примерно в Ръст може да имаш BufWriter и деструктора flush()-ва буфер, но ако не може да го флъшне грешката се поглъща, та ако искаш да си сигурен,че данните са се записали, трябва сам да извикаш bufWriter.flush() и да провериш за грешка
  Форум: Други  ·  Преглед: #502414

Bender++ Публикувана на: 26-04-2025, 10:02

Мнения: 68
Преглеждания: 2212
Не
  Форум: Други  ·  Преглед: #502412

Bender++ Публикувана на: 25-04-2025, 23:37

Мнения: 68
Преглеждания: 2212
Има няколко механизма, които работят заедно:

* Идеята за ownership - всяка променлива може да има само 1 owner, Когато променливата излезе от скоуп, паметта се деалокира.

* Ръст прави разлика между read-only & mutable променливи & референции. По подразбиране, всичко е read-only. Може да имаш колкото си искаш RO референции към нещо, стига да нямаш нито една mut референция. Или може да имаш само 1 единствена mut референця, но тотгава - нито една RO. Тоест ако се опиташ да подадеш някаква структура чрез референция (разбирай чрез малко по-специален поинтер), компилатора няма да ти посволи да създадеш 2 референции едновременно които да позволяват промяна на данните - тоест ако можеш да ги променяш само от 1 място, то тогава няма как да имаш data race.

* Почти всичко има move семантика, за разлика от легаси езиците, където всичко има copy семантика. Copy семантика имат само типовече които имплементират Copy интерфейса, като има ограничения кой може да го имплементира - само типове които нямат деструктор и тези, чиито всички мембъри имплементират копи.. Тоест като подадеш като параметър някаква структура по стойност, тя се "мести" и е компилационна грешка да имаш указател към невалидна памет (тоест старата променлива), следователно пак имаш само един owner, следователно няма как да имаш data race ако може да пишеш само от едно място.

* Има 2 интерфейса - Send & Sync, които се имплементират автоматично от компилатора, но може и ръчно:
- Send - инстанциите на типа Т може да се местят между нишките
- Sync - референции към типа Т (&T) могат да се местят между нишките (тоест може да имаме споделен достъп)




Примери

Ownership & Move semantics:

CODE

fn main() {
   // Create a String, which is heap-allocated and owned by s1
   let s1 = String::from("hello");
   println!("s1: {}", s1); // Works: s1 owns the String

   // Move s1 to s2
   let s2 = s1; // Ownership moves to s2; s1 is invalidated
   println!("s2: {}", s2); // Works: s2 now owns the String

   // This will cause a compile-time error
   // println!("s1: {}", s1); // Error: value borrowed here after move
}


Shared & Exclusive references:
CODE

fn main() {
   let mut value = 42; // Mutable variable

   // Shared reference (&i32)
   let shared_ref1 = &value;
   let shared_ref2 = &value; // Multiple shared references are allowed
   println!("Shared ref1: {}, ref2: {}", shared_ref1, shared_ref2); // Prints: 42, 42

   // Exclusive reference (&mut i32)
   let exclusive_ref = &mut value;
   *exclusive_ref += 1; // Modify the value
   println!("Exclusive ref: {}", exclusive_ref); // Prints: 43

   // Cannot use shared_ref1 here while exclusive_ref exists
   // println!("Shared ref1: {}", shared_ref1); // Error: cannot borrow `value` as immutable because it is also borrowed as mutable
}


Rc<T> е смарт reference counted поинтер, който не е Send защото ако се ползва от много нишки еновременно, брояча ще се намаже
CODE

use std::rc::Rc;
use std::thread;

fn main() {

   // data & data_clone ползват един и същ  споделен брояч вътршено
   let data = Rc::new(42);
   let data_clone = Rc::clone(&data);

   // Опитваме се да преместим втораста инстанция в друга нишка (i.e. Send)
   let handle = thread::spawn(move || {
       println!("Value: {}", data_clone); // компилационна грешка - не имплементира Send
   });

   handle.join().unwrap();
}



Sync:
Arc<T> е смарт atomic reference counted поинтер, който е Send защото атомик брояча може безопасно да се модифицира от няколко нишки едновременно

Мутекса е sync, защото имплементацията му се грижи да не се нарушават правилата на езика. Може от колкото си искаш нишки да кажеш lock(), и той ще се погрижи максимум 1 нишка да държи лока във всеки идин момент от времето и по този начин да имаш 0 или 1 mutable референции.

CODE

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {

   let data = Arc::new(Mutex::new(42));
   let data_clone = Arc::clone(&data); // Clone for the thread

   let handle = thread::spawn(move || {
       let mut value = data_clone.lock().unwrap(); // Safely access the value
       *value += 10;
       println!("Value: {}", *value);
   });

   handle.join().unwrap();
   println!("Final value: {}", *data.lock().unwrap());
}

  Форум: Други  ·  Преглед: #502407

Bender++ Публикувана на: 25-04-2025, 19:58

Мнения: 68
Преглеждания: 2212
QUOTE
Ъхъ, и сега пък като гламав ще трябва на всеки ред проверявам дали нещо някъде не ми е върнало грешка.

Holy Rust не e Golang, и този проблем го няма

QUOTE
За какво ти е, нали можеш да напишеш ...

icon_lol.gif icon_eek.gif icon_lol.gif icon_eek.gif

Нямаш ли хубава билд система, нямаш нищо. Даже умрялата билдсистема в голанг е по-добре от цмаке

QUOTE
щото дори не мога да си представя как *езика* може да го следи

правилата на езика правят невъзможни race conditions в safe rust. Винаги може в unsafe с raw pointers да намажеш нещата icon_smile.gif, но това е важно за по-умелите разработчици които пишат библиотеки на по-ниско ниво. За 99.9% от случаите го няма като проблем

QUOTE
Аз пиша ембедед Ц, някъде 90% от времето, за АРМ Кортекс-М. Рънтайма който се използва - Newlib nano, е компилиран без поддръжка на изцепшъни и всеки такъв в крайна сметка стига до фукция _exit(), която, ако не си я заменил е просто безкраен цикъл или място дето се рестартира МЦУ-то.

това в ръст му казваме panic_handler и за ембеддед имаш няколко опции - безхраен цикъл, halt на цпу-то, etc.

QUOTE
Имаш функция panic, която убива програмата. Линус много се кара на на ентусиастите, които искаха да пишат драйвери на Ръст за тази глупост. Каза им да си пренапишат стандартната библиотека или да спрат.

Нуждите на user-space & kernel space са различни
  Форум: Други  ·  Преглед: #502405

Bender++ Публикувана на: 19-03-2025, 12:50

Мнения: 3
Преглеждания: 815
на 5цата не съм ги отварял, но на 4ката бяха с буксичка, трябва да имаш много голям талант за да НЕ се справиш сам
  Форум: Разни  ·  Преглед: #502290

Bender++ Публикувана на: 15-03-2025, 23:47

Мнения: 26
Преглеждания: 4629
не бях отварял телеграма от доста време, и вече РИА Новости е блокиран в българия icon_sad.gif Педалщината си пусна мазните пипала и там
  Форум: Разни  ·  Преглед: #502272

Bender++ Публикувана на: 11-03-2025, 15:05

Мнения: 26
Преглеждания: 4629
QUOTE (Дон Реба @ 10-03-2025, 07:20)
техния цик отказа регистрация на неправилния кандидат icon_twisted.gif демокрацията си е демокрация, но не бива да се прекалява, да! ех, ако и американските власти бяха имали смелост за подобен ход, ама на, страхливци излязоха icon_twisted.gif icon_twisted.gif

споко, на следващите избори Цар Тръмп ще забрани грешните кандидати icon_lol.gif
  Форум: Разни  ·  Преглед: #502247

Bender++ Публикувана на: 11-03-2025, 15:03

Мнения: 35
Преглеждания: 5510
QUOTE (Дон Реба @ 10-03-2025, 07:40)
QUOTE (Bender @ ++10-03-2025, 00:15)
Какъв ти е проблема с приложението ? Аз компютър ползвам само да гледам филми, и то защото нямам телевизор. Всичко си правя с телефона

не всички сме соросоиди като тебе

соросоидите гледат нова, четат свободна европа и шмъркат белото на зеления


няма как да попадна в тази категория по нито едно направление
  Форум: Разни  ·  Преглед: #502246

Bender++ Публикувана на: 10-03-2025, 00:18

Мнения: 29
Преглеждания: 3165
QUOTE (akrachev @ 09-03-2025, 20:15)
Оказа се, че не са точно украинците тези дето хвърлят съчки в огъня , даже самите украинци се усетиха!

Такива чуждестранни агенти казват каквото им се нареди.

Важното е шефовете какво казват, и тук да ви насоча към речта на Джефри Сакс към ЕСССР, ако не сте я гледали вече

https://www.youtube.com/watch?v=u4c-YRPXDoM
  Форум: Разни  ·  Преглед: #502209

Bender++ Публикувана на: 10-03-2025, 00:15

Мнения: 35
Преглеждания: 5510
Какъв ти е проблема с приложението ? Аз компютър ползвам само да гледам филми, и то защото нямам телевизор. Всичко си правя с телефона
  Форум: Разни  ·  Преглед: #502208

No New Posts  10 за едно място (Страници 1 2 )
Bender++ Публикувана на: 22-02-2025, 14:36

Мнения: 12
Преглеждания: 7561
QUOTE (ici @ 20-02-2025, 11:43)
Не, просто има свободен планктон. Ние търсим инженери и няма, трябва сами да си ги отлеждаме от стажанти и дипломанти.

На всякъде е така.
  Форум: Разни  ·  Преглед: #502103

Bender++ Публикувана на: 22-02-2025, 14:34

Мнения: 15
Преглеждания: 5917
Просто и четливо и Rxjava не могат да са в едно изречение. Няма смисъл да си губиш времето с това извращение.

Ползвай greeen threads, али ако поради някаква причина не можеш - по-добре го пренапиши на golang отколкото да се мъчиш с тая шитня
  Форум: Java/Kotlin  ·  Преглед: #502102

Bender++ Публикувана на: 14-12-2024, 19:43

Мнения: 286
Преглеждания: 17896
QUOTE (dvader @ 10-12-2024, 19:12)
QUOTE (Bender @ ++10-12-2024, 13:20)
На пункта чичката само повтаряше  "ей тази като електричка бе" .

Да не е VW случайно icon_wink.gif

да icon_wink.gif
  Форум: Разни  ·  Преглед: #501775

Bender++ Публикувана на: 10-12-2024, 13:20

Мнения: 286
Преглеждания: 17896
QUOTE
Дотогава допускам, че само по документи е "Евро 6".

На пункта чичката само повтаряше "ей тази като електричка бе" . Евро 6д, мина без проблем
  Форум: Разни  ·  Преглед: #501756

Bender++ Публикувана на: 28-11-2024, 19:00

Мнения: 11
Преглеждания: 1905
Дай му един перманентен бан на този мангалоиден спинозен хермафродит.
  Форум: Разни  ·  Преглед: #501729

Bender++ Публикувана на: 23-11-2024, 12:56

Мнения: 1946
Преглеждания: 113198
Видяхте ли клипчетата от теста на ICBM-а изстрелян по хохлите ? Трябваше по варшава и берлин icon_smile.gif за по-добър отрезвителен ефект
  Форум: Разни  ·  Преглед: #501698

Bender++ Публикувана на: 01-09-2024, 09:07

Мнения: 1946
Преглеждания: 113198
QUOTE
тия живеят 80 години назад.

и окопната война беше отживелица
  Форум: Разни  ·  Преглед: #501225

Bender++ Публикувана на: 31-08-2024, 21:12

Мнения: 1946
Преглеждания: 113198
Ще е голям резил ако рашките им унищожат ефките на земята. Трябва поне един полет над русия да има, та да разберем кое е по-добро - с400 или фките
  Форум: Разни  ·  Преглед: #501221

Bender++ Публикувана на: 17-08-2024, 22:42

Мнения: 1946
Преглеждания: 113198
Като отворя днеса, има 27 статии на тема бълграия от денс, и 3 на тема 404.

Просто журналята работят като катаджиите - само по поръчка, иначе нито са видели ,нито са чули
  Форум: Разни  ·  Преглед: #501121

Bender++ Публикувана на: 17-08-2024, 08:42

Мнения: 1946
Преглеждания: 113198
https://t.me/boris_rozhin/133926?single
  Форум: Разни  ·  Преглед: #501111

Bender++ Публикувана на: 15-08-2024, 22:06

Мнения: 286
Преглеждания: 17896
QUOTE
От 60 до 80 км в час харчи от 2-3 л/100км моментно на равно

Да не караш някакъв хибриден миксер ? Аз такъв разход имам само като се пусна по нанадолнището от рилските езера до сапарева баня без да пипам газта
  Форум: Разни  ·  Преглед: #501081

Страници: (23) [1] 2 3 ... последна »
New Posts  Отворена тема (има нови мнения)
No New Posts  Отворена тема (няма нови мнения)
Hot topic  Гореща тема (има нови мнения)
No new  Гореща тема (няма нови мнения)
Poll  Анкета (има нови гласували)
No new votes  Анкета (няма нови гласували)
Closed  Заключена тема
Moved  Преместена тема

Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0