>>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 は、呼び出した側。
Rustアンチスレ
548デフォルトの名無しさん
2026/09/18(金) 14:08:10.73ID:eomllbB2549デフォルトの名無しさん
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 は
当然のことながら、必ず実装している。
補足すると、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:eomllbB2551デフォルトの名無しさん
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 言語から普通に呼び出される。
[何が言いたかったか]
WindowsでもUnix(Linux)でも、「システムコール」、または、
それに当たるものは、C 言語から直接呼び出せる、
ということ。
その際、アセンブラコードは全く不要。
* Linuxでは、open、close、read などがシステムコールで
C 言語から普通に呼び出せる。というか、それは非常に古く
からのUnixの伝統。C言語と Unix 系OSは、一蓮托生。
* Windowsでは、システムコールという言い方は余りしないが、
それに当たるものは、CreateFile() や、CreateWindow()
で、Win32 API と呼ばれているものであり、それらも、
C 言語から普通に呼び出される。
553デフォルトの名無しさん
2026/09/18(金) 16:22:18.49ID:eomllbB2554デフォルトの名無しさん
2026/09/18(金) 16:45:10.68ID:J8sIB4/b >>548
それらはシステムコールではなくWindows API
それらはシステムコールではなくWindows API
555デフォルトの名無しさん
2026/09/18(金) 16:46:19.53ID:Q/gG7PkE 私もlinux(unix)ぐらいしかわからんので、システムコールと言えば
open、read、write、close みたいなもんだと思ってた。
open、read、write、close みたいなもんだと思ってた。
556デフォルトの名無しさん
2026/09/18(金) 16:48:15.93ID:eomllbB2 >>554
そこまでいうなら、Windows における「システムコール」という言葉の定義から始めなければならない。
いずれにせよ、C言語から呼び出せない OS の機能は、基本的に
ドライバですら使うべきではない、と考えられている。
つまり、C言語から呼び出せないシステムコールは、
実質的には存在し無いと言える。
何か有ったとしてもそれは非公開機能であり、システムコール
とは通常言わないものである。
そこまでいうなら、Windows における「システムコール」という言葉の定義から始めなければならない。
いずれにせよ、C言語から呼び出せない OS の機能は、基本的に
ドライバですら使うべきではない、と考えられている。
つまり、C言語から呼び出せないシステムコールは、
実質的には存在し無いと言える。
何か有ったとしてもそれは非公開機能であり、システムコール
とは通常言わないものである。
557デフォルトの名無しさん
2026/09/18(金) 16:55:31.06ID:97nSdT5E >>551
必ずアセンブラコードが必要になります
システムコールはC言語の機能だけでは呼び出すことができません
実際にそのopen、close、readなどの関数がどのように実装されているのか見てみるとよいでしょう
必ずアセンブラコードが必要になります
システムコールはC言語の機能だけでは呼び出すことができません
実際にそのopen、close、readなどの関数がどのように実装されているのか見てみるとよいでしょう
558デフォルトの名無しさん
2026/09/18(金) 17:03:34.03ID:eomllbB2559デフォルトの名無しさん
2026/09/18(金) 17:09:36.39ID:mJPKW6bB >>556
MS-DOSの時代からシステムコールはint 21h割り込みとして定義されていたよ
だってC言語使う人は少数派だしシステムコールがC言語で規定されても困る
どの言語から見てもint 21hやsyscallなどはアセンブラで呼べるからね
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 は古い。
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ファンクションコール」。
システムコールでも間違いではないが、正式名称ではない。
は、正式名称は「DOSファンクションコール」。
システムコールでも間違いではないが、正式名称ではない。
562デフォルトの名無しさん
2026/09/18(金) 17:29:02.55ID:Bn5zKY/u563デフォルトの名無しさん
2026/09/18(金) 17:32:39.99ID:eomllbB2564デフォルトの名無しさん
2026/09/18(金) 17:57:43.81ID:eomllbB2565デフォルトの名無しさん
2026/09/18(金) 18:01:24.86ID:Bn5zKY/u >>563
システムコールopen, read, writeなどをC言語だけでは実装できないこと理解できたかい?
システムコールopen, read, writeなどをC言語だけでは実装できないこと理解できたかい?
566デフォルトの名無しさん
2026/09/18(金) 18:04:49.02ID:eomllbB2 もしかして、OSを自作したい人が、システムコールを自作するために
C言語だけでは無理、と言っているのだとしたら、それは正解。
システムコールと呼び出す側と、システムコールを提供する側
は全く別の話だ。
それを混同しては駄目。
C言語だけでは無理、と言っているのだとしたら、それは正解。
システムコールと呼び出す側と、システムコールを提供する側
は全く別の話だ。
それを混同しては駄目。
567デフォルトの名無しさん
2026/09/18(金) 18:05:06.55ID:jFDwTqds568デフォルトの名無しさん
2026/09/18(金) 18:05:17.13ID:eomllbB2569デフォルトの名無しさん
2026/09/18(金) 18:06:07.18ID:eomllbB2570デフォルトの名無しさん
2026/09/18(金) 18:08:40.98ID:eomllbB2 「Unixは、99%がC言語で作られている」
という事は正しい。
しかし、すべてC言語だけで作れる訳ではない。
その syscall などの部分だけは C 言語では無理。
しかし、アプリやドライバは、C 言語だけで
システムコールを呼び出せる。なお、
「syscall 命令」 != 「system call」
ということを理解しないとダメ。
ちゃんとGoogle検索にかけるか、ちゃんとしたAIに聞け。
という事は正しい。
しかし、すべてC言語だけで作れる訳ではない。
その syscall などの部分だけは C 言語では無理。
しかし、アプリやドライバは、C 言語だけで
システムコールを呼び出せる。なお、
「syscall 命令」 != 「system call」
ということを理解しないとダメ。
ちゃんとGoogle検索にかけるか、ちゃんとしたAIに聞け。
571デフォルトの名無しさん
2026/09/18(金) 18:14:13.02ID:Rc8lxrdm その通りで
「OSが提供するシステムコール」と
「C言語でシステムコールを呼び出せるようにC言語が提供するシステムコール関数」は異なる
この違いが特に顕著にわかるのはC言語のerrno変数
C言語が提供するシステムコール関数の汚点や恥部と呼ばれている
もちろんOSが提供するシステムコールにはそんな欠陥は存在しない
C言語だけの欠陥だ
「OSが提供するシステムコール」と
「C言語でシステムコールを呼び出せるようにC言語が提供するシステムコール関数」は異なる
この違いが特に顕著にわかるのはC言語のerrno変数
C言語が提供するシステムコール関数の汚点や恥部と呼ばれている
もちろんOSが提供するシステムコールにはそんな欠陥は存在しない
C言語だけの欠陥だ
572デフォルトの名無しさん
2026/09/18(金) 18:17:22.81ID:eomllbB2573デフォルトの名無しさん
2026/09/18(金) 18:30:20.92ID:0jRUIaYY OSのシステムコールにerrno変数は存在しないけど、
C言語のopenやreadはerrno変数を使うということは、
C言語のopenやreadはあくまでもC言語用にカスタムされた独自のインターフェースの関数という理解でいいのかな。
C言語のopenやreadはerrno変数を使うということは、
C言語のopenやreadはあくまでもC言語用にカスタムされた独自のインターフェースの関数という理解でいいのかな。
574デフォルトの名無しさん
2026/09/18(金) 18:55:15.21ID:Bn5zKY/u その観点でもCのインターフェースとシステムコールのインターフェイスは異なる
575デフォルトの名無しさん
2026/09/18(金) 20:03:49.25ID:IxIplbiU libcがラップしてシステムコールを関数としてCから呼べるようにしてくれてる。
Rustのnixなどもシステムコールに新規のフラグなどが追加されたら更新に追従するのだが、glibcより数ヶ月は遅れるそうだ
C最強!
Rustのnixなどもシステムコールに新規のフラグなどが追加されたら更新に追従するのだが、glibcより数ヶ月は遅れるそうだ
C最強!
576デフォルトの名無しさん
2026/09/18(金) 20:14:01.42ID:NumN7WIz libcもglibcもerrno変数が酷いよな
関数呼び出ししてるのに
グローバル変数(問題が起きまくってスレッドローカル変数へ変更)
に結果を返す極悪仕様
関数呼び出ししてるのに
グローバル変数(問題が起きまくってスレッドローカル変数へ変更)
に結果を返す極悪仕様
577デフォルトの名無しさん
2026/09/18(金) 20:58:03.00ID:5X4tZmxP pthread昔なかったから
578デフォルトの名無しさん
2026/09/18(金) 21:53:39.03ID:DXgnmIw7 システムコールのインターフェース仕様はシンプルで美しいのに
C言語インターフェースが邪悪なerrno変数を産んだ理由は何なの?
C言語インターフェースが邪悪なerrno変数を産んだ理由は何なの?
579デフォルトの名無しさん
2026/09/18(金) 21:58:47.58ID:Osbxbi9s シグナル
580デフォルトの名無しさん
2026/09/19(土) 01:01:31.37ID:p4gvVv4W >>573
おそらく誤解を含んでいると思われ、指摘しておくと
linuxのシステムコールであるopenやreadは、errnoは設定しない。
errnoを設定するのはC標準ライブラリ関数のfopen、freadだ。(errno自体もC標準ライブラリに属する変数だ。システムコールに属するものではない。)
ライブラリ関数はカスタムというか、OSには非依存、言語としての定義だね
おそらく誤解を含んでいると思われ、指摘しておくと
linuxのシステムコールであるopenやreadは、errnoは設定しない。
errnoを設定するのはC標準ライブラリ関数のfopen、freadだ。(errno自体もC標準ライブラリに属する変数だ。システムコールに属するものではない。)
ライブラリ関数はカスタムというか、OSには非依存、言語としての定義だね
581デフォルトの名無しさん
2026/09/19(土) 01:10:26.58ID:Kr40mQgO582デフォルトの名無しさん
2026/09/19(土) 08:23:21.39ID:p4gvVv4W 本物になれなかった偽物と言うより意図して他層に作られた別物だよ
ファイル周りはハードウェア制御が関わる領域はOS側(システムコール)、バッファリング等のソフト寄りはユーザプログラム側(ライブラリ)で賄う構成が見て取れる。OSもプログラム言語も同時期に作ったからその塩梅は作り手の自在だったろうね
C言語はerrnoの存在やバッファオーバーフローを容易に発生させる関数も抱えたけど、当時の他言語が抽象化を進める代わりに実行効率を落とした。対してCは軽量なデザインによって高効率かつ充分高級な言語が実現できることを証明した。メモリ64KByte以下クロック10MHz未満のシステムでもコンパイルと実行、実用が可能だった
マルチスレッドや性善的設計に関わる問題まで初期開発当時に対処せよというならば、それは状況的に酷に思う
ファイル周りはハードウェア制御が関わる領域はOS側(システムコール)、バッファリング等のソフト寄りはユーザプログラム側(ライブラリ)で賄う構成が見て取れる。OSもプログラム言語も同時期に作ったからその塩梅は作り手の自在だったろうね
C言語はerrnoの存在やバッファオーバーフローを容易に発生させる関数も抱えたけど、当時の他言語が抽象化を進める代わりに実行効率を落とした。対してCは軽量なデザインによって高効率かつ充分高級な言語が実現できることを証明した。メモリ64KByte以下クロック10MHz未満のシステムでもコンパイルと実行、実用が可能だった
マルチスレッドや性善的設計に関わる問題まで初期開発当時に対処せよというならば、それは状況的に酷に思う
583デフォルトの名無しさん
2026/09/19(土) 10:40:54.61ID:6xwUQb7o584デフォルトの名無しさん
2026/09/19(土) 11:17:19.22ID:1Ed/DlmU Linux、UNIXはlibc使って、生のシステムコールを隠蔽してるんだよ
移植性のためだと思われ
OSによっては生システムコールのABI変更したりするそうだよ。appleとかappleとか
移植性のためだと思われ
OSによっては生システムコールのABI変更したりするそうだよ。appleとかappleとか
585デフォルトの名無しさん
2026/09/19(土) 11:29:44.55ID:6tnKFik7 >>584
途中でlibcの実装を変えることはできないため
新たな環境な新たなアーキテクチャに対応する時に新たに決めるだけで後からの変更はできない
だからlibc使わずとも直接システムコール呼んで構わない
途中でlibcの実装を変えることはできないため
新たな環境な新たなアーキテクチャに対応する時に新たに決めるだけで後からの変更はできない
だからlibc使わずとも直接システムコール呼んで構わない
586デフォルトの名無しさん
2026/09/19(土) 12:10:47.66ID:1Ed/DlmU macOSでは生はダメだそうだ。
Linuxは御大のユーザーランドに迷惑をかけないという強い信念でABIが維持されているから大丈夫なだけだよ
Linuxは御大のユーザーランドに迷惑をかけないという強い信念でABIが維持されているから大丈夫なだけだよ
587デフォルトの名無しさん
2026/09/19(土) 12:13:08.00ID:1Ed/DlmU 組込みなら運用始まったら、カーネルとlibcを互換性崩れるようなものに入れ替えないのは、それはそう
588デフォルトの名無しさん
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を意識しておく必要という点ではややたいへんとも言えるかもだが
Ansi版APIとUtf16版APIを意識しておく必要という点ではややたいへんとも言えるかもだが
590デフォルトの名無しさん
2026/09/22(火) 05:33:13.57ID:LLlzDkp1 最初期のRustコンパイラってRustで描かれてたの?
まさかC使ってたなんて言わないよね?
まさかC使ってたなんて言わないよね?
591デフォルトの名無しさん
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 で書かれていました。
フーンω
>前身である Caml Special Light や Caml Light などをベースに開発されており、
>主に OCaml自身(およびCaml方言) および仮想マシン・ランタイム部分などに C言語 が使われて書かれました。
>なお、歴史をさらに遡った最初の「Caml」の処理系(1987年)は、Lisp で書かれていました。
フーンω
593デフォルトの名無しさん
2026/09/22(火) 12:23:24.22ID:q1x1h6dH コンパイラもインタプリタも任意の言語で作れるからな
C言語なんて必要ない
C言語なんて必要ない
594デフォルトの名無しさん
2026/09/22(火) 20:38:31.53ID:dNy8ovY3 最初だけは仕方ないわね。CコンパイラもアセンブリでCのサブセット言語作って、それで一旦コンパイルしてから、出来たやつでコンパルするとかややこしいことやってた
595デフォルトの名無しさん
2026/09/23(水) 06:21:50.12ID:3XsodjBg rust プログラムは、犯罪者AIの格好の標的
596デフォルトの名無しさん
2026/09/23(水) 06:28:58.92ID:LqjeM2g/ ターゲットは穴開きCとC++
597デフォルトの名無しさん
2026/09/23(水) 06:34:22.12ID:3XsodjBg 腐れrustだよw
598デフォルトの名無しさん
2026/09/23(水) 06:54:55.98ID:SwW4ajl3 AIにC/C++のコードを吐かせるのはリスク高い
599デフォルトの名無しさん
2026/09/23(水) 07:51:34.46ID:Dt2fAcyp CUDAのRust実装とLLMの対応はよ
600デフォルトの名無しさん
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用中間コード)にコンパイルできる。
NVIDIAは2026年9月8日、GPU向け並列計算プラットフォームCUDAにおいてRustによる開発を可能にする「CUDA Rust」を発表した。
これまでCUDAにはC++あるいはPython用のプログラミングツールが用意されていたが、CUDA RustによりRustによるネイティブGPUプログラミングが可能となった。
GPUカーネルをRustで記述し、ネイティブにPTX(GPU用中間コード)にコンパイルできる。
601デフォルトの名無しさん
2026/09/30(水) 00:10:17.97ID:AuFquqym 周回おくれ
レスを投稿する
ニュース
- 【速報】福原遥(まいんちゃん)とサッカー日本代表の久保建英がまさかの電撃結婚★7 [爆笑ゴリラ★]
- 大阪・清風高校で「カンニング指導」後に生徒が自殺「無関係とは決して思っていない」両親が1億円余の損害賠償求める★2 [七波羅探題★]
- 1日500円生活で3食「フライドポテト」を食べ続けた少年の最期……病院から帰宅直後に突然死した理由 [おっさん友の会★]
- 「ロシアへの姿勢変えたのは日本」プーチン大統領 関係悪化は日本の責任との認識示す [煮卵★]
- 【電撃結婚】「チャラいんじゃないかと1、2年スルーしていた」と知人証言、“ド真面目”な福原遥の心を動かした久保建英の“猛アタック” [muffin★]
- 【簗農相記者会見】「道路予算は大幅カット」発言おおむね認める 「表現ぶりが誤解招いた」 [蚤の市★]
- インフレ止まらないねこれ、株価あがる、金利下がらない、原油下がらない、好景気 [943688309]
- 【正論】岩屋前外相会見。「日中関係悪化の原因を作ったのは高市。中国はめっちゃ怒ってる」 [668024367]
- LAWSON守谷中央三丁目店 [793051416]
- 【悲報】まいんちゃん結婚
- 例の自衛隊員「神様みたいな人に『日本は中国になめられている。お前が言って談判せよ』という夢を見た」 [931948549]
- 1日500円生活で3食フライドポテトを食ってた日本人、死亡 [245325974]