CPUの進歩でよみがえるBASIC言語
CPUの進歩でよみがえるBASIC言語
一昔前までは,パソコンでプログラム言語としてBASIC言語を使っていた.私も研究ではワープロ以外は自分で作ったプログラムを利用していた.分子軌道計算もBASIC言語で書かれたものをパソコンの機種に合うように書き換えて使用していた.学生の情報処理実習もBASIC言語による実習をずっと続けてきた.
最近はプログラムは既製品を購入するものであり,アプリケーションの使い方を知ることが情報処理能力になってしまった.ところが,Javaスクリプトを利用したホームページの制作,あるいはパソコンをもっと便利に使いたいとなるとスクリプト処理が必要になる.そのような時にBASIC言語等によるプログラミング経験があると簡単に対応できる.
しかし,BASIC言語はインタプリタ方式,すなわち実行すると1行づつ翻訳する必要があるため,時間がかかり処理が遅い.描画など処理速度が問題になる場合は使い物にならないと言われ次第に使われなくなってしまった.ところが,最近のCPUの処理速度は当時のものに較べると格段に速い.ひょとしたら描画だって捨てたものでないはずと思い,WEBを調べるとWindowsマシン専用だった十進BASICがIntel Mac用まで整備されて公開されていた.
図に示すプログラムおよび実行例は6員環の半径と色,さらに中心位置を変えながら240個描画する16行のプログラムである.子供の頃,麦わらで編んだかごのイメージを描かせてみた.Core 2 duo 2GHzのMac Miniで0.1秒で描画してくれた.Core i7 2600Kでは0.02秒であった.チンタラチンタラ描くBASICのイメージとはまったく異なる速度である.私立大学ではまったく予習復習しないため,「入出力」.「分岐」.「繰り返し処理」などの基礎文法まで教えるのがやっとで,グラフィック処理のことろまでは教えることができなかった.面白味はこれからというところで定期試験突入,国家試験にも関係ないので,試験が終わると何をやったかさえ覚えていないという状況が続いた.学生の能力に大幅な差があり足並みを揃えるのが難しいので,授業終了後も演習できるようにしたがアルバイトがあるからとさっさと帰ってしまう始末である.卒後教育で教える手もあるが,教員に教えた経験からするとおそらく対応できないだろう.プログラミングは20歳までに習得すれば後は自転車の運転と同じであるが,機を逸するとまったくだめである.
十進BASICは白石和夫氏によって大学の数学教育用に作られた言語であり,JIS規格にも準拠している.アルゴリズムを分かりやすく記述できるので,大学教育には必須と思っているが経験したことのない教員にはワード,エクセルで十分,それ以外は不要と言われ続けた.それでもモッコスぶりを発揮して定年まで続けられたのは助教授以下賛同してくれたおかげである.(2012/1/14)
追記
Mac用でも使用できる別のBASIC言語を紹介しておきたい.
(Chipmunk BASIC を利用) 「フロンティア電子密度のグラフィック表示」
「自由電子模型法で共役ポリエンの軌道係数」を求めるプログラムである.実行するとπ電子の数を聞いてくるので,4を入力するとブタジエンの各原子の軌道係数や電子密度が計算される.塗りつぶしたサークルを半径を変えて描かせている.赤,青は正負である.
5' free electron model
10 input n
15 dim c(n,n)
18 print"Eigenvalues"
20 for i = n to 1 step -1
30 print i;
40 for j = 1 to n
50 a = i*j*180/(n+1)
60 d = 3.141592*a/180
70 wh = sin(d)
80 c(i,j) = sqr(2/(n+1))*wh
90 print using "###.###";c(i,j);
100 next j
110 print
120 next i
125 print
128 print"Electron densities"
130 for i = n to 1 step -1
132 print i;
135 for j = 1 to n
140 ed = 2*c(i,j)*c(i,j)
150 print using "###.###";ed;
160 next j
165 print
170 next i
200 graphics 0
210 for i = n to 1 step -1:'input a$
220 for j = 1 to n step 1
230 c = abs(c(i,j)*30)
235 graphics moveto j*30,300-i*30
236 if c(i,j)<0 then
238 graphics color 0,0,100
250 for r=0 to c:graphics circle r:next r
255 else
258 graphics color 100,0,0
260 for r=0 to c:graphics circle r:next r
270 endif
280 next j
285 graphics moveto j*30,300-i*30+5:graphics drawtext str$(i)
290 next i
300 end
>run
? 4 ブタジエンの計算
Eigenvalues
4 0.372 -0.602 0.602 -0.372
3 0.602 -0.372 -0.372 0.602 ---- LUMO
2 0.602 0.372 -0.372 -0.602 ---- HOMO
1 0.372 0.602 0.602 0.372
Electron densities
4 0.276 0.724 0.724 0.276
3 0.724 0.276 0.276 0.724
2 0.724 0.276 0.276 0.724
1 0.276 0.724 0.724 0.276
(十進BASICを利用) 分子構造を描く基本プログラム
回転角はデータ文の最後尾で指定できるようにしている.原子間の距離をすべて計算し,1~1.6Åの範囲にある場合は結合を描き,原子の色はデータ文から文字で読み取った.
結合を複数の線で結ぶ等の変更を行うと立体感が増す.
実行に要する時間は0.14秒である.
!molecule drawing program
SET WINDOW -5,5,-5,5
SET LINE COLOR 1
OPTION ANGLE DEGREES
data 25
data C, 0.170273, 1.520767, 1.217438
data C, 0.308716, 2.104233, -0.059952
data H, 0.968262, 1.404404, 1.915527
data C, -1.099945, 1.007248, 1.363449
data C, -0.865906, 1.991257, -0.753906
data H, 1.226089, 2.481018, -0.454239
data H, -1.531219, 0.657272, 2.276428
data C, -1.204086, -0.737076, 0.153671
data C, -1.925200, 1.616852, 0.244934
data C, -0.943344, -0.262207, -1.128555
data H, -1.082535, 2.406600, -1.712555
data O, -3.121887, 1.741348, 0.172882
data H, -1.797089, -0.058090, -1.745789
data H, -2.249634, -0.833527, 0.389038
data C, 0.306198, -0.453079, -1.862076
data H, 0.228989, -0.237946, -2.913193
data C, -0.358673, -1.794296, 0.859955
data C, 1.504089, -0.815979, -1.411530
data H, 2.302780, -0.861160, -2.130051
data C, 1.126938, -1.534653, 0.952606
data H, -0.753174, -1.930359, 1.859940
data H, -0.519028, -2.734787, 0.333862
data H, 1.572388, -1.716339, 1.913879
data C, 1.905792, -1.139800, -0.036545
data H, 2.958908, -1.037933, 0.158127
data 50,0,0
read n
dim a$(n),x(n),y(n),z(n)
for i=1 to n
read a$(i),x(i),y(i),z(i)
next i
read xx,yy,zz
for i=1 to n
LET A1= x(I)
LET A2= y(I)*COS(XX)+z(I)*SIN(XX)
LET A3=-y(I)*SIN(XX)+z(I)*COS(XX)
LET B2= A2
LET B3= A3*COS(YY)+A1*SIN(YY)
LET B1=-A3*SIN(YY)+A1*COS(YY)
LET x(I)= B1*COS(ZZ)+B2*SIN(ZZ)
LET y(I)=-B1*SIN(ZZ)+B2*COS(ZZ)
LET z(I)= B3
next i
for i=1 to n
for j=i to n
if (x(i)-x(j))>1.55 or (y(i)-y(j))>1.55 or (z(i)-z(j))>1.55 then
go to 10
end if
LET d=sqr((x(i)-x(j))*(x(i)-x(j))+(y(i)-y(j))*(y(i)-y(j))+(z(i)-z(j))*(z(i)-z(j)))
! print d
if d<1.6 and d>1.0 then
plot lines: x(i),y(i);x(j),y(j)
plot lines: x(i)+0.02,y(i)+0.02;x(j)+0.02,y(j)+0.02
end if
if a$(i)="H" then
SET AREA COLOR 5
DRAW circle WITH SCALE(1,1)*ROTATE(0)*SCALE(0.1)*shift(x(i),y(i))
elseif a$(i)="O" then
SET AREA COLOR 4
DRAW circle WITH SCALE(1,1)*ROTATE(0)*SCALE(0.2)*shift(x(i),y(i))
else
SET AREA COLOR 8
DRAW circle WITH SCALE(1,1)*ROTATE(0)*SCALE(0.15)*shift(x(i),y(i))
end if
10 next j
next i
PICTURE circle
DIM P(18,2)
FOR t=1 TO 18
LET P(t,1)=1*cos(20*t)
LET P(t,2)=1*sin(20*t)
NEXT t
MAT PLOT AREA: P
mat plot lines:p
END PICTURE
end