空白(プログラミング言語)

構文強調表示付きの空白のHello Worldプログラム
  タブ
  スペース

ホワイトスペースは、空白文字スペースタブ改行)のみが意味を持つ構文を持つ難解な プログラミング言語です。これは、空白文字をほとんど無視する一般的な言語とは対照的です。 [1] [2]

構文上、空白文字を含むソースコードは、空白文字を無視する言語で書かれたコードの空白部分内に含めることができ、テキストは多言語化されます。[2]

Whitespaceは命令型のスタックベースの言語です。プログラマーは任意の幅の整数値をスタックにプッシュし、ヒープにアクセスしてデータを保存できます。

インタープリターとそのHaskellソース コードは、Whitespace の作成者によって提供されています。

歴史

カヤ語とイドリス語も開発したエドウィン・ブレイディとクリス・モリスは、2002年にダラム大学でホワイトスペースを開発しました。 スラッシュドットは2003年のエイプリルフールにレビューを掲載しました。 [3]

C++言語の演算子として空白文字を使用するというアイデアは、5年前にBjarne Stroustrupによって冗談めかして提案されていました。[4]

構文

空白文字は、コマンドを空白文字のシーケンスとして定義します。例えば、[Tab][Space][Space][Space]スタックの先頭2つの要素の算術加算を実行します。

コマンドは、命令変更パラメータ(IMP)の後に操作とパラメータが続く形式で記述されます。 [1]

IMP シーケンスには次のものが含まれます。

インプ意味
[空間]スタック操作
[タブ][スペース]算術
[タブ][タブ]ヒープアクセス
[改行]フロー制御
[タブ][改行]入出力

IMP別に整理された演算子シーケンスには次のものがある: [1]

インプオペレーターパラメータ意味必要なスタックの最小サイズ*
[空間][空間]番号数字をスタックにプッシュする0
[空間][LF][スペース]-スタックの一番上のアイテムを複製する1
[空間][タブ][スペース]番号nスタック上の n 番目の項目 (引数で指定) をスタックの先頭にコピーします**n +1
[空間][LF][Tab]-スタックの一番上の2つのアイテムを入れ替える2
[空間][LF][LF]-スタックの一番上のアイテムを捨てる1
[空間][タブ][LF]番号n一番上のアイテムを保持したまま、n 個のアイテムをスタックからスライドします**n +1未満となる可能性がある

ただし、少なくとも 1 つのアイテム (スタックの一番上) が必要です。

[タブ][スペース][スペース][スペース]-追加2
[タブ][スペース][スペース][タブ]-減算2
[タブ][スペース][スペース][LF]-乗算2
[タブ][スペース][タブ][スペース]-整数除算2(上は0ではない場合があります)
[タブ][スペース][タブ][タブ]-モジュロ2(上は0ではない場合があります)
[タブ][タブ][空間]-ヒープに保存2
[タブ][タブ][タブ]-ヒープから取得1
[LF][スペース][スペース]ラベルプログラム内の場所をマークする0
[LF][スペース][タブ]ラベルサブルーチンを呼び出す0
[LF][スペース][LF]ラベルラベルにジャンプ0
[LF][タブ][スペース]ラベルスタックの先頭がゼロの場合、ラベルにジャンプします1
[LF][タブ][タブ]ラベルスタックの先頭が負の場合、ラベルにジャンプする1
[LF][タブ][LF]-サブルーチンを終了し、制御を呼び出し元に戻す0 (コールスタック: 1)
[LF][LF][LF]-プログラムを終了する0
[タブ][LF][スペース][スペース]-スタックの一番上の文字を出力する1
[タブ][LF][スペース][タブ]-スタックの一番上の数字を出力する1
[タブ][LF][タブ][スペース]-文字を読み取り、スタックの先頭で指定された場所に配置する1
[タブ][LF][タブ][タブ]-数字を読み取り、スタックの一番上に指定された場所に置く1

*Haskell は遅延評価されるため、スタックが小さすぎる場合の影響は、たとえば数値を出力する副作用を呼び出す場合にのみ現れる可能性があります。

**コピースライドの操作はWhitespace 0.3で追加されました。[1]

コメント

spacetabおよび以外の文字はlinefeed無視されるため、コメントとして使用できます。

数字

数値は、それぞれ0と1を表す文字の列と、終端の で表されますspacetab最初linefeedの文字は値の符号space(正の場合は 、tab負の場合は )を表します。終端文字の前の文字は、値の2進数を表します。

例えば:

  • [スペース][タブ][スペース][スペース][タブ][スペース][タブ][タブ][改行] (STSSTSTTL) は、space2 進数で 1001011 を表し、10 進数では 75 で始まるため、正です。
  • [タブ][タブ][タブ][スペース][スペース][タブ][スペース][改行] (TTTSSTSL) は負の値で始まりtab、2 進数で -110010、10 進数で -50 を表すことになります。

ラベル

ラベルは制御フローに使用されます。これは、linefeedで終了する文字spacetab文字のシーケンスです。名前空間は1つしかないため、すべてのラベルは一意でなければなりません。 [1]

サンプルコード

以下のソースコードは、空白文字を使った「Hello, world!」Sプログラムです。わかりやすくするために、 、の前にTの注釈を付けていますLspacetablinefeed

S  S  S  T S  S  T S  S  L  :スタックに_+1001000=72='H'をプッシュT LS  S  :出力_'H';_S  S  S  T T S  S  T S  T L:スタックに_+1100101=101='e'をプッシュT LS  S  :出力_'e';_S  S  S  T T S T  T S S  L  :+1101100=108='l'T LS  S  S  S  S  T T S  T S L :+  1101100  =108='l'T LS  S  S  S  S  T T S  T T T L :+1101111=111='o'T LS  S  S  S  S  T S  T S L :+  101100  =44=','T LS  S  S  S  S  T S  S  S  S  L  :+100000=32=スペースT LS  S  S  S  S  T T T S T  T L : +1110111=119='w'T LS  S  S  S  S  T T S  T T T L :+1101111=111='o'T LS  S  S  S  S  T T T S S  T  S L  :+1110010=114='r'T LS  S  S  S  S  T T S  T S L :+  1101100  =108='l'T LS  S  S  S  S  T T S  S  T S  L  =+1100100=100='d'T LS  S  S  S  S  T S  S  S  S  T L:+100001=33='!'T LS  S  :出力_'!';_LLL:プログラム終了

一部のブラウザでは、空白文字のソースコードを表示する際、タブ文字によって生成される水平方向の間隔は固定ではなく、次の水平タブ位置に対するテキスト内の位置によって決まります。ソフトウェアによっては、タブ文字が対応する可変数のスペース文字に置き換えられる場合もあります。

参考文献

  1. ^ abcde 「Whitespace」. Compsoc . 2015年6月18日時点のオリジナルよりアーカイブ。 2015年12月8日閲覧
  2. ^ ab パーカー、マット(2019).謙虚な円周率:数学の間違いの喜劇. アレン・レーン. p. 21. ISBN 978-0-241-36023-1
  3. ^ Timothy (2003年4月1日). 「新しい空白のみのプログラミング言語」. Slashdot . 2014年1月23日閲覧
  4. ^ Stroustrup, Bjarne. 「C++2000のオーバーロードの一般化」(PDF) . 米国ニュージャージー州フローラムパーク: AT&Tラボ. 2014年1月23日閲覧
  • 公式サイト
  • Slashdotでのリリース発表
  • Whitespace Corpus Whitespace用のインタープリタ、コンパイラ、プログラムのコレクション
  • さまざまなスクリプト言語の空白インタープリタのコレクション
  • Whitespace.NET コンパイラ - Whitespace プログラムを .NET バイトコードに変換するコンパイラ
  • Acme::Bleachモジュール本体を空白のみのエンコーディングに書き換えるPerlモジュール (「本当にクリーンなプログラム用」)。
「https://en.wikipedia.org/w/index.php?title=Whitespace_(programming_language)&oldid=1313368503」より取得