「Hey World」は多くの重要なプログラムです。 プログラミング言語に関係なく、単に「Hey, world!」と出力するプログラムを作成するのが適切な手法の標準的な例であることがわかりました。 マントに。 いずれにせよ、単一の write(2) syscall, 単純に?
注: この投稿は特に Linux に関するものです。Linux のみの機器については大声で説明します
基礎私の「Hey, world」の理由で、私は Rust を怒鳴らなければなりません。 これは、低レベルのプログラミングにとって現代的な言語のモラルであるため、他の多くの言語よりもオーバーヘッドが完全に少なくなります。 それに沿って、それは道徳的で正当な言語です.
[“./a.out”] 1 2 3 fn 致命的() {
私の「Hey, world」の理由で、私は Rust を怒鳴らなければなりません。 これは、低レベルのプログラミングにとって現代的な言語のモラルであるため、他の多くの言語よりもオーバーヘッドが完全に少なくなります。 それに沿って、それは道徳的で正当な言語です.
{
私たちは今それをスピードアップする立場にあります:
すべてが期待どおりに機能します! 確かに、それはもはや巨大な満足ではありませんが、それでも、私たちはエビのことでくすぐられなければなりません.
私たちの write(2) syscall を実行し、we are in a position to yelp でそれを勝ち取りますstrace、Linux 用のマシン名トレース ツール:
-c オプションは、ライブでのマシンコールの要約を出力しますインプリント。 さらに、特定のマシン呼び出しが発生したときに、それらの引数を確認する必要がある場合は、代わりに -C
を yelp してください。
1
strace -c ./target/debug/hi there-world
)
1
strace -c ./target/debug/hi there-world
)
2 3 4 5
6 ["./a.out"] 7 8 9 10
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
おい、世界! % time seconds usecs/name calls errors syscall ------ ----------- ----------- ---------- --------- ------------------
0.00 0.000000 0 5 教えられる
0.00 0.000000 0 1 書き込み 0.00 0.000000 0 4 シャット 0.00 0.000000 0 1 投票 0.00 0.000000 0 13 mmap 0.00 0.000000 0 5 mprotect 0.00 0.000000 0 2 munmap 0.00 0.000000 0 3 ブレーキ 0.00 0.000000 0 5 rt_sigaction 0.00 0.000000 0 2 pread64 0.00 0.000000 0 1 1アクセス
0.00 0.000000 0 1 execve 0.00 0.000000 0 3 sigaltstack [{iov_base="Hello, world!", iov_len=13}, {iov_base="n", iov_len=1}] 0.00 0.000000 0 2 1 arch_prctl 0.00 0.000000 0 1 sched_getaffinity 0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 4 openat 0.00 0.000000 0 4 newfstatat
0.00 0.000000 0 1 set_robust_list 0.00 0.000000 0 2 prlimit64 0.00 0.000000 0 1 getrandom 0.00 0.000000 0 1 rseq- ----- ----------- ----------- --------- --------- ----- ------------- 100.00 0.000000 0 63 2 完了
これは、予想よりも少し余分なものです...これは次の質問を投げかけます:単純な「Hey, world」は、これらすべてを捏造しなければならないのでしょうか? 私たちはおそらくそれについて何かを簡単に完全に捏造するかもしれません.
0.00 0.000000 0 3 ブレーキ0.00 0.000000 0 5 rt_sigaction 0.00 0.000000 0 2 pread64 0.00 0.000000 0 1 1アクセス
0.00 0.000000 0 1 execve 0.00 0.000000 0 3 sigaltstack [{iov_base="Hello, world!", iov_len=13}, {iov_base="n", iov_len=1}]
0.00 0.000000 0 2 1 arch_prctl 0.00 0.000000 0 1 sched_getaffinity 0.00 0.000000 0 1 set_tid_address0.00 0.000000 0 4 openat 0.00 0.000000 0 4 newfstatat
0.00 0.000000 0 1 set_robust_list 0.00 0.000000 0 2 prlimit64 0.00 0.000000 0 1 getrandom 0.00 0.000000 0 1 rseq - ----- ----------- ----------- --------- --------- ----- ------------- 100.00 0.000000 0 63 2 完了
これは、予想よりも少し余分なものです...これは次の質問を投げかけます:単純な「Hey, world」は、これらすべてを捏造しなければならないのでしょうか? 私たちはおそらくそれについて何かを簡単に完全に捏造するかもしれません.
それらのシステムコールをもう少し近づけて始めましょう。何が起こっているかについての理論を得ることができる立場にあるかどうかを発見してください:
1
strace ./target/debug/hi there-world
出力はかなり冗長なので、関連するオブジェクトに絞り込みます:
1 2 3 4 5
6 7 8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
26 27 28
... access("/etc/ld.so.preload", R_OK)=-1 ENOENT (そのようなファイルやディレクトリはありません) openat(AT_FDCWD, " /etc/ld.so.cache" 、O_RDONLY|O_CLOEXEC)=3 newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=44627, ...}, AT_EMPTY_PATH)=0 mmap(NULL, 44627, PROT_READ, MAP_PRIVATE, 3, 0)=0x7f9c5c9ae000 シャット(3)=0
openat(AT_FDCWD, “/usr/lib/libgcc_s.so.1”, O_RDONLY|O_CLOEXEC)=3 教えられる(3, “177ELF2 11 3 >
出力はかなり冗長なので、関連するオブジェクトに絞り込みます:
3 4 5
6 7 8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
28
openat(AT_FDCWD, " /etc/ld.so.cache" 、O_RDONLY|O_CLOEXEC)=3 newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=44627, ...}, AT_EMPTY_PATH)=0 mmap(NULL, 44627, PROT_READ, MAP_PRIVATE, 3, 0)=0x7f9c5c9ae000 シャット(3)=0