C/C++言語とRustについて

デジタルトランスフォーメーション技術 人工知能技術 機械学習  数学 アルゴリズムとデータ構造 プログラミング 本ブログのナビ

C/C++言語とRustについて

C/C++言語は、マイクロコンピューターから大型コンピューターまで、多くのプラットフォームのアプリケーションで利用されているプログラミング言語となる。Cは構造化プログラミングをベースとした非常にシンプルで自由度が高く、実行速度が高いプログラミング言語であり、C++はC言語にオブジェクト指向プログラミングの考え方を追加したものとなる。

C/C++言語ともに高級言語で書かれたプログラムを機械語にコンパイル(翻訳)してから実行するみのとなり、コンパイラとしてはgccとg++をそれぞれ使う。

たとえば以下の様なプログラムがあったとき

// adder.cpp
#include<dstdio>

int main(){
   int a, b;
   scanf("%d %d", &a, &b);
   printf("%d\n", a+b);
   return 0;
}

コンパイルはコマンドとして

$ g++ adder.cpp

と入力し、プログラムにエラーがある場合にはエラーメッセージが出力され、エラーがなければa.outというファイルが生成され

$ ./a.out

このファイルを上記の様に実行すると、標準入力(キーボード)から入力されるのを待ち、2つの整数が入力されると加算した結果を出力してプログラムが終了する。

このC++は各種アルゴリズムを記述するためのジェネリックプログラムとしても利用される。ジェネリックプログラミングは1980年台に登場したプログラミングの手法であり、1990年代にC++のTL(Standard Template Library)が開発された。ここで、ジェネリックプログラミングとは、アルゴリズムとデータ構造を設計することに焦点を合わせ、効率を低下させることなく、それらを最も一般的な環境で動作させるためのプログラミング手法となる。

ジェネリックプログラミングは、STLに代表される特定のツールの集まりというよりは、プログラミングに対する姿勢に近いものとなる。

ジェネリックプログラミングの原点は数学であり、更に具体的にいうと、抽象代数学(abstract algebra)と呼ばれる数学の一分野に端を発している。この手法を理解するのに役立つように、この本では、オブジェクトをそれらに対する操作の対象という観点から推論する、という手法に焦点を合わせて抽象代数学について述べられている。

Rustは、Mozilla Researchが開発したシステムプログラミング向けのプログラミング言語であり、高いパフォーマンス、メモリ安全性、並列性、およびマルチスレッド処理を重視して設計されたものとなる。また、コンパイル時に強力な静的型チェックを行うことで、バグを予防することに焦点を当てた言語でもある。

本ブログでは、これらC/C++とRustに関する概略と実装について述べている。

一般

  • Code as Dataの概要とアルゴリズム及び実装例について

“Code as Data”は、プログラムのコード自体をデータとして扱う考え方やアプローチを指し、プログラムをデータ構造として操作し、分析、変換、処理することを可能にする方法となる。通常、プログラムはある入力を受け取り、それに対して特定の手順やアルゴリズムを実行し、結果を出力する。一方で、”Code as Data”では、プログラム自体がデータとして扱われ、他のプログラムによって操作される。これにより、プログラムをより柔軟に、動的に、抽象的に扱うことが可能となる。

実装

プログラミングを行うためには、それぞれの言語に合わせた開発環境を作る必要がある。ここでは、本ブログに述べているPython、Clojure、C、Java、R、LISP、Prolog、Javascript、PHPそれぞのケースでの具体的な開発環境の立ち上げについて述べている。個々の言語では、開発を容易にするためのプラットフォームが準備されており、それらを用いると容易な環境設定が可能となるが、ここでは最もシンプルなケースでのものを中心に述べている。

プログラミングを行う際にファイルの入出力機能は最も基本的で必須なものとなる。またファイルの入出力機能は、手続き的な命令となるため、各言語ごとに実現の仕方も異なってくる。以下に様々な言語でのファイル入出力の具体的な実装について述べる。

プログラミング言語の中でも基本機能は、”プログラミング言語の歴史“でも述べた「構造化言語」の3つの機能である(1)順次進行、(2)条件分岐、(3)繰り返しの中の一つの要素となる。ここではこの内繰り返しと分岐に対して様々な言語での実装を示す。

ここでは”サーバー技術“で述べているサーバーを各種プログラミング言語で活用する事例について述べる。ここでのサーバー技術とは、ネットワーク上でクライアントからのリクエストを受け取り、要求された処理を実行してレスポンスを返すサーバーシステムの設計・構築・運用などに関する技術のことを指す。

サーバー技術は、WebアプリケーションやAPIサーバー、データベースサーバー、メールサーバーなど、さまざまなシステムやサービスで使用されており、プログラミング言語やフレームワークに応じて、サーバー技術の実装方法やベストプラクティスが異なる。

MCMCの手法一つであるメトロポリス法のCによる実装。

Cを用いた実装として、メトロポリス法を使ったシミュレーションを実施。2つのガウス分布を重ねたもの、半円とガウス分布を重ねたものについて適用し、ステップ数とシミュレーション結果の関係等に対する考察を行う。

Cを用いたMCMC法での実装として、多変数の場合について述べ、多変数になることで生じる注意点や新しいアルゴリズムについて述べる。

Cを用いた実装として、メトロポリス法以外のアルゴリズムであるHMC(Hybrid Monte Calro法、あるいはHamiltonian Monte Carlo法)について述べる。

Cを用いた実装としてギブスサンプリングとMH法について述べる

Cを用いた実装でのベイズ推定について述べる。

Cを用いた実装でのイジング、組み合わせ最適化、素粒子物理等の応用について述べる。

Cを用いたグラフアルゴリズム(強連結成分分解、DAG、2-SAT、LCA)

Cを用いたグラフデータの基本的アルゴリズム(DFS、BFS、二部グラフ判定、最短経路問題、最小全域木)

Cを用いたネットワークフロー問題のアルゴリズム

WoT(Web of Things)は、インターネット上のさまざまなデバイスを相互に接続し、デバイス間の通信や相互作用を可能にするための標準化されたアーキテクチャとプロトコルとなる。WoTは、IoT(Internet of Things)を拡張し、デバイスとのやり取りを簡素化し、相互運用性を高めることを目的としている。

今回はこのWoTに関して、一般的な実装手順やライブラリ、プラットフォーム、更にpythonやCによる具体的な実装例について述べている。

概略/参考図書

  • オンラインジャッジではじめるC/C++プログラミング入門

ジェネリックプログラミング

この本のテーマはプログラミングだが、ほとんどのプログラミング本と異なり、アルゴリズムやコードに加えて、数学証明や、古代から現代までの数学上の発見に関する歴史的経緯が含まれている。

もう少し具体的に言うと、テーマはジェネリックプログラミング(generic programming)となる。ジェネリックプログラミングは1980年台に登場したプログラミングの手法であり、1990年代にC++のTL(Standard Template Library)が開発された。ここで、ジェネリックプログラミングとは、アルゴリズムとデータ構造を設計することに焦点を合わせ、効率を低下させることなく、それらを最も一般的な環境で動作させるためのプログラミング手法となる。

ジェネリックプログラミングは、STLに代表される特定のツールの集まりというよりは、プログラミングに対する姿勢に近いものとなる。

Rust

Rustは、Mozilla Researchが開発したシステムプログラミング向けのプログラミング言語であり、高いパフォーマンス、メモリ安全性、並列性、およびマルチスレッド処理を重視して設計されたものとなる。また、コンパイル時に強力な静的型チェックを行うことで、バグを予防することに焦点を当てた言語でもある。

ここでは、このRustに関する概要と基本的な文法および各種適用事例と具体的な実装について述べている。

一般的に、IoTデバイスはセンサーやアクチュエータを備えた小型のデバイスであり、ワイヤレス通信を使用してセンサーデータを収集し、アクチュエータを制御する形態となる。ワイヤレスでのIoT制御にはさまざまな通信プロトコルや技術が使用される。ここでは、このワイヤレス技術を用いたIoTを様々な言語で実装した例について述べている。

勾配法は機械学習や最適化アルゴリズムで広く使用される手法の一つであり、そのの主な目的は、関数の最小値(または最大値)を見つけるために、反復的にパラメータを更新していくことになる。機械学習では、通常、コスト関数(損失関数とも呼ばれる)を最小化することが目標で、例えば、回帰や分類問題において、予測値と実際の値の誤差を表すコスト関数が定義され、このコスト関数が最小となるパラメータの値を見つけるのに役立つ。

ここでは、この勾配法に関して様々なアルゴリズムと各種言語による実装例について述べている。

コメント

  1. […] 数学サマリー 機械学習技術サマリー 人工知能技術サマリー C/C++言語と各種機械学習アルゴリズム   プログラミング技術サマリー […]

  2. […]  C/C++言語と各種機械学習アルゴリズム  […]

  3. […]   アルゴリズム  デジタルトランスフォーメーション技術  C/C++言語と各種機械学習アルゴリズム  […]

  4. […] C/C++言語と各種機械学習アルゴリズム  […]

  5. […] プログラミング  C言語   人工知能 […]

  6. […]   アルゴリズム  デジタルトランスフォーメーション技術   C/C++言語と各種機械学習アルゴリズム  […]

  7. […]   アルゴリズム  デジタルトランスフォーメーション技術  C/C++言語と各種機械学習アルゴリズム  […]

  8. […] 確率的生成モデル サポートベクトルマシン スパースモデリング C/C++言語と各種機械学習アルゴリズム […]

  9. […] 機械学習の領域では、PythonやRのような豊富なライブラリーを持つ環境が利用されててほぼデファクトとなっているが、これに対して初期(2007年〜2017年頃)のClojureでは、CやPython、R等と繋げるしくみも開発されていたが、相手先のライブラリを自由に扱えるレベルではなく、最新のアルゴリズムを駆使することにハードルがあった。 […]

  10. […] デジタルトランスフォーメーション技術 Python  C言語 […]

  11. […] デジタルトランスフォーメーション技術 Python  C言語 物理・数学 […]

タイトルとURLをコピーしました