ページトップへ

一気に眺める「ソフトウェア」

三谷拓也 | 2018/09/18
ソフトウェアは地層のように積み重なっています。

アプリケーション、ミドルウェア、OS、デバイスドライバ・・・などの複数階層のソフトウェアが連携することでハードウェアを動かします。現代では、この階層がどんどん深くなってきているので、ソフトウェアがどのようにハードウェア(最下層)を動かしているのかわかりにくくなっています。

ソフトウェア特許を取得するためには、「ソフトウェアによる情報処理がハードウェア資源を用いて具体的に実現されている」「ソフトウェアとハードウェア資源とが協働することによって、使用目的に応じた特有の情報処理装置又はその動作方法が構築される」ことを明確に記載する必要があるとされています(特許審査基準)。

この「協働」がどのように実現されているのかを概説します。

 

第1段階:ソフトウェアなし


ソフトウェアはハードウェアを動かすものですが、ソフトウェアがなくても動くハードウェアはたくさんあります。

機械式時計は、ゼンマイの回転力を複数の歯車で伝えることで、時計の針を動かします。ゼンマイと歯車群(ムーブメント)が制御システムを構成します。

扇風機の「強風スイッチ」を押すと、電子回路がモーターの回転数をアップさせます。仕事が単純なので、「どのスイッチが押されたら何をする」というルールを電子回路で実装すれば十分です。

このように「動かす仕組み」は機械や電子回路だけでも実現できます。より複雑で柔軟な仕事を電子回路にさせるためにソフトウェア(上層)が生まれました。

第2段階:マシン語


プログラム内蔵式のコンピュータをノイマン型コンピュータといいます。

ノイマン型コンピュータは、(1)メモリから命令を読み出す(2)命令を実行する(3)次の命令を選ぶ、というサイクルを延々と繰り返す機械です。この命令実行装置がプロセッサ(CPUなど)です。

メモリに命令書を記憶させておけば、プロセッサは命令書にしたがって自動的に仕事をします。命令書を書き換えれば別の仕事をさせることもできます。

プロセッサは多数の電子回路を内蔵し、電子回路は多数のトランジスタを内蔵します。
トランジスタは、電流でオン・オフできる「スイッチ」です。この膨大なスイッチのオン・オフの組み合わせにより、プロセッサに命令を与えることができます。

たとえば、あるプロセッサは、「0000(オフ・オフ・オフ・オフ)」という命令(トランジスタへの設定値)を与えられると、メモリからデータを読み出すように電子回路が構成されているとします。「0010」は足し算、「0011」は引き算、のように決まっています。
このプロセッサに「0000」「0100」という命令を与えると、プロセッサはメモリの「0100番地」にあるデータの「0000(読み出し)」を実行します。

このような二進数の命令をマシン語(機械語)といいます。

人間がプロセッサにマシン語で指示すれば、プロセッサは人間の企図した通りの処理を実行します。複数の命令を組み合わせた命令書、すなわち、プログラムをメモリに読み込ませておけば、プロセッサは複雑な処理をまとめて実行できます。

マシン語は、プロセッサの母国語みたいなものです。

大昔にあったパンチカードは、マシン語の命令書です。パンチカード時代を知っている人によれば、パンチカードを睨んでいるとどんな命令が書いてあるのか想像がついたそうです。

マシン語は、もっとも素朴で原始的な「ソフトウェア」です。

第3段階:アセンブリ言語


マシン語は、人間にはわかりづらいです。

互換性の問題もあります。プロセッサAの読み出し命令が「0000」であっても、プロセッサBの読み出し命令は「0101」かもしれません。プロセッサAのマシン語と、プロセッサBのマシン語は同一ではありません。プロセッサAとプロセッサBの電子回路構成が異なるためです。

このようなわかりにくさ、わずらわしさを解消するために考えられたのがアセンブリ言語です。

アセンブリ言語では、読み出し命令は「LD」になります(Loadの意味)。アセンブラと呼ばれるプログラムにより、アセンブリ言語をマシン語に変換(翻訳)します。プロセッサA用のアセンブラはLDを「0000」に変換し、プロセッサB用のアセンブラはLDを「0101」に変換します。

アセンブリ言語は、マシン語よりも読みやすい。その代償として、アセンブラによる翻訳という一手間をかける必要があります。
アセンブリ言語がマシン語に変換され、マシン語にしたがってプロセッサが動きます。

マシン語やアセンブリ言語のことを低水準言語といいます。
 

第4段階:高水準言語


アセンブリ言語よりもわかりやすい言語として、高水準言語が登場します。C、C++、Java、Basicなど高水準言語は非常に種類が多いです。高水準言語は、少なくとも200種類はあると言われています。

高水準言語をマシン語に変換するプログラムをコンパイラといいます。

高水準言語では、一文が複数のマシン語命令に対応します。たとえば、strcmpというC言語の命令文を使えば、文字列の比較をできます。
Cのコンパイラは、strcmpという命令を実現するために複数のマシン語命令を選びます。

コンパイラは、アセンブラのような逐語翻訳ではなく、高水準言語の命令を実現するためのマシン語命令を選ぶという高度な仕事をしています。コンパイラの性能によって、同じアプリケーションでも性能が変わることがあります。コンパイラは奥の深い世界です。

なお、マシン語の命令文(オブジェクトコード)から元の高水準言語のプログラム(ソースコード)を割り出す作業をリバースエンジニアリングといいます。

高水準言語とコンパイラのおかげで、プログラムを作りやすくなりました。C言語のようにハードウェアを細かく制御可能な高水準言語もあれば、BASICのように細かいことはやらないかわりに習得しやすく作りやすい高水準言語もあります。アプリケーションやプログラマのニーズにあわせていろいろな高水準言語を使い分けることができます。

第5段階:OS


複数のソフトウェアを並列実行させたい場合もあります。たとえば、ワードを使いながらメールも適宜確認したいことがあります。

複数のソフトウェアを並列実行させるためには、複数のソフトウェアのうちどのソフトウェアにプロセッサを使わせるかを適宜選択する必要があります。たとえば、ワードを実行しているとき電子メールの到着が検出されたら、メーラーの受信通知機能を一瞬だけ動かす必要があります。

特権的な立場から、複数のソフトウェアをコントロール(交通整理)するソフトウェアがOS(Operating System)です。OSは、特権的な立場にあるとはいえ、高水準言語により作成されたソフトウェアの一種です。

OSは徐々に高機能化し、OSを利用するソフトウェア(以下、「アプリケーション」とよぶ)は、プロセッサなどのハードウェア資源に直接命令を与えるのではなく、OSに処理を依頼するようになります。

OSがハードウェアを操作するためのメニュー(API)を提供するようになると、アプリケーションはAPIを使ってハードウェアを間接的に操作するようになります。アプリケーションは、OSのルールにしたがう必要がありますが、低水準な仕事はOSに任せることができます。

OSのおかげでアプリケーション・プログラマは、アプリケーションのクオリティ追求に専念しやすくなりました。その一方、OSが何をやっているのかわからなくてもアプリケーションを作ることができるようになり、ソフトウェアとハードウェアがどのように協働しているのかがわかりづらくなりました。

こうして、ソフトウェアは、アプリケーション(さまざまな仕事をするためのプログラム)とOS(縁の下の力持ちとしていろいろなアプリケーションとハードウェアを仲介するプログラム)に2層化しました。

WindowsなどのOSは、高度なアプリケーションを作る上で便利な機能を豊富に提供します。OSはソフトウェア技術の精髄ともいうべきものです。

ソフトウェア用語


・ミドルウェア

アプリケーションとOSを仲介するソフトウェアをミドルウェアといいます。
アプリケーションに求められる技術水準が高くなると、アプリケーションの一部の機能を他のソフトウェアに肩代わりして欲しいというニーズが出てきます。このようなニーズに応えるために登場したのがミドルウェアです。アプリケーションはミドルウェアに指示を出し、ミドルウェアはOSに指示を出し、OSがハードウェアをコントロールします。ミドルウェアによりソフトウェアは3層化しました。


・オブジェクト指向

プログラムの作り方についてはいくつか宗派みたいなものがあり、オブジェクト指向はその一派です。オブジェクト(クラス)という機能単位をつくり、このオブジェクトの相互作用により、処理が実現されるというプログラミング言語の概念です。
天才的なアイディアであり、合理的であるものの、体得するのが難しい概念でもあります。オブジェクト指向は、プログラムの作り方を大きく変えました。


・クラウドとビッグデータ

通信環境が整ってくると、データを他のサーバに保存したり、あるいは、処理の一部をサーバに委託するようなソフトウェアが一般化してきます。クラウドやビッグデータは、この考え方の発展形です。


・人工知能

人工知能(AI)も、(現状では)アプリケーションの一つです。人工知能が特殊なのは、膨大なデータから学習することで自らの設定(判断方法)を変化させることです。このため、なにかの人工知能が威力を発揮したとしても人工知能がどのような理由でそのような判断を下したのか人間にはわかりません。

人工知能の仕組みは既存の数学手法の組み合わせであり(ニューラルネットワーク、主成分分析など)、画期的なものではありません。コンピュータの発展によって実現可能となった面があります。
現在の人工知能のパラダイムが主流になるとは限らないという説もあり、これからどのような発展を遂げるのかわからない分野です。


・量子コンピュータ

量子コンピュータは、ノイマン型コンピュータとはまったく異なる原理に基づくコンピュータです。量子コンピュータは圧倒的な計算力を持ちます。理論上の存在とされてきましたが、一部実用化されており、こちらもどのような発展を遂げていくのかわかりません。

ソフトウェア特許


特許出願の場合、「ハードウェアとの協働」を意識して記載するように要請されています。OSや高水準言語が登場してからマシン語などの仕組みがわかりにくくなったように、今後はもっとアプリケーションとハードウェアの距離が離れていくのではないかと思います。

ソフトウェアがなくても動くハードウェアはありますが、ハードウェアがなくても動くソフトウェアはありません。
したがって、ソフトウェア発明であっても、そのソフトウェアが動くべきハードウェアがどこにあるのか、というイメージができていればソフトウェア特許の記載要件を満たすことができると思いますし、権利回避しにくい特許権を作りやすくなります。