プログラミング言語探訪Python
昨今のAI関連のあれこれで何かと関連付けられる言語がPythonです。
比較的有名な生成AIサービスのAI本体がPythonで書かれているのは割と有名な話ですし、数年前から「AIといえばPython」と言わんばかりに、書籍やサイトが乱立していたのは記憶に新しいですね。
あとは高校くらいの情報教育だとPythonがよく使われているとか。とある事情で、出版前の情報教育の教科書……要するに原稿を見せてもらったことがあるのですが、そこでもPythonが使われていました。今はどうか知りませんが、そのくらいよく使われているようです。
では、最近生まれた言語なのかというとそうでもなく、歴史をたどると1989年に生まれた言語なんだとか。
意外に古いな!
元々の設計思想が「読みやすくて使いやすい言語」ということで、既に世に出ていた各種言語のいいとこ取りをしつつ、複雑になりすぎないように設計された言語で、オブジェクト指向の考えを持ちつつ、Javaのように「全てをオブジェクトに」と言うほど強くない、性質的にはC++に近い言語です。オブジェクト指向の考え方を使いたいなら使えばいいが、使うつもりがないなら別に構わない、そんな感じ。
あとは「使いやすい」のために、コンパイルの概念が緩いのも特徴と言えば特徴。ほとんどの実装で明確な「コンパイル」の手順がないので、インタプリタ型の言語かと思いきやそうではない。
python program01.py
のように実行すると、ソースコードを内部でコンパイルして、全てバイトコードに変換してから実行されます。バイトコードの考え方はJavaも同じ考え方を持ってますが、Javaより古い言語だな……と思ったら、どうやらバイトコードに変換する形式は二千年代に入ってからとか。その頃に触れていたわけではないからよくわからんな。ちなみにバイトコード式になっているかどうかも実装次第。ものによっては実行環境の機械語までコンパイルするものがあるかと思えば、C言語に一旦変換してコンパイルする実装もあるとか。色々あるものだなと感心しますね。
さて、Pythonの特徴と言えば、ソースの書き方です。
こんなプログラムを実行してみると……
for i in range(3):
print(i)
print("繰り返し中です")
実行結果はこんな感じ
1
繰り返し中です
2
繰り返し中です
3
繰り返し中です
ところがこれを……
for i in range(3):
print(i)
print("繰り返し中だよ")
こう変えると、エラーになってしまい、
for i in range(3):
print(i)
print("繰り返し中?")
こう変えると、動きが変わります。
1
2
3
繰り返し中?
ソースのインデント、字下げがif文やループ文のブロック構造を作るという言語なんですね。こういう言語って他にどんなのがあるか調べてみたところ、五個ほど見つかりました。あまり数はないようです。
まあ、わからなくもないです。
このインデント、タブでもスペースでもできるのですが、スペース四個=タブ一個でもないし、混在させるとエラーになります。
例えば先ほどのプログラム、
for i in range(3):
[タブ文字]print(i)
[空白8文字]print("繰り返し中なのか?")
これはエラーになるんですね。エディタによってはタブをスペースに自動変換する設定もあったりするのであまり問題ないらしいのですが、ちょっとな……と個人的には思います。
あとは行が長くなったときに改行する方法。カッコで囲んでやれば改行できるのですが……
if a > 10 and b < 20 and c == d :
↑↓は同じ
if ( a > 10
and b < 20
and c == d
) :
わざわざカッコが必要になる、というのは古い言語に戻ってる感じがして、ちょっともやっとします。
さて、そんなPythonがなぜ最近AIでよく使われているのかというと、Python用のデータ分析ライブラリが大量に開発されたからです。まあ、リスト処理とか強かったりするので、ライブラリが多く作られるのはよくある話で、多く作られるからよく使われる。よく使われるからさらに多く作られるという循環ですね。この辺、最初からAI開発を目指して作られたLispとは事情が違います。あと、Python本体の実行速度は比較的遅い方。
なので、部分的にC++やRustを併用しつつ、ライブラリ自身はC/C++/Rustで作られていたりするので、
「このAIはPythonで作られています」
というのはなんかちょっと違う気もします。まあ、最近のシステムはとある特定の言語で作るということ自体が減ってきているので、こういうのはよくある話です。それこそ有名どころの生成AIチャットだと、フロントエンド、つまりプロンプトを受け付けて結果を返す部分はReactだとかNext.jsだとか色々。AI自体もPythonだけでなく、RustやらGoやら組み合わせているらしいです。あくまでも公開されている情報の範囲ですが。
で、作者もPythonを色々使っているのですが、難しいのが「○○をするときにどのライブラリを使うか」ですかね。やりたいことの内容によっては複数のライブラリがあって、どれを使っても似たような結果になるので、どれを使ったらいいのか……となる。んで、「じゃあこれにしようかな」とやろうとすると、微妙に「この場合のステータスが得られないのか」となったりする。そして当然ながらライブラリによって引き渡すパラメータが違っていて、「え、このパラメータ要らないんだけど?省略とかできないの?」となったりする。ライブラリの設計思想に基づく話なので、どれが良い悪いとかではないのがなんとも。そして今後も使い続けるかというとちょっとな、とも思ってます。どちらかというと、ゴリゴリ機械に近いところをかすめていくようなプログラムが好きなので。




