今の時代、プログラムは、いろいろな場所で活躍しています。
パソコンやスマホ。家庭にあるゲーム機。エアコンや冷蔵庫などの家電。
工場にあるロボットにも、外を走る自動車にも、あなたが持つキャッシュカードの中にさえ、プログラムが入っています。
そんなプログラムの開発に使うのが、プログラミング言語。Java,Python,PHP、いろいろあります。
お好みの言語で開発しよう…と思いきや、実は、どこでも何の言語でも使えるわけじゃありません。
動く場所によって、使えるプログラミング言語は、限定されてしまいます。WindowsパソコンならC#、iPhoneならSwift、家電にはC言語、といった具合。
コンピューターを動かすことは同じなのに、なぜ、場所によって言語の制限がかかるのか?
それには、きれいごとだけではない理由があるのです。考察していきましょう。
プログラムが動くプラットフォームいろいろ
プログラムは、どこで、どのように動いているのか、整理します。
- プログラムにより作られた一式:アプリケーション(略称:アプリ)
- アプリケーションが動く場所:プラットフォーム
アプリとプラットフォームには、このような組み合わせがあります。
アプリ種類 | プラットフォーム種類 |
---|---|
デスクトップアプリ | パソコン (WindowsやMac) |
スマホアプリ | スマートフォン (iPhoneやAndroid) |
Webアプリ | [フロントエンド] ブラウザ (ChromeやEdgeなど) |
[バックエンド] サーバ、クラウド | |
ゲーム | コンシューマーゲーム機 (SwitchやPlayStation) |
組み込みアプリ | エアコンや冷蔵庫といった家電 ロボットなどの産業機械 自動車や鉄道などの交通機関 キャッシュカードやSuicaなどのICカード |
アプリやプラットフォームの種別が、プログラミング言語に及ぼす影響を考えます。
使えるプログラミング言語が決まる2つの理由
プログラミング言語は、使いやすさや安全さを追求し、様々なものが生まれ進化しました。
- 安全性を高めたJava
- シンプルさを追求するPython
- 書きやすさ読みやすさを重視するRuby
プログラミング時は、使いやすい言語を使えば良いように思えます。
でも実際のところ、プログラムが動く場所により、使えるプログラミング言語は限定されます。
そしてその理由は、言語自身の特徴とは、別のところにあったりします。
プラットフォームでプログラミング言語が限定される理由は、大きく次の2つ。
- プラットフォーム側の企業戦略
- 性能による制限
順番に見ていきましょう。
企業戦略とひもづく言語
Windows,Mac,Android,iPhone…。おなじみのプラットフォームです。
これらデスクトップアプリやスマホアプリでは、プログラミング言語が企業戦略に深く結びついています。
パソコンやスマホで推奨される開発言語
パソコンやスマホの胴元は、Microsoft、Apple、Googleなど、言わずと知れた巨大テック企業。
各プラットフォームでは、提供元の企業が、開発に推奨する言語を定めています。
種別 | プラット フォーム | 企業 | 推奨 開発言語 | 推奨 フレームワーク |
---|---|---|---|---|
パソコン | Windows | Microsoft | C# | .NET |
Mac | Apple | Swift | SwiftUI | |
スマホ | Android | Kotlin | Android Jetpack | |
iPhone | Apple | Swift | SwiftUI |
独自路線を行くMicrosoftとApple
Windows vs Macの構図で、長年のライバルとして存在する、MicrosoftとApple。
MicrosoftとAppleは、開発に使うプログラミング言語の規格も、自身で定めています。
- Windowsの推奨開発言語は、C#。C#は、Microsoftが開発した言語
- MacやiPhoneの推奨開発言語は、Swift。Swiftは、Appleが開発した言語
そして、プラットフォームの進化に伴い、言語自体も自身で改良しています。
推奨開発言語でなくとも、開発に使えないことはありません。
ただ、プラットフォームの能力をフルに引き出すなら、推奨開発言語を使うのが最適解、と言えるでしょう。
オープンな立場のGoogle
一方、Androidを擁するGoogleは、ちょっと立ち位置が違います。
- 推奨開発言語はKotlinですが、Googleが開発したものではない(JetBrains社が開発)
- そもそもAndroid自体、Linuxというオープン規格のOSがベース
Googleは、比較的オープンな規格でプラットフォームを構成している、と言えます。
オープン規格ということは、ブラックボックスがないので、カスタマイズしやすい。このカスタマイズ性が、Androidの支持者が好む理由のひとつと言えます。
クロスプラットフォームを目指すWeb系言語
巨大企業の思惑があるわけですが、アプリ開発側からすれば、
- WindowsとMacどちらにも、リリースしたい
- AndroidとiPhoneどちらにも、リリースしたい
と普通に考えるわけです。すると、同じアプリを、複数の異なる言語で開発しないとなりません。
これが非常に手間なのです。それぞれの言語の技術者が必要だし、開発時間も倍かかる。
ひとつの開発言語で、複数のプラットフォームに対応したい。
これを実現するのが、クロスプラットフォーム開発です。
プラットフォームから独立するWebアプリ
クロスプラットフォームを実現する、最も強力な方法が、Webアプリです。
Webアプリでは、このような技術が使われます。
- Webフロントエンド ブラウザ(HTML、CSS、JavaScriptを表示する)
- Webバックエンド HTTPサーバー(リクエストに応答してテキストを返すプロトコル)
ブラウザやHTTPなどの技術、規格を制定しているのは、特定企業と異なる第三者機関。
だから、Webアプリは、特定企業に依存しない共通規格で開発できるのです。
フロントエンドの規格
フロントエンドで使われるのは、Webブラウザ。
いまどき、WindowsにもMacにも、AndrondにもiPhoneにも、どこでもWebブラウザが搭載されています。
さらに、
- ブラウザで動く言語は、HTML,CSS,JavaScriptと定められている
- HTML,CSS,JavaScriptのいずれも、国際規格で制定されている
フロントエンドは、言語選択に悩む必要はないですね。
バックエンドの規格
一方バックエンドでは、様々な選択肢があります。
- テキストを送信するHTTPプロトコルを実現できればよい
- やることは単純なので、実はどの言語でもほぼ実現可能
- 言語の選択は、Webアプリケーションフレームワークや、その背後で行う処理、に依る
以下は、よく使用される言語とフレームワークです。
言語 | 主なフレームワーク |
---|---|
Java | SpringFramework |
Python | Django |
JavaScript | Node.js、Express |
PHP | Laravel |
Ruby | Ruby on Rails |
Go | Gin |
スマホ独自のクロスプラットフォーム開発
強力な汎用性を持つWebアプリ。
ただ、スマホを扱うときには、Webアプリでは不十分なことが多々あります。
スマホアプリの他と異なる特徴は、このような点。
- タッチやスワイプなど、スマホ独自の操作に対応が必要
- カメラ、マイク、GPSなど、さまざま固有機能へのアクセスが必要
これらはまた、Webアプリの標準規格では対応しきれないのが実情です。
そのためスマホアプリでは、クロスプラットフォームフレームワークを使う方法も、よく採られます。
これはつまり、Android用とiPhone用の両方のアプリを、同じ言語で開発する、ということです。
よく使われるのは、この2つ。
フレームワーク | 開発言語 |
---|---|
React Native | JavaScript |
Flutter | Dart |
React Nativeは、WebフロントエンドフレームワークであるReactと同様の手法で、スマホアプリも開発できるというものです。使う言語はJavaScript。フロントエンド開発の経験が活かせます。
Flutterは、開発にDartという言語を使います。FlutterもDartもGoogleが開発したもので、この2つは事実上一体として使われます。言語仕様はJavaScriptに似ています。
ゲームアプリ開発言語に必要なリアルタイム性
企業戦略でどうだこうだと、そんな話をしていられないのが、ゲームアプリです。
ゲームアプリで重要になるのが、処理速度。美麗なグラフィックを連続的に動かさなければなりまえん。
ゲームアプリで重要なリアルタイム性
ゲームは、応答(レスポンス)を素早く行うことが要求されます。
- コントローラーからの入力
- グラフィックのアニメーション
- オンラインでの通信
こういった、素早い応答が求められる処理を、リアルタイム処理といいます。
その応答は、ミリ秒やマイクロ秒のオーダーでのレスポンスが必要。処理の応答が遅れると「ラグ」という問題になってしまいます。
ゲームで使われるゼロオーバーヘッド言語
リアルタイム性が必要な言語で、筆頭に上がるのが、“C++” 。
C++の原則は「ゼロオーバーヘッド」。必要ないことは処理しない。この原則が、リアルタイム性を支えています。
SwitchやPlayStationなど、コンシューマーゲーム機では、その開発に使えるライブラリが提供されています。そのようなライブラリは、C++ベースのものが多いです。
組み込みアプリの厳しい制約で使われる言語
プログラムが存在するのは、パソコンやゲームだけではありません。
- 家電
- 産業用ロボット
- 乗物
- 医療機器
- ICカード
いろいろなところに、プログラムが存在します。
このような、機械や装置に組み込まれるシステムを、
「組み込みシステム」または「エンベデッドシステム(embedded system)」
と呼びます。
組み込みアプリの厳しいリソース制約
これらのシステム、リアルタイム性が必要が必要です。自動車のエンジン制御にタイムラグなんて許されません。
加えて、組み込みシステムでは。メモリやストレージなどのリソース制約が厳しいという特徴があります。
例えばICカード。あんな薄いカードの中に、ICチップが埋め込まれ、その中でプログラムが動きます。
ICチップに搭載されるメモリは数KB程度。スマホで撮った写真1枚さえ入らない容量です。
あえてC言語などの低級言語を使う
そんなカツカツのリソース条件下では、もうプログラム自体のサイズも小さくしないといけない。
なのでこの世界では、“C言語”が今でも多く使われています。
C言語は“低級言語”という呼ばれかたもします。
例えるなら、いろいろな安全装置がついてない代わりに軽量な、クラシックカーのイメージ。
C言語でないとプログラムサイズが収まらない、ということも多々あるのです。
C,C++の危険性を克服するRust
CやC++は、軽量かつ高速な点から、今でも組み込み分野において高い需要があります。
しかし、C/C++には、大きな弱点があります。メモリ安全性の欠如です。
メモリ安全性の欠如は、領域外読み取りやメモリ漏えいなどを引き起こし、セキュリティ脆弱性につながります。実際、サイバー攻撃の多くはメモリ脆弱性を狙っていると言われます。
ここで近年登場したのが、Rustです。Rustには「ゼロコスト抽象化」の思想があり、安全性を保ちつつ高速性を保つ言語です。
Rustは、コンパイルの時点で不正メモリアクセスを完全にガードし、コンパイルされたプログラムは高速な処理性能を有します。C/C++の代替として期待されている言語です。
アプリ毎の対応プラットフォーム一覧表(13種言語)
ここまでの話から、13種類のプログラミング言語と、それが使えるプラットフォームを一覧でまとめましょう。
言語 | デスクトップ アプリ | スマホ アプリ | Web フロント | Web バック | ゲーム | 組み込み |
---|---|---|---|---|---|---|
C | ||||||
C++ | WebAssembly | |||||
Java | ||||||
C# | Windows | Unity | ||||
Python | ||||||
JavaScript | ReactNative | |||||
Dart | Flutter | |||||
PHP | ||||||
Ruby | ||||||
Swift | Mac | iPhone | ||||
Kotlin | Android | |||||
Go | WebAssembly | |||||
Rust | WebAssembly |
注意として、上記組み合わせは、あくまで世の中一般的なもの。これ以外でも、できないことはありません。
ただ、よく使われるということは、当然メリットが多い組み合わせです。まず真っ先に検討すべきところでしょう。
まとめ
プログラミングの最終形のひとつが「どのプログラミングでも使える、究極のプログラミング言語」です。でも、そんな究極言語は、ここしばらく登場しそうもありません。
時と場合と場所によって、プログラミング言語を使い分ける。相変わらず重要であり続けるでしょう。
これが正解というのは難しい。でも少なくとも、大間違いの選択はしないよう、特性をしっかり掴んでおきましょう。
コメント