プログラミング言語とは、コンピュータにおけるソフトウエアを開発することを主目的に作られた人工言語である。つまり、ソフトを作るときに書いたりする、映画とかで研究室の画面に流れていたりする、ムズカシソーなアレ。
概要
プログラミング言語の歴史は、コンピュータこと電子計算機よりも長いわけだが、面倒なのでここではスルー。詳しくは、Wikipedia:階差機関にでも。
プログラミング言語は、コンピュータへ命令することを第一に作られている。それを支援する、構造記述能力、表現力が備わっていることが普通である。また、日本語や英語といった自然言語と異なり、曖昧な解釈はできない[1]。
一般に歴史的な理由と使える領域の広さから、C言語はプログラマの一般教養言語となっている。
高級言語と低級言語
プログラミング言語には高級言語と低級言語がある。抽象化の度合いが高いものが高級言語で、低いものが低級言語と呼ばれる。
低級言語
低級言語とは、機械語及びアセンブリ言語(アセンブラ)のことである。
アセンブリ言語は、機械語を英語などの自然言語などで解釈しやすいように作られたものだが、いずれもCPUの処理手順を1つずつ記述しなければいけない。しかもCPU毎に言語仕様が違うため、あるCPU用に書いた機械語プログラムを全く別のCPUに再利用することはできない。
また、論理的には1つの処理も、複数の手順を踏まえないといけないので記述数が膨大になりやすく、現在では処理手順の細かい最適化を行う際に部分的に使われることが多い。
高級言語
対して高級言語とは、自然言語をベースに人間の論理に合わせて作られたプログラミング言語を指す。CPUの仕様から自由ならば高級言語である。
低級言語よりは習得が楽ではあるが、高級言語を機械語に翻訳するコンパイラやインタプリタの性能が悪いと、非効率で処理の遅いプログラムになる恐れがある。
高級言語の中でも、記述内容が機械語に近いもの(例えばメモリへの書き込みの方法やタイミングを指定できるなど)ほど低級で、人間の感覚に近いもの(オブジェクト指向など)をより高級とする考え方もある。
近年の様々なパラダイムを取り込み洗練された言語に親しんでいる人から見ると、過去の言語は野暮ったく低級のように見えてしまうかもしれないが、あくまでも人間の考え方に近いか遠いかの違いを表す表現であって、言語の優劣を論じる用語ではない。パフォーマンスの問題から言えば、むしろ低級な言語ほど(労力を惜しまなければ)できることの種類が多く、高級な言語ほど処理速度が遅くなる傾向にある。
実際の言語の優劣は、言語仕様の良し悪しよりも入手可能なライブラリの量と質や処理系の最適化レベル、開発環境の充実度、動作可能なプラットフォームの普及状態などによって決まってしまうことが少なくない。
コンパイラ言語とスクリプト言語
実行する前にコンパイルという変換作業を必要とするものをコンパイラ言語と呼び、操作や処理を記述したプログラムをそのままインタプリタに解釈させ実行する言語をスクリプト言語(インタプリタ言語)と呼ぶ。言語仕様そのものの違いではなく、処理系の違いなのだが(スクリプト言語でも別途コンパイラを作ってコンパイルしてから実行するようにすればコンパイラ言語といえなくもない)、実用上は両者を区別することが多い。
一つのアプリケーション上で動作し、アプリケーション上の操作を一括して行うように記述できるものもプログラミング言語(スクリプト言語)と呼ぶことができるが、一般にはマクロと呼ばれて汎用プログラミング言語とは分けて扱われる。
一般的な傾向としては処理速度はマクロ < スクリプト言語 < コンパイラ言語 < 機械語 の順番だが、処理系の最適化やプログラマの技量(使用するアルゴリズム)によって大きく変わってしまうこともあるので、「〜で書かれているから速い」という考え方があてはまらない場合もありえる。
静的型付けと動的型付け
ほとんどの高級言語に型の概念が実装されているが、型が実行前に決まっていなければならないかどうかで静的型付け言語と動的型付け言語に分かれる。
→ 型付け
プログラミング言語におけるパラダイム
プログラミング言語では、その言語に対するパラダイムが存在する。
パラダイムとは、プログラムを離れて一般的な広義で言えば、物の捉え方の事を指す。
プログラミング言語におけるパラダイムとは、プログラミング言語の捉え方を表したものである。
以下に、代表的なパラダイムを記述する。詳細はプログラミングパラダイムの記事参照
これらは、排他的な特徴ではないため、当然複数のパラダイムを併せ持つ言語が存在する。そのような言語をマルチパラダイム言語という。多くの言語はマルチパラダイム言語だが、特に多くのパラダイムを実現している言語を指して言うことが多い(例: C++, D言語)。
主なプログラミング言語(高級言語)
主なスクリプト言語
プログラミング言語が作られる目的(一覧)
現在、プログラミング言語は非常に多く存在しているが、言語が作られる理由にはさまざまな理由がある。
- 以前の言語の拡張として (例: C++, C++マネージ拡張, C++/CLI, Objective-C)
- ちょっとしたことをお手軽にやりたい (例: シェルスクリプト系)
- ちょっとしたことをお手軽にやりたい。高機能で (例: Ruby, Python)
- OSを移植しやすくするため (例: C言語)
- そもそも仮想マシンで動かせばどこでも動くんじゃね (例: Java)
- Javaの人気に嫉妬して(いつものように)パクった。後悔はしていない(例: C#)
- 言語設計の研究のため。ネタ言語じゃないよ!! (例: BrainF*ck)
- コンビネータ理論に基づいて言語を作ってみたもの。ネタ言語じゃな…くもない(例: Unlambda, Lazy K)
- 言語使用者に地獄を見せることにガチなネタ言語(例: Malbolge)
- サンプルプログラム内蔵してみた。ゆるいネタ言語 (例: HQ9+)
- Hello,World!をHQ9+を超える最短コードで表示してみた。もちろんネタ言語 (例: BrainCrash)
- 二次元サイコー! (例: Befunge)
- 環境に特化した言語が必要になって (例: PostScript, SQL, JavaScript, ニワン語&ニコス)
- 実は別目的だったんだけど、機能追加してたら言語になってた (例: ActionScript, TeX)
- 新しい概念実装のため (例: Lisp)
- ハードウエア設計のため (例: Verilog)
- 英語よりも日本語だろJK (例: ひまわり, なでしこ)
- 他の言語に組み込むため (例: Lua)
- 俺最強言語を作って、俺TUEEEEEしたくなって (例: D言語)
- 読みにくくしてみた (例: grass, whitespace)
- ゲームだ (例: CarnageHeart)
- 教育用だ (例: LEGO MindStorm, LOGO, CASL)
- 教育用(小学生)にソースコード自体をGUI化してみた (例: Scratch)
- WebとDBに強い言語を作ってみた。文法?とりあえずCっぽくしとけば良いんじゃね。(例: PHP)
- 新言語(信玄後)だから(例: 織田信長)
- 昔は皆これから始めたもんだ(例: BASIC)
- IT土方専用 (例: Visual Basic)
- 元祖最強俺言語、何でもできるよ! (例: Perl)
- 成果物のスパゲッティさは他の追随を許さない。爺専用 (例: COBOL)
- 非情シス部門で勝手システムを作るためのもの。あまり関りたくない (例: Visual Basic for Applications)
- 日本においては税金の無駄使い公共事業用だった (例: Prolog)
- 真祖とか始祖とかそんな感じ。ゆとり世代には伝説の類 (例: Fortran)
- なにげにインストールベースでは最多クラス (例: Visual Basic Scripting Edition)
- 主に教育用だ。ターボとか付いてて、エディタにタダで付いてくるすごいのもあった (例: Pascal)
- 副作用が許されるのは小学生までだよね (例: Haskell)
- 関数型言語とオブジェクト指向が両方そなわり最強に見える (例: Objective Caml, F#, Scala)
- マイクロソフト帝国には誰も逆らえないことを、結果的に証明した(例: Delphi, Object Pascal)
- 制御構造を持たないシンプルな文法、なんでも文字列、簡単GUI(例: Tcl/Tk)
- grepやsedじゃ物足りなくなって (例: awk、Perl)
- WebでもやっぱりBASICだろう(例: VBScript)
- Cの速さ、Rubyの動的さが欲しいし、科学計算、線形代数計算、統計処理、機械学習を手軽に分散コンピューティングで出来るようにしたい。でも言語としてはシンプルなのがいいね。え?欲張りだって?(例: Julia)
- プラットフォームが十分に普及し、何をしてもみんな追随してくれるようになったので (例: Swift)
- ぬるぽをなくしたかった ← ガッ (例: Swift, Kotlin)
- 高速な並列処理をメモリ安全に書きたい (例: Rust)
- 量子コンピュータは実用化されていないけど、青田買い! 囲い込み! (例: Q#他)
面倒なことに、言語内でもバージョンやら実装の違いがあって、トラブルの原因になったりもする。とても面倒。
関連動画
関連コミュニティ
関連用語
- プログラミング
- 日本語じゃない日本語
- 難解プログラミング言語 / esolang
- チューリング完全
- 統合開発環境(IDE)
- ガベージコレクション
- ソフトウェア開発
- プログラミング言語選択ガイド
- ソフトウェアの一覧
- プログラミング関連用語の一覧
脚注
親記事
子記事
兄弟記事
- 19
- 0pt