Sunabaを使わせる立場の方や玄人さんはこちらへどうぞ。
概要
プログラマ人生の最初の100時間を過ごすための言語です。
100時間経ったら他の言語に行く前提なので、極めて低機能です。
こんな感じのものを書いてプログラムを作ります。
0 < 1 な限り
横 → メモリ[50000]
縦 → メモリ[50001]
メモリ[50002] ≠ 0 なら
メモリ[縦 × 100 + 横 + 60000] → 999999
これは、簡単なお絵描きソフトです。これを
メモ帳で書いて専用ソフトのウィンドウにドラッグアンドドロップするだけで実行できます。文法は2ページに収まります。
元々九州大学での講義のために作った言語ですが、
調子に乗って「プログラムはこうして作られる~プログラマの頭の中をのぞいてみよう~」(秀和システム)という本にまでしてしまいました。
詳しいことはこの本に書いてあります。玄人の方向けには、ダウンロードファイル中に詳しい文書があります。
前書きを置いておきます。
Sunabaのいい所
- 覚えることが少なく、調べる手間がない
- 原始的で具体的なのでイメージをつかみやすい
- メモ帳で書いてドラッグアンドドロップするだけで簡単実行
- 絵と音を出すしくみが最初からあり、とても単純
お役に立てる人はこんな人
Sunabaはこんな方のお役に立てます。
- 既存の言語、書籍等で上達できない人
- 何もかもを自作せねばならない状況に置いて自分のスキルを再確認したい人
つまり、運悪く普通の言語ではつまづいてしまった人と、
経験者の再学習が主な用途です。
ダウンロード
過去のバージョンや、詳しい説明は
gitHubのリリースページで。さらに古いバージョンは、
one driveに置いてあります。
また、javascriptで書いてブラウザ上で実行できるようにしたいですが、誰かがやってくれるとうれしいです。たぶんSunabaのコードをJavaScriptに変換して実行するのが一番安いと思います。
授業で使うために
まず、この言語を必要としない意欲と才能あふれる者には
使わせるべきではありません。教育用であるというだけで萎えるでしょう。
使わせるとしても短時間とし、挑戦的な課題を与え、
しかも他の言語でも活きることがわかる形で使う必要があります。
そうすれば役に立ち、本人も意義を認めるでしょう。
ただし、意欲はあっても才能がない者はおり、
それを自覚させるためにこの言語を使うのは効果的です。
欲しい機能をもつコードを探し出して利用することに終始したり、
コピペに頼ったりする者はすぐにそれを露呈します。
Sunabaにはライブラリもなく、調べることもできないからです。
ただし、探して使うことも才能であることに違いはなく、
それが重要な仕事もあるでしょうから、全否定してはいけません。
ゼロからコードを書く能力で劣る、ということを自覚させれば十分です。
鍛えるか、なおいっそう探し利用する能力を高めるかは
カリキュラムや本人の意思によるでしょう。
Sunabaは短時間の使用を想定しています。
100時間取り組んで駄目ならば、おそらくそれ以上は苦痛になるだけです。
10時間程度でもおおよその適性はわかってしまうでしょう。少なくとも、
ゼロから組み上げるプログラミングに向いていないことがはっきりします。
逆に、十分にできているのであれば、低機能さが苦痛になるでしょう。
100時間で倉庫番なりオセロなりのゲームを作れれば、
あとは本人の求めに応じて別の言語に移行させるべきです。
私の本は、自習用に作られており、そのまま講義あるいは演習形式の授業で
使うには適さないかもしれません。基本が自習で、
人によってはアレンジを加える、
というのであればおそらくは大丈夫かと思いますが、
それでも授業に適した形は別にあるように思います。
どのような形にすれば授業に適するのかについては教育される方が
考える方が良いでしょうけれども、少なくとも
テトリスという課題が難しすぎるということは言えます。
オセロくらいまではレベルを落とさないときついのではないでしょうか。
良く出る疑問や要望
- メモリ書き換えの記号は普通は=だろう
-
以下の理由による。
- 「等しい」という演算子とかぶる。1つの記号を2つの意味で使いたくない。「==」は嫌だ。
- 数学の=には3つの意味がある。代入、定義、関係だ。数学ではその3つを文脈で使い分けているが、そのへんが理解できていない人は結構いる。難しいのだ。その難しさをSunabaに持ちこみたくない。
- 左は「いじるメモリ」、右は「セットする値」で意味が非対称だ。それに左右対称な記号を当てたくない。
- メモリ書き換え記号「→」は「←」の方が良くないか
-
迷ったが、「x番ダイアルがyになる」と読む場合、変化の方向は右だろうと思ってそうした。メモリを箱と考える場合は「x番の箱にyを入れる」と読むことになるので左向きが合うが、私は箱として説明していない。他の本では箱として説明することが多く、その経験を持つ人は違和感を持ちやすいようだ。
- 他の言語で言う「関数呼び出し」に「参照」という言葉を使うのはいかがなものか。他の言語では「参照」という用語が別にあり、混乱する。
-
「157ページを参照」のような記述は料理の本にもあるわけで、日常語のつもりで専門用語として定義したつもりはなかったのだが、そう思われてしまうのは仕方ない。他言語の経験があると混乱するかもしれない。しかし、この本の主要読者は他言語の経験がないか、あってもわずかであろうから、そこは気にしないこととした。
- elseやelse ifがないぞ
-
なくても書けるだろう?「あれば便利だが、なくてもそう困らない」という程度の機能は入れないこととした。
- Cで言うグローバル変数(どの部分プログラムから見える名前付きメモリ)がないぞ
- メモリを番号指定で使えば良い。番号を直接書きたくなければ、定数を使えば良かろう。それでも不満な玄人はmallocを書けば良い。
- 全画面書き換えすると遅くてゲームが作れない
- 変化のあるところだけを書き換えればいい。速度改善は1.5倍までは目処が立っていますが、それ以上はたぶん無理です。高速バージョンはそのうち置きますが、不安なので別にしておきます。
なお、「ループにつき1画素」は遅いです。ループ制御オーバーヘッドが大半になります。例えば8x8のスプライトなら内側ループは展開すべきでしょう。ソース上の演算子の数だけ素直に命令が増えることにも注意しましょう。