サブルーチン
(関数_(プログラミング) から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/04/07 01:55 UTC 版)
![]() |
この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。(2016年4月)
|
プログラミングにおけるサブルーチン(英: subroutine)は、プログラム中で意味や内容がまとまっている作業をひとつにまとめたものである。サブプログラムあるいは副プログラム(英: subprogram)[1]とも呼ばれ、単に「ルーチン」(英: routine)と呼ばれることもある。プログラミング言語によっては、関数(英: function)やプロシージャあるいは手続き(英: procedure)とも呼ばれる。
概説
繰り返し利用されるルーチン作業をモジュールとしてまとめたもので、呼び出す側の「主」となるもの(メインルーチン)と対比して「サブルーチン」と呼ばれる。
プログラムのソース中で、繰り返し現れる処理をサブルーチン化することで、可読性や保守性を高く保つことができる。繰り返し現れる処理でなくても、意味的なまとまりを示すためにサブルーチン化することもある。また、キャッシュのような階層的メモリの設計を持つコンピュータ(現在のパソコンやワークステーションなどほぼすべて)では、よく使われるサブルーチンがキャッシュに格納されることで高速な動作を期待できる。
呼び出しと入出力
サブルーチンが結果として値を返す場合、その値は戻り値(もどりち)または返り値(かえりち)と呼ばれる。
プログラミング言語によっては、サブルーチンに相当する処理のまとまりを、「結果として値を返すもの」と「処理だけを行ない値を返さないもの」に分類・区別することがある。この区分はプログラミング言語の仕様で定められるため、言語により区分や名称が異なる。例えば、Pascalでは戻り値があるものを関数と呼び、戻り値がないものを手続きと呼ぶ。C言語ではいずれも関数と呼ぶ。ALGOLではいずれも手続きと呼ぶ。これらは慣習的なものであり、手続き型プログラミングや関数型プログラミングといったプログラミングスタイルあるいはプログラミングパラダイムの分類とは関係がない。サブルーチンが属するスコープなどの特性によって名称を変えているものもあれば、特に区別せず同じ名称を与えているものもある。
日本の情報処理推進機構 (IPA) が運営している基本情報技術者試験で使われる疑似言語では、サブルーチンを戻り値の有無により「関数」と「手続」(てつづき)に分類している。戻り値があるほうが関数であり、戻り値が無いほうが手続である[1]。これはPascalの慣習と同じだが、もともとアルゴリズムの記述にはALGOLやPascal系の構文をもとにした疑似言語が使われることが多かった、という事情もある[2]。
なお、サブルーチンは呼び出し時に入力として引数(ひきすう)を受け取り、サブルーチンの中で宣言された「仮引数」と呼ばれる変数を通じて内部処理に使うことができる。引数の渡し方には、一般的なものとして以下の2つがある[3]。
- 実引数を渡すときにその値だけを渡して、記憶場所(アドレス)は渡さない方法を「値呼び出し」または「値渡し」という。値呼び出しで変数を渡す場合、メインルーチンとは別にサブルーチン側で変数の記憶領域を確保し、そこにいったん値(データ)をコピーする。そのため、サブルーチン側で変数の値を変更しても、メインルーチンに戻ったときには元の値のままになる。
- 実引数を渡すときにその記憶場所(アドレス)を渡す方法を「参照呼び出し」または「参照渡し」という。参照呼び出しで変数を渡す場合、メインルーチンとサブルーチンとで、変数の記憶領域が共有される。そのため、サブルーチン内でその変数に対して行なった変更操作は、メインルーチンに戻ってもそのまま反映される。
一般的には戻り値によって単一の結果を出力として返すが、参照呼び出しを使うことによって複数の結果を出力として返したり、受け渡しの際のデータコピーのコストを低減したりすることもできるようになる。
なお、Pascalでは関数/手続きの内部に、それらの中でのみ呼び出し可能な別の関数/手続きを記述することもできる。関数内関数やローカル関数などと呼ばれることもある。
一般的にサブルーチンにはプログラムソースコード上で識別可能な何らかの名前が付けられ、呼び出しの際にはその名前をもとに参照されるが、名前を持たないサブルーチン(無名関数、ラムダ式)を定義できる言語もある。
通例、サブルーチンとその呼び出し元の間での引数および戻り値の受け渡しや、サブルーチンが終了したときに呼び出し元にフロー制御を戻すための復帰位置(リターンアドレス)の一時記憶、サブルーチン内のローカル変数の割り当てには、コールスタックやレジスタが使われる。引数がスタックに積まれる順序やメモリレイアウトなどの呼び出し規約は、プログラミング言語やプロセッサ (CPU) のアーキテクチャにも依存するが、コンパイラ固有の修飾子(キーワード)によって指定できる環境もある[4][5]。x64やARMのように、特定の条件を満たす引数についてはスタックではなくレジスタを経由して受け渡しされるアーキテクチャもある[6][7]。
環境によっては、呼び出し規約を規定し、また引数と戻り値のデータ型を基本数値型やポインタ型などのPOD型に限定することで、異なる言語間で相互運用可能なABI互換性のあるサブルーチンを定義することができる。例えばCで書かれた関数をダイナミックリンクライブラリ (DLL) や共有ライブラリ (so) にエクスポートし、Pascalの関数または手続きとして呼び出したりすることも可能となる。別の例として、Microsoft Excelでは、C/C++やPascalやVisual Basicなどを使ってDLLに実装された関数を、Visual Basic for Applications (VBA) のコードモジュールからプロシージャとして呼び出したり、ワークシートから直接利用したりすることができる[8][9]。
数学の関数との違い
引数をとり、値を返すという、数学における関数との類似性から、言語によっては関数 (function) とも呼ばれるわけであるが、一般にプログラミング言語における関数は、数学におけるそれとは以下のような点が異なる。
これに対し、関数型言語では状態や、プログラム自身に影響するような副作用をもたないことを基本とするなど、数学の関数に近い性質を持つ。特に純粋関数型言語では数学の関数と同等であり、同様の性質(参照透過性など)を持つことが利用される。
オブジェクト指向言語の場合
多くのオブジェクト指向プログラミング言語では、何らかのオブジェクトあるいはクラスに属するサブルーチンは、メソッドと呼ばれている。Cから発展し、Simulaの影響を強く受けたC++では、クラスや構造体に属する関数はメンバー関数と呼ばれている。
JavaやC#など、サブルーチンはクラスや構造体などの型に属するメソッドもしくはメソッド内のローカル関数として記述しなければならず、どこにも属さない関数(フリー関数)は定義できないオブジェクト指向言語もある。一方、C++やSwiftのように、必ずしもクラスや構造体に属する必要はなく、名前空間スコープに関数を直接定義できるオブジェクト指向言語もある。
歴史
サブルーチンという考え方は、ことさら新しいものではない。アルゴリズムなどにおいて、問題を部分問題に切り分けて解くという分割統治法はコンピュータ以前からあり、コンピュータプログラミングについても、EDSACのプログラミングについて出版された、この分野の世界最初の書籍とされる The Preparation of Programs for an Electronic Digital Computer(1951)においても part one, chapter 2 がサブルーチンに関する章である。
各プログラミング言語におけるサブルーチン
おおむね歴史が古い言語から説明する。
FORTRAN
Fortranでは、値を返すサブプログラムは関数(function
)、値を返さないサブプログラムはサブルーチン(subroutine
)と呼ばれる。Fortran 90以降の関数はPURE属性により副作用を持たないことを明示できる。
LISP
LISPでは関数と呼ばれることが多く、Common Lispでも関数と呼ぶ。しかしSchemeの仕様では手続きという用語を使っている。なおLispにはサブルーチンをマクロで実装するという重要な手法もある。
BASIC
古典的なBASICでは、GOSUB 命令によるサブルーチンがあった。インタプリタは GOSUB 命令を見つけると、GOSUB 命令の終わりの場所(アドレス)をインタプリタ内のスタックにプッシュして保存し、命令で指定された行に飛び、実行を続ける。その後、実行中に RETURN 命令を見つけると、スタックから先ほど保存しておいた呼び出し元の場所をポップして取り出し、そこに飛び、GOSUB 命令の次の命令から実行を再開する。サブルーチンを作成したい場合は、ユーザーは「この行からこの行まではサブルーチンとする」と決めてプログラムを作成した。以上のように「RETURN できる GOTO」でしかない(引数も返り値もローカル変数もない)ため、(グローバル)変数を経由する、配列をユーザースタックとして使うなど、技巧を必要とした。比較的高機能な実装では、DEFFN 命令により、式一個で記述できる範囲という制限ながらも、引数と返り値のあるユーザー定義関数の追加(拡張)が行えるものもあった。
Pascal
Pascalではfunction
およびprocedure
という予約語を使って宣言する[注釈 1]。
C言語
カーニハンとリッチーによる解説書『プログラミング言語C』、いわゆる「K&R」には、C言語の関数はPascalの「手続き」や「関数」に相当すると書かれてある[10]。つまりC言語では戻り値の有無にかかわらず「関数」(function) と呼んでいる。
関数の定義の書式は次の通りである[10]。
<戻り値の型> <関数名>( <引数> ) { 関数内の処理の記述 }
C言語では歴史的な理由から、値を返さない関数を宣言および定義する場合は、関数の型(返戻値の型)を書く場所にvoid
(void型)と書く[注釈 2]。
関数の宣言が複数ある場合、どの順番で書いても良いし、複数のファイルに分けて書いても良い[10]。ただし、ひとつの関数を複数のファイルに分けて書いてはいけない[10]。
なお、K&RのCはANSI C(C89)として標準化される前の古い仕様に基づいており、Cの歴史を知るうえでは重要だが、2023年現在はISO/IEC 9899規格を参照することが望ましい。
Perl
Perlでは、ユーザー定義のものはサブルーチンであるが、引数を渡すことができ、値を返すこともできる。サブルーチン内からは、渡された引数には特殊変数からアクセスし、値を返すにはreturn文[注釈 3]を使う。
Visual Basic
Visual Basic (VB)、Visual Basic for Applications (VBA)、Visual Basic .NET (VB.NET) では、サブルーチンをプロシージャと総称しており、値を返すプロシージャを「Function
プロシージャ」、値を返さないプロシージャを「Sub
プロシージャ」と呼ぶ。さらにプロパティを定義するための構文として「Property
プロシージャ」がある[11][12]。
他
Microsoft Excelにおける関数は、主に、計算をしたり、データの検索や集計をしたり、表示を変換したりするものである。合計値を求めるSUM関数や、平均値を求めるAVERAGE関数、条件演算子に相当するIF関数など、100を超える組み込みの「ワークシート関数」が存在する。一方、VBAコードからのみ利用可能な「VBA関数」もある。例えばIIf関数[13]はIF関数に似た働きをするが、ワークシート上の数式内では利用できず、VBAからのみ利用可能である。ワークシート関数およびVBA関数はいずれもユーザー定義の関数を登録して利用することもできる。
再帰呼び出し
あるサブルーチンf
の定義中でf
自身を再度呼び出すことを再帰呼び出し(さいきよびだし、recursive function call)という[14][1]。再帰呼び出しを使うと、ある処理で得られた値に対しさらに同じ処理を何度も繰り返すような場合に簡潔な記述にすることができる[15]。たとえば階乗の計算をするために使ったり[1]、ファイルシステムのような木構造の探索に使ったり[16]、オセロソフト・チェスソフト・将棋ソフト・囲碁ソフトなどの「先読み」に使ったりできる[注釈 4][17][18][19][20]。
なお、一般的なコンピュータおよびプログラミング言語では、サブルーチン呼び出しの際はコールスタックに引数やローカル変数などの領域が確保されるが、パーソナルコンピュータのような比較的リソースに余裕のある環境であっても、このコールスタックの容量は既定でスレッドごとに数MiB程度に設定されており、サブルーチンの呼び出し階層が深すぎるとスタックオーバーフローを引き起こす場合がある。特に再帰呼び出しは呼び出し階層が深くなりがちで、再帰回数が多すぎるとスタックオーバーフローを引き起こしやすい。
脚注
注釈
- ^ C言語と違い、中身の記述すなわち定義まで含むものもPascalでは「宣言」と言う。
- ^ 標準化以前(K&R初版時代のC)は、省略した場合のデフォルトとしてintを返すと解釈される仕様だったという経緯があり、互換性を保つためにそれが標準とされたため、値を返さない場合には
void
を書いて明示しなければならない、という仕様になっている。 - ^ http://perldoc.perl.org/perlsub.html には return statement とあるが、return 自体の解説は http://perldoc.perl.org/functions/return.html のように関数扱いになっている。
- ^ オセロゲームの盤面先読みのコードは、以前、基本情報技術者試験に出題されたことがあり教科書や問題集などでも掲載されるようになっていた。
出典
- ^ a b c d 大滝みや子『2020年版 基本情報技術者 標準教科書』オーム社、2019年。pp.95-96「手続きと関数」「再帰呼び出し」の章
- ^ 電子情報通信学会『知識の森』 - 6 群「基礎理論とハードウェア」 - 3 編「アルゴリズムとデータ構造」 - 1 章「アルゴリズムとアルゴリズム解析」
- ^ 問49 変数を引数として渡しても、サブルーチンの実行後に変数の値が変更されないことが保証されているものはどれか。 | 日経クロステック(xTECH)
- ^ Calling Conventions | Microsoft Learn
- ^ Argument Passing and Naming Conventions | Microsoft Learn
- ^ x64 calling convention | Microsoft Learn
- ^ Overview of ARM ABI Conventions | Microsoft Learn
- ^ Working with DLLs | Microsoft Learn
- ^ Developing DLLs | Microsoft Learn
- ^ a b c d Brian W. Kernighan / Dennis M. Ritchie "The C Programming Language, Second Edition", 1988. ISBN 0-13-110362-8, pp.24-27 "Functions".
- ^ Writing a property procedure (VBA) | Microsoft Learn
- ^ Property プロシージャ - Visual Basic | Microsoft Learn
- ^ IIf function (Visual Basic for Applications) | Microsoft Docs
- ^ 自分から自分を呼ぶ? Pythonで「再帰呼び出し」の不思議を体験 | 日経クロステック(xTECH)
- ^ 『令和04年 栢木先生の基本情報技術者教室』技術評論社、2021年、p.209「再帰的な関数の例」
- ^ .NET TIPS [ASP.NET]データベースからツリー・メニューを生成するには? - C# VB.NET Webフォーム - @IT
- ^ Chess programming
- ^ 将棋ソフト作成入門
- ^ 再帰呼び出し
- ^ 囲碁プログラムの作り方(基本編)
関連項目
関数型プログラミング
(関数_(プログラミング) から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/06/24 14:14 UTC 版)
プログラミング・パラダイム |
---|
|
関数型プログラミング(かんすうがたプログラミング、英: functional programming)とは、数学的な意味での関数を主に使うプログラミングのスタイルである[1]。 functional programming は、関数プログラミング(かんすうプログラミング)などと訳されることもある[2]。
関数型プログラミング言語(英: functional programming language)とは、関数型プログラミングを推奨しているプログラミング言語である[1]。略して関数型言語(英: functional language)ともいう[1]。
概要
関数型プログラミングは、関数を主軸にしたプログラミングを行うスタイルである[1]。ここでの関数は、数学的なものを指し、引数の値が定まれば結果も定まるという参照透過性を持つものである[1]。
参照透過性とは、数学的な関数と同じように同じ値を返す式を与えたら必ず同じ値を返すような性質である[1]。次の square
関数は、 2
となるような式を与えれば必ず 4
を返し、 3
となるような式を与えれば必ず 9
を返し、いかなる状況でも別の値を返すということはなく、これが参照透過性を持つ関数の一例となる[1]。
def square(n):
return n ** 2
次の countup
関数は、同じ 1
を渡しても、それまでに countup
関数がどのような引数で呼ばれていたかによって、返り値が 1
, 2
, 3
, ... と変化するため、引数の値だけで結果の値が定まらないような参照透過性のない関数であり、数学的な関数とはいえない[1]。
counter = 0
def countup(n):
global counter
counter += n
return counter
関数型プログラミングは、参照透過性を持つような数学的な関数を使って組み立てた式が主役となる[1]。別の箇所に定義されている処理を利用することを、手続き型プログラミング言語では「関数を実行する」や「関数を呼び出す」などと表現するが、関数型プログラミング言語では「式を評価する」という表現も良く使われる[3]。
参照透過性
参照透過性とは、同じ値を与えたら返り値も必ず同じになるような性質である[1]。参照透過性を持つことは、その関数が状態を持たないことを保証する[4]。状態を持たない数学的な関数は、並列処理を実現するのに適している[4]。関数型プログラミング言語の内で、全ての関数が参照透過性を持つようなものを純粋関数型プログラミング言語という[4]。
入出力
関数型プログラミングでは、数学的な関数を組み合わせて計算を表現するが、それだけではファイルの読み書きのような外界とのやり取りを要する処理を直接的に表現できない[5]。このような外界とのやり取りを I/O (入出力) と呼ぶ[5]。数学的な計算をするだけ、つまり 1 + 1
のようなプログラム内で完結する処理ならば、入出力を記述できなくても問題ないが、現実的なプログラムにおいてはそうでない[5]。
非純粋な関数型プログラミング言語においては、式を評価すると同時に I/O が発生する関数を用意することで入出力を実現する[5]。たとえば、 F# 言語では、printfn "Hi."
が評価されると、 ()
という値が戻ってくると同時に、画面に Hi.
と表示される I/O が発生する[5]。
Haskell では、評価と同時に I/O が行われる関数は存在しない[5]。たとえば、 putStrLn "Hi."
という式が評価されると IO ()
型を持つ値が返されるが画面には何も表示されず、この値が Haskell の処理系によって解釈されて初めて画面に Hi.
と表示される[5]。 I/O アクションとは、ファイルの読み書きやディスプレイへの表示などのような I/O を表現する式のことである[5][6]。 IO a
という型は、コンピュータへの指示を表す I/O アクションを表現している[5][7]。ここでの IO
はモナドと呼ばれるものの一つである[8]。
Clean では、一意型を用いて入出力を表す。
手法
![]() |
この節の加筆が望まれています。
|
最初に解の集合となる候補を生成し、それらの要素に対して1つ(もしくは複数)の解にたどり着くまで関数の適用とフィルタリングを繰り返す手法は、関数型プログラミングでよく用いられるパターンである[9]。
Haskell では、関数合成の二項演算子を使ってポイントフリースタイルで関数を定義することができる[9]。関数をポイントフリースタイルで定義すると、データより関数に目が行くようになり、どのようにデータが移り変わっていくかではなく、どんな関数を合成して何になっているかということへ意識が向くため、定義が読みやすく簡潔になることがある[9]。関数が複雑になりすぎると、ポイントフリースタイルでは逆に可読性が悪くなることもある[9]。
言語
関数型プログラミング言語とは、関数型プログラミングを推奨しているプログラミング言語である[1]。略して関数型言語ともいう[1]。全ての関数が参照透過性を持つようなものを、特に純粋関数型プログラミング言語という[4]。そうでないものを非純粋であるという[5]。
関数型プログラミング言語の多くは、言語の設計において何らかの形でラムダ計算が関わっている[3]。ラムダ計算はコンピュータの計算をモデル化する体系の一つであり、記号の列を規則に基づいて変換していくことで計算が行われるものである[3]。
名前 | 型付け | 純粋性 | 評価戦略 | 理論的背景 |
---|---|---|---|---|
Clean | 静的型付け | 純粋 | 遅延評価 | |
Elm | 静的型付け | 純粋 | 正格評価 | |
Erlang | 動的型付け | 非純粋 | 正格評価 | |
F# | 静的型付け | 非純粋 | 正格評価 | |
Haskell[2] | 静的型付け[2] | 純粋[2] | 遅延評価[2] | 型付きラムダ計算[3] |
Idris | 静的型付け | 純粋 | 正格評価 | 型付きラムダ計算 |
Lazy K | 型なし | 純粋 | 遅延評価 | コンビネータ論理 |
LISP 1.5 Scheme Common Lisp Clojure |
動的型付け | 非純粋 | 正格評価 | 型無しラムダ計算[3] |
LISPの各種方言[3] | 方言による | 方言による | 方言による | |
Miranda | 静的型付け | 純粋 | 遅延評価 | |
ML Standard ML OCaml |
静的型付け | 非純粋 | 正格評価 | |
Scala | 静的型付け | 非純粋 | 正格評価 | |
Unlambda | 型なし | 非純粋 | 正格評価 | コンビネータ論理 |
Lean | 静的型付け | 純粋 | 正格評価 | 型付きラムダ計算 |
手続き型プログラミングとの比較
C 言語や Java 、 JavaScript 、 Python 、 Ruby などの2017年現在に使われている言語の多くは、手続き型の文法を持っている[10]。そのような言語では、文法として式 (expression) と文 (statement) を持つ[10]。ここでの式は、計算を実行して結果を得るような処理を記述するための文法要素であり、加減乗除や関数呼び出しなどから構成されている[10]。ここでの文は、何らかの動作を行うようにコンピュータへ指示するための文法要素であり、条件分岐の if 文やループの for 文と while 文などから構成されている[10]。手続き型の文法では、式で必要な計算を進め、その結果を元にして文でコンピュータ命令を行うという形で、プログラムを記述する[10]。このように、手続き型言語で重要なのは文である[10]。
それに対して、関数型言語で重要なのは式である[10]。関数型言語のプログラムはたくさんの式で構成され、プログラムそのものも一つの式である[10]。たとえば、 Haskell では、プログラムの処理の記述において文は使われず、外部の定義を取り込む import 宣言も処理の一部として扱えない[10]。関数型言語におけるプログラムの実行とは、プログラムを表す式の計算を進めて、その結果として値 (value) を得ることである[10]。式を計算することを、評価する (evaluate) という[10]。
手続き型言語ではコンピュータへの指示を文として上から順に並べて書くのに対して、関数型言語では数多く定義した細かい式を組み合わせてプログラムを作る[10]。手続き型言語では文が重要であり、関数型言語では式が重要である[11]。
式と文の違いとして、型が付いているかどうかというのがある[11]。式は型を持つが、文は型を持たない[11]。プログラム全てが式から構成されていて、強い静的型付けがされているのならば、プログラムの全体が細部まで型付けされることになる[11]。このように細部まで型付けされているようなプログラムは堅固なものになる[11]。
歴史
1930年代
関数型言語の開発において、アロンゾ・チャーチが1932年[注釈 1]と1941年[注釈 2]に発表したラムダ計算の研究ほど基本的で重要な影響を与えたものはない[12]。ラムダ計算は、それが考え出された当時はプログラムを実行するようなコンピュータが存在しなかったためにプログラミング言語として見なされなかったにもかかわらず、今では最初の関数型言語とされている[12]。1989年現在の関数型言語は、そのほとんどがラムダ計算に装飾を加えたものとして見なせる[12]。
1960年代
1960年にジョン・マッカーシー等が発表した LISP は関数型言語の歴史において重要である[13]。ラムダ計算は LISP の基礎であると言われるが、マッカーシー自身が1978年[注釈 3]に説明したところによると、匿名関数を表現したいというのが最初にあって、その手段としてマッカーシーはチャーチのラムダ計算を選択したに過ぎない[14]。
歴史的に言えば、 LISP に続いて関数型プログラミングパラダイムへ刺激を与えたのは、1960年代半ばのピーター・ランディンの成果である[15]。ランディンの成果はハスケル・カリーとアロンゾ・チャーチに大きな影響を受けていた[15]。ランディンの初期の論文は、ラムダ計算と、機械および高級言語 (ALGOL 60) との関係について議論している[15]。ランディンは、1964年[注釈 4]に、 SECD マシンと呼ばれる抽象的な機械を使って機械的に式を評価する方法を論じ、1965年[注釈 5]に、ラムダ計算で ALGOL 60 の非自明なサブセットを形式化した[15]。1966年[注釈 6]にランディンが発表した ISWIM(If You See What I Mean の略)という言語(群)は、間違いなく、これらの研究の成果であり、構文や意味論において多くの重要なアイデアを含んでいた[15]。 ISWIM は、ランディン本人によれば、「 LISP を、その名前にも表れたリストへのこだわり、手作業のメモリ割り当て、ハードウェアに依存した教育方法、重い括弧、伝統への妥協、から解放しようとする試みとして見ることができる」[15]。関数型言語の歴史において ISWIM は次のような貢献を果たした[16]。
ランディンは「それをどうやって行うか」ではなく「それの望ましい結果とは何か」を表現することに重点を置いており、そして、 ISWIM の宣言的なプログラミング・スタイルは命令的なプログラミング・スタイルよりも優れているというランディンの主張は、今日まで関数型プログラミングの賛同者たちから支持されてきた[17]。その一方で、関数型言語への関心が高まるまでは、さらに10年を要した[17]。その理由の一つは、 ISWIM ライクな言語の実用的な実装がなかったことであり、実のところ、この状況は1980年代になるまで変わらなかった[17]。
ケネス・アイバーソンが1962年[注釈 7]に発表した APL は、純粋な関数型プログラミング言語ではないが、その関数型的な部分を取り出したサブセットがラムダ式に頼らずに関数型プログラミングを実現する方法の一例であるという点で、関数型プログラミング言語の歴史を考察する際に言及する価値はある[17]。実際に、アイバーソンが APL を設計した動機は、配列のための代数的なプログラミング言語を開発したいというものであり、アイバーソンのオリジナル版は基本的に関数型的な記法を用いていた[17]。その後の APL では、いくつかの命令型的な機能が追加されている[17]。
脚注
注釈
- ^ (Church 1932)
- ^ (Church 1941)
- ^ (McCarthy 1978)
- ^ (Landin 1964)
- ^ (Landin 1965)
- ^ (Landin 1966)
- ^ (Iverson 1962)
出典
- ^ a b c d e f g h i j k l 本間, 類地 & 逢坂 2017, p. 3
- ^ a b c d e 本間, 類地 & 逢坂 2017, p. 2
- ^ a b c d e f 本間, 類地 & 逢坂 2017, p. 4
- ^ a b c d 本間, 類地 & 逢坂 2017, p. 5
- ^ a b c d e f g h i j 本間, 類地 & 逢坂 2017, p. 6
- ^ 本間, 類地 & 逢坂 2017, p. 23
- ^ 本間, 類地 & 逢坂 2017, p. 31
- ^ 本間, 類地 & 逢坂 2017, p. 32
- ^ a b c d Lipovača 2012, p. 22
- ^ a b c d e f g h i j k l 本間, 類地 & 逢坂 2017, p. 22
- ^ a b c d e 本間, 類地 & 逢坂 2017, pp. 22–23
- ^ a b c Hudak 1989, p. 363
- ^ Hudak 1989, p. 367
- ^ Hudak 1989, pp. 367–368
- ^ a b c d e f g h i j k l Hudak 1989, p. 371
- ^ a b c Hudak 1989, pp. 371–372
- ^ a b c d e f Hudak 1989, p. 372
参考文献
- Church, Alonzo (April 1932). “A Set of Postulates for the Foundation of Logic”. Annals of Mathematics (英語). 33 (2): 346. doi:10.2307/1968337. ISSN 0003-486X. JSTOR 1968337. Zbl 0004.14507. Wikidata Q55890017.
- Church, Alonzo (1941), The Calculi of Lambda Conversion (英語), プリンストン大学出版局, Wikidata Q105884272
- Hudak, Paul (1 September 1989). “Conception, evolution, and application of functional programming languages”. ACM Computing Surveys (英語). 21 (3): 359–411. doi:10.1145/72551.72554. ISSN 0360-0300. Wikidata Q55871443.
- Iverson, Kenneth (1 December 1962), A Programming Language (英語), Wikidata Q105954505
- McCarthy, John (1978), History of LISP (英語), doi:10.1145/800025.808387, Wikidata Q56048080
- Landin, Peter (1 January 1964). “The Mechanical Evaluation of Expressions”. The Computer Journal (英語). 6 (4): 308–320. doi:10.1093/COMJNL/6.4.308. ISSN 0010-4620. Zbl 0122.36106. Wikidata Q30040385.
- Landin, Peter (1965). “Correspondence between ALGOL 60 and Church's Lambda-notation”. Communications of the ACM (英語). 8: 89–101, 158–167. ISSN 0001-0782. Wikidata Q105941120.
- Landin, Peter (1 March 1966). “The next 700 programming languages”. Communications of the ACM (英語). 9 (3): 157–166. doi:10.1145/365230.365257. ISSN 0001-0782. Zbl 0149.12505. Wikidata Q54002422.
- Lipovača, Miran (25 May 2012). すごいHaskellたのしく学ぼう!. Translated by 田中英行; 村主崇行 (1st (1st printing) ed.). オーム社. ISBN 978-4-274-06885-0. Wikidata Q105845956.
- 本間雅洋、類地孝介、逢坂時響『Haskell入門 関数型プログラミング言語の基礎と実践』(1st (1st printing)版)、技術評論社、2017年10月10日。ISBN 978-4-7741-9237-6。Wikidata Q105833610。
外部リンク
関連項目
「関数 (プログラミング)」の例文・使い方・用例・文例
- その際には、この関数を使用します
- 関数が条件が真の場合にゼロの値を返す
- 小文字のゼータは数学で関数を意味する。
- このシステムは波動関数で記述することができる。
- プサイ関数
- 上記の関数とともに公式を利用すること
- このドライバーの特性は車間距離と速度の関数で表される。
- 4つのレジスタは、呼び出された関数側が保存する。
- 多くの人間にとって三角関数を学ぶことは無意味であるように思える。
- あのー、先生?黒板に書いてあるの、指数関数じゃなくて三角関数ですけど・・・。
- 【数学】 逆関数.
- その関数は連続微分可能である
- 最適化問題では、我々は最適化されるだろう最適値の関数を導き出す変数の値を求める
- インフレーションは指数関数的に上昇している
- 対数関数的方法で
- 関数または曲線の
- 導関数を計算する
- 数量または関数の逆数の、あるいは、数量または関数の逆数に関する
- 関数の微分係数を求める数学法
- 最大の関数値を見つける数学的方法
- 関数_(プログラミング)のページへのリンク