わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

ライブラリ関数 = 標準関数 ?

先週の授業で,「ライブラリ関数,#include,ヘッダファイル」を解説しました.昨年度までは,前処理指令の中で入れていた話題です.
今週ふと,「ライブラリ関数」という名称が適切なのか,考え直す機会がありました.手元の書籍や,Webの情報を調査して,「ライブラリ関数」という表現がまずい(次回授業で訂正するだとか)というわけではないことを確認しましたが,しかし,知識としては不十分です.整理してみました*1

  • ライブラリ関数」は,ライブラリが提供する関数を指します.「ライブラリ」には,ライブラリ関数を使うための型や定数も定義されています.FILE構造体がなければ,fopenでファイルをオープンしても,どんな型の変数に代入すればいいか,困りますね.ライブラリはファイル(ファイル群)であり,ライブラリ関数はその中で宣言・定義・オブジェクト化されている,ファイルの一部と言えます.
  • 次に押さえておくべき用語は,「標準ライブラリ関数」です.Cの入門書で使用しているライブラリ関数です.printfもmallocも含まれます.「ANSI準拠の関数」や「標準関数」とも呼ばれます.標準ライブラリ関数は,ライブラリ関数に含まれます.別の言い方をすると,標準ライブラリ関数は,ライブラリ関数の中でも厳選されたものです.Cの入門を終えて,画面表示だとか,プロセス間通信だとかをしようとしたら,標準ライブラリ関数の範囲を超えたライブラリ関数の活用が不可欠になります.
  • 標準ライブラリ関数の範囲を超えたライブラリ関数として,最初に挙げたいのが,「システムコール」です.これは,OSの機能を直接呼び出す関数と言えます.例えば,子プロセスを作るforkや,プロセス間通信の端点を作るsocketがあります.システムコールでないライブラリ関数は,「ライブラリルーチン」と呼ばれます.OSの機能を直接呼び出さない(間接的にOSの機能を呼び出す関数を含む)のがライブラリルーチンである,と定義できます.標準ライブラリ関数にはないけれど,UnixLinuxで使用されるシステムコールとライブラリルーチンは,「POSIX準拠の関数」に分類されます.2年後期の情報ネットワーク演習でいろいろ使用します.
  • 最後に,「サードパーティが提供するライブラリ関数」があります.サードパーティは英語で書くとthird party,日本語にすると「第三者」ですが,ここでは「処理系が提供するのでも,ユーザ自身が作るのでもない,関数」と言うことができます.学科で使用するものとして,ビジュアル情報演習のOpenGLが挙げられます.人によっては,GMPと呼ばれる,任意精度の数値演算ライブラリを活用していくことがあるかもしれません.

はじめの問題に振り返ってみますと,タイトルついて,ライブラリ関数は標準関数ではないことになります.そして,プログラムを読解するときには,呼び出している関数が「プログラムの中で定義されている」か「プログラムの外にあるものを使用する」か,結局のところ「自作関数」か「ライブラリ関数」かを見極めればいいのであって,「自作関数」か「標準関数」か「それ以外の関数」か,といった分類をする必要がないということです.

*1:すんません,だれか,ベン図を描いてくれませんか.