見出し画像

Python と C++ の違いについて語ってみる【型宣言】

Python はまだ書き始めたばかりなんだけど、 C++ との差異が独特です。Python の特徴が逆に C++ の性質を際立たせて見せたりするところもあって面白い。

先日、数学の未解決問題の一つである「コラッツ予想」を Python と C++ の両方でプログラミングしましたが、とても興味深い作業でした。
関連記事をリンクしておきます。

そして今日は、変数の型宣言について。


Python に型宣言はありません。
Python でプログラミングした後に C++ でプログラミングしてみると、C++ にズラズラと並んだ型宣言は、かなり鬱陶しい。
しかも、リンク先のプログラムの型宣言は
unsigned long long」。
これは、長い!
C++ の中でも最長クラスです。
プログラムをパッとみて「うざっ」と思う人も多いでしょうねぇ。

「Python では型宣言がいらない」
おそらくこれは、かなり大きな特徴です。
ですが、C畑を耕してきた私にとってそれはある意味座りの悪いものでもありました。

「この変数とあの変数はい同じ?」
「この変数の有効範囲は?」
「この変数のサイズは? 8bit? 16? 32? 64?」

疑問だらけ(笑)。

参考までに、先のコラッツ予想プログラム C++ 版で、私は一度バグってます。
unsigned long long
でなくて
unsigned long
と書いたから。
10億までの数値を判定しようとすると
unsigned long
では足りなかったんですね。
VC では
unsigned long
は 32bit だったので。
なので、 64bit をカバーしてくれる
unsigned long long
に変更しました。

これは、 Python 版と結果を比較してわかった。
Python とは実行結果が違ったから。
逆に言うと、 Python は 64bit で計算しているということですね。
あ、いや、それもわからないか。
もっと大きいサイズかも?
それくらい、 Python はインタプリタ任せです。

C 、 C++ は、計算するプログラムを明記すると同時に、計算するためのメモリ領域も明記しなければなりません。
それが変数の型宣言です。
型宣言がないとコンパイル時にエラーとなります。
コンパイラが、どこのどの変数を使って演算していいのかがわからないためです。

「このメモリ領域を使って、この計算をしてくださいね」

そういうプログラムを書かなければなりません。

一方、 Python では変数の型宣言は不要です。
不要ではありますが、だからと言って変数のメモリ領域が不要だというわけではありません。
CPU が演算するためにはメモリは必ず必要です。
だから、 Python も必ずメモリを確保しています。
そして、確保するルールも、たくさんではありませんが、あります。
Python でプログラミングするにあたって、このルールの把握は必須でしょう。
でないと、
 この変数とこの変数が同じつもりだったのに違った
 この変数のデータが残ってると思っていたのに消えていた
というようなことが起きないとも限りません。

C において変数の型宣言は、設計にそれなりのウェイトを占めます。
だから煩わしいとも言えるのですが、
 変数のサイズ
 変数のアクセス可能範囲
 変数の有効期間
というのはとても重要です。

この重要性は、おそらく、どのプログラミング言語でも同じです。

Python では変数の宣言が不要だからと言って、変数のメモリ領域が確保されないというわけではありません。
むしろ、 C などよりも、もっと大きい領域を使用しているでしょう。

C で、
char i = 0;
と書けば、ぽっきり1バイトしか使われません。
いや、もしかしたら、
「レジスタを使ってメモリを使わない」
というコンパイラも多いやもしれません。
いずれにしても、それ以上でも以下でもない。

でも、 Python で
i = 0
と書けば、おそらく数十バイトは消費されそうです(とは言うものの、 Python で変数にどのくらいのサイズを確保しているのか、私にはわからないんだけれども)。
Python には見えない管理領域がある。
プログラマーには触れられない領域がある。

C は、変数の宣言は煩わしいけれど、 CPU に近い言語だと感じる時がある。
CPU を制御しているという実感がある。
CPU というモノを手中にしている感触がある。
CPU が私のこの手のなかにある。
そう実感する時が、確かにあります。

「よし、動かしてやろうじゃない」

そんな風に感じるときが、とても楽しい。

この記事が気に入ったらサポートをしてみませんか?