2023年06月10日くいなちゃん


6さいからのプログラミング」第11話では、世の中の実際のプログラムがどのように作られているのかを紹介します。

1世の中のプログラムに使われる技術

世の中のプログラムに使われる言語や技術は流行り廃りが激しいため、ここで紹介するものも今後時代遅れになるかもしれません。 しかし未来とは全く新しいところから湧くのではなく、常に今の積み重ねで現れますので、どういう流れなのかを把握しておくと新技術にも適応しやすくなるでしょう。

2Windowsプログラム

Windows上で動く、ウインドウやボタンで構成されたツール系アプリは、かつては「Visual Basic」や「Delphi」などの言語で作られていましたが、現在では「Visual Studio」というアプリを使って「C#」で作られることが多いです。
これらの言語では、視覚的にウインドウ上にボタン等を配置して、「このボタンが押されたときにこの処理を行う」という内容を組み合わせてプログラムを作成します。(図2-1)。
イベントドリブン
図2-1: イベントドリブン
補足

最近ではWPFと呼ばれる枠組みで開発されることも多いですが、ここではWinFormsと呼ばれる枠組みで例示しています。

図のプログラムは、ボタンが押されたときに「Hello, world!」と表示するC#のソースコードです。
このように「○○されたとき××を行う」という組み合わせでプログラムを作ることを「イベントドリブン」といいます。 またプログラムの規模が大きくなると、データと見た目を分離する「MVVMエムブイブイエム」などの手法も使われることがあります。
C#で作成したプログラムは、「.NET Frameworkドットネットフレームワーク」や「.NET Coreドットネットコア」と呼ばれる一種の仮想マシンの上で動作します(図2-2)。
仮想マシン
図2-2: 仮想マシン
.NET Frameworkや.NET Coreは、ウインドウやボタンを作成する機能などが詰まった便利なプログラム群で、OSの上に構築されています。 これによりC#で作る各アプリはプログラムを簡単にすることができます。
ただし何らかの理由で.NET Frameworkなどを使いたくない場合は、C++を使ってOSと直接やりとりするプログラムを書くこともできます。 この方法は比較的大変で、例えばC#であればVisual Studio上で1行もプログラムを書くことなくウインドウが表示できますが、C++で直接書くとウインドウを表示させるだけでも50行程度になります(図2-3)。
C++でウインドウを表示させるプログラム
図2-3: C++でウインドウを表示させるプログラム
Mac OSやLinuxなど、Windows以外のOSでも動作させる場合は、Javaなどの言語で作られることもあります。 Javaのように、1つのプログラムを作るだけで複数のOSや環境で動作することを「マルチプラットフォーム」と言います。

3ゲームプログラム

次はゲームプログラムについてです。 高度なグラフィックスのゲームを作るには、計算がCPUだけでは処理しきれないため、グラフィックスの計算に特化した「GPUジーピーユー」という装置を併用します。

補足

ゲーム以外のツール系アプリでもGPUは活用されます。 特に人工知能や機械学習の分野では高速化のためにGPUがよく使われています。

図3-1: &h
GPUはプログラム中から「OpenGLオープンジーエル」もしくは「DirectXダイレクトエックス」などのソフトウェアを通じて操作することが一般的です。 また、GPUはCPU向けの機械語を読み込めないため、CPU向けのプログラムとは別に、GPU専用の「シェーダ」と呼ばれるプログラムを作る必要があります。
シェーダはC言語などで書くことはできず、シェーダ専用の言語で書かれます。 現在では、OpenGLであれば「GLSLジーエルエスエル」、DirectXであれば「HLSLエイチエルエスエル」などの言語で書かれるのが一般的です。
ゲームプログラムは図3-2のように、主に「CPUの処理→GPUの処理→画面に表示」のサイクルを何度も繰り返すことで実行されます。
ゲームプログラム
図3-2: ゲームプログラム
このサイクル1回分のことを「1フレーム」と呼び、一般的なゲームでは1秒間に60フレームや30フレーム、もしくは可変フレームで実行されることが多いです。
近年ではゲームをプログラミング言語で一から作るのではなく、ゲームを容易に作ることができる「Unityユニティ」などの「ゲームエンジン」と呼ばれるソフトウェアが利用されることも多いです。

4Webプログラム

次はWebプログラムについてです。 Webサイトは、サーバで処理したWebページを閲覧者の端末に送って、Webブラウザ上で表示する仕組みです。 このため、サーバ側Webブラウザ側との両方でプログラムを動作させることができます(図4-1)。
Webプログラム
図4-1: Webプログラム
サーバ側は「Perlパール」「PHPピーエイチピー」「Pythonパイソン」「Rubyルビー」などの言語で書かれることが一般的で、アクセスのたびに異なるWebページを生成することができます。 例えば図4-2の現在日時は、このWebサイトのサーバ上で生成しており、アクセスするたびに変化します。

"Jun 10, 2023 - 15:36:55"

図4-2: サーバ側で生成した現在日時
Webブラウザ側は、かつては「Flashフラッシュ(ActionScriptアクションスクリプト)」などの技術も使われていましたが、現在では「JavaScriptジャヴァスクリプト」が主流です。 これらはWebページに埋め込まれて送信され、閲覧者の端末上で動作するため、閲覧者がページを読み込み直さなくてもページを更新することができます。 例えば、図4-3の値はあなたの端末上で生成して更新しています。

""

図4-3: Webブラウザ側で生成した値
JavaScriptを直接書くのはやや大変なので、様々な便利なフレームワークが使われることも多いです。

5組み込みプログラム

次は組み込みシステムについてです。 PCのような汎用的なコンピュータではなく、炊飯器に組み込まれたコンピュータのような、特定の目的に特化したハードウェアとプログラムを合わせたものを「みシステム」といいます。
組み込みシステムのプログラムでは、限られたハードウェア資源を効率良く活用することが要求されます。 そのため、時にはプログラムの読みやすさを犠牲にしてでも処理効率が良くなるように工夫したり、アセンブリ言語で書く必要が生じることもあります。
組み込みシステムはPCとは違い、ハードウェアの設計から開発者が行えることが多いため、ソフトウェアでの工夫に限界があるときはハードウェアの工夫で補うことができる自由さがあります。 逆に、あまりに負荷の大きいプログラムを書くと発熱が問題になるなど、ソフトウェアがハードウェアの制約に縛られることもあります。

6複数人開発の手法

さて、ビジネスなどにおいてプログラムの多くは複数人で開発されますが、全員が理解できるプログラムを維持したり同じ目標を共有しなければ破綻するため、個人制作とは違った難しさがあります。
また大規模開発になると、プログラムのすべてを読むことがほとんど不可能になるため、いかにプログラムの一部を理解して編集し、バグを多く発見するかといった方法が求められます。 これらは「ソフトウェア工学こうがく」という分野で研究が進んでおり、(実際にはしばしば妥協されますが)現実的に有用そうだと思われる範囲で開発に採り入れられます。
複数人で大規模開発を行う際によく用いられる手法の一例を、図6-1に挙げました。
  • コーディング規約

誰が書いても同じようなソースコードの見た目になるように、「コーディング規約きやく」と呼ばれる書き方のルールを定めます。 例えば、「関数名の先頭は大文字にする」など。

  • 仕様の明文化

機能ごとに、それがどういう機能であるかというルールを文書化します。 これらのルールを「仕様しよう」と呼びます。 機能を実装する人は仕様を満たすように制作し、機能を利用する人は仕様を信頼して使うことで、バグがあった場合に責任の範囲を明確化できます。

  • テスト

作成したプログラムが正しく動作するかについて「テスト」を行います。 テストの手法には、各機能ごとに行うものから、全機能を統合して行うものまでいろいろあります。

  • バージョン管理システム

複数人が1つのソースコードを書き換えると変更がぶつかるため、「Gitギット」「Subversionサブバージョン」などの「バージョン管理かんりシステム」と呼ばれるツールでソースコードを管理します。 サーバ上で管理するソースコードから各開発者がソースコードを取得し、編集したのちにサーバ上に変更を反映せる流れで開発します。

  • その他

このほか、開発者全員の目標をすり合わせるための手法や、短期間で素早く開発するための手法など、世の中の動向の変化に伴い新しい手法が提案され続けています。

図6-1: 複数人開発の手法の一例

7関数型言語とマルチパラダイム

最後に、第2話で触れた「関数型言語」が世の中でどのように使われているかを紹介します。
LISPやHaskellなどの関数型言語は、研究用途で使われることはありますが、実用的な製品を関数型言語のみで作ることは多くありません。 その理由は関数型言語での開発方法があまり確立されていないことや、C++などの広く浸透している言語が使われる前提で世の中が進展していることなどがあります。
ただし関数型言語には関数型言語の利点がありますので、部分的に利用されることはあります。 その方法には、関数型言語で作った部品をC++などで作った部品と組み合わせて作る方法と、C++などの言語そのものに関数型の機能を取り入れて使う方法があります。 後者のような、「オブジェクト指向」と「関数型」のような複数の概念を組み合わせた言語を「マルチパラダイム言語げんご」といいます。
今回は、世の中のプログラムに使われる技術を紹介しました。 ここまで重要機能を説明してきましたが、次回はこれまでに紹介しきれなかった常識的な細かな機能を補足します!
1686379015jaf