Штош, попробуем побоксировать. В соседней теме, где падал Qemu, мы учились писать ядра на цэ и плюшках, а тут я нахваливаю ржавого - раст то, раст сё. Ну, давайте посмотрим. Нам нужен 32х-битный freestanding ELF, который не зависит ни от чего и который поддерживает Multiboot, чтобы мы могли загрузить его как линуксовое ядро. Оооокеей, cargo new kernel, погнали. Первое, что мы видим - у раста нет тулчейна для сборки 32х-битных freestanding-бинарников, а 64х-битные, доступные в тулчейне x86_64-unknown-none, не умеет Multiboot. Што делатб? Правильно - собирать кастомный тулчейн: How to compile Rust code to bare metal 32 bit x86 (i686) code? What compile target should I use? - Stack Overflow Создаём в корне i686-unknown-none.json, в нём пишем: Код (Text): { "llvm-target": "i686-unknown-none", "data-layout": "e-m:e-i32:32-f80:128-n8:16:32-S128-p:32:32", "arch": "x86", "target-endian": "little", "target-pointer-width": "32", "target-c-int-width": "32", "os": "none", "executables": true, "linker-flavor": "ld.lld", "linker": "rust-lld", "panic-strategy": "abort", "disable-redzone": true, "features": "+soft-float,-sse" } Затем говорим Cargo, что хотим собрать этот тулчейн на основе параметров из джейсона: Создаём папку .cargo, в ней config.toml: Код (Text): [unstable] build-std = ["core", "compiler_builtins"] build-std-features = ["compiler-builtins-mem"] [build] target = "i686-unknown-none.json" После этого привязываем наш проект к nightly-версии раста, поскольку stable-версии не поддерживают кастомные тулчейны (и вряд ли когда-то пересборку стабилизируют). Создаём в корне rust-toolchain.toml: Код ( (Unknown Language)): [toolchain] channel = "nightly" components = ["rust-src", "rust-std", "rustc", "cargo"] Теперь, когда мы наберём cargo build, скачается последний nightly-билд раста, который соберёт тулчейн под i686, которым будет собрано наше ядро. Так как у нас нет libunwind, отключим развёртывание стека при исключениях, чтобы приложение сразу падало. Для этого в Cargo.toml зададим поведением при паниках: Код (Text): [package] name = "kernel" version = "0.1.0" edition = "2021" [profile.dev] panic = "abort" [profile.release] panic = "abort" Переходим к коду. Так как мы запускаемся на голом железе, мы не можем использовать рантайм, поэтому делаем no_std-приложение с кастомным мейном. Кроме мейна нам потребуется обработчик паник и Multiboot-заголовок, чтобы Qemu смог его загрузить. Пишем заготовку: Код (Rust): #![no_std] #![no_main] // Multiboot-header with the custom entry point: core::arch::global_asm!(r#" .section .text .align 4 .4byte 0x1BADB002 .4byte 0x00 .4byte -0x1BADB002 .global _start _start: call main cli hlt "#); #[no_mangle] extern "stdcall" fn main() { // Gotcha! } #[panic_handler] fn panic(_info: &core::panic::PanicInfo) -> ! { loop { unsafe { core::arch::asm!("int 3") }; } } Чтобы было по кайфу, научимся писать текст. Напишем простенькую обёртку над VGA по аналогии с той, что мы делали в той теме на плюсах. Код (Rust): #![no_std] #![no_main] #![warn(clippy::pedantic)] use core::panic::PanicInfo; core::arch::global_asm!(r#" .section .text .align 4 .4byte 0x1BADB002 .4byte 0x00 .4byte -0x1BADB002 .global _start _start: call main cli hlt "#); mod vga { use core::ffi::c_char; pub const ADDR: usize = 0xB8000; pub const WIDTH: usize = 80; pub const HEIGHT: usize = 25; #[repr(C)] #[derive(Clone, Copy)] pub struct Cell { pub char: c_char, pub color: u8 } type FrameBuffer = [[Cell; self::WIDTH]; self::HEIGHT]; pub fn screen() -> &'static mut FrameBuffer { // ' unsafe { &mut *(self::ADDR as *mut FrameBuffer) } } #[allow(dead_code)] pub enum Color { Black, Blue, Green, Cyan, Red, Magenta, Brown, White, Gray, LightBlue, LightGreen, LightCyan, LightRed, LightMagenta, Yellow, BrightYellow } impl Color { pub const fn make(background: Color, text: Color) -> u8 { (background as u8) << 4 | (text as u8) } } } mod con { use crate::vga; struct Pos { x: usize, y: usize } impl Pos { pub const fn new() -> Self { Self { x: 0, y: 0 } } } static mut POS: Pos = Pos::new(); fn pos() -> &'static mut Pos { // ' unsafe { &mut POS } } pub fn clear(color: vga::Color) { vga::screen().fill([vga::Cell { char: 0, color: vga::Color::make(color, vga::Color::Black) }; vga::WIDTH]); unsafe { POS = Pos::new() }; } fn new_line() { let pos = self::pos(); let screen = vga::screen(); // Go to the next line: pos.x = 0; if pos.y == (vga::HEIGHT - 1) { // Shift all lines: for line_number in 0..(vga::HEIGHT - 1) { screen[line_number] = screen[line_number + 1]; } // Clear the last line: screen[vga::HEIGHT - 1].fill(vga::Cell { char: 0, color: 0 }); } else { pos.y += 1; } } pub fn print(color: u8, string: &str) { let pos = self::pos(); let screen = vga::screen(); for ch in string.as_bytes() { match char::from(*ch) { '\r' => { pos.x = 0; continue; } '\n' => { new_line(); continue; }, _ => () } screen[pos.y][pos.x] = vga::Cell { char: *ch as core::ffi::c_char, color }; pos.x += 1; if pos.x == vga::WIDTH { new_line(); } } } } #[no_mangle] extern "stdcall" fn main() { use vga::Color; con::clear(Color::LightGreen); con::print(Color::make(Color::LightGreen, Color::Black), "- Hey, buddy, are you ready for rave?!\n"); con::print(Color::make(Color::LightGreen, Color::Black), "- Damn son! Where did you find this?!\n"); } #[panic_handler] fn panic(_info: &PanicInfo) -> ! { loop { unsafe { core::arch::asm!("int 3") }; } } Запускаем: Код (Bash): qemu-system-x86_64 -kernel .\target\i686-unknown-none\debug\kernel Поздравляю! Вы великолепны!
Чтобы триггерить элитных цэшных адептов с васма, для чего еще другого может быть сделан язык программирования, который не цэ?
одно слово == отладка: сишка наиболее легка в отладке. куча Одептов изрыгаются ненавистью к goto, молДе код в спагетти превращается, а вот небоскрёб обёрток на один вызов базовой функи их как-то не колышет Ты куда-то не туда гребёшь - макрос обеспечивает проверку/подготовку входных данных и записывает в сорц вызов целевой функции с этими данными, дальше пашет компиль. рантайм чекеры на макросах, конечно, не напишешь. другими словами, макрос обеспечивает подстановку строк, дабы обеспечить компактность/выразительность сорца то бишь делаем ржаку сишкой и ОНО работает ну - да, ладно == переходим к более интересным новостям... вот ОНЪЪЪ прогресс во всей своей красе
Я о том и говорю, ты никогда не сможешь от Цэ добиться таких же абстракций, как от других языков, тех же Плюсов или Ржавого. Поэтому говорить, что ты можешь сделать тоже самое на Цэ, как минимум не корректно, тк это - далеко не тоже самое. Ну и говорить, о том, что абстракции вредны - глупо, а то, что они влияют на производительность тоже неверно, так как есть zero-cost абстракции, а когда ты используешь не бесплатные абстракции, тебе в общем то микросекунд считать и так нет смысла. Вопрос в том, зачем страдать и писать, как мы уже выяснили ни один раз, говнокод, если можно использовать инструменты, которые помогут тебе написать хотя бы чуть меньший говнокод?
Да ему по-видимому пофиг, ему главное продать говнокод, а будут ли там уязвимости и рандомные креши - это его не волнует.
Эх, если бы не хорошее настроение, я бы сейчас поддержал Thetrik'а в "классовой борьбе" с глупостью. Воздержусь пока - пусть поживет. А причина, ну или повод для хорошего настроения - открыл для себя новую OS имя у которой, (фиг угадаете) - LINUX Но это не простой Линукс, а MANJARO (KDE). GUI там, конечно, просто потрясающее. Нужно только немного уделить времени настройкам и у любого пользователя - все получится. И это я еще с Вайландом не разобрался. Что-то у меня такое предчуствие, что если разберусь, то умру от счастья. Вот у кого "мелким" нужно бы поучиться. Ну куда там... им не до того... Для них главное - слежка и шпионаж во всем мире. В связи с этим вопрос: может кто в курсе, как подключать и отключать Вайланд в MANJARO - KDE? В том смысле, что переключаться между X11 и Вайландом?
ну-а, теперь покажи МЕЛОЧЬ == пример преимуществ плюхи в плане отладки.. или Ты абстракциями постоянно любуешься? и Тебе ровно тот же Вопрос если уж про что-то интересное в плане осей.. а линь - это хрень, ставшая рутинной необходимостью. и в плане дЭва убунту лучше манджары --- Сообщение объединено, 11 янв 2024 --- вот ОНЪЪЪ шанс ржака-любам явить свою мощщщУУУУУУУ
Чува-а-а-а-к, буквально в соседней теме: https://wasm.in/threads/otobrazheni...razdeljaemaja-v-dll-pamjat.35010/#post-440728 Вот что бывает, когда пишем без абстракций, как на си - эти бесконечные лесенки: Код (C++): lock(); auto res1 = acqureRes1(); if (!res1) { unlock(); return; } auto res2 = acquireRes2(); if (!res2) { freeRes(res1); unlock(); return; } auto res3 = acquireRes3(); { freeRes(res2); freeRes(res1); unlock(); return; } // ФРИ ФРИ ФРИ ДА СКОЛЬКО МОЖНО ЧТО Я ТАМ ЕЩЁ ЗАБЫЛ ФРИ АНЛОК ФРИ АНЛОК АНЛОК ФРИ ФРИ ФРИ!!! Вот код здорового человека: Код (C++): auto locker = sync.lock(); auto res1 = acquireRes1(); if (!res1) { return; } auto res2 = acquireRes2(); if (!res2) { return; } auto res3 = acquireRes3(); if (!res3) { return; } --- Сообщение объединено, 11 янв 2024 --- Установи пакет plasma-wayland-session: Код (Bash): sudo pacman -S plasma-wayland-session Затем выйди из сессии, и на экране ввода логина и пароля будет кнопка, где сможешь переключиться на X11 или Wayland. --- Сообщение объединено, 11 янв 2024 --- Знал бы ты, на каких костылях держится линукс… Со стороны пользователя это не видно: красивые окошки, анимации, темы, софт ставится в одну команду, но внутри там черти водятся!
На Си лесенки традиционно решаются goto exit; Это похожим образом выпрямляет код. На плюсах это не может являться нормальным решением, т.к. исключения могут обходить goto и таким образом нужны более твёрдые гарантии. Но вообще от введения в синтаксис finalize sections Си бы тоже только выиграл. Что нибудь типа: Код (C++): auto res1 = acqureRes1(); if (!res1) return; finalize { freeRes1(res1); }; ... Фактически это явное прописывание в синтаксис подкапотных механизмов RAII.
В новом стандарте собирались завести полноценный defer, почему этого не сделали 20 лет назад? Потому что Цэ, деды, которым он все еще остается нужон, не желают из зон комфорта выходить и видеть что-то новое. Я, конечно, понимаю, что с тем элитным кодом на Цэ, которым ты уже предлагал нам на полюбоваться, нужно справляться только отладчиком и в ассемблеры смотреть, но открою тебе секрет: я уже лет десять не использовал отладчик, а обходился отладочным выводом. Почему? Наверное потому, что умею писать и понимать свой код. Да и потом, куча отладчиков тебе позволит проходить тот же Плюсовый код прямо в исходнике и без необходимости ассемблер читать. Ты, наверное, опять же скажешь, что тебе нужно релизные версии с оптимизациями дебажить, но это от того, что код изначально плохой, дебажат дебажные сборки.
https://cohost.org/jckarter/post/2955755-the-lost-language-ex - когда читаю о том, как кто-то пытался натянуть на чистую православную Цэшу языковых фич, сразу вспоминаются почему-то вовсе не Плюсы, а https://ec-lang.org/ - но у всех, кроме Страуструпа, результат одинаковый. --- Сообщение объединено, 11 янв 2024 --- https://blog.nindalf.com/posts/stop-citing-tiobe/ - все, что нужно знать про индекс языков программирования от Тиобе, я раньше не знал, как они такую чушь в индексах получают, теперь я знаю "как", но не могу понять "зачем"...
define и функи-обёртки помогут Отцу русской демократии. А ежли уж совсем прёт на нечто глобальное - пользуй питоху в качестве препроцессора, тогда функи выглядят примерно так.. void foo(...){ // hey, py open_handles .... // hey, py close_handles } ++++++++ питохой можно контролировать были ли закрыты все ресурсы.. дерзай ох-уж, эти элитто сказочники пиши есчо
UbIvItS, элита котрая в каждом втором посте бьет себя тапком в грудь, что их кодес покупают по цене красной икры, при этом этот кодес никто никогда не видел, кроме самого "хозяина жизни". )
Ну, кстати, моего кода, как и кода Хошимина в интернете вполне достаточно. С другой стороны, хотелось бы увидеть реальные кодесы Убивца. --- Сообщение объединено, 12 янв 2024 --- Опять же это говорит человек, который только говорит, но ничего толкового до сих пор не показал. И при этом называет сказочником меня...