Pythonの動作原理

<h1>Pythonの動作原理</h1>
Pythonで計算したりprintを使ったりするとこれはどうやって
動いているのかと疑問を持つことがあることだろう

普段何気なく打っているプログラムの動作原理は知らなくても
Pythonは動かすことができると思うが、どのように動いているかを
おおまかにでも知ることによって役立つこともあるだろう

それではPython はどのように動いているのか調べてみようと思う

<h1>１．インタプリタ言語とコンパイラ言語</h1>
コンピューターは人間が書いたプログラムをそのまま実行するのではなく
必ず機械語に翻訳してから実行する必要がある。
その翻訳方法としてインタプリンタとコンパイルがある

両者の違いは一括ですべてのプログラムを変換するか、一行ずつプログラムを変換するかの違いになっている。

コンパイラ言語の例としてはc言語などが挙げられ
インタプリンタ言語の例としてはPythonやjavaなどが挙げられる

じゃあPythonは一行ずつ機械語に翻訳して実行しているのだなと思うが実際は異なりバイトコードという呼ばれる中間コードを生成し、それを仮想マシンで実行しエミュレートして実行している


<h1>２．Pythonの実装の種類</h1>
１でバイトコードを生成しとか仮想マシンで実行してとか出てくるが
それらはどこでだれがやっているのかという疑問が出たと思う。
そのぎもんには以下で答える。

Pythonという言語はひとつだけれど、その言語の機能を実現するための方法はひとつではない。CPythonとかPyPyとか、これらはPythonという言語の、実装に対する呼称だ。

今回はPythonの原作者が実装していて、世の中のPython実行環境は大体これという、最も一般的なCPythonについて述べていこうと思う

実装とは
あるプログラム言語をどのように機械語に翻訳して実際に実行するかを決めたもの

<h1>３．CPython</h1>
CPythonとは、c言語で書かれたバイトコードインタプリンタである
CPython環境下ではソースコードをバイトコードに変換（コンパイル）してから仮想マシン（インタプリタ）が実行している
<br>

<dl>
<dt>山口さん：<dt>
<dd>こんなことやってたら処理が遅くなっちゃうよ<dd>
<br>


<dt>ライオン先生：<dt>
<dd>そう思うのも無理はないね、でも実際はこのひと手間を加えることで<dd>
<dd>処理が速くなることが分かっているよ<dd>
<br>
<dd>しかもこのひと手間を加えることによってたくさんの利点があるんだ<dd>
<br>

<dt>山口さん：<dt>
<dd>えー気になる～<dd>
<br>

<dt>ライオン先生：<dt>
<dd>具体的にはバイトコードをキャッシュとして残せば構文解析など<br>大部分の処理を2回目以降は行わずに済むことなどがあるね<dd>
</dl>

<h1>４．まとめ</h1>
Pythonは主にCPythonというバイトコードインタプリンタを使用してそのプログラムを一度バイトコードという仮想マシンが読めるバイナリーデータに変換、仮想マシンが実行、その結果をエミュレートして実行している

エミュレートとは
ある装置やソフトウェア、システムの挙動を別のソフトウェアなどによって模倣し、代替として動作させること。代替となるソフトウェアなどのこと

<h1>５．今回調べて分かったこと</h1>
・PythonはPythonのまま動いていると思っていたが実際はC言語で書かれたものを使って機械語に翻訳して動作しているということ

・よくPythonは遅くてc言語は早いというがその原因がpythonの変換の多さ、c言語の機械語に一発翻訳できるところだと分かった

・よくpythonはインタプリンタ言語というが内部的にはコンパイルも行っておりそこら辺の区別は意味があまりないこと

５．最後に
今回調べてみたら面白いエピソードがあったので紹介する

余談：機械がやるべきこと、やるべきでないこと
今でこそ「面倒な単純作業は人間ではなく機械にやらせるべき」という考えが(たぶん)浸透しているが、昔は計算機は非常に高価であり、その計算時間は貴重な資源であった。アセンブリを機械語、つまり数字の羅列に変換するのを「アセンブル」と呼ぶが、それを人間が手で行うことを「ハンドアセンブル」と言う。計算機が使われ始めた当初は、もちろんアセンブラなどなかったから、みんなハンドアセンブルをしていた。さて、世界で初めてアセンブラを作ったと思われているのはドナルド・ギリース(Donald B. Gillies)である。1950年代、ギリースは、フォン・ノイマンの学生だった時、アセンブリを機械語に自動で翻訳するプログラムを書いていた。ギリースがアセンブラを書いているのをフォン・ノイマンが見つけたときのことを、ダグラス・ジョーンズという人が以下のように紹介している。
John Von Neumann’s reaction was extremely negative. Gillies quotes his boss as having said “We do not use a valuable scientific computing instrument to do clerical work!” (I wish I could reproduce Gillies’ imitation of Von Neumann’s Hungarian accent, he was very good at it!)
(筆者による訳)
ノイマンの反応は極めてネガティブだった。ギリースはボス(ノイマンのこと)の口真似をしながらこう言った「我々は貴重な科学計算機をそのようなつまらない仕事に使うべきでない！」 (ギリースの口真似を再現できたらと思う。彼はフォン・ノイマンのハンガリー訛りの英語の真似がすごく上手いんだ)
現在、「AIが人間を超える(シンギュラリティ)」とか「AIにより人間の仕事が奪われる」とかいった、一種の終末思想が盛んに喧伝されている。私はAIの専門家ではないので、将来どうなるかはわからない。しかし、AIは人間が作るものである。自動車が普及することで運転手という職業ができたように、「AIが人間の可能性を奪う」という「引き算の考え」よりは、「AIと人間の組み合わせで新たな可能性が生まれる」と「足し算の考え」でポジティブに考えたい。おそらくそのほうが生産的であろう。
参考URL: https://kaityo256.github.io/python_zero/howtowork/index.html

６．参考
https://qiita.com/0yoyoyo/items/f650b38407370128ff90
https://kaityo256.github.io/python_zero/howtowork/index.html
https://jp.quora.com/Python%E3%81%AE-%E5%85%AC%E5%BC%8F-%E5%AE%9F%E8%A3%85%E3%81%AFC%E8%A8%80%E8%AA%9E%E3%81%A7%E8%A1%8C%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8C-%E3%81%9D%E3%81%AE%E7%90%86%E7%94%B1%E3%81%AF
https://e-words.jp/w/%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html