寄付ウィキペディアに関するお問い合わせ言語このWikipediaでは言語間リンクがページの先頭にある記事タイトルの向かい側に設置されています。ページの先頭をご覧ください。フリー百科事典『ウィキペディア(Wikipedia)』(コンピュータプログラミングから転送)この項目では、コンピュータプログラムの作成について説明しています。(曖昧さ回避)」をご覧ください。この記事には複数の問題があります。改善やノートページでの議論にご協力ください。出典がまったく示されていないか不十分です。内容に関する文献や情報源が必要です。(2017年5月)古い情報を更新する必要があります。TWLインターネットチェスのプログラムLichessの人工知能のプログラミングの例。b3にいる白のビショップがa2に移動すれば、黒のナイトを取ることができる。プログラムは黒に対して最も有利な移動を探索するように設計されているため、その後、b1のポーンがビショップを取る可能性が非常に高いと計算する。黒のプレイヤーはポーンをc2に移動したところである。Programming)とは、ある特定のコンピューティングの結果を得ることを目的として、実行可能なコンピュータープログラムを設計・構築するプロセスのことである。プログラミングが関係するタスクの例としては、アルゴリズムの生成、アルゴリズムの正確さとリソースの消費量のプロファイリング、選択したプログラミング言語でのアルゴリズムの実装(これは一般にコーディングと呼ばれる)などがある[1][2]。プログラムのソースコードは、コンピューターのCPUで直接実行される機械語ではなく、プログラマーが理解できる1つ以上のプログラミング言語で書かれる。プログラミングの目的は、あるタスク(オペレーティングシステムのように複雑な場合もある)をコンピューター上で自動化する1連の命令を見つけることで、与えられた問題を解決することである。そのため、プログラミングのプロセスには、アプリケーションドメインに関する知識、特定のアルゴリズム、形式論理など、さまざまな主題に関する専門性が要求されることが多い。プログラミングをするときに関係するタスクには、テスト、デバッグ、ソースコードのメンテナンス、ビルドシステムの構築、コンピュータープログラムの機械コードなどの生成されたアーティファクト(英語版)の管理などがある。これらのプロセスはプログラミングのプロセスの一部と考えられるが、広義のプロセスはよく「ソフトウェア開発」と呼ばれ、実際にコードを書く行為に対しては、「プログラミング」、「実装」、「コーディング」という名前が使われることが多い。エンジニアリングの技術をソフトウェア開発の実践と組み合わせたものである。「リバースエンジニアリング」はこの逆のプロセスを表す。「ハッカー」とは、技術的な知識を使って問題を解決する技術のあるすべてのコンピュータの専門家を表す言葉であるが、一般的な用語では「セキュリティハッカー(英語版)」と同じ意味でも使われている。歴史[編集]エイダ・ラブレス。Menabrea(英語版)の論文の最後には、解析機関の処理のために設計された最初のアルゴリズムについて書かれた彼女のメモが記載されている。彼女は、世界史上初のコンピュータープログラマーであると考えられている。パンチカードのつまった箱。プログラムデッキがいくつかある。Machineのための配線された制御パネル。最古のプログラマブルな機械(プログラムによって動作の変化を制御できる機械)としては、1206年にアル=ジャザリが作った二足歩行ロボットがあると言われている。アル・ジャザリのロボットは、ボートに4体の演奏人形が乗ったもので、宮廷のパーティで池に浮かべて音楽を演奏したと言われている。プログラムはカムにあり、それによって小さなてこを押して、打楽器を演奏する。カムは実際には円筒にペグが突き刺された形であり、このペグの配置でプログラミングし、演奏パターンを変更した[3]。1801年に開発されたジャカード織機がプログラマブルな機械の起源とされることが多い。この機械は、穴を開けた一連の厚紙(パンチカードの原型)を使った。穴の配列が布を織る際のパターンに対応している。従って、カードを入れ替えることで全く異なる布を織ることができた。1830年ごろには、チャールズ・バベッジがパンチカードを使った解析機関を考案した。彼はホレリス式パンチカード、タビュレーティングマシン、キーパンチ機などを発明した。これらの発明が情報処理産業の基礎となったのである。1906年には、タビュレーティングマシンにプラグボードを追加することで、組み替えれば様々な仕事ができるようになった。これがプログラミングへの第一歩である。1940年代には、プラグボードによるプログラマブルな機械が各種登場していた。初期のコンピュータにもプラグボードでプログラムを組むものがあった。フォン=ノイマン・アーキテクチャの発明により、プログラムをコンピュータのメモリに格納できるようになった。初期のプログラミングは機械語のコードを直接並べる(「コーディング」の本来の意)ことで行われた。入力方法としては穿孔カードや鑽孔テープが利用された他、スイッチなどで直接入力したり、まだ半導体技術などのない時代のため、ROMに相当する電気的配線を直接変更したりすることもあった。機械語の命令は人間にとって扱いにくく、代わりにニーモニックと呼ばれる略語を割り当てたアセンブリ言語により、プログラマは命令をテキスト形式で記述できるようになった。アセンブリ言語は機械語と同様にプロセッサの種類ごとに異なるため、(意図的に互換性があるように設計された機械以外では)他機種にはそのまま流用できなかった。(人間から見れば)単純な処理でも、機械が操作できる基本的な処理命令は細粒度であり、大量に記述する必要があった。そこで、特定のコンピュータに依存しない記述方法で、処理の内容をより抽象的に記述するためのプログラミング言語が開発された。プログラミング言語によって記述されたプログラムを、コンパイラを利用して機械語に翻訳することで、実行プログラムを作成することが一般的になった。1954年、最初のプログラミング言語の1つであるFORTRANが開発された。このプログラムの記述(あるいは「ソース」)はコンパイラと呼ばれる特別なプログラムで機械の命令に変換される。他にも様々な言語が開発された(ビジネス用途のCOBOLなど)。プログラムの入力は依然としてパンチカードやさん孔テープで行われていた。端末の価格が低下してきたことにより、キーボードから直接コンピュータにプログラムを入力できるようになってきた。1]最初はラインエディタ、続いてスクリーンエディタといった、テキストエディタが開発され、それらによってソースコード自身がコンピュータ上で編集されるようになった。コンピュータの能力は時と共に飛躍的に向上した。このため、より抽象化されたプログラミング言語が開発されるようになっていった。抽象化レベルの高い言語はオーバーヘッドも大きいが、コンピュータ自体の性能の向上が激しいため、多少オーバーヘッドが増えても以前よりも高性能な動作が実現された。このような抽象化レベルの高い言語の利点は、習得が容易であることと、プログラム作成時間が短縮されること。何より、バッファオーバフロー等の危険性を孕んだプログラムを書く余地が無いこと、である。それでも、巨大で複雑なプログラムや、高速性が何よりも重視されるプログラムでは、現在でも比較的低レベルな言語を使っている。20世紀後半を通して、先進国ではプログラマが魅力的な職業の1つとされてきた。発展途上国の安い労働力をプログラミングに利用する傾向が強まっている。この傾向がどれだけ続くのか、それによってどのような影響があるのかは未知数である。プログラミングの過程[編集]BASICによるプログラム例まず、そのプログラムの目的、さらには「本当に解決したい問題は何なのか」ということについて十分な検討が必要である(ワインバーグの著書などを参考のこと)。続いて、全体のスタイルをおおまかに2つに分けると「トップダウン設計」と「ボトムアップ実装」[4]になる。「なんとかの設計と実装」といったようなタイトルの本が多くあるように、どちらも重要だが、一般に対象についてよくわかっているものについてのプログラミングでは前者のスタイル、よくわかっていない場合は後者のスタイルとする。「設計された通りに実装することは不可能」といった場合に開発体勢の問題などから正しい対処がされないまま、設計と実装がちぐはぐになったプロダクトは悲惨である。反復型開発では、あまりに大きなプログラムを一方通行のプロセスで書くことは最初から避けるものとされる。目的のプログラムを書き始める前に、まずテストを書く、というスタイルもある(これを、「テストファースト」という。詳しくは、テスト駆動開発を参照)。対象が有限オートマトンやプロセス計算など、形式手法的な方法でモデル化できるのであれば、まずはそのようにすべきである(本来はモデル主導というのはそのような意味のはずである)。最初の段階として、トップダウン設計では軽量プログラミング言語や、非形式的な記述が適している場合には擬似言語(擬似コード)などで全体設計を検討する。Programming』などでは使われているが、現代のプログラミング言語でも有用と信じられていることもあるようである。プログラミングの過程で、ソースコードを記述することを特に指してコーディングという。元々は機械語が符号であること、またはアセンブリ言語のニモニックがまるで暗号みたいである(正確には「コード」は暗号の1分類。参照)というところからコンピュータプログラムに「コード」という語が使われ、それを書く作業というきわめて限定された意味の語だったが、近年はHTMLを書くという意味にも使われるなど濫用され気味である(なお、デモシーンでは機械語のテクニックを駆使して高効率のプログラムを書く、というような本来の意味に近い意味で使われている)。場合によっては仕様にバグがあることもある(もっとひどい場合には標準規格のようなものでもバグがある)。完成の後も、ある程度の期間使われるプログラムでは、使用しているうちに、プログラムの性能や機能に新しい要求が発生したり、プログラムの設定を変更する必要がでてきたり、テストにより発見できなかったバグが見つかることがある。このような事態に対応するため、プログラムを保守していく作業が必要になる。プログラマ[編集]詳細は「プログラマ」を参照プログラミングをする人をプログラマという。プログラミングを行うには一般に、コンピュータ科学を中心としたプログラミングそれ自体についての能力や知識と、書こうとするプログラムが対象とする問題領域などについての能力や知識の両方が必要である。職業としてのプログラマ[編集]プログラマの仕事[編集]要求分析ソフトウェア設計プログラム仕様ソフトウェアアーキテクチャコーディングコンパイルソフトウェアテストソフトウェアドキュメンテーションソフトウェア保守この他、プログラムが、作者以外の人によって利用される場合には、プログラムの利用方法や機能について質問を受けることがある。プログラムを、意図したとおり稼働させてゆくためには、これらの問い合わせに対応する必要もある。一般に、職業としてプログラミングを行う場合、これらの作業が工程として含まれる。大規模なプログラミングでは、これらの作業を分業することも多い。このような業務は、ソフトウェア工学という学問のソフトウェア開発工程の分野として扱われる。プログラミングコードがある程度自動生成できるようになった今、専門家の予測通りプログラミングエンジニアの役割は変わりつつあるが[5]、現時点ではコード自動生成の商用・学術利用には著作権上の課題がある[6]。プログラミング言語[編集]詳細は「プログラミング言語」を参照プログラミング言語が異なれば、プログラミングのスタイル(プログラミングパラダイム)も異なる。どの言語を使うかの判断には、企業としてのポリシー、その用途への適合性、サードパーティのパッケージが使えるか、個人の好みなど様々な要素がある。理想的には、用途に最も適した言語を選ぶべきである[7]。その言語を使えるプログラマが十分揃えられないとか、その言語の処理系に問題があるとか、実行時の効率が悪いといった問題から、最適な言語を選べないこともある。次のように書いている。言語が違えば、詳細も違って見えるが、どんな言語にも次のような基本的命令要素がある。キーボード、ファイル、その他の機器からデータを入手する。画面にデータを表示したり、ファイルその他の機器にデータを送る。加減算のような基本的算術操作を行う。条件をチェックして、一連の処理を行うか否かを判断する。ある処理を繰り返し実行する。通常、毎回何かが変化している。今日までに、プログラミングの進歩に貢献したパラダイムとして、次があげられる:プログラムの実行制御の仕組みとして、命令から命令へと直接移動する代わりに、論理的な順接・反復構造を用いてロジックの抽象化を目指した構造化プログラミング変数の使用による副作用の発生を排除しようとした関数型プログラミング宣言型プログラミングを可能にした論理プログラミングデータと手続きの直交化を押し進め、人間の概念構成に近い表現を可能にしたオブジェクト指向プログラミングプログラミングには、文字による言語で記述する方法ばかりではなく、視覚言語や図形言語で記述する方法であるビジュアルプログラミングという方法もある。最近のプログラミング[編集]この記事には独自研究が含まれているおそれがあります。問題箇所を検証し出典を追加して、記事の改善にご協力ください。議論はノートを参照してください。人工知能(英語版)コンピュータ科学(英語版)品質[編集]ソフトウェア開発手法がどうであれ、最終的にはプログラムは基本的な属性を満たさなければならない。プログラミングにおいてそれを気にかけておくことで、デバッグやその後の開発およびユーザーサポートにかかる時間とコストを削減できる。ソフトウェア品質を確保する方法は様々だが、以下の5つの属性が最も重要である。リソース使用量(プロセッサ、メモリ、デバイス、ネットワークその他)は可能な限り少ない方がよい。プログラムは正しく動作しなければならない。それは単にソースコードが正しく実装されているというだけでなく、誤差の伝播を少なくするとか、典型的な値の範囲に関するエラー(オーバーフロー、アンダーフロー、ゼロ除算など)を防ぐという観点も含まれる。データ型の間違いなど実行時エラーによるプログラム停止を誘発するような事態に対処できなければならない。これは、特にユーザーとのやり取りの場面や、エラーメッセージの処理などで重要となる。再プログラミングしなくとも、任意のソフトウェア環境やハードウェア環境で動作すべきである。後の保守をコーディングした人が行うとは限らないため、命名規則やコメントなどをわかりやすくしておく。方法論[編集]ソフトウェア開発の第一段階は要求分析であり、その後モデル化し、実装し、デバッグする。これら作業については様々な方法論がある。要求分析で一般的な方法論としてユースケース分析がある。モデル駆動型アーキテクチャ(MDA)がある。記法として使われている。データベース設計では、似たような技法として実体関連モデルがある。実装技法としては様々なプログラミングパラダイムがある(オブジェクト指向プログラミング、手続き型プログラミング、関数型プログラミング、論理プログラミングなど)。Studio、NetBeans、Eclipseなど)。独立したデバッガ(gdbなど)も使われている。言語利用状況[編集]どのプログラミング言語が一番使われているかというのは、非常に難しい問題である。言語によっては特定の分野でのみ一般的なものもあるし(例えば、COBOLは企業のデータセンターでよく使われており、FORTRANは科学技術計算に強く、C言語は組み込み市場で強い)、汎用的に様々なアプリケーションを書くのに使われている言語もある。言語の人気を測定する手段として、求人広告に挙げられている言語を数え上げる方法がある[8]。既存のソースコードの行数を言語毎に推計する方法もある(ただし、言語によって同じ機能を実現するのに必要な行数が異なるため、補正が必要)。デバッグ[編集]バグだらけのプログラムは使いものにならないため、デバッグは重要である。C言語やアセンブリ言語などは、慣れたプログラマであっても、バッファオーバーランや不正なポインタやメモリの初期化忘れ/解放忘れといったバグを作りこみやすい。バッファオーバーランは隣接するメモリ領域を破壊し、全く関係ない箇所でプログラムに異常が発生する原因となる。いったメモリデバッガが開発されてきた。いった言語にはそのような問題がほとんどないが、性能は低い。データベースアクセスやファイル入出力が性能を決定付けるような分野では、これらの言語の性能でも何ら問題ない。最近ではこれらの言語の処理系でも性能が向上してきている。プログラミングレス思想[編集]プログラミング言語が使えるようになったことにより、機械語によるプログラミングを人間が直接する必要がなくなったのも一種の「プログラミングレス」だと言えばそれは大成功していると言えるだろうし(プログラミング言語の研究はその初期には「自動プログラミング」等と呼ばれていた)、結局「思想」というものが何を指すのか明確でないので、どうとでも言えることである。現代においてはアプリケーションソフトウェアを使うだけでもコンピュータの利活用の幅がおおいにある、というのも一種の「プログラミングレス」であろう。理屈としては、ドメイン固有言語のうち、チューリング完全でないようなものは汎用の言語ではないから、それらを使ったコンピュータの利活用も「プログラミングレス」と言えなくもない。GUIによる設定やドラッグ&ドロップでアプリケーションが開発できることなどを指して、プログラミングレス、あるいは、ノンプログラミングということもある[9]。大会[編集]RobocodeテラリウムACM国際大学対抗プログラミングコンテストU-20プログラミングコンテストPALROコンテスト議論[編集]プログラムを書くことはアートなのか、クラフトなのか、工学なのかという議論がある[10][11]。よいプログラミングには、それら3つの要素すべてが必要とされ、最終的に効率的で保守しやすいソフトウェアを生み出すことを目的とする(何が効率的で、何が保守しやすいかという判断も様々である)。「プログラムを書くことは設計をすること」という意見もある[12]。午後科目で自由選択制の問題としてプログラミングに関する内容が出題される(2014年春期までは選択必須問題であり、プログラミングまたは経営戦略のどちらかを必ず選択する必要があった)。前身のソフトウェア開発技術者試験では必須問題だった。午後試験では複雑なアルゴリズムを主に多岐にわたるのシステム設計技法が多数出題されていた。2000年度の試験を最後に廃止され、一部の出題範囲がソフトウェア開発技術者試験に継承された。午後科目で自由選択制の問題として例年セキュアプログラミングに関する内容が出題されていた。