マクロ(コンピュータサイエンス)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
jEditのマクロエディタ

コンピュータサイエンスマクロ(ギリシャ語の結合形式μακρο-「long、large」[1]からの「マクロ命令」の略)は、特定の入力を置換出力にマッピングする方法を指定するルールまたはパターンです。入力にマクロを適用することは、マクロ展開です。入力と出力は、一連の字句トークンまたは文字、あるいは構文木である可能性があります。ソフトウェアアプリケーションでは、一般的なコマンドシーケンスを簡単に呼び出すことができるように、文字マクロがサポートされています。トークンとツリーのマクロは、有効にするために一部のプログラミング言語でサポートされていますコードの再利用または言語の拡張。ドメイン固有言語の場合もあります。

マクロは、一連の計算命令を単一のプログラムステートメントとしてプログラマーが利用できるようにするために使用され、プログラミングタスクを面倒でなく、エラーが発生しにくくします。[2] [3](したがって、コードの「大きな」ブロックを「小さな」文字シーケンスから展開できるため、「マクロ」と呼ばれます。)マクロでは、条件付きアセンブラープログラムを指示する位置パラメーターまたはキーワードパラメーターが許可されることがよくあります。オペレーティングシステムプラットフォーム、その他の要因などの変数に従って、プログラム全体またはプログラムスイート生成し、作成するために使用されています。この用語は「マクロ命令」に由来し、そのような拡張は元々生成に使用されていましたアセンブリ言語コード。

キーボードとマウスのマクロ

キーボードマクロマウスマクロを使用すると、短い一連のキーストロークとマウスアクションを、他の、通常はより時間がかかる一連のキーストロークとマウスアクションに変換できます。このようにして、頻繁に使用される、または繰り返されるキーストロークとマウスの動きのシーケンスを自動化できます。これらのマクロを作成するための個別のプログラムは、マクロレコーダーと呼ばれます。

1980年代、マクロプログラム(元々はSmartKey、次にSuperKey、KeyWorks、Prokey)は、最初は脚本を自動的にフォーマットする手段として、次にさまざまなユーザー入力タスクのために非常に人気がありました。これらのプログラムは、TSR(終了して常駐)モードの操作に基づいており、どのコンテキストで発生したかに関係なく、すべてのキーボード入力に適用されました。マウス駆動のユーザーインターフェイスの出現と、ワードプロセッサスプレッドシートなどのアプリケーションでのキーボードとマウスマクロの利用可能性に続いて、ある程度時代遅れに陥り、アプリケーションに依存するキーボードマクロを作成できるようになりました。

キーボードマクロは、大規模なマルチプレイヤーオンラインロールプレイングゲーム(MMORPG)で使用して、反復的ではあるが収益性の高いタスクを実行し、リソースを蓄積することができます。これは人間の努力なしに行われるため、ゲームの経済性を歪める可能性があります。このため、マクロの使用はほとんどのMMORPGのTOSまたはEULAに違反しており、その管理者はマクロを抑制するためにかなりの努力を払っています。[4]

アプリケーションマクロとスクリプティング

アプリケーションの組み込みマクロ機能を使用して作成されたキーボードおよびマウスのマクロは、アプリケーションマクロと呼ばれることもありますこれらは、シーケンスを1回実行し、アプリケーションにアクションを記録させることによって作成されます。アプリケーションの機能に直接アクセスできる、基盤となるマクロプログラミング言語(最も一般的にはスクリプト言語)も存在する可能性があります。

プログラマーのテキストエディターであるEmacs(「マクロの編集」の略)は、この考えに従って結論を出します。実際、ほとんどのエディターはマクロで構成されています。Emacsは元々、編集言語TECOのマクロのセットとして考案されましたその後、 Lispの方言に移植されました

別のプログラマーのテキストエディターであるVimviの子孫)にも、キーボードマクロが実装されています。キーボードで入力した内容をレジスタ(マクロ)に記録し、 MicrosoftOfficeのVBAマクロと同じように再生または編集できます。Vimには、マクロを作成するため のVimscript [5]と呼ばれるスクリプト言語もあります。

Visual Basic for Applications (VBA)は、Office97からOffice2019までのMicrosoftOfficeに含まれているプログラミング言語です(ただし、Office 97より前のOfficeの一部のコンポーネントで使用可能でした)。ただし、その機能は、これらのアプリケーションの一部に元々含まれていたマクロ言語から進化し、置き換えられました。

XEDITは、 VMのConversational Monitor System(CMS)コンポーネントで実行され、 EXECEXEC2、およびREXXで記述されたマクロをサポートし、一部のCMSコマンドは実際にはXEDITマクロのラッパーでした。XEDITの部分的なクローンであるHesslingEditor(THE)は、ReginaおよびOpen Object REXX(oorexx)を使用するRexxマクロをサポートします。多くの一般的なアプリケーション、および一部のPCでは、スクリプト言語としてRexxを使用します。

マクロウイルス

VBAは、ほとんどのMicrosoft Windowsシステムコールにアクセスでき、ドキュメントが開かれたときに実行されます。これにより、一般にマクロウイルスとして知られるVBAでのコンピュータウイルスの記述が比較的簡単になります。1990年代半ばから後半にかけて、これは最も一般的なタイプのコンピュータウイルスの1つになりました。ただし、1990年代後半から現在まで、Microsoftはプログラムにパッチを適用して更新してきました。さらに、現在のアンチウイルスプログラムはそのような攻撃に即座に対抗します。

パラメータ化されたマクロ

パラメータ化されたマクロ、特定のオブジェクトを展開に挿入できるマクロです。これにより、マクロに関数の能力の一部が与えられます。

簡単な例として、Cプログラミング言語では、これはパラメーター化された マクロではない典型的なマクロです。

 #define PI 3.14159

これにより、発生した場所でPI常に置き換えられ3.14159ます。一方、パラメータ化されたマクロの例は次のとおりです。

 #define pred(x)((x)-1)

このマクロがどのように展開されるかは、どの引数 xがマクロに渡されるかによって異なります。考えられる拡張は次のとおりです。

pred(2)→((2)-1)
 pred(y + 2)→((y + 2)-1)
 pred(f(5))→((f(5))-1)

パラメータ化されたマクロは、インライン展開を実行するための便利なソースレベルのメカニズムですが、単純なテキスト置換を使用するCなどの言語では、インライン関数など、インライン展開を実行するための他のメカニズムに比べて多くの重大な欠点があります。

一方、 LispPL / ISchemeなどの言語で使用されるパラメーター化されたマクロは、はるかに強力であり、引数に基づいて生成するコードを決定できます。したがって、これらを効果的に使用して、実行時のコード生成を実行できます。


テキスト置換マクロ

Cなどの言語や一部のアセンブリ言語には、コンパイラまたはアセンブラのプリプロセッサとして実装された基本的なマクロシステムがあります。Cプリプロセッサマクロは、文字レベルではなく、トークンでの単純なテキスト置換によって機能します。ただし、IBM High Level Assembler(HLASM)などのより高度なアセンブラーのマクロ機能は、プリプロセッサーを使用して実装することはできません。命令とデータをアセンブルするためのコードには、マクロ呼び出しをアセンブルするためのコードが散在しています。

マクロの典型的な使用法は、コンピューター植字システムTeXとその派生物であり、ほとんどの機能はマクロに基づいています。

MacroMLは、静的型付けとマクロシステムの調整を目的とした実験的なシステムです。Nemerleは構文マクロを型付けしており、これらの構文マクロを考えるための1つの生産的な方法は、多段階の計算です。

その他の例:

一部の主要なアプリケーションは、CMSの XEDITなど、他のアプリケーションによって呼び出されるテキストマクロとして記述されています。

埋め込み可能な言語

PHPなどの一部の言語は、自由形式のテキストまたは他の言語のソースコードに埋め込むことができます。コードフラグメントが認識されるメカニズム(たとえば、とで囲まれ<?phpている?>)は、テキストマクロ言語に似ていますが、はるかに強力で、完全な機能を備えた言語です。¹¹¹¹¹

手続き型マクロ

PL / I言語のマクロは、 PL / I自体のサブセットで記述されます。コンパイラーはコンパイル時に「プリプロセッサー・ステートメント」を実行し、この実行の出力はコンパイルされるコードの一部を形成します。使い慣れた手続き型言語をマクロ言語として使用する機能は、より大きく低速なコンパイラを犠牲にして、テキスト置換マクロよりもはるかに強力な機能を提供します。

フレームテクノロジーのフレームマクロには独自のコマンド構文がありますが、任意の言語のテキストを含めることもできます。各フレームは、ネストされたサブアセンブリの階層内の汎用コンポーネントであると同時に、それ自体をそのサブアセンブリフレームと統合するための手順(より高いレベルのサブアセンブリを優先して統合の競合を解決する再帰プロセス)でもあります。出力はカスタムドキュメントであり、通常はコンパイル可能なソースモジュールです。フレームテクノロジは、マクロとサブルーチンの発明以来、ソフトウェア開発を悩ませてきた問題である、類似しているが微妙に異なるコンポーネントの急増を回避できます

ほとんどのアセンブリ言語には、それほど強力ではない手続き型マクロ機能があります。たとえば、ループ展開のためにコードのブロックをN回繰り返すことができます。しかし、これらは実際のアセンブリ言語とは完全に異なる構文を持っています。

構文マクロ

字句トークンのレベルで動作するマクロシステム(前述のCプリプロセッサなど)は、字句構造を確実に保持できません。構文マクロシステムは、代わりに抽象構文ツリーのレベルで機能し、元のプログラムの字句構造を保持します。構文マクロシステムの最も広く使用されている実装は、Lispのような言語で見られます。これらの言語は、統一された括弧で囲まれた構文( S式と呼ばれる)があるため、このスタイルのマクロに特に適しています。)。特に、統一された構文により、マクロの呼び出しを簡単に判別できます。Lispマクロはプログラム構造自体を変換し、そのような変換を表現するために利用できる完全な言語を使用します。構文マクロはLispに似た言語でよく見られますが、 Prolog[6] Erlang[7] Dylan[8] Scala[9] Nemerle[10] Rust[11 ]などの他の言語でも使用できます。] Elixir[12] Nim[13] Haxe[14]およびJulia[15]これらは、 JavaScript[16] C#[17]、およびPythonのサードパーティ拡張機能としても利用できます[18]

初期のLispマクロ

Lispがマクロを持つ前は、いわゆるFEXPRがありました。これは、入力が引数によって計算された値ではなく、引数の構文形式であり、出力が計算で使用される値である関数のような演算子です。つまり、FEXPRはEVALと同じレベルで実装され、メタ評価レイヤーへのウィンドウを提供しました。これは一般的に、効果的に推論するのが難しいモデルであることがわかりました。[19]

1963年、Timothy Hartは、AIメモ57:LISPのMACRO定義でLisp1.5にマクロを追加することを提案しました。[20]

照応マクロ

照応マクロは、照応(別の式を参照する式)によって参照される可能性のある、マクロに提供される何らかの形式を意図的にキャプチャするプログラミングマクロの一種です。照応マクロは、PaulGrahamのOnLispに最初に登場しました。その名前は、言語の照応、つまり先行する単語の代わりに単語を使用することへの参照です。

衛生的マクロ

80年代半ばに、多くの論文[21] [ 22]が、マクロ定義とマクロsyntax-rules使用の構文環境が区別され、マクロ定義者とユーザーは、不注意による変数のキャプチャについて心配する必要はありません(参照透過性を参照)。衛生的マクロは、R5RSR6RS、およびR7RS標準のScheme用に標準化されています。、、明示的な名前変更、構文上のクロージャなどsyntax-rules衛生的なマクロの競合する実装が多数存在します。とはsyntax-case両方ともScheme標準で標準化されています。 syntax-rulessyntax-case

最近、Racketは、衛生的なマクロの概念を「評価者の塔」と組み合わせたため、あるマクロシステムの構文拡張時間は、別のコードブロックの通常の実行時間になり[23]、インターリーブ拡張と構文解析を適用する方法を示しました。括弧で囲まれていない言語で。[24]

スキーム以外の多くの言語は、衛生的なマクロを実装するか、部分的に衛生的なシステムを実装します。例としては、ScalaRustElixirJuliaDylanNimNemerleなどがあります。

アプリケーション

評価順序
マクロシステムにはさまざまな用途があります。評価の順序を選択できること(遅延評価および非厳密関数を参照)により、言語に組み込まれているものと区別がつかない新しい構文構造(制御構造など)を作成できます。たとえば、があるcondが欠けているLisp方言ではif、マクロを使用して前者の観点から後者を定義することができます。たとえば、Schemeには継続と衛生マクロの両方があり、プログラマーは、言語に組み込む必要なしに、ループや早期終了構造などの独自の制御抽象化を設計できます。
データサブ言語とドメイン固有言語
次に、マクロを使用すると、コードにすぐにコンパイルされるデータ言語を定義できます。つまり、ステートマシンなどの構造を、自然で効率的な方法で実装できます。[25]
結合コンストラクト
マクロを使用して、新しいバインディング構造を導入することもできます。最もよく知られている例はlet、一連の引数への関数のアプリケーションへの変換です。

Felleisenは、これらの3つのカテゴリーがそのようなシステムにおけるマクロの主な合法的な使用を構成していると推測している[26] 。他の人は、非衛生的であるか、または選択的な非衛生的変換を可能にするマクロシステムにおける 照応マクロなどのマクロの代替使用を提案している。

マクロと他の言語機能の相互作用は、生産的な研究分野です。たとえば、コンポーネントモジュールは大規模なプログラミングに役立ちますが、マクロとこれらの他の構造の相互作用は、それらを一緒に使用するために定義する必要があります。マクロと相互作用できるモジュールおよびコンポーネントシステムは、Schemeおよびマクロを使用する他の言語用に提案されています。たとえば、Racket言語は、マクロシステムの概念を構文タワーに拡張します。構文タワーでは、マクロを含む言語でマクロを記述し、衛生状態を使用して構文レイヤーを区別し、モジュールがマクロを他のモジュールにエクスポートできるようにします。

マシンに依存しないソフトウェアのマクロ

マクロは通常、短い文字列(マクロ呼び出し)をより長い命令シーケンスにマップするために使用されます。もう1つの、あまり一般的ではないマクロの使用法は、逆のことを行うことです。つまり、一連の命令をマクロ文字列にマップします。これは、STAGE2モバイルプログラミングシステムが採用したアプローチであり、基本的なマクロコンパイラ(SIMCMPと呼ばれる)を使用して、特定のコンピュータの特定の命令セットをマシンに依存しないマクロにマッピングしました。これらのマシンに依存しないマクロで記述されたアプリケーション(特にコンパイラー)は、基本的なマクロコンパイラーを備えたコンピューターで変更なしで実行できます。このようなコンテキストで実行される最初のアプリケーションは、マシンに依存しないマクロ言語で記述された、より洗練された強力なマクロコンパイラです。このマクロコンパイラは、ブートストラップでそれ自体に適用されますファッション、それ自体のコンパイルされたはるかに効率的なバージョンを作成します。このアプローチの利点は、複雑なアプリケーションを1台のコンピューターから非常に異なるコンピューターに非常に少ない労力で移植できることです(ターゲットマシンアーキテクチャごとに、基本的なマクロコンパイラを作成するだけです)。[27] [28]コンパイラが事実上すべてのコンピュータで利用できる最新のプログラミング言語、特にCの出現により、そのようなアプローチは不要になりました。ただし、これはコンパイラのブートストラップの最初のインスタンスの1つでした(最初ではない場合)

アセンブリ言語

マクロ命令は、ネイティブアセンブラプログラム命令の任意のセットに対してプログラマが定義できますが、通常、マクロはオペレーティングシステムに付属のマクロライブラリに関連付けられており、次のようなオペレーティングシステム機能にアクセスできます。

  • アクセス方法(OPEN、CLOSE、READ、WRITEなどのマクロを含む)による周辺アクセス
  • サブタスクの作成と同期のためのATTACH、WAIT、POSTなどのオペレーティングシステム機能。[29]通常、このようなマクロは実行可能コードに拡張されます。たとえば、EXITマクロ命令の場合は次のようになります。
  • 定数命令の定義のリスト。たとえば、DCBマクロ( DOSのDTF(Define The File)[30] )、またはコードと定数の組み合わせのリスト。マクロ命令のパラメーターに応じた展開の詳細( READ命令のファイルおよびデータ領域への参照として);
  • 実行可能コードは、ルーチンを呼び出すためのブランチおよびリンクレジスタ命令、またはオペレーティングシステム関数を直接呼び出すためのスーパーバイザー呼び出し命令のいずれかで終了することがよくあります。
  • OS / 360などでシステムを生成するためのステージ2ジョブストリームを生成ます。通常のマクロとは異なり、sysgenステージ1マクロは、ストレージにロードされるデータまたはコードを生成しませんが、PUNCHステートメントを使用してJCLおよび関連データを出力します。

IBMメインフレームで使用されているような古いオペレーティングシステムでは、標準のマクロ命令が常に使用できるとは限らないため、完全なオペレーティングシステム機能は、高級言語プログラムではなく、アセンブラ言語プログラムでのみ使用可能でした(もちろん、アセンブリ言語サブルーチンが使用された場合を除く)。高水準言語で利用可能なルーチンに対応するものがあります。

歴史

1950年代半ば、デジタルコンピュータ用のプログラムを作成するためにアセンブリ言語プログラミングが一般的に使用されていたとき、マクロ命令の使用は2つの主な目的で開始されました。複数のアセンブリ言語ステートメントを生成することによって作成する必要のあるプログラムコーディングの量を減らすことです。 1つのマクロ命令から、プログラム作成標準を適用します。たとえば、標準的な方法で入力/出力コマンドを指定します。[31]マクロ命令は、事実上、アセンブリ言語プログラミングとそれに続く高水準プログラミング言語( FORTRANCOBOLなど)の間の中間ステップでした。IBM 705コンピューター用の「マクロ言語」を開発するための初期のプログラミングインストールの2つは、デラウェアのダウケミカルコーポレーションとカリフォルニアの弾道ミサイルロジスティクスオフィスのエアマテリアルコマンドにありました。ターゲットアセンブリ言語の形式で記述されたマクロ命令は、アセンブラのプリプロセッサであるマクロコンパイラによって処理され、次にアセンブラプログラムによって処理される1つ以上のアセンブリ言語命令を生成します。アセンブリ言語命令を機械言語命令に変換します。[32]

1950年代後半までに、マクロ言語の後にマクロアセンブラーが続きました。これは、1つのプログラムが両方の機能、つまり同じパッケージ内のマクロプリプロセッサとアセンブラの機能を提供する両方の組み合わせでした。[32] [検証に失敗しました]

1959年、ベル研究所のダグラスE.イーストウッドとダグラスマキルロイは、条件付きの再帰マクロを人気のあるSAPアセンブラーに導入し[33]、マクロSAPと呼ばれるものを作成しました。[34] McIlroyの1960年の論文は、マクロプロセッサを介して(高レベルを含む)プログラミング言語を拡張する分野で独創的でした。[35] [33]

マクロアセンブラを使用すると、アセンブリ言語プログラマは独自のマクロ言語を実装でき、同じCPUを実行しているがオペレーティングシステムが異なる2台のマシン(初期バージョンのMSDOSやCPM-86など)間でのコードの移植性が制限されます。マクロライブラリは、ターゲットマシンごとに作成する必要がありますが、アセンブリ言語プログラム全体を作成する必要はありません。より強力なマクロアセンブラにより、マクロ命令で条件付きアセンブリ構造を使用できるようになり、異なるマシンまたは異なるオペレーティングシステムで異なるコードを生成できるため、複数のライブラリの必要性が減ることに注意してください。[要出典]

1980年代と1990年代初頭には、デスクトップPCは数MHzでしか実行されておらず、C、Fortran、Pascalなどで記述されたプログラムを高速化するためにアセンブリ言語ルーチンが一般的に使用されていました。これらの言語は、当時、さまざまな呼び出し規約を使用していました。マクロを使用して、アセンブリ言語で記述されたルーチンを、ほとんどすべての言語で記述されたアプリケーションのフロントエンドに接続できます。繰り返しになりますが、基本的なアセンブリ言語コードは同じままで、ターゲット言語ごとにマクロライブラリを作成するだけで済みました。[要出典]

Unixやその派生物などの最新のオペレーティングシステムでは、オペレーティングシステムへのアクセスは、通常はダイナミックライブラリによって提供されるサブルーチンを介して提供されます。Cなどの高級言語は、オペレーティングシステムの機能への包括的なアクセスを提供し、そのような機能のためのアセンブラ言語プログラムの必要性を排除します。[要出典]

も参照してください

参考文献

  1. ^ オックスフォード英語辞典 sv マクロマクロ命令、およびマクロ-
  2. ^ Greenwald、Irwin D。; モーリーンケイン(1959年4月)。「Share709システム:プログラミングと変更」。ACMのジャーナル米国ニューヨーク州ニューヨーク:ACM。6(2):128–133。土井10.1145 /320964.320967S2CID27424222 _ プログラマーマクロの重要な用途の1つは、プログラムの過程で繰り返されることが多い一連の命令を記述する際の時間と事務的なタイプのエラーを節約することです。
  3. ^ Strachey、クリストファー(1965年10月)。「汎用マクロジェネレーター」コンピュータジャーナル8(3):225–241。土井10.1093 / comjnl /8.3.225
  4. ^ 「Runescape:JagexLtdによる大規模なオンラインアドベンチャーゲーム」2008年4月3日取得
  5. ^ 「スクリプト:vimonline」www.vim.org
  6. ^ 「Prologマクロ」www.metalevel.at 2021-04-05を取得
  7. ^ 「Erlang-プリプロセッサ」erlang.org 2021-05-24を取得
  8. ^ 「ディランマクロシステム—オープンディラン」opendylan.org 2021-04-05を取得
  9. ^ 「Defマクロ」Scalaドキュメント2021-04-05を取得
  10. ^ 「About-Nemerleプログラミング言語公式サイト」nemerle.org 2021-04-05を取得
  11. ^ 「マクロ-Rustプログラミング言語」doc.rust-lang.org 2021-04-05を取得
  12. ^ 「マクロ」elixir-lang.github.com 2021-04-05を取得
  13. ^ 「マクロ」nim-lang.org 2021-04-05を取得
  14. ^ 「マクロ」Haxe-クロスプラットフォームツールキット
  15. ^ 「メタプログラミング・Julia言語」docs.julialang.org 2021-04-05を取得
  16. ^ 「Sweet.js-JavaScript用の衛生的マクロ」www.sweetjs.org
  17. ^ 「LeMPホームページ・拡張C#」ecsharp.net
  18. ^ 「Pythonのマクロ:準引用符、ケースクラス、LINQなど!:lihaoyi / macropy」2019年2月7日–GitHub経由。
  19. ^ マーシャル、ジョー。「無題のメール」2012年5月3日取得
  20. ^ ハート、ティモシーP.(1963年10月)。「AIM-057、LISPのマクロ定義、TimothyP.Hart」。hdl1721.1 / 6111 {{cite journal}}Cite journal requires |journal= (help)
  21. ^ コールベッカー、ユージーン; フリードマン、ダニエル; Felleisen、Matthias; デュバ、ブルース。「健全なマクロの拡大」。土井10.1145 /319838.319859
  22. ^ [1]クリンガー、リース。「機能するマクロ」
  23. ^ フラット、マシュー。「構成可能でコンパイル可能なマクロ:いつ欲しいですか?」(PDF)
  24. ^ ラフキンド、ジョン; フラット、マシュー。「Honu:植林による代数表記の構文拡張」(PDF)
  25. ^ 「マクロによるAutomata」cs.brown.edu
  26. ^ [2]、Matthias Felleisen、LL1メーリングリストの投稿
  27. ^ Orgass、Richard J。; ウィリアムM.ウェイト(1969年9月)。「モバイルプログラミングシステムの基盤」。ACMの通信米国ニューヨーク州ニューヨーク:ACM。12(9):507–510。土井10.1145 /363219.363226S2CID8164996_ 
  28. ^ ウェイト、ウィリアムM.(1970年7月)。「モバイルプログラミングシステム:STAGE2」。ACMの通信米国ニューヨーク州ニューヨーク:ACM。13(7):415–421。土井10.1145 /362686.362691S2CID11733598_ 
  29. ^ 「ノースフロリダ大学」(PDF)
  30. ^ 「DTF(DOS / VSE)」
  31. ^ 「IBMナレッジセンター」IBMナレッジセンター2013年8月16日。
  32. ^ a b "アセンブラ言語マクロ命令"シスコ
  33. ^ a b Holbrook、Bernard D。; ブラウン、W。スタンリー。「コンピューティングサイエンステクニカルレポートNo.99 –ベル研究所でのコンピューティング研究の歴史(1937–1975)」ベル研究所2014年9月2日にオリジナルからアーカイブされました2020年2月2日取得
  34. ^ 「マクロSAP–SAPのマクロコンパイラの変更」HOPL:プログラミング言語のオンライン歴史百科事典2008年8月13日にオリジナルからアーカイブされました。
  35. ^ Layzell、P。(1985)。「プログラミング言語の拡張性におけるマクロプロセッサの歴史」コンピュータジャーナル28(1):29–33。土井10.1093 / comjnl /28.1.29

外部リンク