忍者ブログ
気ままな一人暮らしの、ささやかな日常
美術鑑賞からプログラムのコードまで、思いつくままに思いついた事を書いています。
[4894]  [4893]  [4892]  [4891]  [4890]  [4889]  [4888]  [4887]  [4886]  [4885]  [4884
ざっくざく > パソコン > 難解言語の話
こんにちは、和美です。
仕事で、Excel関数とSQLiteというデータベースシステムとJavaScriptが使えるソフトを使って開発をしています。
JavaScriptの入門講座を探していて見つけたページから始まる、プログラミング言語の話です。

【 目次 】

  1. 初めに
  2. 難解プログラミング言語
  3. チューリング完全とは
  4. 自分自身のソースプログラムを出力する
  5. IOCCC
  6. 最後に

1. 初めに

きっかけは、仕事で調べていて見つけた以下のJavascript入門講座です。
…… お気楽でもなければ入門でもありませんが ……。
最初の文章から察するに、他のプログラミング言語を学んだ経験がある人向けのようです。
参考リンク:お気楽 JavaScript プログラミング超入門:M.Hiroi's Home Page

こちらで、3で割り切れたらFizz、5で割り切れたらBuzz、両方で割り切れたらFizzBuzzと言う 『 FizzBuzz問題 』 を知りました。

以下はPHPという言語で1~50のFizzBuzzを実行するコードです。

for($a=1;$a<=50;$a++){
if($a%3==0 && $a%5==0){
echo "FizzBuzz、";
}
elseif($a%3==0){
echo "Fizz、";
}elseif($a%5==0){
echo "Buzz、";
}else
echo $a."、";
}
?>

2. 難解プログラミング言語

上述のページからリンクされている、『 FizzBuzz問題 』 のWikipediaのページを読み、そこからジョーク向けプログラミング言語であるHQ9+に、FizzBuzzを追加し拡張したHQ9F+を知りました。
参考リンク:HQ9+:Wikipedia
世の中には和美が知らない言語がまだまだ多くあるんだなぁ、と思っていたら、『 難解プログラミング言語 』 と呼ばれるジャンルに属するジョーク言語だそうです。
そもそも命令文が 『 Hello, world! 』など四~六種類しかないため、実用性は皆無ですが。
( バージョンによって命令文が追加されています )
命令文が足りない言語を 「 チューリング完全ではない 」 と表現するようです。

3. チューリング完全とは

「 チューリング完全ではない 」 と言われても、Wikipediaの説明では和美はさっぱり理解できず、以下のサイトを参考にしました。
参考リンク:チューリング完全性について詳しく教えてください。:Quora

内容を書き直すと、以下三つの手段が使えるものの事だそうです。
順次:
ある一つの手続きを実行し、それからもう一つの手続きを実行する。
分岐:
True / Falseの選択肢の結果に従って、2つの分岐先のどちらか片方を実行する。
反復:
True / Falseの選択肢がYesである限り、手続きを繰り返し実行する。
まずは一つ目の順次から。
例えば、1 + 2 + 3という普通の計算式の場合、最初の1 + 2を実行して計算結果の3と次の+ 3の計算を行う、というものです。
1 + 2 × 3は足し算より先に掛け算の2 × 3を先に計算するので順次ではありませんね。

次に二つ目の分岐。
True / Falseは真偽値とも呼ばれて、プログラミングによく出てくる条件分岐の初歩です。
簡単なところだと、Excel関数のifが分かりやすい例だと思います。
IF(1+2=3,"A","B")と書いたら、1+2が3(True:真:正しい)の場合はA、違う(False:偽)場合はBと表示されます。
この式の場合は確実にTrueなので、Aだけが表示されます。
二つの分岐先のどちらか片方を実行、は表示の部分ですね。
1+2が3かどうかという選択肢の結果で、電卓とは異なり、表示されるのは計算結果の3ではなくAという文字です。

三つ目の反復(True / Falseの選択肢がYesである限り、手続きを繰り返し実行する)
は …… Excel関数より普段の実生活が多いですね。
五時まで勉強をする時、繰り返し実行される内容は、勉強と時計を見ることです。
時計を見た時、五時か五時でないか。がTrue:真:正しい / False:偽:違う の選択肢です。
勉強の終了条件は五時なので、時計の時間 < 五時 が成り立つ(Yes)間は勉強を続ける、という感じです。

4. 自分自身のソースプログラムを出力する

上記Wikipediaに
「 自分自身のソースプログラムを出力する 」 という例題は多くのプログラミング言語にとって最も難しい課題の一つ
という一文があり、Javaの講習を思い出して納得しました。
「 同じコードを表示することでソースを出力しているように見せかける 」 という手法になるのでしょうか。
参考リンク:クワイン(プログラミング)Wikipedia
上記Wikipediaに挙がっている中にVBAがありましたが、
「 故意による可読性低下・冗長な装飾を含 」
むらしく、さっぱり読めませんでした……。正規表現に見えるんですが、これ。

参考リンク:Malebolgeマーレボルジェ:Wikipedia
難解プログラミング言語の中にあったMalebolgeマーレボルジェは、最も扱いにくく難解であるプログラミング言語となるべく設計されたそうで、面白そうだなぁと思います。
誰か人力でコードを書いてくれないでしょうか。

5. IOCCC

このサイトについて:IOCCC日本語ネタバレ解説
IOCCC(International Obfuscated C Code Contest:国際難読化Cコードコンテスト)という、故意に難解なC言語のプログラムを書き、その読みにくさと複雑さを競う奇祭があるそうです。
(リンク先は二〇一九年二十六回目まで解説済み、二〇二一年八月現在で二〇二〇年二十七回目まで発表済み)
Obfuscatedはobfuscateの過去分詞形で、暗くする、分かりにくくさせる、などの意味だそう。
( 当惑させる、が一番相応しい気がしました )
第21回IOCCC入賞作品「踊る人形」:cuspy diary
こちらの発想が面白かったです。

和美はC言語が全く読めないのですが、WikipediaによるとJavaScript版もあるようです。
国際難読javascriptコードコンテスト:Wikipedia
が、出典元が不明な上に、Wikipediaからリンクされた公式サイトが繋がらず。
応募期間が不明な第一回が審査中とのことで受賞者もまだおらず、他に情報が出てきません ……。
JavaかJavaScriptかPHP辺りで書かれていたら頑張って解読してみるのですが。
……ひまわり(寝言)

6. 最後に

心酔する「「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典」の方が、コラムで「2つ目のプログラミング言語を勉強する機会が、ほぼ間違いなく訪れる」と書いていたのを思い出しました。
参照リンク:第四十九回:初心者が最初に学ぶプログラミング言語は何がオススメか?
プログラマーならいつかはC言語。(個人的な思い込みです)
PR
【 この記事へコメント 】
名前
コメントタイトル
URL
本文
削除用パスワード
累計アクセス数
アクセスカウンター
レコメンド
プロフィール
書いている人:七海 和美
紹介:
更新少な目なサイトの1コンテンツだったはずが、独立コンテンツに。
PV数より共感が欲しい。
忍者ブログ [PR]