読者です 読者をやめる 読者になる 読者になる

GNUコンパイラgccとg++

序文

この序文は、GNUプロジェクトの創設者でありGCCの主要著者であるリチャード・M・ストールマンによって親切に貢献されました。

この本は、GNU Compiler CollectionであるGCCを始めるためのガイドです。 GCCをプログラミングツールとして使用する方法を説明します。 GCCはプログラミングツールですが、これは真実ですが、それはさらに何かです。これは、コンピュータユーザーのための20年間のキャンペーンの一環です。私たちは皆良いソフトウェアを求めていますが、ソフトウェアが「良い」とはどういう意味ですか?便利な機能と信頼性は、技術的に優れていることを意味しますが、それだけでは不十分です。良いソフトウェアは倫理的にも良いものでなければならず、ユーザーの自由を尊重しなければなりません。

ソフトウェアのユーザーは、適切に実行する権利、ソースコードを勉強して適切に変更する権利、他の人にそのコピーを再配布する権利、および公開する権利が必要ですあなたがコミュニティの構築に貢献できるように変更されたバージョン。プログラムがあなたの自由をこのように尊重するとき、私たちはそれをフリーソフトウェアと呼んでいます。 GCCの前には、C、Fortran、Adaなどのコンパイラがありましたが、それらはフリーソフトウェアではありませんでした。あなたは自由でそれらを使うことができませんでした。私はGCCを書いて、私たちの自由をあきらめずにコンパイラを使うことができました。

コンパイラだけでは不十分です。コンピュータシステムを使用するには、オペレーティングシステム全体が必要です。 1983年には、最新のコンピュータ用のオペレーティングシステムはすべて無料であった。この問題を解決するために、私は1984年にフリーソフトウェアとなるUnixのようなシステムであるGNUオペレーティングシステムの開発に着手しました。 GCCの開発は、GNU開発の一環でした。

90年代初期までに、ほぼ完成したGNUオペレーティングシステムは、1992年にフリーソフトウェアとなったカーネルであるLinuxを追加することで完成しました。GNU / Linuxオペレーティングシステムを組み合わせることで、自由。しかし、自由は決して自動的に安全ではなく、我々はそれを守るために働く必要があります。フリーソフトウェア運動は、あなたのサポートを必要とします。

1はじめに

この本の目的は、GNU CおよびC ++コンパイラgccおよびg ++の使用方法を説明することです。 この本を読んだら、プログラムのコンパイル方法と、最適化とデバッグのための基本コンパイラオプションの使い方を理解する必要があります。 この資料は、他の多くの場所で見つけることができるので、C言語やC ++言語自体を教えようとはしません(see section追加情報)。

他のシステムに精通していてGNUコンパイラには初めての経験豊富なプログラマは、「Cプログラムのコンパイル」、「プリプロセッサの使用」、および「C ++プログラムのコンパイル」の章の前半をスキップできます。 残りの章と章では、他のコンパイラの使い方をすでに知っている人たちのために、GCCの機能をよく理解しておくべきです。

1.1 GCCの歴史

GNU CコンパイラGCC)の元の著者は、GNUプロジェクトの創始者であるRichard Stallmanです。

GNUプロジェクトは1984年に開始され、コンピュータユーザーとプログラマの自由と協力を促進するために、フリーソフトウェアとして完全なUnixライクなオペレーティングシステムを作成しました。すべてのUnixライクなオペレーティングシステムにはCコンパイラが必要です。その時点でフリーコンパイラが存在しないため、GNUプロジェクトはゼロから開発する必要がありました。この作品は、個人および企業からのGNUプロジェクトの活動を支援する非営利団体であるフリーソフトウェア財団への寄付によって資金提供されました。

GCCの最初のリリースは1987年に行われました。これは大きな成功を収めました。これは、移植性の高いANSI Cコンパイラフリーソフトウェアとして初めてリリースされたことです。その時以来、GCCフリーソフトウェアの開発において最も重要なツールの1つになっています。

コンパイラの主要な改訂版には、1992年の2.0シリーズが付属しており、C ++をコンパイルする機能が追加されました。 1997年に最適化とC ++サポートを改善するために、コンパイラの実験ブランチ(EGCS)が作成されました。この作業の後、EGCSはGCC開発の新しいメインラインとして採用され、これらの機能は2001年にGCCの3.0リリースで広く利用できるようになりました。

時間が経つと、GCCFortran、ADA、JavaObjective-Cなどの多くの言語をサポートするように拡張されました。頭字語のGCCは現在、「GNU Compiler Collection」を参照するために使用されています。その発展は、産業、研究、学術界のGCCユーザーコミュニティの代表者で構成されるGCC運営委員会によって導かれます。

1.2 GCCの主な特徴

このセクションでは、GCCの最も重要な機能について説明します。

まず第一に、GCCは移植可能なコンパイラです。現在使用可能なほとんどのプラットフォームで動作し、多くのタイプのプロセッサの出力を生成できます。パーソナルコンピュータで使用されるプロセッサに加えて、マイクロコントローラ、DSP、および64ビットCPUもサポートしています。

GCCは、ネイティブコンパイラだけでなく、GCC自身が使用するものとは異なるシステム用の実行可能ファイルを生成する任意のプログラムをクロスコンパイルすることもできます。これにより、コンパイラを実行できない組み込みシステム向けにソフトウェアをコンパイルすることができます。 GCCは移植性に重点を置いてC言語で書かれており、コンパイルすることができるので、新しいシステムに簡単に適応できます。

GCCには、さまざまな言語を解析するための複数の言語フロントエンドがあります。各言語のプログラムは、任意のアーキテクチャコンパイルまたはクロスコンパイルできます。たとえば、ADAプログラムをマイクロコントローラ用にコンパイルしたり、スーパーコンピュータ用にCプログラムをコンパイルしたりすることができます。

GCCにはモジュラー設計が採用されているため、新しい言語やアーキテクチャを追加することができます。 GCCに新しい言語フロントエンドを追加することで、必要なランタイム機能(ライブラリなど)が利用可能であれば、その言語を任意のアーキテクチャで使用することができます。同様に、新しいアーキテクチャのサポートを追加すると、すべての言語で使用できるようになります。

最後に、最も重要なのは、GCCGNU General Public License(GNU GPL)に基づいて配布されているフリーソフトウェアです。(1)これは、すべてのGNUソフトウェアと同様に、GCCの使用と変更を自由に行えることを意味します。新しいタイプのCPU、新しい言語、または新しい機能のサポートが必要な場合は、自分で追加したり、GCCを強化するために誰かを雇うことができます。あなたの仕事にとって重要なバグを修正するために誰かを雇うことができます。

さらに、あなたはGCCに対してあなたが行った拡張機能を自由に共有することができます。この自由の結果、他の人が開発したGCC拡張機能を利用することもできます。 GCCが提供する多くの機能は、この協力の自由がどのようにあなたの利益になるのか、そしてGCCを使用するすべての人々が今日どのように役立つのかを示しています。

1.3 CおよびC ++でのプログラミング

CおよびC ++は、コンピュータのメモリに直接アクセスできる言語です。 歴史的に、低レベルのシステムソフトウェアや、リソースの使用率の高さや制御が重要なアプリケーションの作成に使用されてきました。 ただし、他のデータ構造の破壊を避けるために、メモリが正しくアクセスされるように注意する必要があります。 このマニュアルでは、コンパイル時の潜在的なエラーを検出するためのテクニックについて説明しますが、CやC ++などの言語を使用するリスクを排除することはできません。

GNU Common Lispgcl)、GNU Smalltalk(gst)、GNU Scheme拡張言語(guile)、JavaGNUコンパイラgcj)などの他の高級言語も、CおよびC ++に加えて提供しています。 これらの言語では、メモリアクセスエラーの可能性を排除して、メモリに直接アクセスすることはできません。 これらは、多くのアプリケーションでCおよびC ++のより安全な代替手段です。

1.4このマニュアルで使用されている表記規則

このマニュアルには、キーボードで入力できる多くの例が含まれています。 端末に入力されたコマンドは次のように表示されます。

$ command

それに続いて出力されます。例えば:

$ echo "hello world"
hello world

行の最初の文字はターミナルプロンプトで、入力しないでください。 このマニュアルではドル記号「$」が標準プロンプトとして使用されていますが、システムによっては異なる文字を使用するものもあります。

例のコマンドが長すぎて1行に収まらない場合、次のように次の行に折り返されてインデントされます。

$ echo "an example of a line which is too long to fit 
    in this manual"

キーボードで入力するときは、コマンド全体を1行に入力する必要があります。

このマニュアルで使用されているソースファイルの例は、出版社のWebサイトからダウンロードすることができます(2)。または、標準のGNUエディタemacsなどのテキストエディタを使用して手動で入力します。 コンパイルコマンドの例では、GNU CおよびC ++コンパイラの名前としてgccおよびg ++を使用し、他のコンパイラを参照するためにccを使用します。 サンプルプログラムはGCCのどのバージョンでも動作するはずです。 最近のバージョンのGCCでのみ利用可能なコマンドラインオプションは、本文に記載されています。

この例では、GNUオペレーティングシステムの使用を前提としています。他のシステムの出力には若干の違いがあるかもしれません。 簡潔にするため、いくつかの重要でないシステム依存の出力メッセージ(非常に長いシステムパスなど)が例で編集されています。 環境変数を設定するコマンドは、標準のGNUシェル(bash)の構文を使用し、Bourneシェルのどのバージョンでも動作します。

2 Cプログラムのコンパイル

この章では、gccを使用してCプログラムをコンパイルする方法について説明します。 プログラムは、単一のソースファイルまたは複数のソースファイルからコンパイルすることができ、システムライブラリとヘッダファイルを使用することができます。

コンパイルとは、プログラムをテキストソースコードからCやC ++などのプログラミング言語で機械コードに変換するプロセスで、コンピュータの中央処理装置(CPU)を制御するために使用される1と0のシーケンスです。 このマシンコードは、バイナリファイルと呼ばれる実行可能ファイルと呼ばれるファイルに格納されます。

2.1単純なCプログラムのコンパイル

C言語の典型的なサンプルプログラムはHello Worldです。 ここに、私たちのバージョンのプログラムのソースコードがあります:

#include <stdio.h>

int
main (void)
{
  printf ("Hello, world!\n");
  return 0;
}

ソースコードは「hello.c」というファイルに格納されているものとします。 ‘hello.c'ファイルをgccコンパイルするには、次のコマンドを使用します。

$ gcc -Wall hello.c -o hello

‘hello.c'のソースコードをマシンコードにコンパイルし、実行ファイル 'hello'に格納します。マシンコードの出力ファイルは、-oオプションを使用して指定します。このオプションは通常、コマンドラインの最後の引数として与えられます。これを省略すると、出力は 'a.out'というデフォルトファイルに書き込まれます。

実行可能ファイルと同じ名前のファイルがカレントディレクトリにすでに存在する場合は上書きされます。

オプション-Wallは、最も一般的に使用されるすべてのコンパイラ警告をオンにします—このオプションを常に使用することをお勧めします!後の章で説明する他の多くの警告オプションがありますが、-Wallが最も重要です。 GCCは、有効にされていない限り警告を出力しません。コンパイラの警告は、CおよびC ++でプログラミングするときに問題を検出する上で不可欠な助けとなります。

この場合、プログラムが完全に有効であるため、コンパイラは-Wallオプションで警告を生成しません。警告を生成しないソースコードは、きちんとコンパイルされていると言われています。

プログラムを実行するには、次のように実行可能ファイルのパス名を入力します。

$ ./hello
Hello, world!

これは、実行可能ファイルをメモリにロードし、CPUにその中に含まれる命令の実行を開始させる。 パス./は現在のディレクトリを参照するため、./helloは現在のディレクトリにある実行可能ファイル ‘hello'をロードして実行します。

2.2簡単なプログラムでのエラーの発見

上で述べたように、コンパイラの警告は、CおよびC ++でプログラミングする際の基本的な助けとなります。 これを実証するために、以下のプログラムには微妙なエラーがあります。整数値に浮動小数点フォーマット ‘%f'を指定することによって、関数printfを間違って使います:

#include <stdio.h>

int
main (void)
{
  printf ("Two plus two is %f\n", 4);
  return 0;
}

このエラーは一見したところ明らかではありませんが、警告オプション-Wallが有効になっているとコンパイラが検出できます。 上のプログラム ‘bad.c'を警告オプション-Wallとともにコンパイルすると、次のメッセージが生成されます。

$ gcc -Wall bad.c -o bad
bad.c: In function `main':
bad.c:6: warning: double format, different 
  type arg (arg 2)

これは、フォーマット文字列が6行目の ‘bad.c'ファイルで不正に使用されたことを示しています.GCCによって生成されるメッセージは、常にfile:line-number:メッセージの形式をとります。 コンパイラは、正常なコンパイルを妨げるエラーメッセージと、考えられる問題を示す警告メッセージ(コンパイルからプログラムを停止しない)を区別します。

この場合、整数引数の正しい書式指定子は ‘%d'でなければなりません。 printfのフォーマット指定子は、Cの一般的な書籍(GNU C Library Reference Manualなどを参照してください)にあります。

警告オプション-Wallを指定しないと、プログラムは正常にコンパイルされたように見えますが、不正な結果が生成されます。

$ gcc bad.c -o bad
$ ./bad
Two plus two is 2.585495    (incorrect output)

不正な書式指定子は、関数printfが浮動小数点数ではなく整数を渡すため、出力が破損する原因となります。 整数と浮動小数点数は異なるフォーマットでメモリに格納され、一般に異なるバイト数を占め、偽の結果につながります。 上記の実際の出力は、特定のプラットフォームおよび環境によって異なる場合があります。

明らかに、コンパイラの警告をチェックせずにプログラムを開発することは非常に危険です。 正しく使用されていない関数があると、プログラムがクラッシュしたり、誤った結果をもたらす可能性があります。 コンパイラ警告オプションをオンにすると、-WallはCプログラミングで発生する最も一般的なエラーの多くを捕捉します。

2.3複数のソースファイルのコンパイル

プログラムは複数のファイルに分割できます。 これにより、特に大きなプログラムの場合には、編集や理解が容易になります。また、個々のパーツを個別にコンパイルすることもできます。

次の例では、プログラムHello Worldを ‘main.c'、 'hello_fn.c'、およびヘッダーファイル 'hello.h'の3つのファイルに分割します。 ここにメインプログラム 'main.c'があります:

#include "hello.h"

int
main (void)
{
  hello ("world");
  return 0;
}

以前のプログラム ‘hello.c'のprintfシステム関数への元の呼び出しは、新しい外部関数helloの呼び出しに置き換えられました。これは別のファイル 'hello_fn.c'で定義します。

メインプログラムには、hello関数の宣言を含むヘッダファイル ‘hello.h'も含まれています。 この宣言は、関数呼び出しと関数定義の間で引数と戻り値の型が正しく一致するようにするために使用されます。 'main.c'はprintfを直接呼び出さないので、printf関数を宣言するために、システムヘッダファイル 'stdio.h'を 'main.c'にインクルードする必要はありません。

‘hello.h'の宣言は、関数helloのプロトタイプを指定する1行です:

void hello (const char * name);

関数helloの定義自体は、ファイル ‘hello_fn.c'に含まれています。

#include <stdio.h>
#include "hello.h"

void 
hello (const char * name)
{
  printf ("Hello, %s!\n", name);
}

この関数は、 “Hello、name!"というメッセージを表示します。 その引数をnameの値として使用します。

ちなみに、インクルードステートメント#include “FILE.h"と#include <FILE.h>の2つの形式の違いは、前者が現在のディレクトリで ‘FILE.h'を検索してから、システムヘッダファイルのディレクトリ 。 includeステートメント#include <FILE.h>はシステムヘッダファイルを検索しますが、デフォルトではカレントディレクトリを検索しません。

これらのソースファイルをgccコンパイルするには、次のコマンドを使用します。

$ gcc -Wall main.c hello_fn.c -o newhello

この場合、-oオプションを使用して、実行可能ファイル ‘newhello'に異なる出力ファイルを指定します。 コマンドラインのファイルのリストには、ヘッダーファイル 'hello.h'が指定されていないことに注意してください。 ソースファイルの#include “hello.h"は、適切なポイントに自動的にインクルードするようにコンパイラーに指示します。

プログラムを実行するには、実行可能ファイルのパス名を入力します。

$ ./newhello
Hello, world!

プログラムのすべての部分が1つの実行可能ファイルに結合されています。これは、以前使用された単一のソースファイルから作成された実行可能ファイルと同じ結果を生成します。

2.4独立してファイルをコンパイルする

プログラムが1つのファイルに格納されている場合、個々の関数を変更するには、プログラム全体を再コンパイルして新しい実行可能ファイルを生成する必要があります。大きなソースファイルの再コンパイルには非常に時間がかかることがあります。

プログラムが独立したソースファイルに格納されている場合、変更されたファイルのみがソースコードが変更された後に再コンパイルする必要があります。このアプローチでは、ソースファイルは別々にコンパイルされ、リンクされて2段階のプロセスになります。最初の段階では、実行可能ファイルを作成せずにファイルがコンパイルされます。結果はオブジェクトファイルと呼ばれ、GCCを使用するときは拡張子 ‘.o'を持ちます。

第2段階では、オブジェクトファイルは、リンカーと呼ばれる別のプログラムによって統合されます。リンカはすべてのオブジェクトファイルを結合して単一の実行可能ファイルを作成します。

オブジェクトファイルには、他のファイルの関数(または変数)のメモリアドレスへの参照が定義されていないマシンコードが含まれています。これにより、ソースファイル同士を直接参照せずにコンパイルすることができます。リンカは、実行可能ファイルを生成するときに、これらの欠落したアドレスを埋めます。

2.4.1ソースファイルからのオブジェクトファイルの作成

コマンドラインオプション-cを使用して、ソースファイルをオブジェクトファイルにコンパイルします。たとえば、次のコマンドは、ソースファイル ‘main.c'をオブジェクトファイルにコンパイルします。

$ gcc -Wall -c main.c

main関数のマシンコードを含むオブジェクトファイル ‘main.o'が生成されます。これには外部関数helloへの参照が含まれていますが、対応するメモリアドレスはこの段階でオブジェクトファイルに未定義のままです(後でリンクすると埋め込まれます)。

ソースファイル ‘hello_fn.c'のhello関数をコンパイルするコマンドは次のとおりです。

$ gcc -Wall -c hello_fn.c

これにより、オブジェクトファイル ‘hello_fn.o'が生成されます。

この場合、オプション-oを使用して出力ファイルの名前を指定する必要はありません。 -cを指定してコンパイルすると、コンパイラは自動的に元の拡張子ではなく ‘.o'を使用してソースファイルと同じ名前のオブジェクトファイルを作成します。

‘main.c'と 'hello_fn.c'の#include文で自動的にインクルードされるため、ヘッダファイル 'hello.h'をコマンドラインに置く必要はありません。

2.4.2オブジェクトファイルからの実行ファイルの作成

実行可能ファイルを作成する最後のステップは、gccを使用してオブジェクトファイルをリンクし、外部関数の欠落アドレスを埋め込むことです。オブジェクトファイルをリンクするには、単にコマンドラインに列挙します:

$ gcc main.o hello_fn.o -o hello

個々のソースファイルが既にオブジェクトコードに正常にコンパイルされているため、-Wall警告オプションを使用する必要はほとんどありません。ソースファイルがコンパイルされると、リンクは成功するか失敗するかの明白なプロセスです(解決できない参照がある場合にのみ失敗します)。

リンク手順を実行するために、gccは別のプログラムであるリンカldを使用します。 GNUシステムでは、GNUリンカーGNU ldが使用されます。他のシステムでは、GNUリンカをGCCと一緒に使用するか、独自のリンカを使用することがあります。リンカそのものについては後述します(see section 11コンパイラの仕組み)。リンカーを実行することによって、gccはオブジェクトファイルから実行可能ファイルを作成します。

結果の実行可能ファイルを今すぐ実行することができます:

$ ./hello
Hello, world!

これは、前のセクションで単一のソースファイルを使用しているプログラムのバージョンと同じ出力を生成します。

2.5再コンパイルと再リンク

ソースファイルを独自にコンパイルする方法を示すために、メインプログラム ‘main.c'を編集し、それを修正して、世界中ではなくすべての人に挨拶を出力します:

#include "hello.h"

int
main (void)
{
  hello ("everyone");  /* changed from "world" */
  return 0;
}

更新されたファイル ‘main.c'は次のコマンドで再コンパイルできるようになりました:

$ gcc -Wall -c main.c

これにより、新しいオブジェクトファイル ‘main.o'が作成されます。 'hello_fn.c'の新しいオブジェクトファイルを作成する必要はありません。ヘッダーファイルなどの依存するファイルや関連ファイルは変更されていないためです。

新しいオブジェクトファイルをhello関数で再リンクして新しい実行可能ファイルを作成することができます:

$ gcc main.o hello_fn.o -o hello

結果として得られる実行可能ファイル ‘hello'は、新しいmain関数を使用して次の出力を生成するようになりました。

$ ./hello
Hello, everyone!

ファイル ‘main.c'のみが再コンパイルされ、hello関数用の既存のオブジェクトファイルと再リンクされることに注意してください。 代わりに 'hello_fn.c'というファイルが変更されている場合は、 'hello_fn.c'を再コンパイルして新しいオブジェクトファイル 'hello_fn.o'を作成し、既存のファイル 'main.o'に再リンクすることができました。

多くのソースファイルを持つ大規模なプロジェクトでは、変更されたものだけを再コンパイルすることで大幅な節約が可能です。 プロジェクト内の変更されたファイルのみを再コンパイルするプロセスは、標準のUnixプログラムメイクで自動化することができます。

2.6 単純なメークファイル

makeに慣れていない人には、このセクションではその使い方を簡単に説明します。 makeはそれ自身のプログラムであり、すべてのUnixシステム上にあります。 GNU版のmakeの詳細については、Richard M. StallmanとRoland McGrathのGNU Makeマニュアルを参照する必要があります(see section追加情報)。

Makeは、メークファイルからプロジェクトの説明を読み込みます(デフォルトでは、現在のディレクトリの ‘Makefile'と呼ばれます)。 makefileは、ターゲット(実行可能ファイルなど)とそれらの依存関係(オブジェクトファイルやソースファイルなど)に関するコンパイルルールのセットを次の形式で指定します。

target: dependencies
        command

各ターゲットに対して、makeは対応する依存ファイルの変更時刻をチェックして、対応するコマンドを使用してターゲットを再構築する必要があるかどうかを判断します。 makefileコマンドラインはスペースではなく、単一のTAB文字でインデントする必要があることに注意してください。

GNU Makeには、Makefileの構築を簡単にするために、暗黙ルールと呼ばれる多くのデフォルトルールが含まれています。たとえば、 ‘.o'ファイルはコンパイルによって ’.c'ファイルから取得でき、 ‘.o'ファイル同士をリンクすることで実行可能であることが指定されています。暗黙的な規則は、CC(Cコンパイラ)やCFLAGS(Cプログラムのコンパイルオプション)などのmake変数の観点から定義され、makefileのVARIABLE = VALUE行を使用して設定できます。 C ++の場合、同等の変数はCXXとCXXFLAGSであり、make変数CPPFLAGSはプリプロセッサのオプションを設定します。暗黙のルールとユーザー定義のルールは、GNU Makeが必要に応じて自動的に連鎖します。

上記のプロジェクトのための単純な「Makefile」は、次のように書くことができます:

CC=gcc 
CFLAGS=-Wall
main: main.o hello_fn.o

clean:
    rm -f main main.o hello_fn.o

このファイルは次のように読むことができます:Cコンパイラgccを使用し、コンパイルオプション-Wallを使用して、オブジェクトファイル ‘main.o'と 'hello_fn.o'からターゲット実行可能なメインをビルドします(これらは順番にビルドされます)。 'main.c'と 'hello_fn.c'からの暗黙のルール)。 (4)rmコマンドで-f(force)オプションを指定すると、ファイルが存在しない場合はすべてのエラーメッセージが抑制されます。

makefileを使用するには、makeと入力します。 引数なしで呼び出されると、makefileの最初のターゲットがビルドされ、実行可能ファイル ‘main'が生成されます。

$ make
gcc -Wall   -c -o main.o main.c
gcc -Wall   -c -o hello_fn.o hello_fn.c
gcc   main.o hello_fn.o   -o main
$ ./main
Hello, world!

ソースファイルを変更した後に実行可能ファイルを再構築するには、単にmakeと入力します。 ターゲットファイルと依存ファイルのタイムスタンプをチェックすることにより、makeは変更されたファイルを識別し、ターゲットの更新に必要な中間ファイルを再生成します。

$ emacs main.c  (edit the file)
$ make
gcc -Wall   -c -o main.o main.c
gcc    main.o hello_fn.o   -o main
$ ./main
Hello, everyone!

最後に、生成されたファイルを削除するには、make cleanとタイプします。

$ make clean
rm -f main main.o hello_fn.o

より洗練されたメイクファイルには、通常、インストール(make install)とテスト(make check)のための追加のターゲットが含まれています。

このマニュアルの残りの部分の例は、makefileを必要としないほど十分に小さいですが、makeを使用することは、どのような大きなプログラムでも推奨されます。

2.7外部ライブラリとのリンク

ライブラリとは、プログラムにリンクできるプリコンパイルされたオブジェクトファイルの集合です。ライブラリの最も一般的な使用法は、C数学ライブラリにある平方根関数sqrtなどのシステム関数を提供することです。

ライブラリは通常、拡張子 ‘.a'を持つ特別なアーカイブファイル(静的ライブラリと呼ばれます)に格納されます。それらは別のツールであるGNU archiver arを使ってオブジェクトファイルから作成され、コンパイル時に関数への参照を解決するためにリンカーによって使用されます。 arコマンド(第10章コンパイラ関連ツール参照)を使ってライブラリを作成する方法については、後で説明します。簡単にするために、このセクションでは静的ライブラリのみを扱います。共有ライブラリを使用して実行時の動的リンクについては、次の章で説明します。

標準のシステムライブラリは通常、 ‘/ usr / lib'と ’/lib'というディレクトリにあります。(5)たとえば、Cのmathライブラリは、通常Unix上のファイル ‘/usr/lib/libm.a'に保存されています同様のシステム。このライブラリの関数の対応するプロトタイプ宣言は、ヘッダーファイル ’/usr/include/math.h'にあります。 C標準ライブラリ自体は ‘/usr/lib/libc.a'に格納され、 'printf'などのANSI / ISO C標準で指定された関数を含んでいます。このライブラリはすべてのCプログラムにデフォルトでリンクされています。

数学ライブラリ ‘libm.a'の外部関数sqrtを呼び出すプログラムの例を次に示します。

#include <math.h>
#include <stdio.h>

int
main (void)
{
  double x = sqrt (2.0);
  printf ("The square root of 2.0 is %f\n", x);
  return 0;
}

このソースファイルだけから実行可能ファイルを作成しようとすると、コンパイラはリンク段階でエラーを出します。

$ gcc -Wall calc.c -o calc
/tmp/ccbR6Ojm.o: In function `main':
/tmp/ccbR6Ojm.o(.text+0x19): undefined reference 
  to `sqrt'

問題は、外部の数学ライブラリ ‘libm.a'なしではsqrt関数への参照を解決できないことです。 関数sqrtは、プログラムまたはデフォルトライブラリ 'libc.a'に定義されておらず、明示的に選択されていない限り、コンパイラはファイル 'libm.a'にリンクしません。 なお、エラーメッセージ ’/tmp/ccbR60jm.o'に記載されているファイルは、リンク処理を行うために、 ‘calc.c'からコンパイラが作成した一時オブジェクトファイルです。

コンパイラがsqrt関数をメインプログラム ‘calc.c'にリンクできるようにするには、ライブラリ 'libm.a'を指定する必要があります。 これを行うための明白であるが面倒な方法の1つは、コマンドラインで明示的に指定することです。

$ gcc -Wall calc.c /usr/lib/libm.a -o calc

ライブラリ ‘libm.a'には、sin、cos、exp、log、sqrtなどのすべての数学関数のオブジェクトファイルが含まれています。 リンカーはこれらを検索し、sqrt関数を含むオブジェクトファイルを検索します。

sqrt関数のオブジェクトファイルが見つかると、メインプログラムをリンクして完全な実行可能ファイルを生成することができます。

$ ./calc 
The square root of 2.0 is 1.414214

実行可能ファイルには、main関数のマシンコードとsqrt関数のマシンコードが含まれ、ライブラリ ‘libm.a'の対応するオブジェクトファイルからコピーされます。

コマンドラインで長いパスを指定する必要を避けるために、コンパイラはライブラリとリンクするためのショートカットオプション ‘-l'を提供しています。 たとえば、次のコマンド、

$ gcc -Wall calc.c -lm -o calc

完全なライブラリー名 ‘/usr/lib/libm.a'を使用した上記の元のコマンドと同等です。

一般に、コンパイラ・オプション-lNAMEは、オブジェクト・ファイルを標準ライブラリ・ディレクトリのライブラリ・ファイル ‘libNAME.a'にリンクしようとします。 コマンドラインオプションと環境変数で追加のディレクトリを指定することができます。これについては後ほど説明します。 大規模なプログラムは通常、数学ライブラリ、グラフィックスライブラリ、ネットワーキングライブラリなどのライブラリをリンクするために、多くの-lオプションを使用します。

2.7.1ライブラリのリンク順

リンカーの従来の動作は、コマンドラインで指定されたライブラリの左から右に外部関数を検索することです。 つまり、関数の定義を含むライブラリは、それを使用するソースファイルまたはオブジェクトファイルの後に現れなければなりません。 これには、次のコマンドに示すように、ショートカット-lオプションで指定したライブラリが含まれます。

$ gcc -Wall calc.c -lm -o calc   (correct order)

リンカによっては、反対の順序(それを使用するファイルの前に-lmオプションを置く)はエラーになりますが、

$ cc -Wall -lm calc.c -o calc    (incorrect order)
main.o: In function `main':
main.o(.text+0xf): undefined reference to `sqrt'

‘calc.c'の 後ろsqrtに ライブラリやオブジェクトファイルが含まれていないためです。このオプションはファイル'calc.c'の後に現れ ます。 -lm

複数のライブラリを使用している場合は、ライブラリ自体についても同じ規則を遵守する必要があります。別のライブラリで定義された外部関数を呼び出すライブラリは、その関数を含むライブラリの前に現れます。

たとえば、GNU線形プログラミングライブラリ'libglpk.a ‘を使用するプログラム'data.c'は、数学ライブラリ'libm.a'を順番に使用して コンパイルする必要があります。

$ gcc -Wall data.c -lglpk -lm

‘libglpk.a'の オブジェクトファイルは'libm.a'で定義された関数を使用するから です。

現在のリンカーのほとんどは、順序にかかわらずすべてのライブラリを検索しますが、これを行わないライブラリもありますので、ライブラリを左から右に並べるという規約に従うのが最善です。

定義されていない参照で予期しない問題が発生し、必要なすべてのライブラリがコマンドラインに表示されているように見える場合は、これを覚えておいてください。

参考

An Introduction to GCC - Table of Contents

GoogleはDeepMind AIに実際のオブジェクトとやり取りする方法を教えます。

GoogleのDeepMindの人工知能は、私たちのように話し、臆病者、死者の人間が盲目にならないようにして、ゴーをプレイすることを知っている。しかし、現在、そのクリエイターはAIに現実の世界を教えようとしているのです。

これは現在検討中の新しい論文で、仮想環境内で物理的な物体を知るためにAIがどのように操作されたかを研究者が説明します。赤ちゃんと周囲の世界との相互作用のタイプを本質的に模倣することによって、コンピュータエンジニアは数と質量について学ぶことができました。

DeepMindは、仮想現実の2つの異なるシナリオでテストに参加しました。最初の実験では、実験が実行されるたびに質量が変わる5つのブロックが含まれていました。 AIの目的は、どのブロックが最も重いかを特定することでしたが、どのようにブロックする必要があるかについての具体的な指示はありませんでした。 AIが正しく推測するたびに、肯定的なフィードバックが与えられ、すべての間違いは否定的なフィードバックを伴います。試行錯誤によって、AIは最終的に、望ましい結果を達成する唯一の方法は、個々のブロックを操作して質量を感じることであることを学びました。

2番目の実験では、同様に5つのブロックが含まれていましたが、一部が一緒に固まっており、本質的に単一ブロックのように機能していました。今回は、ブロックがタワーとして積み重ねられ、AIは個数がどれくらいあるかを推測しなければなりませんでした。以前のシナリオと同じように、DeepMindは試行錯誤によってオブジェクトを操作してそれらを数える方法を発見しました。

このタイプの研究は、一見非常に初歩的ではあるが、人工知能が現実の世界と、そして私たちとどのように相互作用するかの基礎である。ロボットには実用的な意味があります。今後のロボットは、私たちの自然界を理解する方法とその移動方法をよりよく理解することができます。ご存じのように、ターミネーターは溶けた鋼の中を突発的に進んでいません。

科学者たちが神経レースを発明した

f:id:miyamotok0105:20170316181610j:plain イアンM.銀行による文化の小説、未来的なポスト人間が「神経レース。 “あなたの脳で成長したメッシュと呼ばれる自分の脳上のデバイスをインストールし、それは本質的に無線ブレイン・マシン・インタフェースです。しかし、それはまた、あなたのニューロンを考えて特定の化学物質を放出するようにプログラムする方法です。そして今、実生活には神経レースのプロトタイプがあります。

ナノテクノロジーを扱う化学者とエンジニアのグループは、機械と生物学的回路の間の継ぎ目のない界面のように見えるものを作るために、脳に融合することができる超微細メッシュについてNature Nanotechnologyの論文を今月発表しました。「メッシュ・エレクトロニクス」と呼ばれるこのデバイスは非常に薄くて柔軟性があり、針で注射することができます。移植を受けて繁栄しているマウスですでにテストしています。研究者は彼らの装置を「注射器注射可能な電子装置」と表現し、脳活動の監視、パーキンソン病のような変性疾患の治療法の提供、さらには脳機能の強化など、多くの用途があります。

スミソニアン誌の報道によると、デビン・パウエル氏によれば、軍隊を含む多くの団体がこの研究に投資しているという。

f:id:miyamotok0105:20170316181620j:plain 脳細胞と融合したメッシュの3D顕微鏡画像

[研究研究者Charles Lieberの]後援者には、パーキンソン病などの神経変性疾患を治療する新しい方法に関心を持っているベンチャーキャピタル会社、Fidelity Biosciencesが含まれる。軍隊はまた、米空軍のサイボーグセル(Cyborgcell)プログラムを通じて支援を提供することに興味を持ち、小規模エレクトロニクスに焦点を当てて、細胞の「性能向上」を図っている。 今のところ、この電子メッシュのマウスはワイヤでコンピュータに接続されていますが、将来的にはこの接続はワイヤレスになる可能性があります。メッシュについての最も驚くべき部分は、マウス脳細胞がその周りで成長し、ワイヤーとの接続を形成し、生化学系への機械的成分を本質的に歓迎することである。

Lieberと彼の同僚は、現実的には長年のことですが、できるだけ早くそれを人間でテストすることを望んでいます。それでも、これは、雲の中を精神的なトラフィックを通過する注射可能な電子機器を介して脳と脳のインターフェースが可能な、最初の真の人間のインターネットの始まりになる可能性があります。何がうまくいかないでしょうか?

[ Nature Nanotechnologyの科学論文を読む] http://www.nature.com/nnano/journal/vaop/ncurrent/full/nnano.2015.115.html#author-information

参考

http://gizmodo.com/scientists-just-invented-the-neural-lace-1711540938

PathNet:スーパーニューラルネットワークにおける進化チャネル勾配降下

pathNetの論文を読むにはA3Cくらいはわかってる必要がありそう。 図1を見るとニューラルネットの経路を使いまわせる雰囲気に見える。

抜粋

人工総合知能(AGI)では、巨大な忘却を起こすことなく、複数のユーザーが同じ巨大なニューラルネットワークを訓練し、パラメータの再利用が可能であると効率的です.PathNetはこの方向の第一歩です。ニューラルネットワークアルゴリズムは、ニューラルネットワークに埋め込まれたエージェントを使用します。このタスクは、ネットワークのどの部分を新しいタスクに使用するかを発見することです。エージェントは、バックプロパゲーションアルゴリズムの順方向および逆方向パスによって使用および更新されるパラメータのサブセットを決定するネットワークを通る経路(ビュー)である。学習中、トーナメント選択遺伝的アルゴリズムを使用して、複製および突然変異のためのニューラルネットワークを通る経路を選択する。経路適応度は、コスト関数に従って測定されたその経路の性能である。私たちは成功した伝達学習を実証しています。タスクA上で学んだapathに沿ってパラメータを固定し、タスクBに対する新しいパスの集合を再展開することにより、タスクBは、スクラッチまたは微調整後に学習されるよりも速く学習することができる。バイナリMNIST、CIFAR、SVHN監督学習分類タスク、およびAtariおよびLabyrinth補強学習タスクのセットについて、ポジティブ転送が実証され、PathNetsがニューラルネットワークトレーニングに一般的に適用可能であることが示唆されました。最後に、PathNetは、並列非同期強化学習アルゴリズム(A3C)の超パラメータ選択の堅牢性を大幅に向上させます。

キーワード

巨大なネットワーク、経路進化アルゴリズム、進化と学習、継続学習、伝達学習、マルチタスク学習、基底神経節

1.はじめに

人工総合情報のためのもっともらしい要求は、多くのユーザが多数のタスクで同じ巨人ネットワークを訓練することを要求されることである。このネットワークは、各タスクの最初から学習するのではなく、既存の知識を再利用できるため、ネットワークが経験を積む最も効率的な方法です。これを達成するために、我々は、巨大ネットのthaachユーザーに、可能な限り効率的にユーザー定義のタスクを学習させることであるエージェントの集まりを与えることを提案する。エージェントは、ニューラルネットワーク内のアクションを実行することによって、ニューラルネットワークの環境で既存のパラメータを再利用する最良の方法を学習します。他のユーザのタスクを学習したり、転送が可能であればパラメータを共有したり、干渉が重大な場合には別のパラメータを更新することを学ぶ他のエージェントと並行して作業する必要があります。各エージェントは任意の複合強化学習アルゴリズムによって制御できます。可能な限り単純な「エージェント」、進化の単位[4]。上記のAGIのフレームワークは、転送学習[22]、継続学習[16]、マルチタスク学習[2]の側面を含む。私たちの研究は、著者が “情報を吸収するニューラルネットワークの能力はそのパラメータの数によって制限されている"と書いている激しい論文「激しい大規模なニューラルネットワーク」と動機づけをしている[19]。標準的なニューラルネットワークが純粋に訓練されていれば、訓練コストはモデル幅で二次的にスケールされるが、PathNetは理論的にはネットワーク幅に対して一定の計算速度を有するのに対して、大規模ネットワークの固定サイズサブセットのみがいつでもより多くの訓練が必要でないことを保証しない場合もあります)。我々の作業は、ファブリック内のモジュール間の接続強度が学習される「Convolutional Neural Fabrics」にも関連するが、PathNetとは異なり、ファブリック全体が常に使用される[18]。

本稿では、転送、継続、およびマルチタスク学習を明示的にサポートする新しい学習アルゴリズムPathNetを紹介します。図1は、動作中のアルゴリズムを示しています。第1のタスクAはポンであり、第2のタスクBはエイリアンである。両方ともそれぞれ80Mタイムステップの間連続して訓練される。図のボックス1の紫色の線は、ポン訓練の開始時にニューラルネットワークモデルを介して64個のランダムに初期化されたすべての経路を示す。トーナメント選択遺伝的アルゴリズムを使用して経路を進化させ、適応度評価の際に強化学習アルゴリズムを用いた勾配降下によっていくつかのゲームエピソードについて経路を訓練する。したがって、進化と学習は同時に進化しており、勾配降下を適用して体重とバイアスのパラメータを変化させるべきである進化的指導を行っている。ボックス2は、パフォーマンスが向上するにつれて集団が収束することを示している(多くの経路が互いに重なっている)。完璧なパフォーマンスが達成されると、母集団はボックス3に示す単一パスに収束する。ボックス4は、収束した単一経路は、トレーニングセッションの終了まで持続することを示す。この時点で、タスクはタスクB(エイリアン)に切り替わり、Pongの最適パスは「固定」になります。つまり、そのパス上のモジュールの重みとバイアスが固定されます。ボックス5は、明るい青色の経路の新規にランダムに初期化された集団に沿って濃い赤色の線として固定された経路を示す。経路の新しい集団は進化し、ボックス8によってエイリアンに収束する.160Mステップの後、エイリアンの最適経路は固定され、ボックス9の青色の線で示される。経路ネットワークは、スカフォールドおよび任意の所望の勾配ベースの学習アルゴリズムニューラルネットワークのパラメータの限定されたサブセットに向けて実行し、その後、これらのパラメータを学習した後に、それは壊滅的な忘却が設計によって防止されるという点で、漸進的なニューラルネットワークに似ている[17]。進歩的なネットワークでは、転送を決定するトポロジは学習されたものよりもハードワイヤードであり、第1のニューラルネットワークはソースタスクに対して訓練され、第2のニューラルネットワークは重みを固定した第1のニューラルネットワークから入力を受け取るターゲットタスクに対して訓練される。 PathNetsallow元の「列」とそれ以降の「列」との関係を展開します。ここでは列はonedeepニューラルネットワークです。

PathNetの2つの例が調査され、PathNetが確率的な勾配降下によって訓練された2つの教師付き学習タスクの連続実施と、PathNetがAsynchronous Advantage Actor-Critic(A3C)によって訓練された強化学習タスク(Atariand Labyrinthゲーム) A3Cは、効率的に分配された強化学習アルゴリズムであり、複数のCPU上で実行される。 64非同期的に更新された作業者は、単一のネットワークのパラメータを同時に共有し更新する[12]。 PathNetの概念は、ダーウィンの神経ダイナミクスの枠組みの中で最初に考案されたものであるが、これは、最初のタスクで初めてトレーニングされた後の単一の固定パス制御に比べて、進化的アルゴリズムが脳内でどのように実行されるのかを想定している[5]。しかし、その元の仕事では、経路のトポロジーと重みの両方が進化し、勾配降下学習もなかった[4]。組み合わせ最適化問題に関する標準的な遺伝的アルゴリズムと比較することができました。ここでは、A3Cの性能と転送学習のための確率的勾配降下を示す。

2.方法

2.1 PathNetのアーキテクチャ

PathNetは、各層がM個のモジュールからなる層を有するモジュール式深層ニューラルネットワークである。 各モジュール自体は、ここでは畳み込みまたは線形のニューラルネットワークであり、その後に伝達関数が続く。 整流された線形ユニットがここで使用される。 各層について、その層のモジュールの出力は、次の層の能動的なモジュールに渡される前に加算される。 現在評価中の経路遺伝子型に存在する場合、モジュールはアクティブです(下記参照)。 1層当たり最大N個の別個のモジュールが経路内に許容される(典型的にはN = 3または4)。 各タスク(例えば、Atariゲーム)は、値の機能の読み出しとポリシーの読み込みを持っています([12]を参照してください) 使用されたA3Cアルゴリズムの完全な記述については)。

2.2経路の進化:直列および並列

P遺伝子型(経路)は無作為に初期化され、各遺伝子型は多くてN×L行列の整数であり、その経路の各層の活性なモジュールを記述する。直列監視下の実装では、バイナリトーナメント選択アルゴリズムが以下のように直列に実施される。ランダムな遺伝子型が選択され、その経路はT期のために訓練され、その適応性はその訓練期間を誤った負の分類である。次に、別のランダムジェノタイプが選択され、その経路はTエポックのために訓練される。勝ち抜かれた経路の遺伝子型のコピーが、通過経路遺伝子型を上書きする。当選した経路の遺伝子型のコピーは、1 / [N×L]の確率で要素を別々に選択し、[-2、2]の範囲の整数をそれに加えて突然変異させる。 A3C(強化学習)のケースでは、64のすべての遺伝子型が64人の労働者のそれぞれに1つずつ並行して評価されている。したがって、労働者によるパラメータの同時更新は、すべての作業者がすべてのパラメータを更新する標準的なA3Cアルゴリズムとは対照的である。遺伝子型の適合度は、その遺伝子型の経路を使用している労働者がTエピソードにわたって累積した戻り値である。労働者が評価している間、共有フィットネスキットに大きな負のフィットネスを書いて、評価されるまで、遺伝子型がトーナメントに勝つことはありません。作業者がTエピソードを終えると、Bは他のランダムな遺伝子型を選択し、それらの遺伝子型のいずれかが少なくともそれ自身の適合度を戻しているかどうかをチェックする。少なくとも1つがあれば、最も適合する遺伝子型は現在の作業者の遺伝子型を上書きし、上記。他の労働者が、より高い適合性を有する遺伝子型を有していない場合、その労働者は遺伝子型を所有しており、次いで、労働者は、その遺伝子型を再評価する。

2.3転送学習のパラダイム

タスクAが一定の期間にわたって、または何らかのエラー閾値に達するまで訓練されると、ベストフィット経路は固定され、そのパラメータは変更不可能であることを意味する。 最適なパスにない他のすべてのパラメータは、再初期化されます。 私たちは、再初期化を行わないと、パフォーマンスがオフラインチューニングを超えないことを確認しました。 A3Cのケースでは(監視された学習ケースではなく)元のベストフィットパスウェイは、ネットワークのフォワードパスの間に、新しいパスウェイに加えて常にアクティブですが、そのパラメータは後方パスによって変更されません。 次に、ランダムな経路の新しいセットが初期化され、タスクBで進化/訓練されます。監視設定と強化設定の両方で、pathNetは2つの代替設定と比較されます:ターゲットタスクが新しく学習される独立学習制御と、 第2のタスクは、第1のタスクを学習したのと同じ経路で学習される(ただし、新しい値の機能とポリシーの読み出しがある)。

f:id:miyamotok0105:20170315140318p:plain 図1:無作為に初期化された経路の集団(ボックス1の紫色の線)は、タスクA、Pongを学習しながら進化しています。 訓練の終了時に、最良の経路が固定され(ボックス5の暗赤色の線)、タスクBのための新たな経路の集団(ボックス5の明るい線)が生成される。この母集団は、次にエイリアンで訓練され、 エイリアンに進化したので、訓練の最後に固定され、ボックス9に濃い青色の線で示されている。

f:id:miyamotok0105:20170315140538p:plain 図2:PathNetは、AtariとLabyrinthのゲームを学習するために使用されます。各レイヤーには、10層(または時には15層)のモジュールが4層のネットワークで構成されています。 最初の3つのレイヤのモジュールは、モジュールごとに8つのカーネル(緑色のボックス)、カーネルのサイズ(8,4,3)、および第1から第3のレイヤーまでのストライド(4,2,1)を持つ畳み込み2Dカーネルです。 最終的な層は、それぞれ50ニューロンの不連続線状層(紫色の箱)からなる。 各モジュールの後に整流された線形ユニットがある。 次のレイヤーのモジュール(青いボックス)に渡される前に、フィーチャマップが合計されます。 典型的には、1層あたり4モジュールの最大値が経路に含まれることを許されます(赤い枠で示されています)。そうでなければ進化は学習によって調整できるパラメータの数を増やすことによって適応度を向上させる。

ドライバーレス・シャトルがデビュー

f:id:miyamotok0105:20170312211925j:plain

サン・ラモン - ステアリング・ホイール、アクセラレータ、ブレーキ・パッド、さらには人間のドライバーを作るシャトルバスは、月曜日にイーストベイのビジネスパークでデビューした。

var ndnq = ndnq || []; _ndnq.push([‘embed’]); 未来のキューブは、米国で初めてのドライバーレス車のバリエーションで、四隅のすべてのレーザー、GPSナビゲーション、障害物を検出するセンサーなど、21世紀のテクノロジーを使用しています。

センサーは機能します。少なくともパイロットプログラムを担当していたハビブ・シャムスコウ(Habib Shamskhou)が移動シャトルの前に足を踏み入れてポイントを証明したとき、彼らはサン・ラモンのビショップランチビジネスパークでのデモンストレーション中に行った。

シャトルは止まりがちになって、Shamskhouに頭を上げて手を上げ、笑顔で “見て、言った。

フランスのEasyMile社製のシャトルは、コンコルドのGoMentum駅でのテストで昨年夏から始まったパイロットプログラムの第2段階に入っています。現在、2人はオフィスパークのビショップランチ複合施設内で労働者を輸送しています。コンラッド・コスタ・トランスポート・オーソリティ(Contra Costa Transportation Authority)のランディ・イワサキ(Randy Iwasaki)執行取締役は、彼らは、年末までにオフィス・パーク周辺の公共の通りに出ると予想されている。

公共の道路でテストされている他のドライバーレスの車(たとえばGoogle)はありますが、テスト中はハンドルとドライバーが必要です。最近のカリフォルニア州の法案のおかげで、ビショップパークのシャトルは、国道で公共の道路で運転する最初の無人シャトルになります。

しかし、公共の道路の閾値に達する前に、自動車部門からの許可が必要とされる、岩崎は言った。

DMVは自律型車両の規制を策定しており、テスト以外にもこのシャトルを運行するための規則を採用しなければならない。機器、性能および安全基準を考慮する必要があります。現在、DMVには、Google、Tesla、Honda、Fordなどの企業に付与されているテストの許可が必要です。

サン・ラモンでは、シャトルは事前設定されたルートで運行され、Bishop Ranchの建物間で従業員を輸送します。公衆バスを使うのと同じように、ライダーは指定された停留所でシャトルをキャッチします。乗り物が始まっていることを乗客に警告します。シャトルは12mph走行し、緊急停止が必要な場合は「SOS」ボタンが装備されています。各シャトルは12名まで収容できます。

Bishop Ranchを所有し、運営しているSunset Development Co.のAlex Mehran Sr.最高経営責任者(CEO)は、彼が車両の技術に完全な自信を持っていると語った。先日テストしたところ、近くのビニール袋を見つけたときにシャトルが止まったと彼は言った。

Mehran氏は、同社は「これで利益を上げようとせず、公益を提供しようとしていない」と述べた。サンセットは、フランスで設計された2つのシャトルを約50万ドルで購入したとメーラン氏。2年契約には、EasyMileエンジニアによるサービスが付属しています。

アレックス・メフランの妻であるキャロリン・メフラン氏によれば、シャトルの乗りは驚くほどスムーズでした。それは運転手のない乗り物の彼女の最初の乗車でした。

この車両は、イージーマイルが北米に展開する最初の唯一のものだと岩崎氏は述べた。しかし、EasyMileは、フランス、フィンランド、ドバイ、オーストラリアなど14カ国に車両を持っています。EasyMileのMarion Lheritier氏によると、今年は80台を他の国にも展開する予定です。

参考

http://www.eastbaytimes.com/2017/03/06/san-ramon-driverless-shuttles-make-their-debut/amp/

量子コンピューティングのAPIとSDKを取得

2016年5月、IBMのQuantum Experienceは、クラウドで利用可能な量子ビットを実世界で最初に見せてくれました。コンピュータ科学者とソフトウェアエンジニアは感謝するが、物理学者と「重ね合わせ」と「絡み合い」のような用語を理解量子オタクの外に量子コンピューティングは困難な場合があります。芸術のように賞賛されるかもしれませんが、科学を理解するのに多くの時間を費やした少数の人にしかアクセスできません。でも戻って、我々は量子エクスペリエンスコミュニティを設定し2016年には、私たちのチームの目的は、量子APISDKを提供してきた理由です。これらは現在利用可能です。

当社の量子APISDKプログラマビリティのために重要であり、量子研究者やアルゴリズム開発者がハードウェア上でより簡単に実験を行うことを可能にします。昨年、私たちはユーザーにオンラインでQuantum Experienceを介して5キュビットの量子コンピュータをプログラムするインタラクティブなツールを提供しました。次に、量子コンピューティング・ルーチンを直接構築するためのIBM定義のQASMプログラミング言語を作成しました。 APISDKにより、ユーザーはPythonスクリプトを介して量子コンピューティングのパワーにアクセスすることもできます。

我々は、すべてのPythonスクリプトから、量子経験、QASMコードの実行、および結果の戻りのバックエンドへの接続を可能にするために、文書化Jupyterノートの例で、軽量のAPIを開発しました。

これを試すには、無料のQuantum Experienceアカウントを作成し、IBM Quantum SDKをダウンロードして使用してください。

私たちが調べる問題

化学物質の問題は、国立エネルギー研究科学計算センターの2013年度年次報告書に記載されているように、世界のスーパーコンピュータ電力の最大35%を消費します。これらは、効率的な触媒の開発から、肥料の製造、新薬の発見、および他の多くの困難で重要な課題にまで及ぶ。量子コンピュータは、量子化学問題を従来のコンピュータよりもずっと効率的に解決する可能性がある。今後数年間キュービットの数を増やすと、量子コンピュータの優れたコンピューティング機能を利用できるようにプログラムとアルゴリズムが必要になります。

クアンタムエクスペリエンスの現在の5キュービットシステムは、古典的なコンピュータを介して完全にモデル化することができますが、近い将来に利用可能なより高度な量子コンピュータにマップできる実際のビジネス上の課題を評価するためのテストベッドと遊び場があります。量子ビットの数を増やすと、最も強力な古典的なコンピュータでさえ試みることは実際的ではない問題を解決することができます。このような問題は、古典的なコンピュータから利用可能であるよりも多くの処理時間または計算能力を必要とする。

量子の早期採用

ありがたいことに、最適化アルゴリズムのような技術を使用して重要なビジネス上の問題を量子コンピュータにマップする方法を考え始めるまで、すべてを待つ必要はありません。理論物理学者だけでなく、開発者は量子コンピュータの活用方法を探ることができます。効率的な量子コンパイラの作成など、コンピュータサイエンスの重要な課題があります。量子コンピュータで効率的に実行できるようにプログラムをコンパイルするにはどうすればよいですか?キュビットの数が増えると、これはどのように変化しますか? SDKを使用すると、コンパイラーライターは、量子コンピューターで実行されるコードの新しい最適化手法を開発できます。

クラシックコンピュータのムーアの法則は終わりです。それはまあまあであると言われていますが、それはほとんど真実ですが、それはそれほど真実ではありません。重要な問題は「次は何か」です。理論的には古典的なコンピュータよりも指数関数的に重要な計算を行うことができるユニバーサル量子コンピュータだと考えています。ハードウェア的には、高性能でスケールアップされた量子プロセッサへの進展が非常に重要です。

一緒に働く古典と量子コンピュータは、古典的なコンピュータだけでは解決できない問題を解決します。近い将来、量子コンピュータコプロセッサとして使用され、古典的なコンピュータとGPUが連携して動作するのと同様のものです。今日、公開されているIBMのクォンタムシステムをクラウド経由で学ぶべき時期です。

Quantum Experienceにログインして始めましょう。 developerWorksのOpen QISKitプロジェクトの概要で、APISDKGitHubリンク、オープンソースの量子ツールなどのQISKitプロジェクト・コンポーネントに関する詳細情報を入手できます。

Learn more about quantum computing at IBM and on developerWorks Quantum computing at IBM Research https://www.research.ibm.com/ibm-q/

QISKit on developerWorks Open https://developer.ibm.com/open/openprojects/qiskit/

Quantum computing for everyone, a programmer’s perspective https://developer.ibm.com/dwblog/2016/quantum-computing-everyone-programmers-perspective/

参考

https://developer.ibm.com/dwblog/2017/quantum-computing-api-sdk-david-lubensky/

トンボや昆虫のスパイ?Robobugsの研究の科学者

先月ラファイエット広場での反戦集会で働いていた時に、ヴァネッサ・アラルコン氏に会った。

「誰かが「ああ、私の神、それらを見てください」と言うのが聞こえました」と、ニューヨークの大学のシニアは思い出しました。"私は見上げて、私は、 ‘一体何なの?’ 彼らはトンボや小さなヘリコプターのように見えましたが、昆虫ではありません。

群衆の中で、バーナード・クレーンもそれらを見ました。

ワシントンの弁護士は、「私は人生でそれが一番好きなことは一度も見たことがなかった。「彼らはトンボのために大きかった。私はそれが機械的なのか、それとも生きているのだろうと思った。"

ad_icon それは、ワシントンとニューヨークの政治的な出来事での類似した目撃のほんの一歩に浮かぶ質問の一つです。昆虫のような無人機は、おそらく国土安全保障省によって配備されたハイテクの監視ツールだと思われる人もいる。

他の人は、彼らが、まあ、トンボだと思っています。生物学者でさえも生き物が見ることができるロボットと見える昆虫の古代秩序です。

代理店は昆虫サイズのスパイドローンを配備したことを認めていません。しかし、多くの米国政府と民間企業が、彼らが努力していることを認めている。連邦政府から資金提供を受けたチームの中には、スパイウェアを体に搭載し、飛行筋を遠隔操作するという目的で、コンピュータチップを搭載した生きている昆虫を育てているチームもあります。

ロボッブは、容疑者の指示に従ったり、ミサイルを標的に誘導したり、倒壊したビルの谷間をナビゲートして生存者を見つけることができます。

ロボットの昆虫を作る技術的な課題は難しく、ほとんどの専門家は、完全に機能するモデルはまだ存在しないと疑っています。

「何か見つかったら、私に知らせてください」と国防総省の迅速反応技術局のゲーリー・アンダーソンは語った。

しかし、CIAは、ずっと前に1970年代にシンプルにトンボのスヌーパを開発しました。そして近年の進歩により、懐疑派でさえ、ある機関が静かに何かを運用可能にする機会が常にあると言います。

「アメリカはかなり卑劣である可能性がある」と、非営利のワシントン州の研究所である戦略・予算査定のセンターにある無人航空機の大佐であり、退役した空軍大佐のトム・エハールド氏は語った。

ロボットフライヤーは、第二次世界大戦以来、軍によって使用されてきましたが、過去10年間で、その数と洗練のレベルは非常に増加しました。国防総省の文書には、今日使用されているほぼ100種類のモデル、鳥のような小さなもの、小さな飛行機のサイズなどが書かれています。

全米飛行艦隊の艦隊は、2003年以来4倍以上の増加を記録しており、160,000時間以上の飛行時間を記録しています。米軍司令部および一般教職員の最近の報告では、交通規則がすぐに解明されなければ、軍用空域を混乱させ、潜在的に危険なものにする可能性がある」と述べた。

しかし、バードサイズからバグサイズにすることは、すべてを小さくするという単純な問題ではありません。

カリフォルニア大学バークレー校のロボット学者、ロナルド・ファアリング氏は、「金属ボールベアリングの従来のロボットを作って設計を縮小することはできません。一つには、空気力学のルールは非常に小さなスケールで変化し、正確な方法でフラップする翼が必要です。これは膨大な工学的課題です。

ad_icon 科学者たちの目の前にある証拠にもかかわらず、理論的には不可能とされた生物力学的な偉業であった。ちょうど先月、コーネル大学の研究者は、ホバリング時にエネルギーを節約するために、トンボがどのように前後の翼の動きを調整するかを明らかにする物理学の論文を発表した。

そのような発見は、飛行機を飛ぶことがエネルギー豚になる傾向があり、電池が重くなるため、ロボット工学にとって重要です。

CIAは早急に問題に取り組んでいた。30年前に同研究所の研究開発局が開発した「昆虫駆逐艦」は、トンボのように見え、4つの羽をフラップにするための小さなガソリンエンジンを搭載していました。それは飛行したが、横風を扱うことができなかったため最終的には失敗と宣言された。

代理店のジョージ・リトル報道官は、CIAがそれ以降何をしているのかについて話すことはできないと述べた。ナショナル・インテリジェンスの局長、国土安全保障省、秘密庁の事務所も、この話題について議論することを拒否した。

FBIだけが宣言的拒否を申し出た。スポークスマンによると、「我々にはそういうものはない」と述べた。

しかし、国防省は努力している。

あるアプローチでは、国防総省高等研究計画庁(DARPA)によって資金提供された研究者は、幼虫と成虫との中間段階である蛾の蛹にコンピュータチップを挿入し、それらを健康なサイボーグの蛾に孵化させる。

ハイブリッド昆虫マイクロエレクトロメカニカルシステムプロジェクトは、文字通りのシャッターバグを作成することを目的としています。カメラ付きの昆虫は、神経が内部のシリコンチップに成長してラングラーが活動をコントロールできるようになっています。DARPAの研究者は、サイボーグビートルを筋肉によって生成される様々な器具のための力で飼育している。

「最近の古典的な「ロード・オブ・ザ・リング」のフレンドリーな魔法使いのガンダルフが、空中支援を呼びかけるために蛾を使用したことを思い出してもよいだろう」とDARPAプログラムマネージャーのアムティ・ラールは8月のシンポジウムで語った。今日、彼は「このSFのビジョンは現実の領域内にある」と述べた。

DARPAの広報担当者は、プロジェクトでLalやその他の人にインタビューするという記者の要請を拒否した。

サイボーグの昆虫プロジェクトには疑惑の種があります。

「プログラムが展開する前に真剣に死んでいるだろう」とマサチューセッツ州バーリントンのiRobotにあるNaval Air Systems Commandの前司令官、Joe Dyer副長官は、家庭用および軍事用のロボットを作っていると述べた。

対照的に、完全に機械的なマイクロフライヤーは急速に進歩しています。

ad_icon カリフォルニア工科大学の研究者は、自由に飛行し、手のひらに収まる「マイクロバットオルニトプター」を作った。Vanderbilt Universityのチームも同様のデバイスを作っています。

帆のような翼では、どちらも昆虫と誤認されません。しかし、7月には、ハーバード大学のチームがフライトライクなロボットを手に入れました。その合成翼は毎秒120ビートで鳴っていました。

「昆虫が生み出す複雑な翼の動きを再現するために必要な関節構造の高速構造物を製造できることが示されました。

フライの薄い材料は、レーザーで機械加工された後、「マイクロ折り紙のように」立体的な形に折り畳まれました。交番電場は羽をフラップにする。全体の重量はちょうど65ミリグラム、またはプッシュピンのプラスティックヘッドよりもわずかです。

それでも、力を供給する糸状のつなぎ紐に取り付けられている間だけ飛ぶことができ、重大なハードルが残っているという証拠があります。

8月、スイスで開催された「飛行する昆虫とロボットに関する国際シンポジウム」で、日本の研究者らは、鷹のような4インチのウィングスパンを備えたラジオコントロールのチラシを紹介した。彼らが飛ぶのを見る人は、その作成者が「生きている魂」を感じます。"

CIAからのアドバイスを受けている他の人たちは、電池の代わりに化学燃料を使ったチラシを作っている。ジョージア工科大学での開発の初期段階で、バグよりもおもちゃ飛行機に似ている「昆虫」は、液体燃料を熱いガスに変換します。このガスは4つの羽ばたき翼と付帯設備を駆動します。

「一滴のガソリンから、一滴のガソリンよりも多くのエネルギーを得ることができます」と、チームリーダーのロバート・マイケルソンは述べています。

技術的なハードルが克服されたとしても、昆虫サイズのチラシは常に危険な投資になるでしょう。

「彼らは鳥が食べることができ、スパイダーの巣に引っかかる可能性がある」とバークレーの恐怖は語った。「あなたがどれほど賢いものであっても、そこにペンティアムを置くことができます。鳥が1時間30マイルであなたに来たら、あなたはそれについて何もできません。

抗議者たちは、エールハルト、元空軍大佐、および他の専門家が、ワシントンで発見されたホバリングの虫がスパイであることを疑っていたという多くの理由の1つでも、

だから、Crane、Alarcon、そしてDCの行進で見られる何人かの人々 - そして、2004年のように、ニューヨークの共和党全国大会において、観察的ではあるが恐らくはパノラマ的な平和行進の参加者が、第7大道の真ん中で地上から約10フィートのところに浮かぶジェットブラック・トンボ。

国立自然史博物館の昆虫学者Jerry Loutonは、彼らはおそらくトンボを見たと言いました。ワシントンには、「あなたの靴下を叩くことができる」、壮大に飾られたいくつかの大きなトンボがあります。

それと同時に、いくつかの詳細は意味をなさないと付け加えた。DCイベントの3人は、大きなトンボの尾に沿って小さな球果の大きさである球の列を独立して描写しました。これは、Loutonが説明できなかった装備品です。すべての人は、少なくとも3回の操縦が一致していると報告した。

「トンボは決してパックでは飛ばない。

民事司法担当パートナーシップのMara Verheyden-Hilliardは、彼女のグループが証人報告書を調査しており、情報開示法の要求をいくつかの連邦機関に提出したと述べた。このような機器が政治活動家を脅かすのに使われているならば、それは人々の市民権を大きく侵害するだろう」と述べた。

しかし、まだまだ地面に降り立つためにまだ苦労している多くのロボット工学者にとって、その懸念とその技術の潜在的な役割は余計なようです。

“私は人々が編集的になることを望んでいませんが、私は何を言うことができますか?” 恐れている。「携帯電話のカメラはすでにどこにでもあります。それほど違いはありません」

参考

http://www.washingtonpost.com/wp-dyn/content/article/2007/10/08/AR2007100801434_3.html?sid=ST2007100801459