------
この記事はGUT Advent Calender(https://www.c-sqr.net/c/todaigensokyo/Circle_detailReport.html?report_id=405032)へ向けて書かれた記事です。
-----
東方ファンの皆さま、こんにちは。東方NewbieのiLiss.です。
アドカレの記事を遅刻しました。どうして?遅刻癖?
東方関連の記事は他の方に任せまして、私は少々趣味を語りたいと思います。
技術関連のお話です。
それでは...
「Esolang」について....
お話しします.....
みなさん.....
「Esolang」って....
ご存知ですか...?
「Esolang」っていうのはですね.....
プログラミング言語の....
言語仕様を難しくすると....
「気持ちがいい」とか....
可読性を完全に無視して言語を作ると....
「気持ちがいい」だとか.....
あるいは....
命令数を極端に少なくすると.....
「気持ちがいい」
といったことを....
「Esolang」というんですね。
[結局どういうことだよ]
Esolang、略さずには"Esoteric Programming Language"。
日本語でいうと、「難解プログラミング言語」。
名前からして難しそうですね。実際難しいんですが。
基本的に、Esolangっていうのは、難しいようにできています。
難しいので、ちゃーんと、言語仕様を読まないと...
プログラミングができません。
そんな「難しい言語」、Esolangの魅力を...ちょっとだけ語ろうと思います。
まあ、Esolangって一口に言ってもいろんなものがあるんですね。
それぞれの言語でこれが簡単とか難しいとかあるし。
今回は、全て紹介し切ることが不可能な言語たちから...
ちょっとセレクトして...
言語を紹介していきながら...
その魅力を語りたいと思います。
今回は、言語紹介とともに、よく紹介されるサンプルコード(Wikiのもの)を載せたりするよ。
[Brainf*ck]
Brainf*ck。名前の時点で伏せ字されていますが大丈夫だろうか。
この言語、とにかく言語仕様が簡単である。どのくらい簡単かというとWikipediaのみで言語仕様の記述が済んでしまうレベルで、
処理系は次の要素から成る: Brainfuckプログラム、インストラクションポインタ(プログラム中のある文字を指す)、少なくとも30000個の要素を持つバイトの配列(各要素はゼロで初期化される)、データポインタ(前述の配列のどれかの要素を指す。最も左の要素を指すよう初期化される)、入力と出力の2つのバイトストリーム。
Brainfuckプログラムは、以下の8個の実行可能な命令から成る(他の文字は無視され、読み飛ばされる)。
>
ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;
」に相当する。<
ポインタをデクリメントする。C言語の「ptr--;
」に相当。+
ポインタが指す値をインクリメントする。C言語の「(*ptr)++;
」に相当。-
ポインタが指す値をデクリメントする。C言語の「(*ptr)--;
」に相当。.
ポインタが指す値を出力に書き出す。C言語の「putchar(*ptr);
」に相当。,
入力から1バイト読み込んで、ポインタが指す先に代入する。C言語の「*ptr=getchar();
」に相当。[
ポインタが指す値が0なら、対応する]
の直後にジャンプする。C言語の「while(*ptr){
」に相当。]
ポインタが指す値が0でないなら、対応する[
(の直後[1])にジャンプする。C言語の「}
」に相当[2]。
これだけ。たったこれだけ。は?
1度でもプログラミングを触ったことのある方であれば、言語仕様の理解に苦労したり、関数をリファレンスで調べたりと色々苦労があったと思われる。Brainf*ckはそれがない。これだけ!
簡単にするっていうのは...本当に難しい。
これは実際にプログラムを記述すれば理解できると思われる。
是非一度、AtCoderの最初の問題、"Welcome to AtCoder"にチャレンジしてほしい。
https://atcoder.jp/contests/practice/tasks/practice_1
これ、めちゃくちゃ難しい。通常言語では感じなかった難しさがある。
時間のある方、是非...やってみてください。
僕は諦めました。
こちら、所属サークルTSGのEsolangマスターうら氏によるAC
わかりません。
[><>]
ウオウオ・フィッシュ・ライフ!"Fish"と読むこのうおな言語、><^vの4つで言語を読む方向を指定し、|/\_が言語を読む方向を反射させるというとんでもない言語!
自分の思い通りに進行方向を指定できます。
先程のBrainf*ckと異なりAtCoder非対応。そもそも対応EsolangがBrainf*ckのみ
個人的に好きな言語です。名前オチだけど。
こちらはEsolang Wiki(https://esolangs.org/wiki/Main_Page)から拝借したFizzBuzzのソースコード
0voa ~/?=0:\ voa oooo'Buzz'~< / >1+:aa*1+=?;::5%:{3%:@*?\?/'zziF'oooo/ ^oa n:~~/
たのしいですね。 ええとても。
[Starry]
またとんでもない言語が登場します。言語仕様は、
Spaces Final Description 0 +
Invalid opcode. 1 +
Duplicate top of stack. 2 +
Swap top 2 stack elements. 3 +
Rotate top 3 stack elements. 4 +
Pop top of stack. n ≥ 5 +
Push n − 5 to stack. 0 mod 5 *
Pop y, pop x, push x + y. 1 mod 5 *
Pop y, pop x, push x − y. 2 mod 5 *
Pop y, pop x, push x * y. 3 mod 5 *
Pop y, pop x, push x / y. 4 mod 5 *
Pop y, pop x, push x mod y. 0 mod 2 .
Pop a value and print it as a number. 1 mod 2 .
Pop a value and print it as an ASCII character. 0 mod 2 ,
Read a number from input. 1 mod 2 ,
Read an ASCII value from input. n `
Mark label n. n '
Pop a value; if non-zero, jump to label n.
空白の数で同じ文字の意味が変わるのは楽しいですね。
それではHelloWorldを見ていきましょう。
+ + * + * + . + + * + * * + . + * + . + . + * + . + + * + * * + . + * + . + + * + * * + . + * + . + * + . + * + . + * + . + + * + * * + .
満 天 の 星 空
Starryという英単語は"星空"を意味します。みんなも星空をプログラムしてみよう!は?
[Shakespeare Programming Language(SPL)]
これはなに?
色々とよく分からなすぎて面白い言語。いつかコードゴルフ大会に出ないかな...
プログラミング知識の他にシェイクスピア(教養、らしい)の知識と台本を書く力(は?)が要求されてそう。人間そんなに多く才能を持てるようにできていませんが...
[Piet]
まずはHelloWorldのソースコードを見てもらおう。それが一番手っ取り早い。
Thomas Schoch - own work at http://www.retas.de/thomas/computer/programs/useless/piet/explain.html (with detailed explanation), CC 表示-継承 3.0, リンクによる
...は?
意味が分からない、と思われた方もいらっしゃると思われる。
このEsolang、ソースコードはなんと画像でできている。
この画像を読み込むとHelloWorldが出力されるらしい...
にわかに信じがたい話ではあるが...
[Whitespace]
こちらもソースコードを見ていただいた方が早い。
....もうなんだこれ....
ちなみに、このソースコード、ちゃんと動きます。本当に?????
"Hello,world of spaces!"なる文字列が出てくる。どうしてこれで動くんだ....
Whitespace、それは空白、Tab、改行のみで記述される人類に見ることが不可能な言語。プログラムを見ることのできない人類のために、オンラインのプログラム環境が存在する。
色がついて見えるようになったね!!!!
[おわりに]
正直、もう少しEsolang力を上げてから記事を書くべきだったかなあと思っている。
こういう場面ってさ、自分でコード書いてこんな感じだよー、とかするところじゃん?と思っていたり。
Esolangは...楽しいですよ....
何故って... 「誰も知らない」 .... からなんですね....
突然新たな言語が提示されて.... 言語仕様を読んで....
みんなが同じスタートラインから...
一斉に.... プログラミングを始めるんですよ....
そう...
#全人類はEsolangの下に平等 なのです。
楽しいと.... 思いませんか....?
そのうちEsolangでやる楽しい遊び、「コードゴルフ」についても記事を書きたいと思います。
でも、今回はこのへんでおしまいにしましょう。
ではでは。