質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

1回答

716閲覧

低レイヤでの例外機構の実装方法

miyaken912

総合スコア15

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2022/12/31 14:46

Pythonなどの言語処理系で、例外機構がどのように実装されているか興味があり知りたく思っています。

Pythonのopen()を例にとると、以下のように理解しているのですが、合っていますでしょうか?

以下ざっくりとした自分の理解

Pythonの組み込み関数であるopen()は、内部的にファイルをオープンするシステムコールと、システムコールの戻り値でエラーが返ってきた場合に例外処理ルーチンにジャンプするコードにコンパイルされる。 システムコールを呼び出した結果、指定したファイルが存在せずエラーが返ってきた場合は、例外処理ルーチン(例外ハンドラ)にジャンプする。 ジャンプ先の例外ハンドラを求める方法には表引き法や2返戻値法、setjmp法などがある。 もし該当する例外ハンドラが見つからない場合は、エラーメッセージを表示し、プログラムを終了する処理を行う。

open()がコンパイルされると、システムコールと、システムコールの戻り値によって例外処理ルーチンに分岐するような処理になっているといった記載が調べても見当たらなかったのですが、想像で上記のように考えています。

もし詳しい方がいれば実際の動きを教えていただければ幸いです。
どうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyaken912

2023/01/03 01:14 編集

ありがとうございます。単純に興味というか、プログラミングを学ぶ中で素朴な疑問としてどうなっているのか気になったという理由です。 cpythonのソースを追ってみようとしましたが、C言語自体あまり分からないため、なかなか答えに辿り着くのは難しそうです・・・ (なおstack overflowで見ていたところ、fileutils.cのopenはbuilt-inのopen関数ではなく簡易なテスト用?の関数のようで、https://github.com/python/cpython/blob/v3.2.1/Modules/_io/_iomodule.c がPython 3のopenの本当の実装が書いてある箇所らしいです)
dameo

2023/01/03 01:10

違っていません。 単に興味があるというのは構いませんが、他人に聞く以上最低限cpythonを読める程度の知識は必要だと思います。アセンブラまで追うつもりの人がCすら分からないのでは、話になりません。
dameo

2023/01/03 05:50

ん?コメントを私の返信コメント後に書き換えたんですね。返事した後に書き換えると読む人が分かりにくいので続けてください。 内容的には違ってましたね。 ただstackoverflowにもいろいろな質問/回答があるので、URLまで書かないといろいろ不明です。中にはfileutils.cだと回答して質問者が納得してるものもあり、今回はそれをベースに調べただけです。 別の始点から調べたものだと、まずpythonのインタプリタから >>> help(open) として以下の出力を見ます。 Help on built-in function open in module io: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) ... ここでbuilt-in function open in module ioと記述されていることから、ドキュメント上では実体がioモジュールであると説明されていることが分かります。ここを足掛かりに3.10のドキュメントベースで https://docs.python.org/3.10/library/io.html#io.open を見ると明確にエイリアスである旨記載がありました。そのままコードを読むと https://github.com/python/cpython/blob/3.10/Lib/io.py#L55 からopenは↓であることが分かります。 https://github.com/python/cpython/blob/3.10/Modules/_io/_iomodule.c#L232-L507 stackoverflowのこの質問によると、 https://stackoverflow.com/questions/64357158/difference-between-cpython-io-open-impl-and-py-open-impl _Py_OpenはPOSIXのopenシステムコールを意識した形になっていて、CPython内部で使用される関数をその拡張機能で(ある程度バージョンを自由に)使用できるようにしたAPIの1つだそうです。 実際使用箇所を調べてみるとテストではなくCPython内部のいくつかの場所で使用されていますが、io.open内では使用されておらず、Pythonオブジェクトを使用してその中でopenシステムコールを直接使っているようです。 本題からは外れていますが、訂正は以上です。 自分で調べた結果を載せられるようにしましょう。
guest

回答1

0

大抵のCPUには例外割り込みってのが実装されてますが、これはあくまでCPUの命令実行上での異常検知(未定義命令実行やらアライメント異常、異常アクセスやらFPU異常やら)のためのものであり、その手の高級言語での例外機構とは全く関係ありません。
ってことで、別に(高級言語での)例外のための特別な機構や命令が存在するわけでもないので、決まった処理法やら実装法ってのも存在しません。

ってことで、本気でそこらの実装法を見たいなら、公開されたソースを読むしかないかと思います

投稿2022/12/31 22:41

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyaken912

2023/01/03 02:04

ありがとうございます。一口に例外と言っても、CPUの例外割り込みとは別なんですね。高級言語の例外機構がどのように実装されているかが知りたいという方がより正確な質問だと理解しました。 初学者のため公開されているソースを読むのは厳しいかもしれず、一般的にどんな形で実装されることが多いか概念レベルで理解できれば十分なので、もう少しいただいたキーワードから調べてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問