hpprc/jawiki-books huggingface dataset:
JavaScript/Console

consoleオブジェクトは、JavaScriptにおいてウェブブラウザのコンソール機能へのインターフェースを提供します。主に開発者がコードのデバッグやログの表示などを行うために利用されます。以下に、consoleオブジェクトの概要と一部のメソッドについて説明します。
Console APIは、JavaScriptのコード実行中にコンソールにメッセージを表示したり、デバッグ情報を収集するためのAPIセットです。主に開発者がコードのデバッグやモニタリング、パフォーマンスの評価などに使用されます。このAPIはWebブラウザやNode.jsなどの環境で利用できます。
主なconsoleオブジェクトのメソッドには以下のようなものがあります:
これらのメソッドを使用することで、開発者は実行中のコードの状態や変数の値、エラーの発生箇所などをコンソール上で確認できます。また、計測やプロファイリングのためのメソッドも提供されています。Console APIは、開発者がアプリケーションの品質を向上させるために重要なツールとなっています。
Console APIの策定は、WHATWG(Web Hypertext Application Technology Working Group)によって行われました。WHATWGは、ウェブ技術の発展と標準化を目指すためのグループであり、Web標準の進化に関与しています。Console APIは、開発者がコンソールにログを出力し、デバッグ情報を取得するためのAPIとして、WHATWGが策定した仕様であり、それがLiving Standardとして提供されています。
詳細な情報や最新の仕様については、Console Living StandardのドキュメントをWHATWGのウェブサイトから参照することができます。
Console APIの歴史は、Web開発の初期からさかのぼります。JavaScriptの初期のバージョンでは、デバッグやログ出力に関する統一的な手段が提供されていませんでした。各ブラウザは独自の方法でデバッグ情報を表示していました。
以下に、Console APIの歴史の主なマイルストーンをいくつか挙げてみましょう:
このようにして、Console APIはWeb開発者にとって重要なデバッグツールとして進化してきました。
console.memoryはJavaScriptのコアなコンソールAPI仕様には含まれておらず、ブラウザの実装や開発者ツールによって異なる結果が返される可能性があります。これは非標準の拡張機能であり、ブラウザによってはサポートされていないことがあります。
一般的に、標準のconsoleメソッド以外のプロパティやメソッドに依存することは避け、コードが異なる環境で予測可能な動作をするように心がけることが重要です。
Console APIは、JavaScriptの開発やデバッグにおいてさまざまなユースケースで利用されます。以下に、Console APIの主なユースケースをいくつか挙げてみます。
これらのユースケースは、Console APIが提供するメソッドを活用して開発者がコードの挙動を理解し、デバッグやパフォーマンスの最適化を行うのに役立ちます。
Console APIの使用においてベストプラクティスは以下の点に注意することがあります。
ベストプラクティスとして、トップレベルに console オブジェクトがない場合や console メソッドがサポートされていない場合、エラーを発生させないようにするためにスタブを定義することが考えられます。これにより、コードがエラーを引き起こすことなく、スムーズに動作できます(console オブジェクトはECMACScriptとしては、仕様外であることに留意が必要です)。
以下は、基本的な console スタブの例です。
このスタブは、console オブジェクトが存在しない場合や、特定のメソッドが定義されていない場合に、それぞれのメソッドに対して空の実装を提供します。これにより、console メソッドが存在しない環境でコードがエラーになることを防ぐことができます。
ただし、このアプローチは慎重に使用する必要があります。なぜなら、console メソッドが存在しない場合は通常デバッグしにくくなるため、開発環境やデバッグモードでのみ使用されるようにするといった配慮が必要です。生産環境では、エラーログの記録や通知システムを使用して問題を検出・解決できるようにする方が望ましいです。
これらのベストプラクティスを守ることで、コンソールログを効果的に利用し、デバッグやパフォーマンスの向上に寄与できます。
住宅の品質確保の促進等に関する法律第96条

法学>コンメンタール住宅の品質確保の促進等に関する法律>住宅の品質確保の促進等に関する法律第96条
(一時使用目的の住宅の適用除外)
一時使用のため建設されたことが明らかな住宅については、消費者保護の意味が薄いので、これを適用除外とした。
ただし、「一時使用のため建設された」については解釈の余地があり、当初は一時使用目的であったが、事情により長期の居住となってしまった場合は、本条が適用されないことも想定される。
前二条
ポストデジタル

デジタルアート以降のハイブリッド・メディア、インタラクティブネットワーク、複雑系と偶発性を概念とした美術理論。
我々は既にデジタル技術が特別なものでないポストデジタル時代にいるとするキムカスコーン (Kim Cascone) 、松本良多 (Ryota Matsumoto) による説と美術におけるプラクティスを意味しデジタルツールによるクリエイティブプロセスにおいてその重要性を増している。ロイアスコット (Roy Ascott) のデジタルとアナログの融合によるモイストメディアのセオリーが原点としてある。
ポストデジタルはキム・カスコーン (Kim Cascone) により提唱されジョージオ・アガンベン (Giorgio Agamben)、松本良多 (Ryota Matsumoto) により美術論、アートの手法として定義された。 ポストデジタル・アートは視覚、触覚、聴覚、および運動感覚のメディア体験、仮想と拡張現実の間、オリジンとグローバリゼーションの間、インディビジュアルとコミュニティの対話との関係、およびウェブ対応のメディアにおいてアーティストの役割が再定義された参加、交流、コラボレーションを通じてつくられた美術である。
キム・カスコーン (Kim Cascone)、松本良多 (Ryota Matsumoto)、ジョージオ・アガンベン (Giorgio Agamben)
ガロア理論/Galoisの基本定理

K / F {\displaystyle K/F} を有限次 Galois 拡大、 G {\displaystyle G} をその Galois 群とする。 G {\displaystyle G} の部分群 H {\displaystyle H} に対して
は K / F {\displaystyle K/F} の中間体であり、また K / F {\displaystyle K/F} の中間体 E {\displaystyle E} に対して、
は G {\displaystyle G} の部分群であって,関係
が成り立つ。それゆえ、 K / F {\displaystyle K/F} の中間体 E {\displaystyle E} と G {\displaystyle G} の部分群 H {\displaystyle H} との間には、互いに他の逆である 1 対 1 の対応
が存在する。
式と計算

文字式の分類 次数

同類項 式の加減 分配法則 複雑な式の加減

単項式の乗法 単項式の除法 指数法則 乗除混合計算

代入と式の値 体積,表面積の変化

連続する数についての説明 2けた以上の整数についての説明 倍数についての説明

基本問題 応用問題 発展問題
情報幾何学/数学的準備

定義1.1 集合 X {\displaystyle X} と X {\displaystyle X} の部分集合族 O {\displaystyle {\mathcal {O}}} の組 ( X , O ) {\displaystyle (X,{\mathcal {O}})} が位相空間であるとは, 次の2条件が満たされることをいう:
X {\displaystyle X} を台集合, O {\displaystyle {\mathcal {O}}} を位相構造あるいは単に位相という.
注意1.2 誤解の恐れのないときには, 位相空間を台集合と同じ X {\displaystyle X} という記号で表すことが多い. しかし, 台集合 X {\displaystyle X} を定めたからといって位相空間が一意に決まるわけではない.
定義1.3 位相空間 X {\displaystyle X} が位相多様体であるとは, 次の3条件が満たされることをいう:
組 ( U , ψ ) {\displaystyle (U,\psi )} を x {\displaystyle x} の座標近傍という.
事実1.4 n ≠ m {\displaystyle n\neq m} ならば R n {\displaystyle \mathbf {R} ^{n}} の空でない開集合と R m {\displaystyle \mathbf {R} ^{m}} の空でない開集合は同相でない.
注意1.5 これはホモロジー論の初歩的だが重要な結果である.
定義1.6 位相多様体 X {\displaystyle X} の各点 x {\displaystyle x} に対応する自然数 n {\displaystyle n} は一意に定まり, これを dim x  X {\displaystyle \dim _{x}X} と表し, これが x {\displaystyle x} によらず一定であることを X {\displaystyle X} が純次元位相多様体であるという. 任意の点 x {\displaystyle x} に対して dim x  X = n {\displaystyle \dim _{x}X=n} であれば特に X {\displaystyle X} を n {\displaystyle n} 次元位相多様体という.
注意1.7 この「純次元」という語は pure dimension や equidimension の訳語でありスキーム論でよく用いられる.
定義1.8 位相多様体 X {\displaystyle X} の開集合 U {\displaystyle U} 上の関数からなる集合 A ( U ) {\displaystyle {\mathcal {A}}(U)} を定める対応 A {\displaystyle {\mathcal {A}}} が X {\displaystyle X} 上の C r {\displaystyle C^{r}} 級微分構造であるとは, 次の3条件が満たされることをいう:
組 ( X , A ) {\displaystyle (X,{\mathcal {A}})} を C r {\displaystyle C^{r}} 級多様体という.
注意1.9 誤解の恐れのないときには, C ∞ {\displaystyle C^{\infty }} 級多様体(resp. 微分構造)のことを単に多様体(resp. 微分構造)といい, 多様体を位相多様体と同じ X {\displaystyle X} という記号で表すことが多い. しかし, 位相空間 X {\displaystyle X} を定めたからといって多様体が一意に決まるわけではないことに注意せよ.
難解プログラミング言語の作り方

本書はいくつかの既成のw:難解プログラミング言語をもとにして、新たな難解プログラミング言語を作る方法を紹介します。 作成言語はC#とします。すべてインタプリタです。
この本をすべて読み終わるころには、あなたは難解言語を使い、作れるようになります。
この本はC#の本ではないので、C#の学習を重視しているわけではありません。なので、実装に時間がかかったり、実装が大変なものは省いています。それぞれのページにその旨を記載しています。
読者対象:
難解プログラミング言語の作り方/難解プログラミング言語とは

このページでは、そもそも難解プログラミング言語が何かということを説明しています。知っておいてほしいことのみ書いているので難解言語が何かわかっている人は読み飛ばしてくださって構いません。
難解プログラミング言語、略して難解言語は、わざと難しくなるように設計されたプログラミング言語で、それぞれ独特の雰囲気を持っています。
例えば、コードゴルフでよく出てくる問題(ハローワールドや99 Bottles of beerなど)を1文字で記述できるが、それ以外はほとんど何もできない「HQ9+」。 命令が8つしかないが、それらを組み合わせることでいろいろできる「Brainfuck」。
これらは基本ジョークのためのものですが、沢山の言語が作成されており、難解プログラミング言語を集めたwikiまで作られています。
もちろん言語の制約など特にありません。自分の得意な言語で作りましょう。(C++、Ruby、Python etc...) ただ、この本はC#で書いてあるので、翻訳しないといけません。
でも心配いりません。すぐわかります!なぜなら簡単に作ってあるからです。
難解プログラミング言語の作り方/Brainfuckをもとにする

このページでは、有名な難解プログラミング言語であるw:Brainfuckをもとにして新たな難解プログラミング言語を作成する手順を紹介します。
まず最初にするべきことは、どのような言語をつくるのか、計画を立てておかなければなりません。 行き当たりばったりでも何とかなるとは思いますが、やはり計画があったほうがやりやすいでしょう。
このページで作成する言語は、以下のような言語とします。できる限りC#初心者でも実装できるよう、単純にしました。
命令の詳細は以下に示します。
計画が出来上がったので、さっそく作っていきましょう。
これはただ単に変数を作っているだけです。同じ動作のために毎回違うコードを入力するのは面倒なので、インタプリタのループに入れてしまうことにします。
無限ループを作り、その中で入力を受け付ける文を書いています。そのあと、命令を実行します。
?命令で使う、Randomクラスは、ハローワールドには(おそらく)出てきません。 Randomクラスは、乱数を生成するためのクラスです。変数にしておかないと利用できません。 よくわからない方は調べて下さい。
ここが最も肝心です。ただ、単純にswitch文で分岐しているだけなので特に難しいところはありません。
これらのコードを一つのソースコードにまとめて、うまくできるかためしてみましょう。 テストのコードをいくつか用意してあります。使ってみましょう。 うまくいかない場合はソースコードを見直してみましょう。それでもわからない場合は、全体図を写しましょう。
ポインタを使って文字を出力しています。
コード: ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ +++++ . >
++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ +++++++-- . < .
出力: AAA
入力を求められ、入力した文字をそのまま表示します。
コード: ,.
入力例: R
出力例: R
0~65535の間の乱数が出力されます。
コード: ?!
出力例: 157
すべてのソースコードをのせます。これをコンパイルすればインタプリタが動作します。
難解プログラミング言語の作り方/HQ9+をもとにする

このページでは、HQ9+をもとにして難解プログラミング言語を自作します。
HQ9+は、命令が4つしかない難解プログラミング言語です。
たったこれだけです。実装も非常に簡単なので、数多くの派生言語が作られています。 例えば...
などなど。
HQ9+が何者か学んだので、計画を立てましょう。
命令は以下の通りです。
E命令でスローされる例外は以下の通りです。
計画ができました。作りましょう。
これは非常に簡単で、変数を必要な分用意するだけで終わります。
前のページで作ったBrainfuck派生言語のソースコードを流用することにしましょう。
これはただ地道にSwitch文を書くだけですが、非常に重要です。がんばりましょう。
例外をスローするためにはthrow文を使います。
だいたい二分の一でメッセージが表示されます。
コード: HH
出力例: Hello, world! Good afternoon!
入力をそのまま表示します。
コード: Q
出力: Q
全部のソースコードです。
難解プログラミング言語の作り方/Deadfishをもとにする

このページでは、Deadfishをもとにして新たな言語を作ります。
Deadfish(直訳:死んだ魚)は、難解プログラミング言語のひとつで、もともとHQ9+のサブセットとする予定だったそうです。 命令は4つですが、HQ9+のような命令はありません。
たったこれだけ!HQ9+よりも一層作りやすいです。 また、XKCDバリエーションという命令の種類もあります。それはインクリメントがx、2乗がkになっています。
仕様は以下のようにします。
命令を決めましょう。
数値カウンタを作ります。
もちろんBrainfuckから流用します。
ここで一番大事なのはg命令でInt32.TryParseを使っているところです。仕様を決めるときにそうしたので、Convert.ToInt32などを使うのはダメです。
また、TryParseの2つ目の引数が「out x」となっていますが、関数側が「この変数への変更を反映したいです~」と設定するときにoutをつける必要があるためです。
ふつう関数の中で引数がいじられても元の変数には影響しません。でも、outをつけておくと変更が反映されるのです。似たようなものにrefキーワードがあります。
何故GOかと言いますと、プログラムがgoだからです。数字を入力したら、そのままおうむ返しされます。
コード:go
入力例: 44
出力例: 44
難解プログラミング言語の作り方/ちょっとコーヒーブレイク(1) Esolang wikiに投稿してみよう

3つも言語を作ってしまったので、ちょっと休憩しましょう。
Esolang wikiは、いろいろな人が作った難解プログラミング言語を投稿するWikiです。Wikipediaと同じものを使っているので、Wikipediaの執筆ができればスタイルは問題なしです。
ただもう一つ問題があります。それは言語の壁です。Esolang wikiは英語で書かれています。英語が書けるのであれば全く問題ありませんが、英語がわからなければ一大事です。
...とまあいろいろおどかしましたが、世界は情報社会です。翻訳があります。やりました!
ほかにも、英語が書けないので説明を書けないひとは、説明を書かずにソースコードのリンクをのせておくのもよいでしょう。GithubやGoogle Driveなどです。それを見たほかのユーザーが書き足してくれるかもしれません。実体験です。
節の名前によく出てくる書き方をいくつか載せておきます。また、ページを書かない人も知っておけば読みやすくなるかもしれません。特に目次。
概要です。
この言語を使ったソースコードのサンプルを載せておく節です。Hello, worldやQuine(クワイン)など。
実装とかいう意味です。Cとかで書かれたソースコードが書いてあります。
こちらもご覧ください、という意味です。類似言語や元にした言語など、関連のあるページをリストにしましょう。
外部ソースという意味です。wikiの外のサイトを貼りたいときはSee alsoではなくこちらへ。
Brainfuck

Brainfuckは、 Urban Müllerによって1993年に開発された難解プログラミング言語です。
P"やFALSEに影響を受けました。また、膨大な数の難解プログラミング言語に影響を与えた言語です。
拡張子は、「.b」もしくは「.bf」です。
fuckが卑語であるため、様々な別名があります。それを以下に示します:
このように、様々な別名のせいで、情報を探すことが困難になっていたりします。
Brainfuckは以下のもので成ります:
Brainfuckは、8つの命令を持ちます。命令は以下の通りです:
また、命令でない文字は無視されます。
Brainfuckにおけるハローワールドプログラムを以下に示します。
Brainfuckを利用するには、ソフトウェアをインストールするほかに、ブラウザで実行する方法があります。以下はその一例です。
JavaScript/字句構造

JavaScriptは大文字と小文字を区別します。つまり、Hello()はHELLO()やhello()、さらにはhEllo()とは同じではありません。
ホワイトスペースとは、余分なインデント、改行、スペースのことです。JavaScriptでは無視されますが、コードを読みやすくするために使われます。
以下は、ホワイトスペースがほとんどないJavaScriptです。
以下は、同じJavaScriptに典型的な量のホワイトスペースを加えたものです。
以下は、同じJavaScriptを空白を多くして表示したものです。
コメントを使うと、他の人がコードを理解しやすいようにコードにメモを残すことができます。また、パーサーからは隠したいが削除したくないコードをコメントアウトすることもできます。
JSDocは、JavaScriptのコード内にドキュメンテーションコメントを記述するためのツールです。JSDocを使用することで、JavaScriptの関数やクラス、メソッドなどのドキュメンテーションを自動化し、ドキュメント生成ツールなどで出力することができます。
JSDocは、以下のような形式でコメントを記述します。
また、関数やメソッドの引数や戻り値の型を指定することもできます。
このように、JSDocを使用することで、コード内に自己完結的なドキュメンテーションを記述することができます。また、JSDocに対応したドキュメント生成ツールを使用することで、簡単に読みやすいドキュメントを生成することができます。
以下は、クラス構文を使わずに複素数クラスを作成する例です。JSDocを使用して、コードの意味を説明します。
このコードでは、Complexという関数を定義しています。この関数は、realとimagという2つの引数を受け取り、それらをプロパティとして持つオブジェクトを返します。また、Complexのプロトタイプに、add、sub、mul、absといったメソッドを定義しています。
それぞれのメソッドには、JSDocで説明を追加しています。例えば、addメソッドには、引数としてComplex型のオブジェクトを受け取り、戻り値としてもComplex型のオブジェクトを返すということを示す@paramと@returnsが含まれています。
このようにJSDocを使用することで、コードの意味を明確にすることができます。
多くのコンピュータ言語では、各コード文の最後にセミコロンが必要です。JavaScriptではセミコロンの使用は任意で、改行することで文の終わりを示します。これはセミコロンの自動挿入と呼ばれるもので、そのルールはかなり複雑です。 セミコロンを省きパーサーが自動的にセミコロンを挿入するようにすると複雑な問題が生じます。
上記のコードは、2つのステートメントとして解釈されません。2行目に括弧があるため、JavaScriptは上記を以下のように解釈します。
と解釈するのではなく、次のように解釈することを意図していたのかもしれません。
セミコロンは任意ですが、誤解を招かないためにも文の最後にはセミコロンを付けるのが望ましいです。
リテラルとは、ハードコードされた値のことです。リテラルはスクリプトの中で特定の値を表現する手段となります。例えば代入の右辺には次のようなものがあります。
リテラルにはいくつかの種類があります。最も一般的なのは文字列リテラルですが、他にも整数や浮動小数点のリテラル、長整数のリテラル、配列やブーリアンのリテラル、オブジェクトリテラルなどがあります。
オブジェクトリテラルの例
これらの型の詳細については、変数で説明しています。
識別子とは、変数、配列、関数などのデータの一部を表す名前です。ルールがあります。
有効な識別子の例です。
1A2B3Cは数字で始まっているため、無効な識別子です。
変数の名前をつけるにあたって、いくつかのルールがあります。
JavaScript/セミコロンの自動挿入

C言語系言語では、セミコロン(;)は文の終わりを表します。他のC言語系言語とは異なり、JavaScriptでは文の最後にセミコロンを使用することを強制していません。その代わり、セミコロンは任意でありJavaScriptのインタープリタがコードを実行する際に「インテリジェントに」追加します。
JavaScriptでは、次のような場合にセミコロンが自動的に挿入されます。
ASIはコードを書きやすくしますが(セミコロンをすべて入力する必要はありません)、実際には、セミコロンがないとプログラムのデバッグが難しくなります。このため、ステートメントの最後にセミコロンを使用することはベスト・プラクティスとして広く認識されています。しかし、ASIの存在は何を探すべきかを知らなければトラブルシューティングが困難ないくつかのバグを作り出す可能性があります。
最初のケースでは、プログラマは 2*a + 1 を返すことを意図していましたがコードは何も返しませんでした。同様に、2番目のケースではプログラマは中括弧{}で囲まれた行を返すことを意図していましたが、コードは何も返しませんでした。このように、JavaScriptには奇妙な点があるため文の中で改行したり開始波括弧を別の行にしたりしないことがベスト・プラクティスとされています。
JavaScript/文法

JavaScriptの文法には他のプログラミング言語との類似点と相違点があります。以下にいくつかの重要な点を挙げてみましょう。
これらの相違点は、JavaScriptが異なる用途に使用されるための柔軟性を提供しています。ウェブ開発、サーバーサイド開発、モバイルアプリケーション開発など、さまざまなコンテキストで JavaScript が使用されています。
JavaScript/予約語/break

breakはループ文やswitch文を直ちに中断します。 ループ文やswitch文以外でbreakを使おうとすると SyntaxError となります。 ここで言うループは、while文、do文、for文、for-in文、for-of文のいずれかです。 Array.prototype.forEachの様な反復メソッドからの脱出にはbreakは使えません。
実行結果
JavaScript/予約語/continue

continueキーワードは、ループ文を直ちに中断し、あたかもループが最後まで終了したかのように開始行に進み、for文の場合は第三項を評価します。 ループ文以外でcontinueを使おうとすると SyntaxError となります。 ここで言うループ文は、while文、do文、for文、for-in文、for-of文のいずれかです。 Array.prototype.forEachの様な反復メソッドにはcontinueは使えません。
実行結果
JavaScript/予約語/for

キーワードforは、異なる四種類の反復構文で使われます。
for文は、C言語風の反復構文です。
while文による等価なプログラム
外側のブロックは、初期化式がブロックスコープを持つ変数の宣言であった場合 for文 を抜けるとスコープから出ることを表現した。
実行結果
for...in文は、文字列をキーとするオブジェクトのすべての列挙可能なプロパティを反復処理します。
変数がブロックスコープで宣言された場合、変数はfor...in文を抜けると揮発します。
実行結果
for...of文は、String、Array、TypedArray、Map、Setと配列似なオブジェクト(例えば、ArgumentsやNodeList)、ユーザー定義の反復可能オブジェクトを反復するループを作成します。このループはオブジェクトの各プロパティの値に対して実行されるステートメントを持つカスタム反復フックを呼び出します。
変数がブロックスコープで宣言された場合、変数はfor...of文を抜けると揮発します。
実行結果
for await... of文は、非同期イテレート可能なオブジェクトや同期反復可能なオブジェクトを反復するループを作成します。これらのオブジェクトには、String、Array、TypedArray、Map、Setと配列似なオブジェクト(例えば、ArgumentsやNodeList)、ユーザー定義の反復可能オブジェクトが含まれます。オブジェクトの各プロパティの値に対して実行される文を持つカスタム反復フックを呼び出します。for await... of文は、非同期関数の内部でのみ使用できます。。
変数がブロックスコープで宣言された場合、変数はfor await...of文を抜けると揮発します。
実行結果
Fortran/なぜFortranを学ぶのか？

Fortran(フォートラン)は科学コミュニティで広く利用されるプログラミング言語で、高速かつ移植性があり、配列や並列処理をスムーズに扱えます。 最初期の高水準言語の一つで、パンチカードや紙テープを使用してプログラムをエンコードする初期のバージョンは広く知られています。 Fortranの名前は「FORmula TRANslation」の略で、数学的な表現を低水準のアセンブリ言語よりも簡単に実現できることを示しています。 Fortran90より古いバージョンは、しばしばFORTRANと綴られます。 Fortranは今でも数値天気予測、物理学や化学のモデリング、応用数学、および他の高性能コンピューティング目的で広く利用されています。 Fortranは豊富な数学ライブラリと科学的なコードベースを備えており、新しい標準では現代的な機能が追加されつつも、完全な後方互換性が保たれています。
この本は、現代のFortranでコードを書くのを支援することを意図しています。 適切な場合には、古いバージョンと現代の標準との使用方法の違いが強調されます。 これは FORTRAN 77などの古いバージョンで書かれた重要なコードベースが存在するためです。
以上が、Fortranの主な特徴です。数値計算や科学技術計算などの分野で広く使用されており、高い性能と効率性を提供しています。
Fortranは非常に冗長で、静的型付けされたコンパイル言語です。他の動的型付けおよびインタープリター言語よりも書くのに、コンパイルするのに、およびデバッグするのに時間がかかる場合があります。
Fortranを置き換えることができる言語には、主に次のようなものがあります。
これらの言語は、Fortranと同様の数値計算や科学技術計算のニーズを満たすことができますが、各言語にはそれぞれ特徴や適用範囲があります。選択する際には、プロジェクトの要件や開発者の経験、コミュニティのサポートなどを考慮することが重要です。
Fortran/歴史

Fortranは、1957年にIBMのJohn Backusを中心としたチームによって作られました。当初、名前はすべて大文字で書かれていたが、現在の標準や実装では最初の文字だけを大文字にします。 Fortran という名前は、FORmula TRANslation の略です。当初は科学計算に特化していたため、文字列の扱いが非常に限定的であり汎用プログラミング言語として重要な他の機能が欠けていたが、成功裏にデビューした後の大規模な開発によって後に達成されることになる。Fortranは、C言語が普及するまでは、異なるコンピュータシステム間で適度な移植性を持つ数少ない高級言語の一つでした。いくつかのウェブサイトによると、Fortranの開発は1954年に開始され、1957年に商業的にリリースされたようです。小さなFORTRANプログラムのコンパイルに初めて成功したのは、1954年9月20日のことだと考えられています。
Fortranにはいくつかのバージョンがあります。FORTRAN I、II、III、IVは時代遅れであり、多くの機械依存機能が含まれていました。FORTRAN 66は最初の標準化されたバージョンで、1966年にリリースされました。それ以降のすべてのFortranのバージョンは、標準規格がリリースされた年にちなんで番号が付けられています。最も一般的に使用されているFortranのバージョンは、FORTRAN 77、Fortran 90以降です。
Fortranは早くから標準化された言語でしたが、多くの企業が独自の拡張を行っていました。不思議なことに、IBMとDECはほとんど同じ拡張機能を持っていました。
大文字のFORTRANは、FORTRAN66、FORTRAN77と呼ばれる1950年代から開発され使われてきたクラシックな数値計算言語です。新規にプログラムを開発するには、上記の小文字のFortranが推奨されます。 Fortran95になって、FORTRANのいくつかの機能が削除されました。
削除された機能の一例
Fortran/Hello world

以下は簡単なFortranのプログラムです。
Fortranは大文字と小文字を区別しないので、最初のプログラムは次のようにこともできます。
このプログラムでは、大文字小文字を区別されるのは、print文の引用符で囲まれた部分("Hello World!")だけです。
上のコラムで紹介した「オンラインのコンパイル・実行環境」には、次のような特性があります。
短所か問題になる場合は、自らコンパイル実行環境を構築することで解決する必要があります。
g95, flang などいくつかのオープン・ソース・ソフトウェアの Fortran 言語処理系がありますが、ここでは GNUプロジェクトのGCC(GNU Compiler Collection)のFortranフロントエンド gfortran を紹介します。
OnlineGDB でも、gfortran-11.3.0 が使われています。
ディストリビューションにより、パッケージマネージャとパッケージ体系に違いがありますが、
いく通りかの方法がありますが、MSYS2環境にMinGW64の一部として、gfortran をインストールする方法を紹介します(MSYS2のインストール方法については、項を改めて紹介します)。
MSYS2/MinGW64のパッケージマネージャは、Arch Linux 由来の pacman(1) です。
環境が構築できたら、コンパイラーのバージョンを確認します。
上の例は、Windows 11 上の MSYS2 / MinGW64 上の、gfortran-10.3.0です。環境によって gfortran のコマンド名に prefix や suffix か付く場合があります。
例えば、FreeBSDでは複数のバージョンのGCCパッケージが共存できるようバージョンごとにsuffixが付き gfortran12 の様なコマンド名になります。
テキストエディタなどで hello.f90 を用意し、
コマンドラインから、
とすると、ソースコード hello.f90 から 実行形式 hello をコンパイルします(WinowsやOpenVMSでは、 .EXE の様な拡張子が暗黙に追加されるかもしれません)
gfortran ではデフォルトでFORTRAN 77規格を使用します(FORTRAN 77標準で使用されている固定形式のフォーマットが要求される)。 このため、自由形式のフォーマットを有効にするには、ソースファイルの拡張子を .f90(またはそれ以降の規格)のにして、コンパイラが希望する規格を自動的に推測できるようにしなければなりません。ほかにも、コマンドラインから -ffree-form オプションをコンパイラに渡すことでソースファイルの拡張子が .f でも自由形式のフォーマットを有効にすることができます。
基本情報技術者試験/午前試験免除制度

当ページ「基本情報技術者試験/午前試験免除制度」はまもなく削除される予定です。理由は以下の通りです。
削除に同意されないのであれば、方針などを確認して、ページを適切なものに書き換えた上で、このテンプレートを取り除いてください。勝手に取り除いた場合、投稿ブロックされる恐れがあります。
基本情報技術者試験の午前試験免除制度に関するコンテンツです。
国家資格の情報処理技術者試験の一区分である基本情報技術者試験(FE)には通常、午前試験と午後試験があり、2科目ともに基準点(満点の60%)以上の点数を取ることが合格の条件となっています。 しかし、試験を開催している独立行政法人情報処理推進機構(IPA)が認定した講座を受講し、その後、修了試験(修了認定に係る試験)に合格することで、基本情報技術者試験(FE)の午前科目の受験が免除される特典が存在します。午前試験が免除となるのは、原則、修了認定日から1年間(本試験2回分)です。 免除対象となる講座の多くは情報処理関係の専修学校(専門学校)で開講されていますが、一部の大学や高等学校、職業能力開発短期大学校、企業などにも開講されている場合があります。 なお、この制度はあくまで講座を修了した人だけに与えられる特典です。「本試験の午前で基準点以上だったが、午後が基準点未満だった」という場合の科目合格制度ではないため、注意が必要です。 午前試験免除制度は2005年度(平成17年度)から導入されています。
修了認定に係る試験は6月第2日曜日、7月第4日曜日、12月第2日曜日、1月第4日曜日の年4回実施されますが、一つの講座を受講した後、修了試験を受講できるのは2回までです。2回とも合格できなかった場合は再度講座を受講し直す必要があります。 修了試験の形式は以下の通りです。本試験の午前とほぼ同じですが、本試験に比べて過去問からの出題が多いので、難易度は本試験の午前よりやや低いと言われています。修了試験の問題はIPAが作成・提供します。
以下の民間検定試験に合格した人も、FEの午前試験免除制度の講座を受講することができます。その際、履修する項目数は通常の講座よりも少なくなります(検定試験合格によって一部の項目が習得済みとみなされるため。)。また、検定試験合格後に受講する講座を差分講習とも言います。なお、これは構造改革特別区域における特例処置として認められているものです。
このうち、サーティファイの情報処理技術者能力認定試験の2級または2級第一部の合格者は、IPAが提供する修了試験とは別に、サーティファイが提供する修了試験を受験することが可能です。 サーティファイ提供の修了試験は試験時間60分、問題数全30問となっており、通常の修了試験に比べて大幅に縮小されています。18問以上正解すれば合格です。
午前試験免除制度にはメリットもありますが、反面、デメリットも存在します。
Fortran/サブルーチンと関数

ほとんどのプログラムでは、同じブロックのコードが複数の場所で再利用されることがよくあります。コードの重複を最小限に抑え、コードのメンテナンスを容易にするためには、そのようなコードのブロックは関数またはサブルーチン内に配置する必要があります。Fortranのfunctionは、数学的な関数に似ており、0個以上の引数を入力として受け取り、単一の出力値を返します。Fortranのsubroutineは、入力変数に対していくつかの操作を行うコードブロックであり、サブルーチンを呼び出すことで入力変数が変更されます。
多くのプログラミング言語では、関数とサブルーチンを区別しません(例:C/C++、Python、Rust、Go)。純粋な関数型プログラミング言語(例:Haskell)では、サブルーチンは場合によっては入力変数を副作用として変更できるため、コードを複雑にする可能性があるため、関数のみが許可されます。
関数はサブルーチンよりもシンプルです。関数は単一の値を返さなければならず、write文、if (function) then内の式などの式内から呼び出すことができます。サブルーチンは値を返さず、その引数を介して多くの値を返すことができ、callキーワードを使用して単独のコマンドとしてのみ使用できます。
Fortranでは、functionを使用して値または値の配列を返すことができます。次のプログラムは、整数の自乗と立方の和を計算するために関数を呼び出します。
引数iのintent (in)属性は、iが関数内で変更されないことを意味し、それに対して戻り値jは自動的にintent (out)を持ちます。 funcの戻り値の型を宣言する必要があることに注意してください。これを省略すると、一部のコンパイラではコンパイルされません。 Open64(訳註:Itaniumおよびx86-64マイクロプロセッサアーキテクチャ向けの無料のオープンソースの最適化コンパイラ)は警告を伴って生成されたコードをコンパイルしますが、動作は定義されていません。
別の形式(F77互換)は次のとおりです。
func_nameの戻り値の型も、上記と同様に宣言する必要があります。唯一の違いは、func_name内でfunc_nameの戻り値の型が参照される方法です。この場合、戻り値変数は関数自体と同じ名前を持っています。
再帰関数は、以下に示す方法で宣言でき、コードをコンパイルできるようになります。
subroutineは、その引数を介して複数の値を返すために使用できます。これはcall文で呼び出されます。以下はその例です。
関数とサブルーチン内で宣言される変数に対して、渡す必要がある場合はインテント(Intent; 意図)を追加することができます。 デフォルトでは、インテントのチェックは行われず、コンパイラによって誤ったコーディングが検出されない可能性があります。
関数は、結果のデータ型を別々の変数または関数名で定義できます。
以下に例を示します
手続きは、モジュールuseで含めるか、external手続きとして指定する必要があります。 externalはimplicitインターフェイスのみを提供します。これは、コンパイラが引数の数やデータ型を把握していないため、コンパイル時に警告を生成できないことを意味します(モジュールuseからの明示的インターフェイスとは対照的です。参照: Fortran/オブジェクト指向プログラミング)。
関数とサブルーチンは、入力変数を変更できます。サブルーチンは出力値を返さないため、必然的に入力変数を変更します。関数はそうする必要はありませんが、デフォルトでは入力変数を変更することが許可されます。関数は、すべての入力変数にintent属性を使用し、さらにpureキーワードを使用して、いかなる副作用(side-effects)も持たない純粋な関数に変換できます。 pureキーワードは、実質的に関数がいかなる副作用も持たないようにする追加の制限を課します。
pure関数の例を示します。
を
にコンパイラにより最適化することが可能となります。
ダミー名で引数を指定すると、入力引数の順序を任意に指定できます。それは、呼び出し手続きが意図された手続きのインターフェイスブロックを持っている場合(moduleを使用すると自動的に作成される)、可能です。
また、一部のパラメーターを位置で、残りのパラメーターをダミー名で指定するハイブリッドメソッドもあります。
次に例を示します。
引数はoptionalとして設定することができます。 組み込み関数presentを使用して、特定のパラメーターが設定されているかどうかを確認できます。
以下に例を示します。
手続きがダミー引数として別の手続きを持っている場合、その型を指定する必要があります。これは、procedure文とその引数の定義からなるinterfaceブロックを使用して行われます。
注意:各interfaceブロックには独自のスコープがあります。そのため、外部の値にアクセスする必要がある場合は、明示的にそれらを読み込む必要があります。これは、importまたはuse文によって実現できます。
以下に例を示します。
変数の値を手続き呼び出しの間に保存するには、save属性を明示的に指定します。
以下に例を示します。
整数、実数、複素データ型に対して機能するabs関数のように、異なる入力引数のために同じ名前のジェネリック関数を作成することができます。
以下の例は、整数または文字列を追加するadd関数を作成する方法を示しています。
抽象型のタイプバウンド手続きを作成するには、deferred遅延属性を指定する必要があります。これにより、型の実際のバインディングが行われるまで、型バウンド手続きは実際には作成されません。これにより、型のバインディングポイントを決定するために、プログラムの実行時にタイプバウンド手続きを選択する柔軟性が向上します。
詳しくはFortran/オブジェクト指向プログラミング#抽象型の項を参照してください。
要素は任意の次元のパラメーターを操作する手続きを作成することができます。キーワード elemental は、単一のオブジェクト(例:整数)に対する操作を定義する場合に使用され、一般的な場合は自動的に処理されます。
以下の例は、任意の長さの整数次元の加算が示されています。
Fortran/変数

プログラミングにおいて変数とは、プログラムが変更できるデータの入れ物です。通常、変数を使用する前には、どのようなデータを格納するかの情報を提供するために、変数を宣言します。しかし、Fortranでは暗黙的に変数を作成することができます。 implicitの記述がない場合、i/Iからn/Nまで(inグループ)で始まる宣言されていない変数や引数はintegerとなり、それ以外の宣言されていない変数や引数はrealとなります。
多くの人は、宣言せずに変数を使うことを悪習と考えています。もし変数の宣言を強制されたいのであれば、まず :implicit none をコーディングしてください。
通常の変数の例を以下に示します。
以下は、まったく同じことをしていますが、より短く、より古風な形になっています。
メモリのレイアウトを重視する場合は、m(1,1)の後にm(2,1)が続き、m(1,2)は続かないことに注意してください。
変数に値を設定するには、変数を等号の前に置き、等号の後に設定される値を置く。上記の宣言を行うと、以下のような代入が可能です。
変数は、代入の両サイドに現れることができます。右辺が先に評価され、その値に変数が代入されます。
変数はある型から別の型に変換することができますが、C++やJavaのように変数を型付けするのではなく、Fortranでは固有の手続きを使用します。
また、同じことをよりシンプルで古風な形で表現しています。
配列の宣言には2種類の表記法があります。次の例は、integer型で長さ5の配列の表記法を示しています。
多次元配列の場合は、各次元の長さを指定する必要があります。次の例では、5x6の整数行列が長さ(5,6)の2次元配列になっている場合を示しています(ここでも両方の表記をしています)。
配列に実際の値を代入するには、特定の要素・特定の範囲・あるいは配列全体を設定するという複数の選択肢があります。
多次元配列を設定するには、reshapeやshapeコマンドを利用する必要があります。
Fortranでは列メジャーな順序を採用しているため、上の例ではよくわからない行列ができてしまいます。行メジャーの順序では,次の例のように,どの次元で最初にソートするかを order 引数で指定することができます.
Fortran/テキスト入出力

Fortranプログラムは、read文を使用して標準入力またはファイルから読み取り、print文を使用して標準出力に書き込むことができます。write文を使用すると、標準出力またはファイルに書き込むことができます。ファイルに書き込む前に、ファイルをオープンし、プログラマがファイルを参照するためのユニット番号を割り当てる必要があります。write文を使用してデフォルトの出力にステートメントを書き込む場合、構文はwrite(*,*)となります。使い方は以下の通りです。
このコードは、"Hello World!"をデフォルトの出力(通常は標準出力、画面)に書き込みます。これはprint *,ステートメントを使用した場合と同様です。
ファイル出力のデモとして、次のプログラムはキーボードから2つの整数を読み取り、その整数と積を出力ファイルに書き込みます。
ファイル "results.txt" にはこれらの行が含まれます。
デフォルトでは、各printまたはwriteステートメントは新しい行に印刷を開始します。例えば、以下のようになります。
標準出力に出力します。
もし、"Hello World!"を1つのprint文に入れていたら、"Hello World!"というテキストが1行に表示されたことになります。
Fortran/プログラムのフロー制御

条件付き実行は、以下の構成のif、then、else文を使って行われます。
else if文はいくつあっても構いません。
論理式を作る際には、以下のような演算子を使うことができます。
注:Fortranの標準では、.EQ.と.NEQ.は論理演算子と一緒に使用できないことになっていますが、一部のコンパイラでは標準が適用されません。
複数のステートメントをチェックする場合は、括弧を使用します。
次のプログラムは、0から1の間の乱数を生成し、それが0から0.3、0.3から0.6、0.6から1.0の間のいずれかであるかどうかをテストします。
IFには2つの興味深い古風な形式があります。
第1の形式では、物事は非常に簡単です。 2番目の形式では、算術式が評価されます。 式が負の数と評価された場合は、最初の文番号で実行が継続されます。 式がゼロと評価された場合、実行は2行目の番号に続きます。 それ以外の場合は、3行目から実行されます。
if ブロックが単一の変数に対する繰り返しのテストで構成されている場合は、select case構成に置き換えることができるかもしれません。たとえば、次のようなコードです。
は次のように置き換えることができます。
Fortranではbreak文は必要ありません。
反復処理を行うために、Fortranにはdoループがあります。次のループは,1から10までの整数の二乗を表示します. コード中のループさせたい箇所に、下記のようなdo~end do文を挿入します。
以下のコードのように、exitを使ってループを早期に終了させることができます。このコードでは、整数の二乗を、いずれかの二乗が25を超えるまで表示します。

ループは入れ子にすることができます。次のコードは、1から10までの整数の累乗2から4を表示します。
古い形式のDOでは、ループの終わりの行番号が使われます。 以下は同じループで、ラベル1が各ループの最後の行であることを明示しています(複数のループでのラベルの共有は、Fortran95からは禁止されています)。
旧来の形式を使用する場合、ループはIFまたはGO TO文で終わらせてはならない。1ラベルのアンカーとしてCONTINUE文を使用することができます。
また、doループを宣言する際には、オプションでインクリメント引数があります。 以下は、2の単位でカウントアップします。2, 4, 6, ...
doループの引数は数値リテラルである必要はなく、プログラムのどこかで定義されている任意の整数で構いません。first, lastやincrementにはどんな変数名でも構いません。