duangsuse::Echo
722 subscribers
4.29K photos
130 videos
583 files
6.51K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
好困... 不应该用 no_std 的 Rust 来写的 (暴论)
又一次来到 Rust 面前(...
虽然这次 duangsuse 是稍微了解一点底层的菜鸟工程师(迫真)
但对于 Rust 这种高端语言还是再次学习前都无法驾驭呢
#tech #dev #PL #rust 重新回归 Rust 的怀抱,好耶!

记得 duangsuse 所认识到的第二门语言,就是 Rust。Rust 的中文社区很友好,而且大部分语法都很优雅,也适合进行各种底层操作
/etc/profile 里添加了 #guide

export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup

然后再在 .bashrc .zshrc 里添加(如果自动无效的话)

export PATH=$PATH:$HOME/.cargo/bin

再执行

curl https://sh.rustup.rs -sSf | sh

即可获得现烤 Rust toolchain 一份 🍰

no_core 的时候,经常出现 libc 多了一个版本导致无法正常编译的情况,删除 commit 版本旧的那个即可
// main.rs
#![feature(lang_items)]
#![feature(no_core)]

#![feature(libc)]
#![no_core]

extern crate libc;
extern crate core;

use libc::printf;
use core::panic::PanicInfo;

#[no_mangle]
pub unsafe extern "C" fn _main(argc: i32, argv: *const *const u8) -> i32 {
printf("Hello, world!\n\00".as_ptr() as *const i8);
return 0;
}

#[lang = "eh_personality"]
#[no_mangle]
pub extern "C" fn eh_personality() {}

#[panic_handler]
#[no_mangle]
pub extern "C" fn panic_handler(p: &PanicInfo) -> ! {
loop {} // never return
}


// main.c
int _main(int _, char **__);

int main(int argc, char **argv) { return _main(argc, argv); }


# Makefile
RUSTC := rustc # rust compiler
RUSTDOC := rustdoc # rust doc generator

# compiler flags
RUSTCFLAGS := -O --color auto
RUSTDOCFLAGS := -v

# default target
RUSTTARGET := x86_64-unknown-linux-gnu
RUSTCFLAGS := $(RUSTCFLAGS) --target $(RUSTTARGET)

ifeq ($(DEBUG), 1) # use debug info
RUSTCFLAGS := $(RUSTCFLAGS) -g -v
endif

snappy: main.c libsnappy.a
$(CC) $(CFLAGS) $? -o $@
libsnappy.a: main.rs
$(RUSTC) $(RUSTCFLAGS) $? --crate-type staticlib --crate-name snappy


最后目标文件大小 8.7K,我赢了,duangsuse 想(
duangsuse::Echo
// main.rs #![feature(lang_items)] #![feature(no_core)] #![feature(libc)] #![no_core] extern crate libc; extern crate core; use libc::printf; use core::panic::PanicInfo; #[no_mangle] pub unsafe extern "C" fn _main(argc: i32, argv: *const *const u8) ->…
因为今天实在是太晚了... 暂时决定功能如此(因为 snappy 自己目前居然没有一个前端可用):

snappy [files]

将 每个 file 压缩为 file.snappy,- 被当作 stdin

unsnappy [file] [output]

将 file 解压缩,默认标准输出
(写不下去了(毕竟熬夜太久伤身体啊
#learn 学会了什么? 👾

0. 知道自己对 f*() 系列文件操作函数、mmap() 和 Rust FFI 还不熟(准确的说对 Rust 整个都不熟,更别提 #![no_std] 了)
1. 写了第一行这么长又简单易懂的 GNU Makefile...
2. 机制地利用 C 给不使用 std 的 Rust 函数导出弄了个 _start 不至于每天 segfault
3. 复习了 Rust,会在不使用外部 crate 和 cargo 和 IDE 的情况下工作
4. 留下了明天不睡到中午就不能平复的倦意...(悲)
duangsuse::Echo
(写不下去了(毕竟熬夜太久伤身体啊
突然想到某些 JVM、Ruby 程序员可能会说 "300 多行都写了 3 个小时,真慢啊"
... 拿 #![no_std] 的 Rust 写这玩意可不止比你们那全自动高端大气上档次 GC 折腾,比完全拿 C 写还折腾...

还好现在是写 C 版本的 Rust,生命周期什么的考虑得少一些,不然思路绝对要迫真崩坏,惹不起啊
算法要设计半天实现起来也得画啥生命周期图分析...

Crystal 虽然比 Ruby 底层但还是有个 Slice 啊,还是有标准的 OO 类型系统啊,这个 Rust 如果不熟想的话真是要死人啊,不信你们写啊...
写了三个小时真是感觉无法形容 😶...
#PL #dev
#![no_std] 的 Rust、C 还是 C++ 这是个问题...
还好 Ada、Fortran 等语言没人维护性能不好可以早点排除... 是多么美好的事情...
Forwarded from Programmer Jokes
Forwarded from Programmer Jokes
Forwarded from Programmer Jokes
duangsuse::Echo
#recommended #kotlin #dev out 等关键字:可以说是写得很好的文档了,易懂 https://www.kotlincn.net/docs/reference/keyword-reference.html
#CSharp *注意,在 C# 里 out 的语义是完全不同的,基本是 ref 引用传参无需初始化的版本,有一篇博文解释了它
有一点我无法理解的,Kotlin 文档里提出这是从 C# 里抄过来的语义,那么就是说 C# 支持在参数列表和泛型约束里使用这个关键字,或许