ProgrammingLanguages

3. プログラミング言語

3.1. 概要

時としてコーディングと言われるプログラミングは、情報科学と密接に関わっている。この本では、プログラミングのやり方について教えないが(入門へのリンクを示す)、プログラミング言語が何で、コンピュータ科学者がどのように言語に魂を吹き込んだかを見て行きたい。プログラマーの視点でいくつかの指示を入力し、コンピュータはそれを実行する。しかし、コンピュータには何がわかっているのだろう?あなたたちは、Python, Java, Scratch, Basic 、C#のようなたくさんのコンピュータ言語のうちの一つを使うだろうことを心にとめておきなさい、しかし、コンピュータは人間が読み書きするのが難しい非常に単純なマシンコードによる指示しか受け付けないハードウェアだ。そしてもし、あなたが新しいコンピュータ言語を発明したら、どのようなことが起きるのだろう。

この章では、プログラムを書いたり実行したときに起きることや、プログラムを他の人に配布したときにどのような影響があるかについて見ていく。

我々はプログラムを書いたことはないけれどプログラムについて知りたいと思っている読者のために、プログラムとは何かを紹介するところから始める。このセクションでは残りの章を理解するための十分な内容を教える。ここではプログラムの書き方を教えないが、プログラマーが実行可能なプログラムを得る過程を通じて超えていけるだろう。プログラミングについて少し知っているなら遠慮なくこのセクションは飛ばしてほしい。

A subsection on what this chapter focuses on then follows. このセクションは皆読むべきである。

3.1.1. プログラミングとは何か?

注:このセクションはプログラミングを知らない人のためのものである。もし、あなたが少しは知っているなら、このセクションを遠慮なく飛ばしてください。または、ざっと見ることで、続きがわかりやすくなります。

最も簡単なプログラムの例を紹介しよう。5つの指示が次々と続く。

print("************************************************")
print("************************************************")
print("*** Welcome to computer programming, Student ***")
print("************************************************")
print("************************************************")

このプログラムはPythonという言語で書かれている。プログラムが実行されたとき、次のようなテキストを画面に表示する。

************************************************
************************************************
*** Welcome to computer programming, Student ***
************************************************
************************************************

Pythonのプログラムを実行するために、Pythonインタープリターが必要である。Pythonインタープリターはプログラムを読み、実行できる。もしインタープリターをコンピュータにインストールしていて、起動し、プログラムを実行するやり方がわかっているならOK。そうでなければ、次のWebサイトを見て欲しい。きっとPythonプログラムを動かす手助けになるだろう。(もしあなたがこの本を授業で使っていて困っているなら先生に相談してみよう)http://mathcs.holycross.edu/~kwalsh/python/[1]

Studentの代わりにあなたの名前が表示されるようにプログラムを変えてみよう。正しくできると思ったとき、プログラムを見るためにもう一度実行してみよう。ダブルクォーテーションや括弧をミスして消さないように確認しましょう。programmingのスペルを間違えたら、コンピュータは正しく直してくれるだろうか。

願わくばプログラムがどのようにしてあなたの名前を表示するかを理解してほしい。あなたはアスタリスク(*)を別の記号に変えることもできる。もし、ダブルクォーテーションの1つを消したり、括弧の1つを消したら、何が起こるだろう。やってみて。

あなたが、プログラムの決まった言葉(予約語)を変更したら、たぶんPythonインタープリターがエラーメッセージを吐く。上に表示されているオンラインPythonインタープリターのサイトでは、“ParseError: bad input on line 1”と表示される。しかし、種類の違うインタープリターは違ったエラーメッセージを表示する。エラーを解決できずまたエラーが出たら、上にあるプログラムをコピーして戻ってみよう。

プログラミング言語は文字を表示する以上のことができる。次のプログラムは数の掛け算を表示する。実行してみよう。

print("I am going to print the first 5 multiples of 3")
for i in range(5):
   print(i*3)

1行目は最初に見たようなプリント文であり、システムにスクリーンにメッセージを表示しろと命令をする。2行目は次の行を5回繰り返せというループである。ループされるたびに、変数iの値は変わる。例:最初のiの値は0で、1,2,3,4となる。1から5ではなく、0から4になるのは奇妙に思えるかもしれない。しかし、プロラマーは少し単純に実行できるということで、0から数えがちである。3行目はi×3のその都度の値を表示する。(なぜなら3の積が知りたい)最後のプリント文にはダブルクォーテーションがないことに注意しよう。ダブルクォーテーションはテキストを文字通りに出力したいときだけ使う。もし、ここで書いたなら、計算結果の代わりに「i*3」という文字を5回出力する。

プログラムを次のように変えてみよう。

  • 3の代わりに5の積を出力できるようにする。ヒント:1行目だけでなく他のものも変える−3行目も同じように変える必要がある。
  • 5回ではなく10回出力しよう。9回や11回ではなく10回出力されていることを確認しよう。

データのリストを繰り返すこともできる。下のプログラムを実行しよう。一連のスパムを生成する。受取人リストにある人向けに出している。

#List of recipients to generate messages for
spam_recipients = ["Heidi", "Tim", "Pondy", "Jack", "Caitlin"]
#Go through each recipient
for recipient in spam_recipients:
  #Write out the letter for the current recipient
  print("Dear " + recipient + ", \n")
  print("You have been successful in the random draw for all  people ")
  print("who have walked over a specific piece of ground located 2 meters ")
  print("from the engineering road entrance to Canterbury University.\n")
  print("For being successful in this draw you, " + recipient + ", win ")
  print("a prize of 10 million kilograms of chocolate!!!\n")
  print("And " + recipient + " if you phone us within the next 10 minutes ")
  print("you will get a bonus 5 million kilograms of chocolate!!! \n")
  print("\n\n\n") #Put some new lines between the messages

受取人リストか手紙を変更してみよう。手紙の中の受取人の名前にふくまれるすべての言葉を注意深く見てください。

Jargon Buster

プログラミング言語のどの予約語をいつどこで使うかを細かく決めたものを文法という。上記の例では、名前のリストのための文法はリストを大カッコで囲み、名前をダブルクォーテーションで囲み、それぞれをカンマで区切る。もし大カッコの1つを忘れるような間違えをしたら、システムはシンタックスエラーを起こし、プログラムを実行することはできない。すべての言葉は大切であるが、1つの小さなエラーがプログラムを止め、悪いことを引き起こす。

プログラムは計算結果を保存したり、ユーザーの入力を受け付けたり、決定(ifのような分岐)をするために変数を使う。このプログラムを実行してみよう。入力を促されたら、変換するマイルを入れてください。複数の数を入れないでください。たとえば12だけを入れます。

print("This program will convert miles to kilometers")
number_of_miles = input("Number of miles: ")
if number_of_miles < 0:
   print("Error: Can only convert a positive number of miles!")
else:
   number_of_kilometers = number_of_miles / 0.6214
   print("Calculated number of kilometers...")
   print(number_of_kilometers)

1行目はプリント文です。(今ではお馴染みのやつです)2行目はユーザにマイルの数を頼み、3行目では入力された数が0より小さいかチェックをしています。もし小さいなら4行目でエラーを表示します。さもなければ、もし入力された数がOKなら、プログラムはelse部に移り、キロメーターの数を計算し(1マイルあたり0.6214km)、その値を後に参照されるnumber_of_kilometersという名前の変数に保存し、それから最後の行を表示する。私たちは変数number_of_kilometersに保存してある値を表示したいのでまた最後の行を示さない。もしわからなくても、気にしないでください。この章ではプログラムのやりかたを知らなくてもよいです。入門編では単にプログラムが何で有り、できることを知ってもらいたかっただけです。

もっとやりたいなら、このプログラムを他のものを、たとえばポンドをキログラムに直すとか、華氏を摂氏に直すような計算ができるように変えてみることもできます。

プログラムはもっとたくさんのことができます。たとえば、グラフィカルインターフェースにするとか(ほとんどのコンピュータプログラムではお馴染みですよね)、グラフィックスをスクリーンに表示できるようにするとか、あなたがプログラムを走らせているいかなる時のデータを保存するために書き込んだり、読み込んだりするようなことができます。

3.1.2. 私たちはどこに行くのか

プログラムを走らせている時に、コンピュータが瞬時に出力するのがまったく不思議に見えるかもしれない。しかしこの裏ではコンピュータがプログラムを理解できる形に変える別のプログラムを通して実行している。

最初は、Pythonのような言語をなぜ必要とするのか、なぜ私たちはコンピュータに私たちの言葉で命令できないのか戸惑うかもしれない。もし、私たちがコンピュータに「やあ、コンピュータさん、5掛ける3を教えてください」と入力したとしても、理解してもらえるかわからない。第一に、「掛け算」の意味がわからないだろう。そしてこの命令をどうやって実行してよいかさえわからない。コンピュータはすべての言葉の意味をしるはずがないし、できそうなことすべての成し遂げ方を知っているはずもない。人間の言葉を理解することがコンピュータにとって大変難しいということを人工知能の章で発見するだろう。世の中を理解し意味がわかる人間と違い、コンピュータは正確な命令のみついていくことができる。ゆえに、コンピュータが命令を”理解する”制限のある、あいまいでない言語が必要になる。前章でのように、こういったものでコンピュータに命令ができる。

しかしながら単純ではない、コンピュータはこれらの言語で直接指示して動かすことはできない。もっと低いレベルでは命令を実行するために物理的なハードウェアを使う。加減乗除や小さいとか大きいとか等しいとか単純な比較はトランジスタに含まれている物理的なコンピュータのチップを通じて電子的に2進の数として実行される。出力もまた2進数で表される。先ほどの単純な算術命令をするには速く安い回路でできるが、人々がコンピュータにやらせたい命令(”次のような文を出力して”とか”100かい繰返して”)はもう少し難しい回路になる。

Jargon Buster

確実さと速さを実現するため、コンピュータでは2値(高い電圧、低い電圧)からなる電子回路を使っている。このシステムではバイナリーと呼び、しばしば論文(レポート)では0と1を使って書かれる。5章データ表現には、2進について詳しく書いてあるので、もし2進をやったことがないなら最初の章だけでもちょっと覗くと参考になるだろう。

Python(またはJava, Basic, JavaScript, C などの)ような言語でする高いレベルの命令を理解するコンピュータを構築する代わりに、非常に限定的な命令セットだけができるコンピュータを構築する、そこで私たちは人間がプログラムを書く普通の言語で書かれた命令を電子回路が直接に実行できる単純な命令に変換するプログラムを書く。これらの単純な命令はよくマシンコードと関連付けられる低レベルのプログラミング言語である。

高レベルから低レベルへの変換は高レベルの命令を実行可能なマシンコード命令に置き換えるコンパイルをするか、それぞれの命令を1行ずつ変換するインタープリターで実行するかのどちらかである。実際には、たくさんの言語は両方をミックスして使っている、時には中間言語に置き換え、それからインタープリターしり。(Javaなどがそうである)私たちが簡単に見てきた言語Pythonはインタープリター言語である。C++など他の言語はコンパイル型である。コンパイルとインタープリターについては後ほどもっと触れていく。

私たちは手始めにプログラマーがコンピュータに命令するいくつかの他のプログラミング言語を見ていく、それから低レベル言語とコンピュータがどのように実際に命令を実行していくかを見ていき、最後に人間の書いた高レベル言語で書かれたプログラムを、コンピュータが実行できる低レベル言語にコンピュータがどのようにして変換するかについて話をしよう。

3.2. Machine Code (Low level languages)

コンピュータは物理的に回路の命令を実行しなければならない。これらの回路には入力に基づく正しい出力を得る特殊なやり方が設計されているトランジスタがある。

数のようなデータ(2進で表現される)は回路が処理をする際にレジスターと呼ばれる貯蔵場所に置かれる。値をレジスターにセットしたり、メモリーからのデータをレジスターに入れることができる。レジスターで一度だけ、加減乗除と等しいか、大小関係の比較ができる。出力はレジスターに置かれ、検索したり、先の算術演算で使われる。

すべてのコンピュータは機械語(命令セット)を持ち、さっき書いたように値をレジスターに入れるとか、あるレジスターの値で算術計算を実行するとか、結果を別の特殊なレジスターに入れるなどをコンピュータに伝える。機械語はメモリーから(レジスターの中や外)の値を読み込んだり保存したりする命令や、プログラムの特定の行に飛んだり(現在の行の前や後なども)する命令や(レジスターでの特別な値の比較をすることで)ある状態が起きた時に、その行に飛ぶ命令などを含む。単純な入力と出力を扱う命令や他のハードウェアと連携する命令もある。

それらの命令は高レベルの言語では見たことがないほどまったく違う。たとえば、次のプログラムはいくつかのコンピュータシステムに組み込まれているMIPSという機械語で書かれている。私たちはこの章を通じてMIPSを例として扱う。

それは2つの数を足すことで始まり(レジスタ$t0と$t1に値が置かれる)結果を出力する。次に”Hello World”と出力する。心配しないで、私たちはこの言語で実際にプログラムする方法を学んでもらうわけではない。

.data
str:  .asciiz "\nHello World!\n"
#You can change what is between the  quotes if you like

.data
str:  .asciiz "\nHello World!\n"
#You can change what is between the  quotes if you like

.text
.globl main

main:
#Do the addition
#For this, we first need to put the values to add into registers  ($t0 and $t1)
li $t0, 10 #You can change the 10
li $t1, 20 #You can change the 20
#Now we can add the values in $t0 and $t1, putting the result in special register $a0
add $a0, $t0, $t1
#Set up for printing the value in $a0. A 1 in $v0 means we want to print an int
li $v0, 1
#The system call looks at what is in $v0 and $a0, and knows to print what is in $a0
syscall

#Now we want to print Hello World
#So we load the (address of the) string into $a0
la $a0, str
#And put a 4 in $v0 to mean print a string
li $v0, 4
#And just like before syscall looks at $v0 and $a0 and knows to print the string
syscall

#Nicely end the program
li $v0, 0
jr $ra

このプログラムをオンラインMIPSエミュレーターを使って実行できる。実行するには2段階のステップを踏む:

  • コードをこのページの黒い四角に貼る(四角の中のすべてのテキストを消すこと)次にAssemble buttonをクリックする。
  • Assemble Outputの出力をこのページの四角に貼る(四角の中のすべてのテキストを消すこと)そしてSimulate Execution buttonをクリックするとページの上の方に結果が出力される。

プログラムの動く様子を見たければ、加算する数を変えれば良い。コメントはどこの数を変えられるか教えてくれる。出力する文字列を変えるのもそれほど難しくない。チャレンジ課題として、加算ではなく引き算はできるだろうか。ヒント:命令の名前は大概とても短い。残念ながらこのエミュレーターではサポートされていないので掛け算や割り算をすることができない。プログラムを変えた後で、先ほどのステップ1,2をもう一度たどるのを忘れてはいけない。

2段階のステップをなぜ実行するのかと不思議に思うかもしれない。なぜならコンピュータはビット1とビット0で動くので、命令は簡単な16進数に変換する必要がある。16進数は2進数の簡単な表示法である。コンパイルやインタープリターの処理でまごつかないでくれ。これらと違って、16進数で終わる1行のソースコードからの命令は一般的に非常に簡単である。

実行可能な命令を読んでいくなかで、気がつくことがあるかもしれない。それは、MIPSにはループ命令がないことだ。しかし、いくつかの命令を使うことでこの単純な言語でループを書くことが実際に可能だ。MIPSの様々な命令が書いてあるパラグラフを読んでみてください。この問題を解決する考えが思いつきますか?

その行へ飛ぶこと、分岐があったとき行に飛ぶことでループを実現できる!5から1までカウントダウンして「Go!!!!」と出力するプログラムはループを必要とするとても簡単なプログラムがある。Pythonでは3行で簡単なプログラムが書ける。

for i in range(5,0,-1): #Start at 5, count down by 1 each time, when we get to 0 stop
   print(i)
print("GO!!!!!")

しかしMIPSでは簡単にはいかない。値をレジスターに入れる必要があるし、ジャンプ命令でループを作らなければならない。
まず第一にどうやってループを作ったらいいのだろう。

完全なMIPSプログラムを示す。これを使って変えてもよい。

      .data        #Define the data strings
go_str:  .asciiz "GO!!!!!\n"
new_line: .asciiz "\n"

        .text
        .globl main  #Where should we start?
main:
        li $t0, 5    #Put our starting value 5 into register $t0. We will update it as we go
        li $t1, 0    #Put our stopping value 0 into register $t1
start_loop:      #This label is just used for the jumps to refer to
        #This says that if the values in $t0 and $t1 are the same that it should jump down to the end_loop label. This is the main loop condition.
   beq $t0, $t1, end_loop
      #These three lines prepare for and print the current int
   move $a0, $t0 # It must be moved into $a0 for the printing
        li $v0, 1
        syscall
   #These three lines print a new line character so that each number is on a new line
        li $v0, 4
        la $a0, new_line
        syscall
        addi $t0, $t0, -1 #Add -1 to the value in $t0, i.e decrement it by 1
        j start_loop  #Jump back up to the start_loop label

end_loop: #THis is the end loop label that we jumped to when the loop is false

   #These three lines print the “GO!!!!” string
        li $v0, 4
        la $a0, go_str
        syscall
      #And these 2 lines make the program exit nicely
        li $v0, 0
        jr $ra

Pythonのプログラムを変えて、10からカウントダウンするようにできるでしょうか?
5で止まるようにするにはどうしたらよい?何回か試行錯誤しなければならないかもしれない。

たぶんPythonのプログラムを改変するのはそれほど難しくない。MIPSのプログラムにも同じような改変ができるか確認してください。

もし、それが簡単なら、出力を1度でなく2度できますか。(Loopを使う必要はない)もし、それが簡単なら、「GO!!!!」を10回出力するのはどうですか?
ループを使わずにプログラムで行を10回繰り返すのは、ぞっとする実習なので、この課題にはループを使う必要がある。

きっと、さっきの変更についてはMIPSプログラムの方がより複雑で、変更が難しい。もし、MIPSのプログラムに正しく「GO!!!!」を10回加えられるなら、きっと素晴らしいプログラマーだ!

そして、これらすべてのポイントは何だろうか。これらの低レベルの手続きは退屈でちょっとばかばかしく思える。しかし、コンピュータは単純な課題なのでハードウェア上で直接実行できる。

ある言語をわかっているならプログラマーはその言語でプログラムを書け、コンピュータは特別なことをせず、直接それを実行できる。

わかったように、プログラムをこのやり方で書くととても時間の節約になる。

レジスタの中身を入れたり出したりして動かし、ジャンプや飛越文でループを実装し、あなたが考えたことのないような3行のパターンを使って文字列や数の出力をすることは、プログラムでのバグを起こさせないようにするためだ(わかりません!)

言うまでもなく、プログラムの結果は読むのも理解するのも非常に難しい。

なぜなら、コンピュータはプログラマーがするように直接指示を実行できないからである。この問題への異なる必要性に対する解は、プログラマーが使う高レベルのプログラミング言語をコンピュータが理解できる機械語に変換するコンパイラーかインタープリターを使うことだ。

最近ではこれらの言語でプログラムを直接書くプログラマーは ほとんどいない。コンピュータの黎明期には、機械語で直に書かれたプログラムは高級言語からコンパイルされたものより速いとされていた。それはコンパイラーが(高級言語のプログラムを)最小の最適化された機械語命令に変換するのが得意ではなく、機械語を書く訓練を受けた人が機械語で書いたほうがよかったからです。

しかし、今日ではコンパイラは大変性能がよくなり、人がやるよりもはるかにコードを最適化できる。結果として機械語で直にプログラムを書くことは、高級言語からコンパイルされたものより最適化されていないものになってしまった。レポートには低級言語の方が速いなんて書いてはいけません。

これで全部ではない。ここで扱ったMIPSコードはReduced Instruction Set Architecture (RISC)と呼ばれている。今日の多くのコンピュータはComplex Instruction Set Architecture (CISC)を使っている。これはコンピュータのチップはいっそう性能がよくなり、シングルステップよりもたくさんのことができるようになったということだ。

これはこの本の範囲をはるかに超えているが、RISCマシンの類ができることや、MIPSと高級言語の違いを理解することはこのレベルではすごいが、すべてのコンピュータ科学者やソフトウェアエンジニアにとっても素晴らしいことだ。

3.3. A Babel of programming languages

多くの異なるプログラミング言語があります。ここでは、言語が使われる目的の範囲を例示するために、言語をいくつか扱います。世の中にはたくさんすぎるほどの言語が有り、様々な目的で、それぞれに特化した特殊な利用法を見出した信者により支持されています。

これ以上についてはWikipediaを参照のこと。

3.3.1. Python

Pythonは広く使われている言語で、教育用言語としても人気がある。Pythonを最初の言語として学ぶ人は多い。イントロダクションではプログラミングを経験したことのない人のために、Pythonの例をいくつか示した。

しかし、元々はPythonはスクリプト言語とされていた。スクリプト言語はファイル入出力や反復的な試行をための文法を備えている。

Pythonの非常に強力な例として、あなたの先生が1年間に5回のテストをし、このようにそれぞれの結果を記録していたとしよう、それぞれの生徒の名前の後に点数が続く(生徒の数は6人以上)。何人かの生徒はすべての試験に参加しなかったので、点数が不足しているものもある。

Karen 12 12 14 18 17
James 9 7 1
Ben 19 17 19 13
Lisa 9 1 3 0
Amalia 20 20 19 15 18
Cameron 19 15 12 9 3

先生は、生徒のとった点数の平均を(5回の試験の総和も)知りたかったが、他にやることもあったので、そんなに時間はかけたくなかった。pythonを使えば、先生はたった10行未満のコードで素早く欲しいデータを生成できる。

raw_scores_file = open("scores.txt", "r") #Open the raw score file for reading
processed_scores_file = open("processed_scores.txt", "w") #Create and open a file for writing the processed scores into
for line in raw_scores_file.readlines(): #For each line in the file
   name = line.split()[0] #Get the name, which is in the first part of the line
   scores_on_line = [int(score) for score in line.split()[1:]] #Get a list of the scores, which are on the remainder of the line after the name
   average = sum(scores_on_line)/5 #Calculate the average, which is the sum of the scores divided by 5
   processed_scores_file.write(name + " " + str(average) + "\n") #Write the average to the processed scores output file
raw_scores_file.close() #Close the raw scores file
processed_scores_file.close() #Close the processed scores file

このプログラムは生徒の名前、得点の和、和を5で割ったものを含むファイルを生成する。もし、コンピュータにpythonが入っているなら、コードを試すことができる。上に示されているのと同じ形式で素点を"scores.txt"というファイルに置くだけです。ソースコードファイルと同じディレクトリにあれば、動くでしょう。

このプログラムはもちろん、様々な言語で書くことができるが、幾つかの言語は他の言語より遥かに簡単である。私たちが軽く触れた標準的なソフトウェア・エンジニアリング言語であるJavaは、そんな直接的なファイル処理はできない。Javaはプログラムがコケるのを避けるために、ファイル取得が失敗したらどうするかについてきちんと書くことを要求する。Pythonはそんなことは要求しない。その代わりにファイル取得に失敗した時、プログラマにどうするか聞いてくる。

これらのアプローチにはそれぞれ利点があります。先生にとっては試験の結果を調べるために素早くスクリプトを書くときに、プログラムがクラッシュするかなんて気にしなければ、そのためのコードを書かないのは理に叶っている。多くの人びとが使う巨大なソフトウェアシステムにとっては、クラッシュは不便であり、セキュリティ上のリスクである。そのシステムで働いているすべてのプログラマにこの潜在的なクラッシュを正しく扱うことをさせるなら、後に起こるたくさんのトラブルを避ける事ができるだろう。

ファイル処理が簡単であることに加えて、問題解決するためにいくつかの強力なビルトイン関数が用意されているので、クラスや関数の中にコードを書く必要すらない。たとえば、リストの合計を求めるものや、テキストの行を数のリスト(using a very commonly used pattern)に変換する関数がある。

Javaでの同じプログラムは少なくとも2倍の行のコードが必要だ。

Pythonに加えてたくさんのスクリプト言語がある。たとえば、Perl、Bash、Rubyといったものだ。ここに、あなたが出会うだろういくつかのものを紹介しておく。

3.3.2. Scratch

Scratchはどうやってプログラムをするか教えるために使われるプログラミング言語だ。ドラッグアンドドロップでプログラミングをするので、初学者はSyntaxに悩むことはないので、Sスクリーン上にあるキャラクタや他のスプライトを制御するプログラムに集中できる。

Scratchは教育用途であり、決して現場では使われない。もし、あなたがScratchを試してみようと思うなら、このリンクからダウンロードやインストールなしでオンライン版でできる。

★コンテンツは準備中です★

上の画像をクリックして、プロジェクトをロードし自分でやってみよう。

これは前に見たPythonやJavaのプログラムと同様のScratchのプログラムの例である。ユーザがストップと言うまで数を尋ね、与えられた数の平均を求める。

pl-scratch.png

そしてこれが緑の旗をクリックした時に表示される出力結果である。

pl-scratch-output.png

Scratchは簡単な計算や、ゲーム、アニメーションを作ることができる。しかし、他の言語のようなすべての性能を備えていない。

AliceやLogoは他の教育言語に含まれる。Aliceもドラッグアンドドロップで使うが、3D環境である。LogoはLispをベースとした大変古い多目的言語である。どこでも使われているのではないが、Scratchのようにスクリーンにペンで絵を描くタートルで有名である。Scratchのデザインは部分的にLogoに影響を受けている。

3.3.3. Java

これは平均のファイルを生成するPythonで見たのと同じ内容の(問題解決する)Javaのコードだ。

import java.io.*;
import java.util.*;
public class Averager
{
       public static void main() {
           try {
               Scanner scanner = new Scanner(new File("scores.txt"));
               PrintStream outputFile = new PrintStream(new File("processed_scores.txt"));
               while (scanner.hasNextLine()) {
                   String name = scanner.next();
                   Scanner numbersToRead = new Scanner(scanner.nextLine());
                   int totalForLine = 0;
                   while (numbersToRead.hasNextInt()) {
                       totalForLine += numbersToRead.nextInt();
                   }
                   outputFile.println(name + " " + totalForLine/5.0 + "\n");
               }
               outputFile.close();
           }
           catch (IOException e) {
               System.out.println("The file could not be opened!" + e);
           }
       }
}
  • C#, C++など他の汎用言語について

While the code is longer, it ensures that the program doesn’t crash if something goes wrong. It says to try opening and reading the file, and if an error occurs, then it should catch that error and print out an error message to tell the user. The alternative (such as in Python) would be to just crash the program, preventing anything else from being able to run it. Regardless of whether or not an error occurs, the "I am finished!" line will be printed, because the error was safely “caught”. Python is able to do error handling like this, but it is up to the programmer to do it. Java will not even compile the code if this wasn’t done! This prevents programmers from forgetting or just being lazy.

There are many other general software engineering languages, such as C# and C++. Python is sometimes used for making large software systems, although is generally not considered an ideal language for this role.

3.3.4. JavaScript

  • Webブラウザで使える
  • 似たような言語: Actionscript(Flash)

Note that this section will be completed in a future version of the field guide. For now, you should refer to wikipedia page for more information.

3.3.5. C

  • 高級言語のSyntaxを持つ低級言語
    プログラミングオペレーティングシステムとそこに埋め込まれたシステムのために一般的に使われます。
  • Cで書かれたプログラムは大変速いとされている(なぜなら、最適な機械語に容易くコンパイルできるように設計されているから)
  • Bug prone due to the low level details.必要がなければ、そんな状況では使わないのがよい。
  • 関連言語: C++
    

Note that this section will be completed in a future version of the field guide. For now, you should refer to wikipedia page for more information.

3.3.6. Matlab

  • 高度な数学(数値計算、線形代数、etc)に関連したプログラムを書くのに使われる
  • 有料
  • 関連する言語:Mathematica, Maple

Note that this section will be completed in a future version of the field guide. For now, you should refer to wikipedia page for more information.

3.3.8. Esoteric Programming Languages

誰もが自分のプログラミング言語を作ることができる。あなたの言語のSyntaxを見つけ、プログラムが走るようにパーサーとコンパイラーとインタープリターを書くことはすごく関連している。??人々が作ったほとんどのプログラミング言語は広くは使われていない。

実際に使われているプログラミング言語について加えて言えば、冗談としか言えないような多くの言語を作り、どれだけプログラミング言語が曖昧であるかの限界をテストしようとしてるかのようだ。さきほど触れた低級機械語の方がより論理的に見えるようなものもある。Wikipediaにそんな言語のリストがある。
http://en.wikipedia.org/wiki/Esoteric_programming_language

あなたはもしやりたければ、自分自身の言語を作ることができます。

3.4. How does the computer process your program?

PythonやJavaのようなプログラミング言語はプログラム自体を使って実行する。あなたのPythonプログラムを取り、それを走らせてみることは誰かが書いたプログラムを実行することなのだ。

コンピュータハードウェアは低級言語だけで実行できるので、プログラミングシステムはあなたのPython命令を機械語だけ使って実行する。インタープリター方式かコンパイル方式かの2つの幅広い選択がある。

この1983年のビデオはインタープリター方式とコンパイラー方式をよいたとえで説明している。

大きな違いはコンパイラーはあなたのプログラムをコンピュータ上で実行する機械語に変換するプログラムである。インタープリターはあなたのプログラムを1行1行読み、命令を理解し、直ちに実行する。

双方のアプローチにも利点があり、それぞれがいくつかの言語に他よりも適している。実際にほとんどの現代の言語はコンパイル方式とインタプリター方式を混ぜている。たとえば、ほとんどのJava言語はバイトコードと呼ばれるJavaよりも機械語に近い「中間言語」にコンパイルされる。バイトコードはインタープリターで実行される。

もしあなたのプログラムを広く配布するなら、普通機械語にしたいだろう。なぜなら、より速く動くし、あなたがインストールしている特定の言語のインタプリターをユーザが持つ必要がない。そして、誰かが機械語をダウンロードしても、オリジナルの高級言語のプログラムのコピーを入手されることはない。こういったことが起きる言語は、C#, Objective C(iOS機器にプログラムする), Java, Cである。

インタプリター方式のプログラムは大きな利点がある。それは全体のコンパイルを妨げることなく素早くテストができ、より簡単に何が起こっているかトレースすることができ、中身を見るために簡単な命令をタイプすることさえできるのである。このため、インタープリター方式は入門言語に広く使われている(たとえば、ScratchやAliceはインタープリターである)、簡単な仕事をするスクリプトのような簡単なプログラムもまたインタープリター方式で書かれ、素早くテストされる(たとえば、PHP、Ruby、Pythonはこういった状況で使われている)

下の図はいくつかの数をソートするプログラムを書いた時に、インタープリターとコンパイラーで起こることの違いを示している。コンパイラーはソートを行う機械語のプログラムを作り、データはソートした結果をうけとるために2つ目のプログラムに投入される。インタープリターはプログラムの命令に従って直ちに入力したものをソートする。コンパイラーはあなたが配布できる機械語のプログラムを作るが、プロセスの余分な段階を伴う。

画像の説明

3.4.1. Project

このプロジェクトの目標は、インタープリターとコンパイラーを使うプログラムの実行プロセスの比較である。

次の言語はインタープリターとコンパイルの両方が使えるので、あなたはまったく同じプログラムを使うことができる、そうでなければ、あなたはコンパイル用とインタープリター用の2つのプログラムを用意する必要がある。

  • Basic: QBasicとQuickBasicを使う
  • Gamemaker:オプションでインタープリター方式とコンパイル方式が提供される

さもなければ、あなたにとって役立つScratch、Alice、AWK、JavaScript、Python、Rubyのようなインタープリター言語を選ぶとよい。そしてあなたのシステムにあるC、C++、Visual Basic、Visual C#、Pascalのようなコンパイル言語を選べば良い。
2つのアプローチを混ぜて使われるとき、コンパイルとインタープリターが両方使われていることに気がつく必要がある。そのような言語はJava, Python, Perl, Greenfootである。

コンパイル言語で書かれたすでにあるプログラムから始めよう。(あなたが過去に書いたものや、ネットのものや、先生が書いたものでよい)。他の人へのメッセージの代わりにあなたの名前を書いたりして、あなたのものとわかるようにしよう。

あなたの理解を示すために、あなたは、コンパイルされたシステムで動作するために与えられたプログラムを得るために、何をしなければならないか、そして、高水準で低レベルの言語の役割がこのプロセスに何であるか述べなければなりません。変えられたら、再び動かすために何をしなければいけませんか。

前の例を使って、プログラムが書かれているプログラミング言語の特徴とコンパイルされたプログラム(低レベル)の特徴を述べなさい。異なる言語を比較し、対比しなさい。あなたの例でコンパイラの役割を説明しなさい。

同様にインタープリター言語で書かれた2つめのプログラムを用意しなさい。あなたがそのプログラムを実行するために何をする必要があるかについて述べて、それらを使ったところで2つのプログラミング言語の特徴について説明してください。

3.5. The whole story!

たくさんの新しい言語があり、新しいのがいつも発明されている。それぞれの新しい言語は言語を育て発展させるために新しいコンパイラーと(または)インタープリターを必要とする。幸いなことに、これを素早く手助けしてくれるよいツールがあり、いくつかの考えはFormal Languageの章で挙げている。そこには、正規表現と文法は言語を記述するために使われ、コンパイラは記述から自動的に作られるとある。

我々がこの章で議論した言語は、入門言語として通り過ぎがちのものかもしれない。しかし、大変重要なアプリケーションを持つ完全に異なったスタイルの言語がいくつかある。それは関数型プログラミングと呼ばれるアプローチで、すべてのオペレーションが数学的な関数として述べられている。関数的テクニックを使っている共通言語としてLisp, Scheme, Haskel, Clojure, F#があり、いくつかの便利な言語(Pythonのような)は関数型プログラミングの考えを含んでいる。純粋な関数型プログラミング・スタイルは副作用と呼ばれている問題を除き、プログラムが何をしようとしているかよりはっきりと簡単に確かめることができる。もう一つの重要なプログラミングの種類は論理プログラミングだ、そこではプログラムはどうするかと指示するより、何をすべきかというルールセットと考えることができる。一番有名は論理プログラミング言語はPrologである。

3.6. Further reading

3.6.1. Useful Links

  • The TeachICT lesson on programming languages covers many of the topics in this chapter
  • CS Online has a quick overview of this topic
  • Wikipedia entries on Programming language, High level language, and `Low level language <http://en.wikipedia.org/wiki/Low-level_programming_language>
  • website including posters comparing programming languages by Samuel Williams
  • tutorial comparing programming languages
  • a discussion of interpreters and compilers
  • a poster with full details of the file content in an executable file (the exe format)
  • David Bolton explains a Programming Language, Compiler, and the difference between Compilers and Interpreters.
  • Computerworld article on the A to Z of programming languages
  • What is Python? (compared with other languages)
  • A very large poster showing a timeline of the development of programming languages
  • Hello World program in hundreds of programming languages
  • 99 bottles of beer song in hundreds of programming languages

Computer Science Field Guide is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

Produced by Tim Bell, Jack Morgan, and many others based at the University of Canterbury, New Zealand.

powered by Quick Homepage Maker 5.1
based on PukiWiki 1.4.7 License is GPL. QHM

最新の更新 RSS  Valid XHTML 1.0 Transitional