探検


Rustアンチスレ

548デフォルトの名無しさん
垢版 |
2026/09/18(金) 14:08:10.73ID:eomllbB2
>>541
めちゃくちゃ原始的な意味でのsystem callは、
sysenter、syscall、int 21h みたいなことが多いが、
例えば、Windows API の基礎である Win32 API の
CreateWindow() や、CreateFile()、TextOut()、
LineTo()、MoveTo()、glBegin()、glEnd() などは、
全て、C の関数呼び出しの ABI の一種を使っている。
Windows においては、
C は、通常は、32BIT モードでは、cdecl、64BIT モードでは、fastcall
を使っている。
上記の Win32 API だと、
32BIT モードだと、stdcall に変わるが、C 言語でサポートされている
calling convention の一種で、関数宣言の際に、
stdcall と修飾していれば、C 言語で普通に使える。
64BIT モードだと、C の関数も、Win32(Win64?) API も、
どちらも、fastcall。
なお、クラスに所属する非staticなメンバ関数は、32
BIT モードの場合は、thiscall と呼ばれ、cdecl と似ているが、
this が、ecx レジスタに乗る、という点が、cdecl と異なる。
cdecl は、すべて stack 経由。stdcall は、cdecl とほとんど同じ
だが、stack pointer を元に戻すのが、呼び出された側。
cdecl は、呼び出した側。
549デフォルトの名無しさん
垢版 |
2026/09/18(金) 14:13:08.65ID:eomllbB2
>>548
補足すると、Win32 API は、kernel32.dll や user32.dll、
gdi32.dll などの中で、実装されていて、user land
で実行されるものは、それらの dll の中で実行される事が
ある。
kernel land で実行されるものは、それらの dll の中には、
syscall などを使った短い呼び出しコードが書いてある。
また、アプリから、Win32 API を使う場合、
例えば、kernel32.dll の中の API を使いたい場合には、
kenel32.lib という小さなライブラリをリンクする。
しかし、アプリ側から見ると、どの場合も、syscall などは
直接使わず、C 言語レベルの関数を呼び出しているだけ。
但し、32BIT モードの場合は、通常の cdecl ではなく、stdcall
と呼ばれる呼出し規約(calling convention)が使われる。
stdcall と cdecl の際は非常に小さく、msvc、gcc、clang は
当然のことながら、必ず実装している。
550デフォルトの名無しさん
垢版 |
2026/09/18(金) 14:14:05.31ID:eomllbB2
>>549
誤: stdcall と cdecl の際は非常に小さく、
正: stdcall と cdecl の差異は非常に小さく、
551デフォルトの名無しさん
垢版 |
2026/09/18(金) 15:16:04.87ID:eomllbB2
>>58
[何が言いたかったか]
WindowsでもUnix(Linux)でも、「システムコール」、または、
それに当たるものは、C 言語から直接呼び出せる、
ということ。
その際、アセンブラコードは全く不要。
* Linuxでは、open、close、read などがシステムコールで
C 言語から普通に呼び出せる。というか、それは非常に古く
からのUnixの伝統。C言語と Unix 系OSは、一蓮托生。
* Windowsでは、システムコールという言い方は余りしないが、
それに当たるものは、CreateFile() や、CreateWindow()
で、Win32 API と呼ばれているものであり、それらも、
C 言語から普通に呼び出される。
552デフォルトの名無しさん
垢版 |
2026/09/18(金) 15:17:00.73ID:eomllbB2
>>551 は、アンカーミスで、正しくは、
は、>>548 に向けたもの。
553デフォルトの名無しさん
垢版 |
2026/09/18(金) 16:22:18.49ID:eomllbB2
>>551
今思ったが、>>534 から書きこんでいる人は、
x86/x64 の マシン語の「syscall 命令」と、
昔から Unix 系OSで「システムコール」と呼ばれていた関数群を
混同していたのかもしれない。
それらは別の概念。
2026/09/18(金) 16:45:10.68ID:J8sIB4/b
>>548
それらはシステムコールではなくWindows API
2026/09/18(金) 16:46:19.53ID:Q/gG7PkE
私もlinux(unix)ぐらいしかわからんので、システムコールと言えば
open、read、write、close みたいなもんだと思ってた。
556デフォルトの名無しさん
垢版 |
2026/09/18(金) 16:48:15.93ID:eomllbB2
>>554
そこまでいうなら、Windows における「システムコール」という言葉の定義から始めなければならない。
いずれにせよ、C言語から呼び出せない OS の機能は、基本的に
ドライバですら使うべきではない、と考えられている。
つまり、C言語から呼び出せないシステムコールは、
実質的には存在し無いと言える。
何か有ったとしてもそれは非公開機能であり、システムコール
とは通常言わないものである。
2026/09/18(金) 16:55:31.06ID:97nSdT5E
>>551
必ずアセンブラコードが必要になります
システムコールはC言語の機能だけでは呼び出すことができません
実際にそのopen、close、readなどの関数がどのように実装されているのか見てみるとよいでしょう
558デフォルトの名無しさん
垢版 |
2026/09/18(金) 17:03:34.03ID:eomllbB2
>>557
そんなことない。
あなたの理解が間違っている。
2026/09/18(金) 17:09:36.39ID:mJPKW6bB
>>556
MS-DOSの時代からシステムコールはint 21h割り込みとして定義されていたよ
だってC言語使う人は少数派だしシステムコールがC言語で規定されても困る
どの言語から見てもint 21hやsyscallなどはアセンブラで呼べるからね
560デフォルトの名無しさん
垢版 |
2026/09/18(金) 17:11:39.99ID:eomllbB2
>>559
MS-DOSのシステムコールは int 21h だったことは間違いないが、
現代の OSであるところの、Linux(Unix系)、Windows OSの
システムコールと言えば、open()、read()、
CreateFile()、CreateWindow() などの C 言語インターフェース
の関数のことを言う。
MS-DOS は古い。
561デフォルトの名無しさん
垢版 |
2026/09/18(金) 17:13:18.02ID:eomllbB2
なんか違和感が有って、今調べてみたら MS-DOS の int 21h
は、正式名称は「DOSファンクションコール」。
システムコールでも間違いではないが、正式名称ではない。
2026/09/18(金) 17:29:02.55ID:Bn5zKY/u
>>557が正しい
ID:eomllbB2は実際にLinuxなどでopen, read, write関数を実装してみることを勧める
インラインアセンブラを用いないとCでは実装できないことがわかる
563デフォルトの名無しさん
垢版 |
2026/09/18(金) 17:32:39.99ID:eomllbB2
>>562
間違ったことに賛同すべきではない。
知識の浅い人が知識の浅い人に賛同している。
564デフォルトの名無しさん
垢版 |
2026/09/18(金) 17:57:43.81ID:eomllbB2
>>562
なお、いま議論しているのは、
「システムコール自体を自分で実装する」
という意味ではないハズだぞ。
システムコールがC言語から呼び出さるかどうかの話だ。
2026/09/18(金) 18:01:24.86ID:Bn5zKY/u
>>563
システムコールopen, read, writeなどをC言語だけでは実装できないこと理解できたかい?
566デフォルトの名無しさん
垢版 |
2026/09/18(金) 18:04:49.02ID:eomllbB2
もしかして、OSを自作したい人が、システムコールを自作するために
C言語だけでは無理、と言っているのだとしたら、それは正解。
システムコールと呼び出す側と、システムコールを提供する側
は全く別の話だ。
それを混同しては駄目。
2026/09/18(金) 18:05:06.55ID:jFDwTqds
>>564
どの言語からでもアセンブラを使えばシステムコールを呼び出せるよ
C言語でも全く同じでアセンブラを使ってシステムコールを呼び出してるよ
C言語だけでは無理
568デフォルトの名無しさん
垢版 |
2026/09/18(金) 18:05:17.13ID:eomllbB2
>>565
実装と呼び出しは別だ。
言葉が間違っている。
569デフォルトの名無しさん
垢版 |
2026/09/18(金) 18:06:07.18ID:eomllbB2
>>567
違う。
呼出しは、C言語だけでもできる。
実装は無理。
「実装」 != 「呼出し」
570デフォルトの名無しさん
垢版 |
2026/09/18(金) 18:08:40.98ID:eomllbB2
「Unixは、99%がC言語で作られている」
という事は正しい。
しかし、すべてC言語だけで作れる訳ではない。
その syscall などの部分だけは C 言語では無理。
しかし、アプリやドライバは、C 言語だけで
システムコールを呼び出せる。なお、
「syscall 命令」 != 「system call」
ということを理解しないとダメ。
ちゃんとGoogle検索にかけるか、ちゃんとしたAIに聞け。
2026/09/18(金) 18:14:13.02ID:Rc8lxrdm
その通りで
「OSが提供するシステムコール」と
「C言語でシステムコールを呼び出せるようにC言語が提供するシステムコール関数」は異なる
この違いが特に顕著にわかるのはC言語のerrno変数
C言語が提供するシステムコール関数の汚点や恥部と呼ばれている
もちろんOSが提供するシステムコールにはそんな欠陥は存在しない
C言語だけの欠陥だ
572デフォルトの名無しさん
垢版 |
2026/09/18(金) 18:17:22.81ID:eomllbB2
>>571
そういうことではない。
あなたもちゃんと理解できてない。
2026/09/18(金) 18:30:20.92ID:0jRUIaYY
OSのシステムコールにerrno変数は存在しないけど、
C言語のopenやreadはerrno変数を使うということは、
C言語のopenやreadはあくまでもC言語用にカスタムされた独自のインターフェースの関数という理解でいいのかな。
2026/09/18(金) 18:55:15.21ID:Bn5zKY/u
その観点でもCのインターフェースとシステムコールのインターフェイスは異なる
2026/09/18(金) 20:03:49.25ID:IxIplbiU
libcがラップしてシステムコールを関数としてCから呼べるようにしてくれてる。
Rustのnixなどもシステムコールに新規のフラグなどが追加されたら更新に追従するのだが、glibcより数ヶ月は遅れるそうだ
C最強!
2026/09/18(金) 20:14:01.42ID:NumN7WIz
libcもglibcもerrno変数が酷いよな
関数呼び出ししてるのに
グローバル変数(問題が起きまくってスレッドローカル変数へ変更)
に結果を返す極悪仕様
2026/09/18(金) 20:58:03.00ID:5X4tZmxP
pthread昔なかったから
2026/09/18(金) 21:53:39.03ID:DXgnmIw7
システムコールのインターフェース仕様はシンプルで美しいのに
C言語インターフェースが邪悪なerrno変数を産んだ理由は何なの?
2026/09/18(金) 21:58:47.58ID:Osbxbi9s
シグナル
2026/09/19(土) 01:01:31.37ID:p4gvVv4W
>>573
おそらく誤解を含んでいると思われ、指摘しておくと
linuxのシステムコールであるopenやreadは、errnoは設定しない。
errnoを設定するのはC標準ライブラリ関数のfopen、freadだ。(errno自体もC標準ライブラリに属する変数だ。システムコールに属するものではない。)

ライブラリ関数はカスタムというか、OSには非依存、言語としての定義だね
2026/09/19(土) 01:10:26.58ID:Kr40mQgO
>>580
Cの関数はシステムコールを生で提供していないニセモノだよな
errnoなどの独自カスタムをしている
2026/09/19(土) 08:23:21.39ID:p4gvVv4W
本物になれなかった偽物と言うより意図して他層に作られた別物だよ
ファイル周りはハードウェア制御が関わる領域はOS側(システムコール)、バッファリング等のソフト寄りはユーザプログラム側(ライブラリ)で賄う構成が見て取れる。OSもプログラム言語も同時期に作ったからその塩梅は作り手の自在だったろうね

C言語はerrnoの存在やバッファオーバーフローを容易に発生させる関数も抱えたけど、当時の他言語が抽象化を進める代わりに実行効率を落とした。対してCは軽量なデザインによって高効率かつ充分高級な言語が実現できることを証明した。メモリ64KByte以下クロック10MHz未満のシステムでもコンパイルと実行、実用が可能だった
マルチスレッドや性善的設計に関わる問題まで初期開発当時に対処せよというならば、それは状況的に酷に思う
2026/09/19(土) 10:40:54.61ID:6xwUQb7o
>>582
Rustはゼロコスト抽象化だから全てを手に入れたうえで速いよ
速いだけで全てがないCに勝ち目なし
2026/09/19(土) 11:17:19.22ID:1Ed/DlmU
Linux、UNIXはlibc使って、生のシステムコールを隠蔽してるんだよ
移植性のためだと思われ
OSによっては生システムコールのABI変更したりするそうだよ。appleとかappleとか
2026/09/19(土) 11:29:44.55ID:6tnKFik7
>>584
途中でlibcの実装を変えることはできないため
新たな環境な新たなアーキテクチャに対応する時に新たに決めるだけで後からの変更はできない
だからlibc使わずとも直接システムコール呼んで構わない
2026/09/19(土) 12:10:47.66ID:1Ed/DlmU
macOSでは生はダメだそうだ。
Linuxは御大のユーザーランドに迷惑をかけないという強い信念でABIが維持されているから大丈夫なだけだよ
2026/09/19(土) 12:13:08.00ID:1Ed/DlmU
組込みなら運用始まったら、カーネルとlibcを互換性崩れるようなものに入れ替えないのは、それはそう
2026/09/19(土) 17:28:55.09ID:NVenImEm
何のスレかわからんが、ためになりました。linuxはともかく、winとかは大変みたいですね。
589デフォルトの名無しさん
垢版 |
2026/09/20(日) 19:48:07.78ID:NG8EFsfn
WindowsはWindowsで、Microsoftが血反吐を吐きながらWin32 API維持してくれてるから、たいへんという程でもないんじゃない?
Ansi版APIとUtf16版APIを意識しておく必要という点ではややたいへんとも言えるかもだが
590デフォルトの名無しさん
垢版 |
2026/09/22(火) 05:33:13.57ID:LLlzDkp1
最初期のRustコンパイラってRustで描かれてたの?
まさかC使ってたなんて言わないよね?
2026/09/22(火) 07:28:16.55ID:5yMM2JzD0
言わんね
592デフォルトの名無しさん
垢版 |
2026/09/22(火) 11:56:27.42ID:ZihPI0od
>OCaml(旧称:Objective Caml)の最初のバージョン(1996年リリース)は、
>前身である Caml Special Light や Caml Light などをベースに開発されており、
>主に OCaml自身(およびCaml方言) および仮想マシン・ランタイム部分などに C言語 が使われて書かれました。
>なお、歴史をさらに遡った最初の「Caml」の処理系(1987年)は、Lisp で書かれていました。
フーンω
2026/09/22(火) 12:23:24.22ID:q1x1h6dH
コンパイラもインタプリタも任意の言語で作れるからな
C言語なんて必要ない
2026/09/22(火) 20:38:31.53ID:dNy8ovY3
最初だけは仕方ないわね。CコンパイラもアセンブリでCのサブセット言語作って、それで一旦コンパイルしてから、出来たやつでコンパルするとかややこしいことやってた
2026/09/23(水) 06:21:50.12ID:3XsodjBg
rust プログラムは、犯罪者AIの格好の標的
2026/09/23(水) 06:28:58.92ID:LqjeM2g/
ターゲットは穴開きCとC++
2026/09/23(水) 06:34:22.12ID:3XsodjBg
腐れrustだよw
2026/09/23(水) 06:54:55.98ID:SwW4ajl3
AIにC/C++のコードを吐かせるのはリスク高い
2026/09/23(水) 07:51:34.46ID:Dt2fAcyp
CUDAのRust実装とLLMの対応はよ
2026/09/23(水) 07:54:18.62ID:XfIs2jGP
https://gihyo.jp/article/2026/09/cuda-rust
NVIDIAは2026年9月8日、GPU向け並列計算プラットフォームCUDAにおいてRustによる開発を可能にする「CUDA Rust」を発表した。
これまでCUDAにはC++あるいはPython用のプログラミングツールが用意されていたが、CUDA RustによりRustによるネイティブGPUプログラミングが可能となった。
GPUカーネルをRustで記述し、ネイティブにPTX(GPU用中間コード)にコンパイルできる。
2026/09/30(水) 00:10:17.97ID:AuFquqym
周回おくれ
レスを投稿する


ニューススポーツなんでも実況