APL ( 『プログラミング言語』という本にちなんで名付けられた)[ 3 ]は、1960年代にケネス・E・アイバーソンによって開発されたプログラミング言語です。その中心的なデータ型は多次元配列です。ほとんどの関数と演算子を表すために、さまざまな特殊なグラフィックシンボル[ 4 ]を使用しており、非常に簡潔なコードになります。概念モデリング、スプレッドシート、関数型プログラミング[ 5 ]、およびコンピュータ数学パッケージ[ 6 ]の開発に重要な影響を与えてきました。また、他のいくつかのプログラミング言語にも影響を与えています[ 7 ] [ 8 ]。
配列を操作するための数学的記法は、1957年にハーバード大学でケネス・E・アイバーソンによって開発されました。1960年、彼はIBMに入社し、そこでアディン・ファルコフと共にこの記法を開発し、 1962年に著書『プログラミング言語』で発表しました。 [ 3 ]序文にはその前提が述べられています。
応用数学は、主に様々な関数の正確な値または近似値を計算するための明示的な手順の設計と分析に関係しています。このような明示的な手順は、アルゴリズムまたはプログラムと呼ばれます。プログラムを記述するための効果的な表記法は、かなりの構文構造を示すため、プログラミング言語と呼ばれます。
この表記法は、IBM社内で、スタックマシンとレジスタマシンを比較評価して次世代コンピュータを開発する際に、 Burroughs B5000とそのスタック機構などのコンピュータシステムに関する短い研究報告書を作成する際に使用されていた。
アイバーソンは、フレッド・ブルックスと共著で執筆していた書籍『自動データ処理』(1963年出版)の「プログラミング言語」の章の草稿でも自身の記法を使用した。 [ 9 ] [ 10 ]
1979年、アイバーソンはAPLに関する研究でチューリング賞を受賞した。 [ 11 ]
1962年には早くも、完全なコンピュータシステムを記述するためにこの表記法を用いる最初の試みが行われた。これは、ファルコフがウィリアム・C・カーターと、後にIBM System/360ファミリーとなるマシンの命令セットを標準化するための自身の研究について話し合った後のことだった。
1963年、IBMシステム研究所に勤務していたハーバート・ヘラーマンは、IBM 1620コンピュータ上で記法の一部を実装し、超越関数を級数和で計算する高校の特別コースで生徒たちがそれを使用しました。生徒たちはヘラーマンの研究室でコードをテストしました。この記法の一部を実装したものは、パーソナライズド配列トランスレータ(PAT)と呼ばれました。[ 12 ]
1963年、IBMに勤務していたファルコフ、アイバーソン、エドワード・H・サッセンガス・ジュニアは、IBM System/360シリーズのマシンアーキテクチャと機能の正式な記述にこの表記法を使用し、その結果、1964年にIBM Systems Journalに論文が掲載された。この論文が掲載された後、チームはコンピュータシステム上での表記法の実装に注目した。この実装に焦点を当てた動機の1つは、 1964年にIBMに買収された教育会社であるサイエンス・リサーチ・アソシエイツで新たな職務に就いていたジョン・L・ローレンスの関心であった。ローレンスはアイバーソンとそのグループに、教育におけるコンピュータの開発と使用のためのツールとしてこの言語を使用するのを手伝ってほしいと依頼した。[ 13 ]
スタンフォード大学のローレンス・M・ブリードとフィリップ・S・エイブラムスがIBMリサーチのチームに加わった後、彼らはIBSYSオペレーティングシステム上で動作するIBM 7090コンピュータ用に行われた表記法の一部のFORTRAN IVでプログラミングされた実装に関する以前の作業を継続した。この作業は1965年末に完了し、後にIVSYS(アイバーソンシステム)と名付けられた。この実装の基礎は、1966年にエイブラムスがスタンフォード大学の技術レポート「アイバーソン表記法のインタプリタ」で詳細に説明した。この学術的な側面は正式にニクラウス・ヴィルトが監督した。[ 14 ]以前のヘラーマンのPATシステムと同様に、この実装ではAPL文字セットは省略されたが、関数と演算子には特別な英語の予約語が使用された。このシステムは後にタイムシェアリングシステムに適合され、1966年11月までにタイムシェアリングモードで動作するIBM System/360 Model 50コンピュータ用に再プログラムされ、IBM社内で使用されました。 [ 15 ]


陰極線管(CRT)端末が広く普及する以前、APLを効果的に使用する能力における重要な進展は、すべての特殊APL文字が印字されたIBM Selectricタイプライターの交換式入力要素の開発でした。これは、 IBM 1050やIBM 2741端末など、Selectricタイプライターと入力要素機構を使用する紙印刷端末ワークステーションで使用されました。キーキャップを通常のキーの上に置き、そのキーが押されたときにどのAPL文字が入力されるかを示すことができました。プログラマーは初めて、アイバーソンの表記法で使用される適切なAPL文字を入力して確認することができ、それらの文字を不格好な英語のキーワードで表現する必要がなくなりました。ファルコフとアイバーソンは、1964年後半に特殊APL Selectric入力要素987と988を設計しましたが、これらを使用できるAPLコンピュータシステムは当時存在しませんでした。[ 16 ]アイバーソンは、APL文字セットにIBM Selectric型要素を使用するというアイデアの着想源としてファルコフを挙げた。[ 17 ]
SelectricのタイピングエレメントにAPL文字が搭載されていたとしても、多くのAPL記号は既存の2つのエレメント文字を重ねて入力する必要がありました。例えば、グレードアップ文字は、デルタ(Shift+H)とシェファーストローク(Shift+M)を組み合わせて作成する必要がありました。これは、APL文字セットが、大文字のみに制限されていた場合でも、タイピングエレメントで使用できる88文字よりもはるかに多かったためです。
Tektronix 4013 コンピュータディスプレイ端末は、APL と ASCII の両方の文字セットを備えたTektronix 4010です。 [ 18 ]キーの上には、文字セットを選択するためのロッカー スイッチがあります。 [ 19 ]
APLへの最初の対話型ログインとAPLワークスペースの作成は、1966年にラリー・ブリードがニューヨーク州ヨークタウンハイツにあるAPLの本拠地、トーマス・J・ワトソン研究所近くのIBMモハンシック研究所でIBM 1050端末を使用して行った。[ 16 ]
IBMは主にAPLを市場に導入した。APLの最初の公開バージョンは1968年にIBM 1130向けにリリースされた。IBMはAPL\1130を無償で提供したが、責任やサポートは提供しなかった。[ 20 ] [ 21 ]わずか8k 16ビットワードのメモリで動作し、専用の1メガバイトのハードディスクを使用した。
APLは、1960年代後半から1980年代初頭にかけて、メインフレームのタイムシェアリングシステムで足場を築きました。その理由の一つは、動的アドレス変換ハードウェアを持たない低スペックシステムで複数のユーザーをサポートできたからです。[ 22 ]一部のIBM System/370メインフレームシステムでは、 APLアシストマイクロコードによってパフォーマンスがさらに向上しました。これは、上位レベルのソフトウェアによって完全に実装されるのではなく、プロセッサのファームウェアにAPL実行のサポートが組み込まれたものです。その後、1980年代半ばから後半にかけて、適切な性能のハードウェアがようやく入手可能になり始めると、多くのユーザーがアプリケーションをパーソナルコンピュータ環境に移行しました。
IBM 360 および IBM 370 ハードウェア用の初期の IBM APL インタプリタは、ホスト サービスに依存するのではなく、独自のマルチ ユーザー管理を実装していたため、独自のタイム シェアリング システムでした。1966 年に IBM で初めて使用するために導入されたAPL\360 [ 23 ] [ 24 ] [ 25 ]システムは、マルチ ユーザー インタプリタでした。情報を取得したり、インタプリタ システム変数を設定したりするために、特別な特権を持つ「 I-beam」関数を介してプログラム的に通信する機能は、単項演算と二項演算の両方を使用して実現されました。[ 26 ]
1973年、IBMはAPL.SVをリリースしました。これは同じ製品の続編でしたが、オペレーティングシステムファイルなど、APLシステム外の機能にアクセスする手段として共有変数を提供しました。1970年代半ばには、IBMメインフレームインタープリタは、小型CRTとAPLキーボードを備えたIBM 5100デスクトップコンピュータでも使用できるように改良されました。当時の他の小型コンピュータのほとんどはBASICしか提供していませんでした。1980年代には、VSAPLプログラム製品が、 Conversational Monitor System(CMS)、Time Sharing Option(TSO)、VSPC、MUSIC/SP、およびCICSのユーザーに広く利用されました。
1973年から1974年にかけて、パトリック・E・ハガティは、スペリーUNIVAC 1100/2200シリーズのメインフレームコンピュータの1100ライン向けに、メリーランド大学のAPLインタープリタの実装を指揮した。 [ 27 ] 1974年には、学生のアラン・ステベンスが内部関数の実装を担当した。[ 28 ] Xerox APLは、1975年6月から、 CP-Vを実行するXerox 560およびSigma 6、7、9メインフレームとHoneywell CP-6で利用可能になった。[ 29 ]
1960年代と1970年代には、IBM APL\360 [ 25 ]インタプリタの改良版を使用して APL サービスを販売するタイムシェアリング企業がいくつか出現しました。北米では、IP Sharp Associates、Scientific Time Sharing Corporation (STSC)、Time Sharing Resources (TSR)、The Computer Company (TCC) がよく知られていました。CompuServe も 1978 年に、Digital Equipment Corp と Carnegie Mellon の改良版に基づいた APL インタプリタで市場に参入しました。これは DEC の KI および KL 36 ビット マシンで動作しました。CompuServe の APL は、商用市場と消費者向け情報サービスの両方で利用可能でした。IBM 4300などのより安価なメインフレーム、そして後にパーソナル コンピュータの登場により、1980 年代半ばまでにタイムシェアリング業界はほぼ消滅しました。
Sharp APLは、IP Sharp Associates社から提供され、1960年代にはタイムシェアリングサービスとして、その後1979年頃からはプログラム製品として販売されました。Sharp APLは、パッケージ(1つ以上のオブジェクトを1つの変数に格納する機能)、ファイルシステム、ネストされた配列、共有変数など、多くの言語拡張機能を備えた高度なAPL実装でした。
APLインタープリタは、他のメインフレームおよびミニコンピュータメーカーからも提供されており、特にBurroughs、Control Data Corporation(CDC)、Data General、Digital Equipment Corporation(DEC)、Harris、Hewlett-Packard(HP)、Siemens、Xeroxなどが挙げられます。
シラキュース大学のガース・フォスターは、ニューヨーク州ブルーマウンテンレイクにあるシラキュースのミノウブルック会議センターで、APL実装者コミュニティの定期的な会合を主催した。後年、ユージン・マクドネルは、カリフォルニア州モントレー近郊のアシロマール会議場と、カリフォルニア州ワトソンビル近郊のパハロ砂丘で同様の会合を組織した。Association for Computing MachineryのSIGAPL特別利益団体は、APLコミュニティを引き続き支援している。[ 30 ]
1970年代半ば以降に普及したマイクロコンピュータでは、BASICが主要なプログラミング言語となった。[ 31 ]それにもかかわらず、一部のマイクロコンピュータは代わりにAPLを提供していた。最初の例は、1974年にリリースされたIntel 8008ベースのMCM/70で[ 32 ] [ 33 ]、主に教育で使用された。[ 34 ]この時期のもう1つのマシンは、 1977年にリリースされたVideoBrain Family Computerで、APL/Sと呼ばれるAPLの方言が付属していた。[ 35 ]
1981年に発表されたコモドール・スーパーPETには、ウォータールー大学が開発したAPLインタープリタが含まれていた。[ 36 ]
1976年、ビル・ゲイツは趣味家への公開書簡の中で、マイクロソフト社はIntel 8080とMotorola 6800向けにAPLを実装しているが、ソフトウェアの海賊版問題のため「趣味家に提供する動機はほとんどない」と主張した。[ 37 ]結局リリースされることはなかった。
1980年代初頭から、ジム・ブラウンのリーダーシップの下、IBM APL開発は、配列が他の配列を含むことができるネスト配列の概念と、ネスト配列をプログラムワークフローに統合しやすくする新しい言語機能を含む、APL言語の新しいバージョンを実装しました。ケン・アイバーソンは、APL言語の開発の指揮を執らなくなり、IBMを離れてIP Sharp Associatesに入社し、そこで彼の主な貢献の1つは、Sharp APLの進化を彼のビジョンにより合致するように方向付けたことでした。[ 38 ] [ 39 ] [ 40 ] APL2は、 1984年にCMSとTSO向けに初めてリリースされました。[ 41 ]その後、 APL2ワークステーション版(Windows、OS/2、AIX、Linux、Solaris)が続きました。[ 42 ] [ 43 ]
他のベンダーが新しいハードウェア、特にUnixベースのマイクロコンピュータ向けのAPLインタープリタの開発に忙殺されていたため、新しいAPLインタープリタの開発にはほぼ常にAPL2が標準として選ばれていました。今日でも、ほとんどのAPLベンダーやそのユーザーは、APL2互換性をこれらの製品のセールスポイントとして挙げています。[ 44 ] [ 45 ] IBMは、問題解決、システム設計、プロトタイピング、エンジニアリングおよび科学計算、エキスパートシステム[ 46 ] 、数学やその他の科目の教育、視覚化、データベースアクセス[ 47 ]での使用を挙げています。
APLX、DyalogなどによるAPLの様々な実装には、オブジェクト指向プログラミングの拡張機能、 .NETのサポート、XML配列変換プリミティブ、グラフ作成、オペレーティングシステムインターフェース、ラムダ計算式などが含まれています。フリーウェア版としては、Linux用のGNU APLとWindows用のNARS2000(Wine経由でLinux上でも動作)があります。これらはどちらも、様々な言語拡張機能を備えた、かなり完成度の高いAPL2のバージョンです。
APLは、以下の言語の基礎を形成したり、影響を与えたりしてきました。
APLは、独自の文字セットを選択したことで批判と賞賛の両方を受けてきました。1960年代と1970年代には、APL文字セットを再現できる端末装置やディスプレイはほとんどありませんでした。最も普及していたのは、特別なAPLタイプの要素とともに使用されるIBM Selectric印刷機構を採用したものでした。初期のAPLライン端末(ラインモードのみで、フルスクリーンではない)の1つは、 APL文字セット[ 50 ]を完全に備えたTexas Instruments TI Model 745でした。この端末は、APLタイムシェアリングサービスまたはリモートメインフレームとやり取りしてリモートコンピュータジョブ、リモートジョブエントリ(RJE)を実行するための、半二重および全二重通信モードを備えていました。
時が経つにつれ、高品質のグラフィックディスプレイ、印刷デバイス、Unicodeサポートが広く普及したことで、APL 文字フォントの問題はほぼ解消されました。しかし、APL 文字を入力するには、入力メソッドエディタ、キーボードマッピング、仮想/画面上の APL シンボルセット[ 51 ] [ 52 ]、または他のプログラミング言語に慣れている初心者を困惑させる可能性のある印刷されたキーボードカードの使用が必要です。[ 53 ] [ 54 ] [ 55 ]他のプログラミング言語の経験がない初心者を対象とした高校生の研究では、APL 文字の入力と使用は、測定可能な方法で生徒を妨げないことが分かりました。[ 56 ]
APLを擁護する立場から言えば、入力する文字数が少なく、キーボードのマッピングは時間とともに記憶される。また、現在では専用のAPLキーボードが製造され使用されているほか、Microsoft Windowsなどのオペレーティングシステム用のフォントも無料でダウンロードできる。[ 51 ]報告されている生産性の向上は、記号、その意味、キーボードのマッピング、一般的なタスクのための多くの慣用表現を記憶する価値があるほど、その言語で作業するのに十分な時間を費やすことを前提としている。
従来の構造化プログラミング言語とは異なり、APL コードは通常、配列に対して作用する単項関数または二 項関数、および演算子[ 57 ]の連鎖として構造化されています。[ 58 ] APL には、単一のシンボルまたは少数のシンボルの組み合わせで示される非標準のプリミティブ(関数と演算子) が多数あります。すべてのプリミティブは同じ優先順位を持つように定義されており、常に右結合します。したがって、APL は右から左に読むか、または最もよく理解されます。
初期の APL 実装 ( 1970年頃) には、ループや構文などのプログラミング ループ制御フロー構造はありませんでした。代わりに、配列操作を使用しており、 1 つのステートメントで配列全体に対して操作を実行できるため、構造化プログラミング構文の使用は不要でした。たとえば、関数 ( ) は、for ループの反復処理を置き換えることができます。スカラー正整数に適用すると、1 次元配列 (ベクトル)、1 2 3 ... N が生成されます。後の APL 実装では、データ構造とプログラム制御フローを明確かつきれいに分離できるように、包括的な制御構造が一般的に含まれています。dowhileif-then-elseiotaι
APL環境はワークスペースと呼ばれます。ワークスペースでは、ユーザーはプログラムとデータを定義できます。つまり、データ値はプログラムの外にも存在し、ユーザーはプログラムを定義することなくデータを操作することもできます。[ 59 ]以下の例では、APLインタープリタはまず6つのスペースを入力してから、ユーザーの入力を待ちます。その出力は1列目から始まります。
ユーザーは、ワークスペース内のすべての値、プログラム、および実行ステータスを保存できます。
APL は、従来の算術および代数表記の拡張である非ASCIIシンボルのセットを使用します。単一の命令に単一の文字名、複数のデータ ( SIMD ) ベクトル関数を持つことは、APL が、コンウェイのライフ ゲームを1 行のコードで計算するなどのデータ変換アルゴリズムをコンパクトに記述できるようにする方法の1 つです。 [ 60 ]ほぼすべてのバージョンの APL では、理論的には、任意の計算可能な関数を 1 つの式、つまり 1 行のコードで表現できます。
文字セットが特殊なため、多くのプログラマーはAPL キートップを備えた特別なキーボードを使用して APL コードを記述します。 [ 61 ] ASCII 文字のみを使用して APL コードを記述する方法はいくつかありますが、[ 62 ]実際にはほとんど行われません。(これは、記法を思考のツールとして捉える Iverson のテーゼを裏付けるものと考えられます。[ 63 ])現代の実装のほとんどすべては、標準のキーボードレイアウトを使用し、特別なマッピングまたは入力メソッド エディタを使用して非 ASCII 文字にアクセスします。歴史的に、APL フォントは、大文字のイタリック体のアルファベットと直立した数字と記号で特徴的でした。ほとんどのベンダーは、APL 文字セットをカスタム フォントで表示し続けています。
APLの支持者たちは、いわゆる書き込み専用コード(拙劣でほとんど理解不能なコード)の例は、ほぼ例外なくプログラミングの慣習の悪さや初心者のミスによるものであり、どの言語でも起こりうると主張している。また、APLは従来型のプログラミング言語よりもはるかに生産性が高く、他の技術を用いる場合よりもはるかに少ない時間とプログラマーで動作するソフトウェアを実装できるとも主張している。
また、APLはコンパクトで簡潔であるため、コード行数を大幅に削減できるため、大規模なソフトウェア開発や複雑な処理に適していると主張する人もいる。多くのAPL支持者や実務者は、COBOLやJavaなどの標準的なプログラミング言語は比較的面倒だと考えている。APLは、トレーディングシステムなど、市場投入までの時間が重要な場面でよく見られる。[ 64 ] [ 65 ] [ 66 ] [ 67 ]
APL では、関数と演算子を明確に区別しています。[ 57 ] [ 68 ]関数は、引数として配列 (変数、定数、または式) を受け取り、結果として配列を返します。演算子 (高階関数に似ています) は、引数として関数または配列を受け取り、関連する関数を導出します。たとえば、合計関数は、加算関数に縮約演算子を適用することによって導出されます。同じ縮約演算子を最大値関数 (2 つの数値のうち大きい方を返す) に適用すると、数値のグループ (ベクトル) の中で最大の値を返す関数が導出されます。J 言語では、Iverson は関数の代わりに動詞、演算子の代わりに副詞または接続詞という用語を使用しました。
APLでは、言語に組み込まれ、記号または固定された記号の組み合わせで表される機能をプリミティブと呼びます。ほとんどのプリミティブは関数か演算子です。APLのコーディングは、主に非プリミティブ関数と(APLの一部のバージョンでは)演算子を記述するプロセスです。ただし、関数でも演算子でもないプリミティブもいくつかあり、最も顕著な例は代入です。
APLの文献で使用される用語の中には、数学や一般的なコンピュータ科学における用語とは異なる意味を持つものがある。
APLには関数、演算子、構文の明示的な表現があり、言語における拡張機能の明確かつ明示的な記述の基盤と、それらを実験するためのツールを提供します。[ 72 ]
これは「こんにちは、世界」と表示します。
'こんにちは世界'APLの設計テーマの一つは、他のほとんどのプログラミング言語では構文エラーとなるような場合において、デフォルトの動作を定義することである。
上記の「Hello, world」という文字列定数は表示されます。これは、明示的にアクションが指定されていない式(代入、関数パラメータなど)に対して、表示がデフォルトのアクションとなっているためです。
このテーマのもう1つの例は、APL でのべき乗が と書かれることです2*3。これは 2 を 3 乗することを意味します (これは、一部の言語では または と書かれる2^3か、他の言語では2**3のような関数呼び出しに追いやられます)。多くの言語では、のように乗算を表すために を使用しますが、APL では を使用することを選択します。ただし、底が指定されていない場合 ( APL のステートメント、または他の言語の場合)、ほとんどのプログラミング言語ではこれを構文エラーとみなします。しかし、APL は、欠落している底を自然対数定数eであると想定し、を と解釈します。pow(2, 3);*2*32×3*3^3*32.71828*3
Xが数値の配列である とします。すると、 はその平均を表します。を右から左に(+/X)÷⍴X読むと、は X の要素の数を表し、 は二項演算子であるため、その左側の項も必要です。 は括弧で囲まれています。そうしないと X が取られてしまうため (つまり、合計はX の各要素を X の要素の数で割ったものになる)、 はX の要素の合計を表します。 これを基に、次の式で標準偏差を計算します。⍴X÷X÷⍴X+/X
(( + / (( X - ( + / X ) ÷⍴ X ) * 2 )) ÷⍴ X ) * 0.5当然ながら、この式は毎回書き直すのではなく、繰り返し使用できる関数として定義するのが望ましいでしょう。さらに、代入は演算子であるため、式の中にも使用できます。したがって、以下の式では、T、AV、SDに適切な値が格納されます。
SD ← (( + / (( X - AV ← ( T ← + / X ) ÷⍴ X ) * 2 )) ÷⍴ X ) * 0.5次の即値モード式は、典型的なPick 6宝くじの数字セット(1から40までの重複しない擬似乱数整数6個)を生成し、昇順にソートして表示します。
x [ ⍋ x ← 6 ? 40 ]上記は簡潔に多くのことを実行しますが、APL初心者には複雑に思えるかもしれません。これは、以下のAPL関数(プリミティブ[ 73 ]およびグリフ[ 74 ]とも呼ばれます)を組み合わせたものです。
?、指定された最大値(この場合は右引数:40)までのランダムな整数の選択数(この場合は左引数:6)からなるベクトルdealを返す二項関数(二項関数の場合は名前が付けられる)で、指定された最大値がベクトルの長さ以上であれば、重複しないことが保証されます。したがって、1から40までのランダムな整数を6個生成/作成します。[ 75 ]←x⍋⍋⍋変数をインデックス付けし、その項目を昇順で選択します。x一番左のxの左側には、APLに結果をどう処理するかを指示する関数がないため、明示的な指示がなくても、結果を(スペースで区切られた1行に)ディスプレイに出力します。
?また、 には と呼ばれる単項式の同等の式がありroll、これは 1 からその唯一のオペランド (右側のオペランド) までの範囲のランダムな整数を 1 つ返します。したがって、ロールプレイングゲームのプログラムでは、 という式を使って?2020 面ダイスを振ることができます。
次の式は、1からRまでのすべての素数を求めます。時間と空間の両方において、計算の複雑さは次のようになります。(ビッグオー記法で)
( ~ R ∊ R ∘. × R ) / R ← 1 ↓⍳ R右から左へ実行すると、次のようになります。
⍳を含むベクトルを作成します。1RR= 6⍳R1 2 3 4 5 6↓関数)を削除します。つまり、です1。1↓⍳R2 3 4 5 6R新しいベクトル(←、代入プリミティブ)に設定します。つまり、2 3 4 5 6/は二項演算子であり、インタプリタはまずその左引数(括弧で囲まれた部分)を評価します。RR°.×Rと同じ長さのベクトルを作成します。1R∈0 0 1 0 1∼)(ゼロを1に、1をゼロに変更します)( 、論理否定またはチルダ演算子)、つまり、1 1 0 1 0R対応する要素が1(/複製演算子)である項目を選択します。2 3 5(これはAPLの原点が1、つまりインデックスが1から始まることを前提としています。APLは原点を0に設定することも可能で、その場合は となりι6、0 1 2 3 4 5一部の計算に便利です。)
次の式は、行列Xに格納された単語リストを単語の長さに従ってソートします。
X [ ⍋ X + . ≠ ' ' ;]Dyalog APLで書かれた以下の関数「life」[ 76 ] [ 77 ]は、ブール行列を受け取り、コンウェイのライフゲームに従って新しい世代を計算します。これは、複雑なアルゴリズムを非常に少ないコードで実装できるAPLの力を示していますが、理解するにはAPLに関するある程度の高度な知識が必要です(同じプログラムを多くの言語で記述する場合と同様です)。
人生← { ⊃ 1 ⍵ ∨ . ∧ 3 4 = + / + ⌿ ¯1 0 1 ∘. ⊖ ¯1 0 1 ⌽ ¨ ⊂ ⍵ }次の例もDyalogで記述されており、最初の行でHTMLコードを変数に代入しtxt、次にAPL式を使用してすべてのHTMLタグを削除しています。
txt ← '<html><body><p>これは<em>強調された</em>テキストです。</p></body></html>' { ⍵ /⍨ ~ { ⍵ ∨≠ \ ⍵ } ⍵ ∊ '<>' } txtこれは強調されたテキストです。APL という名前は、アイバーソンの著書A Programming Language [ 3 ]の頭文字から取られていますが、この本はアイバーソンの数学的記法について記述しており、この記事で説明されている実装されたプログラミング言語について記述しているわけではありません。この名前は、 APL\360から始まる実際の実装にのみ使用されます。
アディン・ファルコフは、 1966年にIBMでAPL/360を実装していた際にこの名前を考案した。
3人の学生が共有しているオフィスを通りかかったとき、議論している声が聞こえた。ドアから顔を覗かせると、エリックが「僕たちが使っている記法はAPLって言うって、みんな知ってるんじゃないの?」と聞いてきた。申し訳ないが、私はその名前を聞いたことがないと告白しなければならなかった。一体どこで、それがよく知られているという考えを得たのだろうか?そして、誰がそう呼ぶことに決めたのだろうか?そもそも、なぜ名前をつける必要があったのだろうか?しばらくして、その名前の由来が分かった。1966年6月に実装作業が始まったとき、文書作成作業も始まった。ファルコフとアイバーソンは、「それ」について書かなければならなくなったとき、「それ」に名前を付けなければならないことに気づいたのだろう。当時、おそらく多くの提案があったのだろうが、私が聞いたことがあるのは2つだけだ。シカゴのSRAで、その記法を使った教材を開発していたグループは、「Mathlab」という名前を支持していた。しかし、これは定着しなかった。別の提案としては、「アイバーソンのより良い数学」と名付け、適切な頭字語は人々に考えてもらうというものがあった。しかし、これは冗談めかした提案とみなされた。
そしてある日、アディン・ファルコフがケンのオフィスに入り、ホワイトボードに「プログラミング言語」と書き、その下に「APL」という頭字語を記した。こうしてAPLは誕生した。それからわずか1週間ほど後、エリック・アイバーソンが私に質問をしてきた。当時、APLという名前は、IBMリサーチからタコニック・パークウェイを13マイル北上したIBMモハンシックまではまだ伝わっていなかった。
—ユージン・マクドネル、[ 78 ]
APLは時折、配列プログラミング言語または配列処理言語として再解釈され、[ 79 ]それによってAPLはバクロニムとなる。

APLベンダー間の協力関係は常に存在しており、1969年から2010年まで定期的に合同会議が開催されていました。[ 80 ]このような会議では、APLのモチーフやベンダーのロゴを集めたAPLグッズがよく配布されました。よく使われていたのは、リンゴ( appleとAPLの発音の類似性を利用した言葉遊び)と、 APL修飾キーを押しながら「APL」と入力したときにクラシックなAPLキーボードレイアウトで生成される記号であるコードスニペットでした。⍺*⎕
こうしたコミュニティの努力にもかかわらず、プログラミング言語のベンダーに依存しない統一ロゴは現れませんでした。人気のあるプログラミング言語が認識しやすいロゴを確立するにつれて、Fortran は2020 年にロゴを獲得しました[ 81 ]英国 APL 協会は 2021 年後半に APL のロゴを確立するためのキャンペーンを開始し、コミュニティの投票と複数回のフィードバックを経て、2022 年 5 月にロゴが選ばれました。[ 82 ]
APLは、金融および保険アプリケーション[ 83 ] 、人工知能[ 84 ] [ 85 ] 、ニューラルネットワーク[ 86 ] 、ロボット工学[ 87]など、多くの目的で使用されています。APLはプログラミング言語ではなく計算ツールであると主張されています[ 88 ] 。その記号的な性質と配列機能により、コンピュータプログラマのスキルを持たない、または必要としないドメインエキスパートやデータサイエンティスト[ 89 ]の間で人気があります。
APLは、画像操作やコンピュータアニメーションに適しており、グラフィック変換を行列乗算としてエンコードできます。最初の商用コンピュータグラフィックス会社の1つであるDigital Effectsは、 VisionsというAPLグラフィックス製品を開発し、1982年の映画「トロン」のテレビコマーシャルやアニメーションの作成に使用しました。[ 90 ]最近では、Stormwindボートシミュレーターが、コアロジック、レンダリングパイプラインミドルウェアとのインターフェース、および物理エンジンの主要部分の実装にAPLを使用しています。[ 91 ]
今日でも、APLは幅広い商業および科学アプリケーション[ 83 ] 、資産管理[ 92 ]、ヘルスケア[ 93 ]、 およびDNAプロファイリング[ 94 ] [ 95 ]で使用されています。
認識可能な APL シンボルを使用した最初の APL 実装は、IBM System/360上で動作する APL\360 であり、1966 年 11 月に完成しました[ 1 ]。ただし、当時は IBM 内でのみ使用されていました。[ 41 ] 1973 年に、その実装者であるLarry Breed、Dick Lathwell、Roger Moore は、 Association for Computing Machinery (ACM)からGrace Murray Hopper 賞を受賞しました。この賞は、「対話型システムのシンプルさ、効率性、信頼性、応答時間において新たな基準を確立した APL\360 の設計と実装における彼らの功績」に対して贈られました。[ 96 ] [ 97 ] [ 98 ]
1975年、IBM 5100マイクロコンピュータは、コンピュータ用の2つの組み込みROMベースのインタプリタ言語の1つとしてAPL\360 [ 99 ]を提供し、その言語で使用されるすべての特殊記号をサポートするキーボードとディスプレイを備えていました。[ 100 ]
APL/360 の重要な開発には、 CMSの仮想記憶機能を利用した CMS/APLや、共有変数、システム変数、システム関数を導入した APLSV などがありました。その後、 IBM System/370およびVSPCプラットフォームに移植され、1983 年に最終リリースされ、その後 APL2 に置き換えられました。[ 41 ]
1968年、APL\1130はIBMがIBM 1130向けに開発した、初めて一般に公開されたAPLシステムとなった。[ 101 ]これはIBMがリリースしたIBMタイプIIIライブラリソフトウェアの中で最も人気のあるものとなった。[ 20 ]
APL*PlusとSharp APLは、データフォーマットやAPL配列を外部ファイルに保存する機能など、ビジネス向けの拡張機能が追加されたAPL\360のバージョンです。これらは2つの会社が共同で開発し、元のIBM APL\360開発チームのさまざまなメンバーが参加しました。[ 102 ]
2つの会社は、1964年にイアン・シャープ、ロジャー・ムーアらが設立したAPL/360サービス会社であるIP Sharp Associates (IPSA)と、1969年にローレンス・ブリードらが設立したタイムシェアリングおよびコンサルティングサービス会社であるSTSCでした。両社は共同でAPL*Plusを開発し、その後も協力関係を続けましたが、APLはAPL*PlusとSharp APLとして別々に開発されました。STSCはAPL*PlusをVAX 11 [ 103 ] PCおよびUNIX向けに移植し、多くのプラットフォームに対応させましたが、IPSAはパーソナルコンピュータの登場に対して異なるアプローチを取り、追加のPC-XT/360ハードウェアを使用してこのプラットフォームでSharp APLを利用できるようにしました。1993年、 Sharp APLをサポートするためにSoliton Incorporatedが設立され、Sharp APLをSAX(Sharp APL for Unix)に発展させました。2018年現在APL*PlusはAPL2000 APL+Winとして継続されます。
1985年、STSCのイアン・シャープとダン・ダイヤーは、APLへの傑出した貢献に対してケネス・E・アイバーソン賞を共同受賞した。[ 104 ]
APL2は、IBMによるAPLの重要な再実装であり、1971年から開発され、1984年に初めてリリースされました。言語に多くの追加機能があり、その中でも最も注目すべきは、ネストされた(非矩形)配列のサポートです。[ 41 ] APL2製品およびサービスチーム全体が、2007年にアイバーソン賞を受賞しました。[ 104 ]
2021年、IBMはAPL2をLog-On Softwareに売却し、Log-On SoftwareはLog-On APL2として製品を開発・販売した。[ 105 ]
1972年、APLGOLはAPLの実験版としてリリースされ、言語フレームワークに構造化プログラミング言語の構成要素が追加されました。ステートメント間の制御、条件付きステートメントの実行、ステートメントの構造化のための新しいステートメントが追加され、アルゴリズムの意図を明確にするためのステートメントも追加されました。[ 106 ]これは1977年にヒューレット・パッカード向けに実装されました。[ 107 ]
Dyalog APLは、1983年にイギリスのDyalog Ltd. [ 108 ]によって初めてリリースされ[ 109 ]、2018年現在は、 AIX、Linux ( Raspberry Piを含む)、macOS、Microsoft Windowsプラットフォームで利用可能です。APL2をベースに、オブジェクト指向プログラミング[ 110 ] 、関数型プログラミング[111] 、暗黙的プログラミング[ 112 ]をサポートする拡張機能を備えています。個人/非商用利用の場合はライセンスは無料です[ 113 ] 。
1995年、開発チームの2人、ジョン・ショールズとピーター・ドネリーは、通訳に関する功績によりアイバーソン賞を受賞した。[ 104 ]ギッテ・クリステンセンとモーテン・クロンベルクは、2016年にアイバーソン賞を共同受賞した。[ 114 ]
NARS2000 は、1970 年代から 1980 年代にかけてSTSCで著名な APL 開発者および実装者であった Bob Smith によって書かれたオープンソースの APL インタープリタです。NARS2000 は高度な機能と新しいデータ型を備え、 Microsoft WindowsおよびWineを介して他のプラットフォームでネイティブに動作します。その名前は、1980 年代の開発ツールである NARS (Nested Arrays Research System) に由来しています。[ 115 ]
APLXは、APL2をベースにいくつかの拡張機能を備えたクロスプラットフォームのAPL方言で、2002年にイギリスのMicroAPL社によって初めてリリースされました。現在は開発も商用販売もされていませんが、Dyalogから無料で入手できます。[ 116 ]
York APL [ 117 ]は、1968 年頃にオンタリオ州のヨーク大学で開発され、IBM 360 メインフレーム上で動作していました。APL\360 との顕著な違いの 1 つは、スカラーの「形状」(ρ) を 1 と定義していたのに対し、APL\360 ではより数学的に正しい 0 と定義していたことです。これにより、スカラーとベクトルで同じように動作する関数を簡単に記述することができました。
GNU APL は ISO/IEC 13751:2001 で規定されている拡張 APL のフリー実装であり、したがって APL2 の実装です。Linux、macOS、いくつかの BSD 方言、および Windows 上で動作します(すべてのシステム機能を完全にサポートするにはCygwin を使用するか、一部のシステム機能が欠落したネイティブ 64 ビット Windows バイナリとして動作します)。GNU APL は内部的にUnicodeを使用し、スクリプト化できます。Jürgen Sauermann によって作成されました。[ 118 ]
GNUプロジェクトの創設者であるリチャード・ストールマンは、APLの初期の採用者であり、1969年の夏に高校生の頃にテキストエディタを作成するためにAPLを使用していた。[ 119 ]
APLは従来、インタプリタ型言語であり、コンパイルにはあまり適さない弱い変数型付けなどの言語特性を持っています。[ 120 ]しかし、配列をコアデータ構造としているため[ 121 ]、並列処理[ 122 ]、並列コンピューティング[ 123 ] [ 124 ] 、大規模並列アプリケーション[ 125 ] [ 126 ]、超大規模集積回路(VLSI)[ 127 ] [ 128 ]を通じてパフォーマンス向上の機会を提供し、当初からAPLは高性能言語と見なされてきました[ 129 ]。たとえば、「配列上で動作し、行列の逆行列などの操作を内部的に実行するため」に複雑な行列演算を高速に実行できることが注目されていました。[ 130 ]
しかしながら、APLは純粋に解釈される形で実行されることは稀であり、現在または過去に用いられてきたコンパイルまたは部分コンパイルの手法には、以下のようなものがある。
ほとんどの APL インタプリタはイディオム認識をサポートしており[ 131 ]、一般的なイディオムを単一の操作として評価します。[ 132 ] [ 133 ]例えば、イディオムをBV/⍳⍴A単一の操作として評価することで (ここでBVはブールベクトル、Aは配列)、2 つの中間配列の作成を回避できます。[ 134 ]
APL の弱い型付けとは、名前が配列 (任意のデータ型)、関数、または演算子を参照できることを意味します。一般に、インタプリタはそれがどの形式になるかを事前に知ることができないため、実行時に解析、構文チェックなどを実行する必要があります。[ 135 ]ただし、特定の状況では、名前が参照すると予想される型を事前に推測し、実行時のオーバーヘッドを削減して実行できるバイトコードを生成することが可能です。このバイトコードは、定数畳み込みや共通部分式の削除などのコンパイル技術を使用して最適化することもできます。[ 136 ]インタプリタは、バイトコードが存在し、かつ想定された条件が満たされている場合に、そのバイトコードを実行します。Dyalog APL は、最適化されたバイトコードをサポートしています。[ 136 ]
APLのコンパイルは、この言語が初めて利用可能になって以来、研究と実験の対象となってきました。最初のコンパイラは、1971年頃にリリースされたBurroughs APL-700 [ 137 ]と考えられています。 [ 138 ] APLをコンパイルできるようにするには、言語の制限を課す必要があります。[ 137 ] [ 139 ] APEXは、 Robert Berneckyによって書かれた研究用APLコンパイラで、 GNU General Public Licenseの下で利用可能です。[ 140 ]
STSC APLコンパイラは、バイトコード最適化ツールとコンパイラのハイブリッドです。サブ関数とグローバル変数が宣言されていれば、関数をマシンコードにコンパイルできますが、コンパイル要件を満たさない関数を実行するために、ランタイムライブラリとしてインタプリタが引き続き使用されます。[ 141 ]
APLは、米国規格協会(ANSI)のワーキンググループX3J10、国際標準化機構(ISO)および国際電気標準会議(IEC)のISO/IEC合同技術委員会1小委員会22ワーキンググループ3によって標準化されています。コアAPL言語はISO 8485:1989で規定されており、拡張APL言語はISO/IEC 13751:2001で規定されています。
{{cite book}}ISBN /日付の不一致(ヘルプ){{cite web}}: CS1 maint: bot: 元の URL の状態が不明です (リンク){{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)とAPLは初期に影響を与えた2つの言語です。
は、SimCorp Dimensionのようなフロントからバックまでの投資管理プラットフォームです。...
Sofiaは、SimCorp Dimensionの一部と同様に、APLコーディング言語に基づいています。
Effectsは、トロンの制作に携わったもう一つの制作会社です。同社はレーザースキャンシステムを使用して画像をデジタル化、保存、再現しました。Digital Effectsの社長であるジャドソン・ローズブッシュは、現在使用されている2つのコンピュータアニメーションパッケージであるAPL VISIONとFORTRAN VISIONの主要設計者です。
Stormwindは、APLコミュニティで大きな注目を集めている[3Dボートシミュレータ]です。
技術プラットフォームとしてAPLを選択することで、実行可能なプロトタイプと呼べるソリューションを比較的簡単に迅速に構築できます(原文からの翻訳)。
コレクション指向言語には、APL、APL2などがある。
– グローバル セル オートメーション。本質的に大規模並列。「APL は、行列とベクトルの構造を表現できるため選択されました」。
対話性とコーディングの容易さのためのAPL •ブレナー、ノーマン (1984)。「Fortranサブルーチンを用いたAPLによるVLSI回路設計」。APLに関する国際会議議事録 – APL '84。ACM SIGAPL。ISBN 978-0897911375。
VLSIモジュールジェネレータについて説明されています。インタプリタ型言語とコンパイル型言語の例として、APLとCを高度なグラフィックスディスプレイに接続できます。