コンピュータプログラミングまたはコーディングとは、コンピュータがタスクを実行するために実行できるプログラムと呼ばれる一連の命令の構成のことです。 [ 1 ] [ 2 ]これには、 1 つ以上のプログラミング言語でコードを記述することにより、手順の段階的な仕様であるアルゴリズムを設計および実装することが含まれます。プログラマは通常、中央処理装置によって直接実行される機械語よりも人間にとって理解しやすい高水準プログラミング言語を使用します。熟練したプログラミングには通常、アプリケーション領域の知識、プログラミング言語と汎用コードライブラリの詳細、特殊なアルゴリズム、形式論理など、いくつかの異なる分野の専門知識が必要です。
プログラミングに付随し、関連する補助的なタスクには、要件分析、テスト、デバッグ(問題の調査と修正)、ビルドシステムの実装、プログラムのマシンコードなどの派生成果物の管理などがあります。これらはプログラミングとみなされることもありますが、多くの場合、このより大きな全体的なプロセスにはソフトウェア開発という用語が使用され、プログラミング、実装、コーディングという用語は、コードそのものの記述と編集に限定されます。ソフトウェア開発は、特に形式手法を採用したり、エンジニアリング設計プロセスに従ったりする場合、ソフトウェアエンジニアリングと呼ばれることもあります。

プログラム可能なデバイスは数世紀前から存在しています。9世紀には早くも、ペルシャのバヌ・ムーサ兄弟がプログラム可能な音楽シーケンサーを発明し、 『独創的な装置の書』の中で自動機械式フルート奏者について記述しています。[ 3 ] [ 4 ] 1206年には、アラブのエンジニア、アル・ジャザリが、ペグとカムを介して音楽機械式オートマトンにさまざまなリズムとドラムパターンを演奏させることができるプログラム可能なドラムマシンを発明しました。[ 5 ] [ 6 ] 1801年には、ジャカード織機が穴の開いた厚紙カードの「プログラム」を変更することで、まったく異なる織り方を生産できるようになりました。
暗号解読アルゴリズムも数世紀前から存在しています。9世紀には、アラブの数学者アル・キンディが『暗号メッセージの解読に関する手稿』の中で、暗号化されたコードを解読するための暗号アルゴリズムについて記述しました。彼は、最も初期の暗号解読アルゴリズムである周波数分析による暗号解読について初めて記述しました。 [ 7 ]
最初のコンピュータプログラムは一般的に1843年に数学者エイダ・ラブレースがチャールズ・バベッジの解析機関で実行することを目的としたベルヌーイ数列を計算するアルゴリズムを発表した時とされています。[ 8 ]ルイージ・フェデリコ・メナブレアの解析機関に関する論文の翻訳のメモを通して伝えられたこのアルゴリズムは、バベッジとのやり取りから分かるように、主にラブレースによって考案されたものです。しかし、チャールズ・バベッジ自身は1837年にAE用のプログラムを書いていました。[ 9 ] [ 10 ]ラブレースはまた、数学的計算を超えて解析機関のより広い応用を最初に見抜いた人物でもあります。

1880年代、ハーマン・ホレリスは機械可読形式でデータを保存するという概念を発明した。 [ 11 ]その後、 1906年に彼が開発したタイプIタブレータに制御パネル(プラグボード)を追加することで、さまざまな作業に合わせてプログラムできるようになり、1940年代後半には、IBM 602やIBM 604などのユニットレコード機器が、最初の電子計算機と同様に、制御パネルによって同様の方法でプログラムされるようになった。しかし、1949年に導入されたプログラム内蔵型コンピュータの概念により、プログラムとデータの両方がコンピュータメモリに同じ方法で保存および操作されるようになった。[ 12 ]ハードウェアとソフトウェアを統合した実践的なプログラミングコースは、工学部の1年生の学生の記憶力と学習意欲を向上させることが示されている。[ 13 ]
初期のプログラムは機械語で記述され、特定の機械の命令セットを用いて、多くの場合バイナリ表記で書かれていました。その後、アセンブリ言語が開発され、プログラマは命令をテキスト形式(例:ADD X、TOTAL)で記述できるようになり、操作コードには略語を、メモリアドレスには意味のある名前を使用できるようになりました。しかし、アセンブリ言語は機械語の表記法が異なるに過ぎないため、命令セットが異なる2つの機械では、アセンブリ言語も異なります。

高水準言語は、プログラム開発のプロセスをよりシンプルかつ理解しやすくし、基盤となるハードウェアへの依存度を低くしました。最初のコンパイラ関連ツールであるA-0システムは、1952年にグレース・ホッパーによって開発されました[ 14 ]。ホッパーは「コンパイラ」という用語も考案しました[ 15 ] [ 16 ]。関数型実装を持つ最初の広く使用された高水準言語であるFORTRANは1957年に登場し[ 17 ]、その後すぐに他の多くの言語が開発されました。特に、商用データ処理を目的としたCOBOLや、コンピュータ研究を目的としたLispなどです。
これらのコンパイル言語により、プログラマは構文的に豊かで、コードを抽象化できる用語でプログラムを記述することができ、コンパイル宣言とヒューリスティックによってさまざまなマシン命令セットを簡単にターゲットにすることができます。コンパイラは、プログラマが中置記法を使用して数式を入力することで計算を指定できるようにすることで、コンピュータの力を活用してプログラミングを容易にしました[ 17 ]。
プログラムの入力は、主にパンチカードや紙テープを使って行われていた。1960年代後半になると、データ記憶装置やコンピュータ端末が安価になり、コンピュータに直接入力することでプログラムを作成できるようになった。また、パンチカードよりもはるかに簡単に変更や修正ができるテキストエディタも開発された。
開発のアプローチがどのようなものであっても、最終的なプログラムはいくつかの基本的な特性を満たさなければなりません。次の特性は最も重要なもののいくつかです。[ 18 ] [ 19 ]
コンピュータプログラミングにおいて、可読性とは、人間がソースコードの目的、制御フロー、および動作をどれだけ容易に理解できるかを示すものです。可読性は、移植性、ユーザビリティ、そして最も重要な保守性など、上記の品質特性に影響を与えます。

プログラマーは新しいソースコードを書くよりも、既存のソースコードを読んで理解し、再利用し、修正することに多くの時間を費やすため、可読性は重要です。読みにくいコードは、バグ、非効率性、重複コードにつながることがよくあります。ある研究では、いくつかの簡単な可読性変換によってコードが短くなり、理解にかかる時間が大幅に短縮されることが分かりました。[ 22 ]
一貫したプログラミングスタイルに従うことは、可読性を高めるのに役立つことが多い。しかし、可読性はプログラミングスタイルだけにとどまらない。コンピュータがコードを効率的にコンパイルおよび実行する能力とはほとんど、あるいは全く関係のない多くの要因が可読性に貢献する。[ 23 ]これらの要因には、次のようなものがある。
表示面(インデント、改行、色の強調表示など)はソースコードエディタによって処理されることが多いが、内容面はプログラマーの才能とスキルを反映する。
コードの構造と表示に従来とは異なるアプローチを採用することで可読性の問題を解決することを目的として、さまざまなビジュアルプログラミング言語も開発されてきました。統合開発環境(IDE)は、こうした支援機能をすべて統合することを目指しています。コードリファクタリングなどの手法は、可読性を向上させることができます。
コンピュータプログラミングの学術分野と工学的実践は、特定の問題群に対して最も効率的なアルゴリズムを発見し、実装することに関心を寄せている。この目的のために、アルゴリズムはビッグオー記法を用いて次数に分類される。ビッグオー記法は、実行時間やメモリ消費量といったリソース使用量を入力サイズで表すものである。熟練したプログラマーは、様々な確立されたアルゴリズムとその複雑さを熟知しており、この知識を用いて状況に最適なアルゴリズムを選択する。
ほとんどの正式なソフトウェア開発プロセスの最初のステップは要件分析であり、続いてテストによって価値モデリング、実装、および障害排除(デバッグ)が行われます。これらの各タスクにはさまざまなアプローチが存在します。要件分析でよく用いられるアプローチの1つはユースケース分析です。多くのプログラマーはアジャイルソフトウェア開発の形態を採用しており、正式なソフトウェア開発のさまざまな段階が、数年ではなく数週間で完了する短いサイクルに統合されています。ソフトウェア開発プロセスには多くのアプローチがあります。
一般的なモデリング手法としては、オブジェクト指向分析設計(OOAD)とモデル駆動型アーキテクチャ(MDA)が挙げられる。統一モデリング言語(UML)は、OOADとMDAの両方で使用される表記法である。
データベース設計に用いられる同様の手法として、エンティティ関係モデリング(ERモデリング)がある。
現代のプログラミング言語の中で最も人気のある言語を特定するのは非常に難しい。プログラミング言語の人気度を測定する方法としては、その言語について言及している求人広告の数を数えること[ 24 ]、その言語を教える書籍やコースの販売数(これは新しい言語の重要性を過大評価する)、そしてその言語で書かれた既存のコード行数の推定(これはCOBOLなどのビジネス言語のユーザー数を過小評価する)などがある。
特定の種類のアプリケーションを作成するのに人気のある言語もあれば、さまざまな種類のアプリケーションを作成するのに使用される言語もあります。たとえば、COBOL は今でも企業のデータ センターで広く使われており[ 25 ] 、多くの場合、大規模なメインフレーム コンピュータで使用されています。Fortranはエンジニアリング アプリケーションで、スクリプト言語はWeb開発で、C は組み込みソフトウェアで使用されています。多くのアプリケーションは、構築と使用において複数の言語を組み合わせて使用します。新しい言語は一般的に、以前の言語の構文をベースに新しい機能を追加して設計されます (たとえば、C++は C にオブジェクト指向を追加し、Java はC++ にメモリ管理とバイト コードを追加しますが、その結果、効率性と低レベル操作の能力が失われます)。

デバッグはソフトウェア開発プロセスにおいて非常に重要な作業です。プログラムに欠陥があると、ユーザーに重大な影響を及ぼす可能性があるからです。言語によっては、コンパイラが他の言語ほど多くのチェックを行う必要がないため、特定の種類の不具合が発生しやすいものがあります。静的コード解析ツールを使用すると、いくつかの潜在的な問題を検出できます。通常、デバッグの最初のステップは、問題の再現を試みることです。これは、並列処理や特殊なソフトウェアバグなどの場合、容易ではない作業となる可能性があります。また、特定のユーザー環境や使用履歴によって、問題の再現が困難になる場合もあります。
バグが再現されたら、デバッグを容易にするためにプログラムの入力を簡略化する必要がある場合があります。たとえば、コンパイラのバグによって大きなソースファイルを解析する際にクラッシュが発生する場合、元のソースファイルから数行だけを残すようにテストケースを簡略化すれば、同じクラッシュを再現できる可能性があります。試行錯誤と分割統治法が必要です。プログラマは元のテストケースの一部を削除し、問題がまだ存在するかどうかを確認します。GUIで問題をデバッグする場合、プログラマは元の問題の説明からユーザー操作の一部を省略し、残りの操作でバグが発生するかどうかを確認できます。スクリプト作成とブレークポイント設定もこのプロセスの一部です。
デバッグはIDEで行われることが多い。GDBのようなスタンドアロンのデバッガも使用されるが、これらは通常コマンドラインを使用するため、視覚的な環境はあまり提供されない。Emacsなどのテキストエディタの中には、GDBを呼び出し、視覚的な環境を提供するものもある。ある研究では、Pascalのような構造化言語を教えることで、初心者プログラマのデバッグ精度と全体的な理解度が向上することがわかった。[ 27 ]
プログラミング言語によって、サポートされるプログラミングスタイル(プログラミングパラダイムと呼ばれる)が異なります。使用する言語の選択は、企業の方針、タスクへの適合性、サードパーティ製パッケージの利用可能性、個人の好みなど、多くの考慮事項に左右されます。理想的には、目の前のタスクに最も適したプログラミング言語が選択されます。この理想から外れると、チームを編成するのに十分な数の言語を知っているプログラマーを見つけること、その言語のコンパイラが利用可能であること、特定の言語で書かれたプログラムの実行効率など、いくつかのトレードオフが生じます。言語は、「低レベル」から「高レベル」までのスペクトルを形成します。「低レベル」言語は一般的に機械指向で実行速度が速いのに対し、「高レベル」言語は抽象的で使いやすいですが、実行速度は遅くなります。通常、「低レベル」言語よりも「高レベル」言語の方がコーディングが容易です。プログラミング言語はソフトウェア開発に不可欠です。最も単純なアプリケーションから最も高度なアプリケーションまで、すべてのソフトウェアの構成要素です。
アレン・ダウニーは著書『コンピュータ科学者のように考える方法』の中で次のように述べている。
多くのプログラミング言語は、共有ライブラリが提供する関数を呼び出すためのメカニズムを提供しています。ライブラリ内の関数が適切な実行時規約(引数の渡し方など)に従っている限り、これらの関数は他の言語で記述できます。IEEE Spectrumによる年次ランキングでは、求人情報、検索トレンド、開発者の活動などの指標を使用してプログラミング言語の人気を分析しています。[ 28 ]
プログラミングの学習には、専門的な基準や慣行、学術的な取り組みやカリキュラム、学生、独学者、趣味でプログラミングを学ぶ人、その他個人利用のためにソフトウェアを作成またはカスタマイズしたい人向けの市販の書籍や教材など、長い歴史があります。1960年代以降、プログラミングの学習は、学問分野の台頭、刺激的なリーダー、集団的アイデンティティ、そして運動を拡大し制度的な変化をもたらすための戦略とともに、大衆運動としての特徴を帯びるようになりました。 [ 29 ]これらの社会的理想や教育的課題を通して、プログラミングの学習は科学者やエンジニアだけでなく、ソフトウェアの作成が社会とその構成員にとって有益であると信じるようになった何百万人もの市民にとっても重要になりました。近年、コンピュータサイエンス教育への参加は大幅に拡大し、何百万人もの学生が学校やオンラインプラットフォームを通じてプログラミングの基礎的な経験を積んでいます。[ 30 ]
1957年、米国には約15,000人のコンピュータプログラマーが雇用されており、これは世界の現役開発者の80%を占める。2014年には、世界に約1,850万人のプログラマーがおり、そのうち1,100万人がプロフェッショナル、750万人が学生または趣味でプログラミングをしている。[ 31 ] 1990年代半ばに商用インターネットが台頭する前は、ほとんどのプログラマーは書籍、雑誌、ユーザーグループ、非公式な指導方法を通じてソフトウェア構築について学んでおり、専門職にとっては大学の授業や企業研修が重要な役割を果たしていた。[ 32 ]
コンピュータのプログラミング方法に関する具体的な手順を記載した最初の書籍は、モーリス・ウィルクス、デイビッド・ウィーラー、スタンレー・ギル共著の『電子デジタルコンピュータ用プログラムの準備』(1951年)だったかもしれない。この本には、世界初のプログラム内蔵型コンピュータの一つであるEDSACで基本的な操作を行うための一般的なサブルーチンがいくつか紹介されていた。
高水準言語が登場すると、言語キーワード、プログラムフローの管理、データの操作、その他の概念を説明する多数の書籍や資料によって紹介されました。これらの言語には、FLOW-MATIC、COBOL、FORTRAN、ALGOL、Pascal、BASIC、C が含まれます。この時期の初期のプログラミング入門書の例としては、Marshal H. Wrubel のA Primer of Programming for Digital Computers (1959) があり、コーディングシートの記入、パンチカードの作成、IBM の初期の FORTRAN システムでのキーワードの使用に関する手順が段階的に説明されていました。[ 33 ] Daniel McCracken のA Guide to FORTRAN Programming (1961) は、学生や事務員を含むより幅広い読者に FORTRAN を紹介しました。
1961年、アラン・パーリスはカーネギー工科大学のすべての新入生にコンピュータプログラミングのコースを受講することを提案した。[ 34 ]彼の助言は人気の技術誌「Computers and Automation 」に掲載され、プロのプログラマーにとって定期的な情報源となった。
プログラマーはすぐに、さまざまな学習テキストを利用できるようになりました。プログラマー向けリファレンスには、言語に関連するキーワードや関数が、多くの場合アルファベット順にリストアップされているほか、コンパイラや関連システムに関する技術情報も掲載されていました。初期の例としては、IBMの『Programmers' Reference Manual: the FORTRAN Automatic Coding System for the IBM 704 EDPM』(1956年)が挙げられます。
時が経つにつれ、プログラミングガイドというジャンルが生まれ、言語の機能をチュートリアル形式やステップバイステップ形式で解説するようになりました。初期の入門書の多くは、「Hello, World」と呼ばれるプログラムから始まっており、これは開発者が特定のシステムで作成できる最短のプログラムでした。その後、プログラミングガイドは、変数の宣言、データ型、数式、制御フロー、ユーザー定義関数、データの操作など、中核となるトピックについて解説していきました。
初期の、そして影響力のあるプログラマー向けガイドとしては、ジョン・G・ケメニーとトーマス・E・カーツの『BASICプログラミング』(1967年)、キャスリーン・ジェンセンとニクラウス・ワースの『パスカル・ユーザー・マニュアルとレポート』(1971年)、ブライアン・W・カーニハンとデニス・リッチーの『Cプログラミング言語』(1978年)などが挙げられる。一般読者向けの同様の書籍(ただし、はるかに軽いトーン)としては、ボブ・アルブレヒトの『BASICを話すとコンピュータは私を愛してくれる』(1972年)、アル・ケリーとアイラ・ポールの『C言語入門』(1984年)、ダン・グーキンの『C言語入門』 (1994年)などがある。
言語固有の入門書以外にも、プロのプログラミング手法を紹介する書籍や学術誌が数多く存在した。その多くは、コンピュータサイエンス、ソフトウェアエンジニアリング、または関連分野の大学の講義向けに設計されたものであった。ドナルド・クヌースの『コンピュータプログラミングの技法』(1968年以降)では、数百もの計算アルゴリズムとその分析が紹介された。ブライアン・W・カーニハンとPJ・プラウガーによる『プログラミングスタイルの要素』(1974年)は、プログラミングスタイル、つまりプログラムはコンパイラだけでなく人間の読者にも満足するように書かれるべきだという考え方を扱っていた。ジョン・ベントレーの『プログラミングの真珠』(1986年)は、プロフェッショナルおよび学術的な文脈におけるプログラミングの技術と技法に関する実践的なアドバイスを提供した。学生向けに特別に設計されたテキストには、ダグ・クーパーとマイケル・クランシーの『Oh Pascal!』(1982年)、アルフレッド・アホの『データ構造とアルゴリズム』(1983年)、ダニエル・ワットの『Learning with Logo』(1983年)などがある。
パーソナルコンピュータが一般市場向け製品になると、何千もの専門書や雑誌が、プロ、趣味人、一般ユーザーにコンピュータプログラムの書き方を教えようとした。これらの学習リソースの例としては、David Ahl著のBASIC Computer Games, Microcomputer Edition (1978) 、 Rodnay Zaks著のProgramming the Z80 (1979)、Andy Johnson-Laird著のProgrammer's CP/M Handbook ( 1983) 、 Mitchell Waiteと The Waite Group著のC Primer Plus (1984)、 Peter Norton著のThe Peter Norton Programmer's Guide to the IBM PC (1985)、Ray Duncan 著のAdvanced MS-DOS (1986)、Michael Halvorsonと David Rygymr著のLearn BASIC Now (1989)、Charles Petzold著のProgramming Windows (1992 年以降)、Steve McConnell著のCode Complete: A Practical Handbook for Software Construction (1993) などがある。そして、アンドレ・ラモート著『ゲームプログラミングの達人の秘訣』(1994年)。
PCソフトウェア業界は、プログラミング入門書やチュートリアル、上級ソフトウェア開発者向けの書籍を提供する多数の出版社の設立を促しました。[ 35 ]これらの出版社には、Addison-Wesley、IDG、Macmillan Inc.、McGraw-Hill、Microsoft Press、O'Reilly Media、Prentice Hall、Sybex、Ventana Press、Waite Group Press、Wiley、Wrox Press、Ziff-Davisなどがありました。
コンピュータ関連の雑誌や学術誌も、プロのプログラマーや趣味でプログラミングをする人向けの学習コンテンツを提供していました。これらのリソースの一部を挙げると、 Amiga World、Byte(雑誌)、Communications of the ACM、Computer(雑誌)、Compute!、Computer Language(雑誌)、Computers and Electronics、Dr. Dobb's Journal、IEEE Software、Macworld、PC Magazine、PC/Computing、UnixWorldなどがあります。
2000年から2010年の間に、プログラマーが情報へのアクセスを拡大するためにインターネットのリソースに移行したため、コンピューター書籍や雑誌の出版社はプログラミング教育の提供者としての役割を大幅に縮小しました。この変化により、プログラミングスキルを学ぶための新しいデジタル製品や仕組みが登場しました。移行期間中、出版社のデジタル書籍は、従来印刷物で提供されていた情報を、新たな、そして拡大する読者層に伝達しました。[ 36 ]
コーディングを学ぶための重要なインターネット リソースには、ブログ、書籍、[ 37 ]ウィキ、ビデオ、オンライン データベース、ジャーナル、[ 38 ] [ 39 ]購読サイト、会議論文[ 40 ]、コーディング スキルに特化したカスタム Web サイトなどがありました。近年、LeetCode、HackerRank、freeCodeCampなどのプラットフォームが、プログラミングの学習、コーディング チャレンジの練習、技術面接の準備に人気を博しています。新しい商用リソースには、 YouTubeビデオ、Lynda.com チュートリアル (後にLinkedIn Learning )、Khan Academy、Codecademy、GitHub、W3Schools、Codewars、多数のコーディング ブートキャンプなどがあります。
ほとんどのソフトウェア開発システムやゲームエンジンには、統合開発環境(IDE)、コンテキストに応じたヘルプ、API、その他のデジタルリソースなど、豊富なオンラインヘルプリソースが備わっていました。また、市販のソフトウェア開発キット(SDK)は、ソフトウェア開発ツールとドキュメントを1つのインストール可能なパッケージにまとめて提供していました。
営利団体や非営利団体は、開発者向けの学習ウェブサイトを公開したり、ブログを作成したり、プログラミングに関するニュースフィードやソーシャルメディアのリソースを確立したりした。Apple 、Microsoft、Oracle、Google、Amazonといった企業は、 Microsoft Developer Network (MSDN)などのリソースを含む、プログラマーを支援する企業ウェブサイトを構築した。Hour of Code( Code.org )のような現代のムーブメントは、プログラミング学習がデジタル学習戦略、教育アジェンダ、そして企業の慈善活動とどのように結びついているかを示している。
コンピュータプログラマーとは、コンピュータソフトウェアを作成する人のことです。彼らの仕事は通常、以下のような内容を含みます。
プログラミングはメディアではやや数学的な科目として紹介されているが、いくつかの研究では、優秀なプログラマーは自然言語に優れたスキルを持ち、コーディングを学ぶことは外国語を学ぶことに似ていることが示されている。[ 41 ] [ 42 ]
{{cite book}}ISBN /日付の不一致(ヘルプ)ィングイニシアチブは、セキュリティ、相互運用性、移植性、信頼性におけるクラウド導入の障壁を取り除くことを目指している。
性、移植性、互換性に基づいているのか。
{{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク){{cite journal}}: CS1 maint: 複数の名前: 著者リスト (リンク)