ネイティブ言語でクロスプラットフォーム対応

私が業務で開発するアプリはmacOS用のアプリが多くあります。そのため、使用するプログラミング言語はネイティブ開発対応の以下のコードが多くなります。

  • Objective-C / Objective-C++
  • Swift
  • C++
  • C言語
目次

プログラミング言語の選択

どの言語を使用して実装するかは、何を実装したいのかに大きく依存します。

MacOSのAPIを使用する機能では、SwiftやObjective-Cが第一候補となります。新規に開発するプログラムではSwift一択となることでしょう。一方で、長年にわたって開発・運用しているプログラムではObjective-Cで実装します。

WindowsやLinuxなど、Appleプラットフォーム以外のプラットフォームにも対応しているプログラムでは、C言語やC++を使用します。

C++の進化

C++の進化について、今回の記事では注目しています。C++は非常に歴史のある言語です。デジタル大辞泉によると、1992年に米国AT&T社が策定したのが始まりです。C++は国際標準規格によって、言語の機能や標準ライブラリのインターフェイスが策定されています。最新の標準規格はC++20です。

  • C++20 (2020年)
  • C++17 (2017年)
  • C++14 (2014年)
  • C++11 (2011年)
  • C++03 (2003年)
  • C++98

C++国際標準規格 – cpprefjp C++日本語リファレンスより

Xcodeの対応状況

Xcodeに内蔵されるClang/LLVMもC++標準に対応しています。Xcodeのどのバージョンがどの標準規格に対応しているかについて、以前、調べようと思ったのですが、あまりに大変で断念したことがあります。しかし、今はAppleが公式ドキュメントを公開しています。

C++ Language Support – Xcode – Apple Developer

この記事を執筆している時点ではC++23は策定中なのですが、既にXcode 15で対応が始まっていることが分かります。

動作環境によって使用可能な標準規格は変わる

macOSアプリでは、多くの場合、古いOSにも対応してほしいという要望を受けることが多いです。この記事の執筆時点(2023年8月13日)ではmacOS 14 (OS X Mavericks) 以降が最低環境になることが多いです。C++で実装するときには標準ライブラリを必ず利用します。すると、動作環境に合わせて使用可能な標準規格が変わります。macOS 14.0であれば、Xcode 10.1以降が使用可能なので、上記のページを確認すると。。。残念ながら載っていません。

なお、Xcodeの動作環境はテックブログにまとめ記事を作っています。Xcodeがリリースされる度に更新しています。

仕方がないので、Xcodeを起動して選択可能なC++標準を確認します。

Xcodeでは使用するC++標準をビルド設定で設定します。ビルド設定の「Apple Clang – Language – C++」の「C++ Language Dialect」を開きます。すると、次の選択肢が表示されます。

  • C++98
  • GNU++98
  • C++11
  • GNU++11
  • C++14
  • GNU++14
  • C++17
  • GNU++17
  • Compiler Default
C++ Language Dialect

C++17まで対応しているようです。細かく見ると使えない機能があるかもしれないですが。。。

というのも、C++標準への対応というのはコンパイラによって異なります。各コンパイラが対応するプラットフォームの事情(都合)により実装方法が異なり、結果、制約があったり、一部使えないことがあったりなどします。ビルドエラーで気がつきます。

C++17まで使えるとなると、クロスプラットフォーム対応部分はC++標準の範囲で実装できる可能性が高くなってきます。

スレッド関連や日時に関する処理があると、ネイティブAPIを使うことが多かったのですが、C++11以降はC++標準ライブラリだけでも実装できます。

これからは動作環境の都合でC++標準にあるのに使えない、ということ少なくなっていくだろうと思います。

また、SwiftやObjective-Cだけではなく、C/C++も併用して色々なプラットフォームに素早く対応できるようにするというのが、やりやすくなっていくだろうと思います。

先日も通信速度を表示する機能を実装するときに、通信に要した時間を計測するコードを実装する必要があり、C++で実装しました。対象のアプリはObjective-C++で書かれている処理なので、Objective-CのNSDateを使って実装することも可能です。しかし、Objective-C++ではありますが、C++のクラス内だったので、C++11のchronoライブラリを使って実装しました。

chronoライブラリを使った処理時間の計測処理は、Objective-Cのコードよりも汎用的です。また、可読性も高いコードになります。コード例については次の記事をご覧ください。

著書紹介

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Akira Hayashi (林 晃)のアバター Akira Hayashi (林 晃) Representative(代表), Software Engineer(ソフトウェアエンジニア)

アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note, Medium, LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note, Medium, LinkedIn

目次