はじめに
このページはprime numberが開発しているプログラミング言語「Elem」の公式ページです。
現在version 0.0.2です。(2012/07/24)仕様は今後も変更される可能性があります。
Elemってどんな言語?
プログラミング言語にはいろいろなものがあります。
その多くは、ソースコードを機械語またはそれに準ずるものに翻訳して実行します。
しかし、Elemは違います!機械語に翻訳するのではなく、機械に翻訳するのです!
Elemでは、ソースコードに機械の設計図を記述します。
Elemインタプリタはその設計図に従って、コンピュータ上で機械をエミュレートすることで、目的の処理を達成します。
で?機械ってどんな?
ある程度理想化された論理回路です。
従って、理論上はCPUやメモリをもエミュレートし、その上でプログラムを走らせることもできます。(ただ、Elemではそのような方法は普通用いません。)
また、ある程度理想化されているとは言っても、現在の仕様上信号のオンオフに伴うスパイクノイズは除去し切れない場合があります。(Elemプログラマーはスパイクノイズが発生しない、もしくは発生しても影響のでない設計をすることが(現状では)求められます。)
Elemの仕組み
Elemに現在実装されている「部品」を紹介します。Elemではこれらの部品を接続して「機械」を作ります。
Element
Elementは入力を1個以上、出力をただひとつ持つ部品です。
Elementの入力、出力には後に述べるWireのみが接続できます。
Elementには汎用部品のNANDと特殊用途のSTDOUT、STDERRが実装されています。OUTからSTDOUTに名称変更されました。(2012/07/24)
NAND
NANDは入力を2個もつ部品で、入力が両方ともtrueのときfalseを出力し、それ以外の時はtrueを出力します。
NANDを複数組み合わせることによって、AND,OR,NOTなどを構成できるので、NAND(とWire)を組み合わせることで任意の論理回路を生成することができます。
STDOUT
STDOUTは入力を1+8=9個持つ部品で、標準入出力を管理します。
0番目の入力(STDOUT<0)がtrueになったときに、1〜8番目の入力(STDOUT<1〜STDOUT<8)の値を上位ビットから(STDOUT<8,STDOUT<7,…,STDOUT<1)となる8ビットの文字として標準出力に出力します。
STDERR
STDERRは標準エラー出力に出力する以外はSTDOUTと同じです。
Wire
Wireは入力を最大1個、出力を任意の個数(0個以上)持つ部品です。
Wireの入力、出力にはElementのみが接続できます。
デフォルトのWireは入力を1個とり、その値をそのまま接続されているすべての出力に流します。
特殊用途のWireはTRUE,FALSE,CLOCKが実装されています。
TRUE
TRUEは常にtrueを出力するWireです。
FALSE
常にfalseを出力します。
CLOCK
クロック信号を出力します。回路の同期を取るために使います。
1stepでfalse→true→falseと出力します。
クロックの変化に伴う回路の状態変化が終わるまでクロックが次の状態に遷移することはありません。
Elemの構文
@構文
@構文は、回路の動作全体に関わる設定を行うことができます。
@(設定項目)=(値)
例
動作ステップ数(メインクロック(CLOCK)の上下回数)を2に設定する。
$構文
$構文は、WireとElementの接続関係を設定することができます。1つのWireの入力に複数のElementの出力を設定したり、1つのElementの出力に複数のWireを設定するなどといったことはできません。(設定してしまった場合の動作は未定義です。)
Elementの入力で、何番目の入力かを指定するのに<演算子を使います。入力側がWireの場合は<及び番号は省略してください。
$(入力<番号)=(出力)
例1
STDOUTの0番目の入力をCLOCK(の出力)に設定する。
例2
(W1はWire、N1はNAND)
W1の入力をN1の出力に設定する。
+構文
+構文はWireや汎用Element(今はNANDだけですが)を追加するときに用います。
+(WireならW、NANDならN):(ラベル)
例
N1という名前のNANDを追加する。(この状態ではまだどこにも接続されていない)
サンプルコード
大文字のHを1回出力するプログラム。
@STEP=1
$STDOUT<0=CLOCK
$STDOUT<1=FALSE
$STDOUT<2=FALSE
$STDOUT<3=FALSE
$STDOUT<4=TRUE
$STDOUT<5=FALSE
$STDOUT<6=FALSE
$STDOUT<7=TRUE
$STDOUT<8=FALSE
インタプリタはよ
公開はまだです(てへ☆
今後追加したい機能
- module機能(回路のまとまりをひとつの部品のように扱える機能)
- ライブラリモジュールの作成 これでだいぶまともに遣えるようになるはずです
- Wireの自動補完(Elementの入力にWireの入力が接続されているElementを指定すると自動的にWireを見つけて接続する/無ければ自動で作る)
- 標準入力
最終更新:2012年07月24日 07:50