全部で13回の連載となりましたが、2週間ごとの連載でしたので、あっという間に終わってしまった感じがあります。本当は、読者からの質問を受けつつダラダラと続けながら、ちょっとだけVBプログラマが良い気持ちになれるようにして行ければ良かったと思います。ちょっと残念。
素数を知るために実行するものではなく、マシンやコンパイラや実行環境の速度比較などに使うものです。そのため同じ計算を指定回数繰り返します。デフォルトでは、100000までの素数を10000回繰り返します。オプション指定をしない場合、計算だけして何も出力しません。
Module Module1
Private Const repeatCountDefault As Integer = 10000
Private Const sizeDefault As Integer = 100000
Private Sub usage()
Console.Error.WriteLine("usage: prime [-d][-l][-c][SIZE][REPEAT_COUNT]")
Console.Error.WriteLine("options: -l list all primes")
Console.Error.WriteLine(" -c output number of primes")
Console.Error.WriteLine(" -d output time of process")
Console.Error.WriteLine("SIZE default is " + sizeDefault.ToString())
Console.Error.WriteLine("REPEAT_COUNT default is " + repeatCountDefault.ToString())
End Sub
Function Main(ByVal args() As String) As Integer
Dim outputList As Boolean = False
Dim outputCount As Boolean = False
Dim outputSpan As Boolean = False
Dim repeatCount As Integer = repeatCountDefault
Dim size As Integer = sizeDefault
Dim notOptionCount As Integer = 0
For i As Integer = 0 To args.Length - 1
If args(i) = "-?" Then
usage()
Return 2
End If
If args(i) = "-l" Then
outputList = True
ElseIf args(i) = "-c" Then
outputCount = True
ElseIf args(i) = "-d" Then
outputSpan = True
Else
Select Case notOptionCount
Case 0
size = Integer.Parse(args(i))
Case 1
repeatCount = Integer.Parse(args(i))
Case Else
usage()
Return 2
End Select
notOptionCount += 1
End If
Next
Dim startTime As DateTime = DateTime.Now
Dim flags(size - 1) As Boolean
For r As Integer = 0 To repeatCount - 1
ReDim flags(size - 1)
For i As Integer = 2 To size - 1
If Not flags(i) Then
For j As Integer = i * 2 To size - 1 Step i
flags(j) = True
Next
End If
Next
Next
Dim endTime As DateTime = DateTime.Now
If outputList Then
For k As Integer = 2 To size - 1
If Not flags(k) Then Console.WriteLine(k)
Next
End If
If outputCount Then
Dim count As Integer = 0
For k As Integer = 2 To size - 1
If (Not flags(k)) Then count = count + 1
Next
Console.WriteLine("found: " + count.ToString())
End If
If outputSpan Then
Console.WriteLine(endTime.Subtract(startTime).ToString())
End If
Return 0
End Function
End Module
もちろん、ずっとVB6を使ってきて、他のプログラム言語を知らないVBプログラマが、そのままでVB.NETを正しく使いこなし、そこに秘められたパワーを発揮できるとは思っていません。その点で、VBプログラマは勉強をする必要に迫られていると思います。おそらく、勉強をしてそのハードルを超えていくVBプログラマもいると思うし、残念ながら勉強しないVBプログラマもいることでしょう。
しかし、それはVBプログラマに限った問題ではありません。人生は死ぬまで勉強ですが(もちろん、学校に通うとか教科書を読むという意味ではなく)、学び続ける人もいれば、学ぶことをやめてしまう人もいます。VBプログラマが直面していることは、それと同じに過ぎないと思います。
ですから、もし勉強してハードルを乗り越えていこうと思う人達が、たとえ少人数でもいるのなら(願わくば大人数であって欲しいものですが)、それを応援する価値があると思います。