2018/12/20 22:04

多くのプログラミング言語がありますが、プログラミング教育に適した言語や環境はなんなのでしょうか?

ブラウザがあれば動くからということで――最近はどうか知りませんが――、Javascriptが使われていたときもありました。ただ、Javascriptがプログラミング教育に適しているかというと、疑問になります。Javascriptで書かれたライブラリであったり環境であったりがいくつも存在します。それらの中身を見ていただくとわかると思いますが、Javascriptの基本的なところからはかなり離れたものになっていたりします。

これはJavascriptの欠点という話ではなく、Javascriptにはそれだけの記述力があるということです。しかし、プログラミング教育においてその記述力は必要かという疑問があります。もちろん、学年によってはそこまでのことはやらないかもしれませんが、どこかで気づく児童・生徒はいるかもしれません。それに気づくと、もはや混沌の域に達してしまいます。

ならば、記述力はない方がいいかというと、必ずしもそうは言えません。それだけの記述力がなくとも、充分に要は足りる場合がほとんどですが。

また、Scratchなどグラフィカルなものが最近は多いようです。ここで考える必要があるのは、「グラフィカルである必要があるのか」という事柄です。これには、もちろん、キーボードを使えるかという問題が前提としてあります。物理的にキーボードを接続できるかどうかではなく、児童・生徒の技能としての話ですが。これはそれなりに大きな障害ですが、Scratchなどでもまったくキーボードを使わないわけではないので、乗り越えられる障害だと考えましょう。

そこが問題でないとしたら、グラフィカルである必要性もかなり減ります。

そうすると、最後は言語そのものが扱いやすいかどうか、理解しやすいかどうかということになるかと思います。この扱いやすさや理解のしやすさをうまく考える方法はないでしょうか?

あることはあります。

第一に、汎用言語であったとしても、あるいは特定目的の言語ではあっても汎用的につかえるとしても、その言語の目的そのものが明確であることを挙げたいと思います。

この点においては、awk (gawk) を候補に挙げたいと思います。テキスト処理を目的とした言語ですが、汎用的にも使えます。

第二に、言語そのものがシンプルであることを挙げたいと思います。これは、児童・生徒への教育用として、機能を隠す必要もないほどにシンプルであるということです。

第三に、言語そのものに一貫性があることを挙げたいと思います。言語のシンタックスが、「こうも書ける、あぁも書ける」であるとか、「この場合にはこう書き、あの場合にはあぁ書く」というような、原則が弱かったり例外だらけだったりする言語は教育用には向かないかと思います。よけいなところで児童・生徒がつまづくだけではないかと思うからです。

この第一から第三の条件から、lisp系forth系におおむね限定されるかと思います (lisp系ではなく関数型言語という声もあるかもしれません。それももちろんありだと思います。Viscuitはグラフィカルですが、関数型と言えるかと思います)。

lisp系とforth系には、上記とはことなる特徴もあります。それは文法として規定されているというような強い制約ではありません。しかし、どちらも「小さい関数やワードを積み重ねて、全体を構成する」という、ある意味では文化であり、ある意味では言語仕様です。これは、「問題をどう分析し、どう分解し、どう組み合わせるか」というプログラミングにおいて重要な思想です。

付け加えるなら、第四に、直交性を挙げておきたいと思います。演算とデータ型が直観的に、自然な感じで、自由に組み合わせることができることと言っていいと思います。lisp系やforth系では、このあたりは弱点かもしれません。しかし、「型」や「オブジェクト」という概念が足止めになってしまうのであれば、それらを基本的には気にしなくていいものが望ましいでしょう。この点については、第一の条件の時に挙げた awk (gawk) を再度候補として挙げたいと思います。

awk (gawk) は、それらの特徴だけではなく、「処理対象にこれこれの文字列があったら、これを実行する」という書き方をするのが基本です。これは実際のところは別として、イベント・ドリブンの考え方にも通じるのではないかと思います。

awk (gawk) ではこれはできませんが、直交性の例としてこんなものを挙げてみたいと思います:

Jun = 6
Jul = 7

こう宣言した後に、"Jun + 1" によって、 "Jul" を求めたいとしましょう。ですが、それはできません。 "7" という答えが出てくるのみです。 "Jun" の次を求めたいのだから、 "Jul" が返って欲しいと思うのは不自然でしょうか? あるいは "7" を求めたい場合には "Jun + 1" とし、 "Jul" を求めたい場合には、たとえば "next(jun)" と書くとしたらどうでしょうか? ある面ではという条件がつきますが、シンプルさと一貫性、そして直交性の面から、直観的とは言えないかもしれません。もちろん、このくらいの例であればけっこうやりようはありますが。

lisp系、foth系、あるいは awk (gawk) にしなければならないということではありませんが、それらがあまりに無視されているようにも思えます。

ここに挙げた条件から、使う言語を考えてみるのも無駄ではないと思います。