フリースタンディング環境とは? わかりやすく解説

Weblio 辞書 > 固有名詞の種類 > 製品 > コンピュータ > プログラミング言語 > C++ > フリースタンディング環境の意味・解説 

フリースタンディング環境

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/08/13 21:59 UTC 版)

フリースタンディング環境(フリースタンディングかんきょう、: freestanding environment)はC言語およびC++のプログラム実行環境の一種である。対義語はホスト環境: hosted environment)。

概要

フリースタンディング環境は、オペレーティングシステム (OS) なしでプログラムを実行しなければいけない環境を指すCおよびC++の用語である。それぞれ国際標準化機構による規格ISO/IEC 9899およびISO/IEC 14882で規定されている[注釈 1]。OSなしで実行するプログラムとは、組み込みシステム用のプログラムであったり、あるいはOSそのものであったりする。ホスト環境は逆にOSが存在することを想定しており、一般的なアプリケーションソフトウェアミドルウェアを指す。ただし、フリースタンディング環境用としてつくられたプログラムはOSなしで動作する必要はない。OS上で動くフリースタンディング環境のプログラムとしてはデモシーン用のプログラムが代表的である。 実行環境を指定しない場合は、ホスト環境を対象にしていることがある。組み込みシステムではフリースタンディング環境を対象にすることもある。μITRONはオペレーティングシステムの一種であるが、フリースタンディング環境を選択しているシステムとして提供していることがある。TOPPERSプロジェクトのTRON系、OSEK系などで、模擬環境でないものは、フリースタンディング環境での利用を想定してソースコードを提供している。

ホスト環境との違い

フリースタンディング環境はOSから提供される機能が無いこと、プログラムを書き込む記憶領域が狭いことを想定し、ホスト環境で標準Cライブラリとして要求される関数は、Cでは一切要求せず、またC++では言語機能を実装するために必要とされる最低限のものしか要求しない。Cにおいては定義[要説明]を記述したヘッダーファイルのみを要求する(詳細は#制限を参照)。このため、Cにおいてはホスト環境で必要とされるランタイムライブラリを必要としない。

ホスト環境におけるmain関数は、プログラムを呼び出した親プログラム(OS等)の存在を想定しており、フリースタンディング環境のエントリーポイントとしては過剰である。またmainという名前が、main関数を呼び出すスタートアップコードを用意する上で邪魔になる( main関数を呼び出す関数がmainでは他にmainを定義できない[要校閲])ため、エントリーポイントはmain関数とは名前も形式も異なる関数にすることができるようになっている。

制限

フリースタンディング環境では言語仕様に以下の制限を受ける。

  • エントリーポイントmain関数である必要はなく、関数の型および名称は処理系定義となる。GCC の場合、デフォルトは void _start(void)
  • 標準Cライブラリの大部分がサポートされない。フリースタンディング環境でもサポートされる標準ライブラリを以下に挙げる。
    • C89の場合、float.hlimits.hstdarg.hstddef.h
    • C95の場合、C89の標準ライブラリ、iso646.h
    • C99の場合、C95の標準ライブラリ、stdbool.hstdint.h
    • C11の場合、C99の標準ライブラリ、stdalign.hstdnoreturn.h
    • C++03の場合、exceptionlimitscstdargcstddefcstdlibabortatexitexitのみ)、newtypeinfo

この Hello worldGCCLinux の組み合わせで動作する。gcc -ffreestanding -nostartfiles -static -o freestanding freestanding.c でコンパイルする。exit は各種終了処理を行う stdlib.h の関数のためフリースタンディング環境では使えないが、_exitunistd.h で定義されたシステムコールを呼び出すだけの POSIX の関数のため GCC の Linux 用フリースタンディング環境でも使える。

#include <unistd.h>

void _start (void)
  {
  char msg [] = "Hello, world!\n" ;
  write (1, msg, sizeof msg) ;
  _exit (0) ;
  }

標準Cライブラリなし

類似概念として、コンパイラによっては標準Cライブラリなしでコンパイルすることも可能。例えば GCC の場合、-nostdlib オプションを指定することにより、標準Cライブラリを使わなくなる。さらに制限は厳しくなる。フリースタンディング環境同様、終了処理すら行わないため、コンパイル結果を Linux で動作させる場合、エントリーポイントの最後などで OS のシステムコールの exit を呼び出してプロセスを殺す必要があり、フリースタンディング環境の場合は、GCC と Linux の組み合わせの場合、_exit(0) で終了させられるが、標準Cライブラリがないため、そのコードは OS と CPU 種別依存のアセンブラで書かないといけない。スタックに関しては、Linux の場合、execve システムコールがスタックを準備するため、スタックは正しく準備された状態でエントリーポイントが呼び出される。

この標準Cライブラリ未使用の Hello world は GCC、Linux、x86-64 の組み合わせで動作する。gcc -nostdlib -fno-builtin -static -o nostdlib nostdlib.c でコンパイルする。

static void write (long fd, const void *buf, unsigned long count)
  {
  __asm__ volatile
    (
    "movq %0, %%rax \n\t"
    "movq %1, %%rdi \n\t"
    "movq %2, %%rsi \n\t"
    "movq %3, %%rdx \n\t"
    "syscall        \n\t"
    :
    : "i" (1), "r" (fd), "r" (buf), "r" (count)
    : "%rax", "%rdi", "%rsi", "%rdx"
    ) ;
  }

static void _exit (long status)
  {
  __asm__ volatile (
    "movq %0, %%rax \n\t"
    "movq %1, %%rdi \n\t"
    "syscall        \n\t" 
    :
    : "i" (60), "r" (status)
    : "%rax", "%rdi") ;
  }

void _start (void)
  {
  write (1, "Hello, world!\n", 14) ;
  _exit (0) ;
  }

脚注

注釈

  1. ^ 例えばC11の規格書[1]およびC++14の規格書[2]などを参照のこと。

出典

関連項目


フリースタンディング環境

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/10/02 01:28 UTC 版)

標準Cライブラリ」の記事における「フリースタンディング環境」の解説

フリースタンディング環境では、C89 では標準Cライブラリのうち float.h、limits.h、stdarg.h、stddef.h に対応しているISO/IEC 9899/AMD1:1995 では加えて iso646.h が、C99 では更に stdbool.h および stdint.h に対応している

※この「フリースタンディング環境」の解説は、「標準Cライブラリ」の解説の一部です。
「フリースタンディング環境」を含む「標準Cライブラリ」の記事については、「標準Cライブラリ」の概要を参照ください。

ウィキペディア小見出し辞書の「フリースタンディング環境」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「フリースタンディング環境」の関連用語

フリースタンディング環境のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



フリースタンディング環境のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのフリースタンディング環境 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの標準Cライブラリ (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS