ジョン・マッカーシーがまだ生きていればよかったのに…
LISP 1.5 Programmer's Manualから:
LISP は、S 式の形式で記述されたプログラムを解釈して実行できます。したがって、機械語と同様に、他のほとんどの高水準言語とは異なり、さらに実行するためのプログラムを生成するために使用できます。
機械語を使用してプログラムを生成する方法と、Lisp でそれを行う方法について、もっと明確にする必要がありますか?
ジョン・マッカーシーがまだ生きていればよかったのに…
LISP 1.5 Programmer's Manualから:
LISP は、S 式の形式で記述されたプログラムを解釈して実行できます。したがって、機械語と同様に、他のほとんどの高水準言語とは異なり、さらに実行するためのプログラムを生成するために使用できます。
機械語を使用してプログラムを生成する方法と、Lisp でそれを行う方法について、もっと明確にする必要がありますか?
つまり、マシンコードはマシン命令をメモリに直接書き込んで、それらの命令にジャンプして実行できるということです。実際、これはソフトウェアに侵入するための多くの攻撃ベクトルの基礎となっています。
重要なのは、機械語を書いている場合、機械語コードを生成するのは簡単だということです。しかし、C のようなコンパイル済み言語で作成している場合、プログラムに C コンパイラが含まれていない限り、実行時に C コードを生成して実行することはできません。
Lisp、そして最近では他の多くの言語、特に Perl、Python、Ruby、Tcl、Javascript、コマンド シェルなどの「スクリプト言語」には、実行時に生成されたコードを実行する機能があります。Lisp では、コードとデータが同じ構造を持っているため、これは通常、評価されるコードが一般的に解析されなければならない文字列である他の言語よりも作業が少なくなります。(ただし、Perl にはeval
文字列の代わりにブロックを作成する機能があり、これにより、コンパイラはリテラル コードを事前に解析できます。)
機械語プログラムは、メモリ領域を任意のバイトで埋めることができます。次に、jump
そのような領域の開始点に到達することができ、すぐに実行されます。
Lisp 言語プログラムは、 を使用してメモリ内に任意の S 式を簡単に作成できますcons
。次に、eval
これらの S 式を呼び出して、それらを評価 (解釈) することができます。
高水準言語プログラムは、言語の構文で新しいコードを表す文字でメモリ領域を簡単に埋めることができます。しかし、彼らはそのようなコードを実行できません。