プログラミング
コンピューター原始的な動作原理
CPUはプログラム (命令)を読み込みながら処理をし、メモリへ書き込み命令があればメモリにデータを書き込む CPUへの命令は単純なものが何種類か用意されており、それぞれ対応する番号 (数値)が割り当てられている。 つまり、プログラムは数値の羅列(=データ)として扱う事ができ、それ自体データなのでメモリに格納する事が出来る。
ノイマン型コンピューター
このように、プログラムをデータとしてメモリに格納する方式を 「ノイマン型コンピューター」と呼ぶ。フォン・ノイマンという数学者によって考案されたらしい。
プログラム(CPUを動作するための数値(命令)の羅列)
プログラム(CPUを動作するための数値(命令)の羅列)を人間が読めるように 数字を意味のある文字列に置き換えたもの
||
アセンブリ
↓
最終的には数値の羅列 (=以下、マシン語とよぶ) になり、メモリやハードディスクに保存される。
※CPUによって命令セットや使用できる。
レジスタが異なるので、CPUの種類の数だけアセンブリも存在する。
マシン語↓
.LC0:
.string "%d\n"
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-4], 1
mov DWORD PTR [rbp-8], 2
mov edx, DWORD PTR [rbp-4] mov eax,
DWORD PTR [rbp-8] add eax, edx
mov esi, eax
mov edi, OFFSET FLAT:.LC0 mov eax, 0
call printf
mov eax, 0
leave
ret
この、意味不明なやつを分かりやすく書けるようにしようということでプログラミング言語の誕生に繋がる。
int a=1;
int b=2; printf("%d\n", a+b);
↑C言語のコード
まだ意味がわかりやすい。
プログラミング言語とは
結局のところ、プログラミング言語というのは、 CPUへの命令(アセンブリ)を直接書くのはしんどすぎるっていうか、常人ではムリなので、普通の人でも書けるようにしましょう、という事で開発された「プログラム」なのです。
プログラミングとは
プログラミングというのは、コンピューターを使って生産性をあげたり、人間では難しい計算をコンピューターを使って簡単に出来るようにするためのものです。
つまりプログラミング言語というプログラム、プログラムを簡単に書けるようにするためのプログラムなのです。
なので、プログラムは難しい、などと言っていると、プログラミング言語を開発した人からすると、「いや、難しいっつーから簡単に出来るようにしたのがこれなのよ」となります。
プログラミング言語の種類
コンパイラ
→ 機械語を直接作成したり、アセンブリを生成するプログラミング言語。C言語など。
・仮想マシンの中間言語コードを生成するプログラミング言語。Javaなど。
インタープリタ
→ コンパイルという操作なしに、順次プログラミングコードを実行する。
JavascriptやPHP、 BASICなど。
中間言語、仮想マシン
仮想マシン:コンピューターの動作を真似たプログラム。
コンピューターの中に別のコンピューターが 入ってるイメージ
→ どんなハードウェア(CPU)でも同じ仕様の中間言語を動作せる事が出来る。
ハードウェアによる違いを意識する必要がほとんど無くなる。
中間言語:仮想マシン用の機械語
このような動作原理で動作するプログラミング言語のJavaが有名。
インタープリタのメリットとデメリット
使い始めるのが簡単。
コードが間違えていてもとりあえず動くものが多く、手軽に実行できる反面、プログラムの間違いに気付きにくい。
コンパイラのメリットとデメリット
コンパイルしてからでないと実行できない。
正しく書かないとコンパイルが通らずエラーになる。実行前にエラーを検出できるというメリットでもある。ネイティブコードを生成するタイプのコンパイラであればCPUが直接実行できる機械語になるので処理速度は最速。
プログラミング言語どんだけ知ってる?
C言語 , C++ , C# , PHP , javascript , typescript , python , Objective-C , swift , Java , kotlin , Dart , COBOL , BASIC , Ruby , Perl , Rust , Go , LISP , Pascal , FORTRAN , Ada , ALGOL , アセンブラ
プログラム、ソフトウェア、ハードウェア、システム
プログラム = ソフトウェア
プログラムとソフトウェアは同じものと考えてよい。
ソフトウェア <> ハードウェア
ハードウェアの対義語としてソフトウェアという用語を使う事が多い。ハードウェアとは、ソフトウェアを動作させるためのパソコンや周辺機器の事を指す。 なお、デバイスはハードウェアと同義語と考えてよい。
システム ≠ プログラム
システム = ちょっと曖昧な用語なので使用する場合は注意が必要。体制や仕組みの事をシステムとよぶ。
複数の要素が強調し、なんらかのルールの上で運営されるもの。ソフトウェア(=プログラム)がシステムの重要な位置を占める場合もあるけど、そもそもソフトウェアが必須という事では無く、仕組み全体の一部にプログラムが組み込まれているものと考えるべき。複数のプログラムで構成される場合もある。
ある程度の規模のソフトウェアに対して、名称に「システム」を含める場合がある(例:CMS等)
ソフトウェアの種類
アプリケーション:
ユーザーが直接的に使用するソフトウェアの事。スマホの場合はアプリとよんだりする。何らかの明確な目的をもって作られる事が多い。
Webアプリはアプリケーションの中でも、特にWeb上に作られたもの(=ブラウザで操作可能なアプリ)の事を指す。
OS(オペレーティングシステム):
コンピューターを人が簡単に使うための基本的なソフトウェアの事。WindowsとかMacOSとかAndroid,iOSの事。何らかのユーザーインターフェース(画面)がそなえられており、外部記憶装置(ハードディスク)のIO(入出力)機能、ディスプレイやスピーカーなどの出力装置のコントローラー及びアプリケーションの管理及び実行機能を持っていたりする。
ミドルウェア:
単体で使用される事は無いが、アプリケーションの開発をしやすくするための補助的なプログラム。MySQLなどのデータベースエンジンや、Javaのプログラムを動作させるための仮想マシンや、Javascriptを動作させるためのV8エンジンなど。ユーザーインターフェースをもたないものは大体これに分類しておけばOK。(適当)
デバイスドライバ :
広義ではミドルウェアになると思うけど、デバイス(=ハードウェア)を動作させるためのプログラム。
プログラミング言語別 利用用途
C言語 , C++:
OS開発など、ハードウェアに近い処理を書く場合や、可能な限り速いプログラムを書きたい場合などに使用される。ただし、メモリ管理プログラマ責任となり、メモリリークと呼れるバグが発生しがち。初心者が今から学ぶ微妙かも。教養として、コンピューター動作原理をより理解したり、Cで書かれたオープンソースプログラムを読めるようになりたいならおすすめ。
Rust:
比較的最近できた言語で、C/C++で発生しがちなメモリ関連バグを防ぐため機構が言語レベルで組み込まれている。主要なプログラミング言語に育ちつつある。難しい言語であるも、学ぶ価値あり。
C#:
マイクロソフトが開発したプログラミング言語。Windows用アプリケーションを開発するに使われる事が多い。今から学ぶに微妙かも?近年昔に比べてWebアプリでリッチなUIがいくらでも作れるようになり、Windows専用ネイティブアプリ開発というニーズがかなり低くなったと感じる。
PHP:
Webアプリ開発用。最近nodejsなどに押されているも、まだまだ大半WebアプリPHPで書かれたプログラムで運営されています。最大特徴プログラムにHTMLを直接記述できる(というかHTML中にPHPを埋め込むという方がしっくりくる)という書式で、それにより、HTMLと親和性が非常に高いもになっていると同時に、学習障壁が低くなっている。
javascript:
Webブラウザ上で動作させられるプログラミング言語。近年で、nodejsやDenoというブラウザ外でJavascript実行するため環境が出ており、プログラミング言語界隈でとても人気がある言語。フロントエンドとバックエンドで共通言語を使えるという事学習しないといけない事が半分減るに等しい。Google apps script(GAS)もjavascriptであり、そもそもブラウザに搭載されている言語という生い立ちからして拡張性が高い言語であり、また、Webブラウザが廃れない限りjavascriptも廃れる事が無く、重要度非常に高い。
Type script: Javascriptを拡張し、静的型付けを出来るようにした言語。それにより、人為的な記述ミスを防ぎ、堅牢性向上が見込まれる。実行時にjavascriptに変換(トランスパイル)される。
(OWLコードがPHPに変換されるに似ている)
python:
記述方法がちょっとクセつよな言語ですが、AI関係ライブラリが強く、近年AI台頭により、人気が上昇し続けている言語。習得簡単らしい。
Objective-C:
かつてmacやiOS用アプリケーション開発に使われていたが、今swiftという言語が主流になっており、あまり重要で無くなっていると思われる。
Swift/SwiftUI:
macOS/iOS用アプリケーション開発に使用される。iPhone用アプリ開発をしたい場合これ(SwiftUI)を使うとよい。今から学ぶならSwiftよりSwiftUIを使う事。
Kotlin:
Android用アプリ開発に使われる。Javaを拡張した言語。
Dart:
Flutterという、AndroidとmacOS/iOSアプリを同時に開発するため開発環境で使用される言語。使った事ないで詳しい事わからないけど、AndroidとmacOS/iOS用アプリを両方同時に作りたい場合使用を検討すべし。
COBOL:
事務処理用プログラミング言語。名前だけ知ってればOK
Fortran:
科学計算用プログラミング言語。かなり古くからあり、歴史的に重要な言語だけど、使う機会無いと思うで名前だけ知ってればOK
BASIC:
初心者用に開発された言語。昔PC起動するとBASICを書くため画面が起動したりしていた。歴史的に重要な言語だけど、使う機会無いと思うで名前だけ知ってればOK
Pascal , Ada , ALGOL:
今から勉強する必要全くないないけど、歴史的に重要な言語。名前だけ知ってればOK
LISP:
関数型プログラミング言語。歴史的に重要な言語だけど、使う機会無いと思うで名前だけ知ってればOK
Go:
Google製プログラミング言語。流行るか廃るかよくわかりません。
Ruby:
若干廃れつつある気がしますが、まつもとゆきひろという日本人が開発した言語。Webアプリ開発でよく使われているらしい。
*COMMENT*
下川 春樹
*コメント*
様々な単語が出てきて、ちょっとこんがらがりましたが、意味を知れてとてもいい勉強になりました。
様々なプログラミング言語も、メリットや何をするのに向いているかなど解説いただきましたが、まずはJavaScriptの理解を深めて業務でも活かせるようにしていきたいです!
*コメント*
久保 一也
*コメント*
JSについてもちょいちょい重点的に教えていこうかなと思います。
鶴田 れな
*コメント*
プログラミング言語は、プログラムを人間が簡単に書くするための
プログラムである。
パッと文字面を見ただけでは意味が分かりませんでしたが
説明を聞くと「なるほど」となりました!
各言語(と言っても一部ですが)の特徴や、何に使われているのか
学習コストなどもふまえてお話してくださり、
今後の学習に役立つお話でした。
私を含め、ぴよぴよルームでは「js」の勉強法について
どうしたものか...となっている方がいるので
そちらについても質問させていただきました。
js自体を理解するというよりかは、jsを用いて何をするのか
というところに焦点を当てる必要があるということがわかりましたので、ルームのコーダーさんにも伝播していきます!
*コメント*
久保 一也
*コメント*
熟知してないと躓くポイントがいくつかあったりするので、今後教えていきますね。
鈴木 健太
*コメント*
プログラムを機械にわかる言語に翻訳してから実行すること、またその翻訳の方式によってコンパイラとインタプリタの2種類に分かれることを学びました。
プログラミング言語を作成(コンパイラ作成)ってどのようにするのだろうと興味が湧きました。
*コメント*
久保 一也
*コメント*
則岡 えり
*コメント*
今回はプログラミング言語について、でした。
プログラミング言語は、プログラムを簡単に書けるようにするためのプログラムである。
つまり自分が難しと思っているプログラミング言語は、実は簡単にできるようにしたものである、ということを知りました。
いろんなプログラミング言語の用途やどういう特徴なのかも詳しく教えていただきました。
なぜこんなにもたくさんの種類の言語があるのか?そんなに必要なのか?と思っていましたが
それぞれ目的にあった言語あるのだということ学びました。
最近node.jsに初めて触れ、今一番興味があります。
*コメント*
高橋 かほ
*コメント*
今回は、プログラミングやプログラミング言語についてより深く学ぶことができた回でした。
各プログラミング言語の特徴について教えていただき、「やりたいことに合わせて言語を選ぶ」という感覚があまりなかったため新鮮でした。自分自身が今後どういったことをしていきたいのかを考えるきっかけにもなりました。
また、個人的には日常で何となく使っている「プログラム」や「ハードウェア」「ソフトウェア」「システム」などの言葉について一つずつ詳しく意味を解説してくださったことが印象に残っています。言葉の理解がはっきりしていないと教えていただくことを正しく理解できないと思うので、基本的なことから分かりやすく学べる環境を有難く思っています。
次回のプログラミング学校も楽しみにしています!
よろしくお願いいたします。
*コメント*
山本 高広
*コメント*
今回は、プログラミングとは?についての回でした。
プログラムとは何なのか?、どう動作しているのか?
という基本の仕組みを学びました。
プログラム言語のカテゴリとして「コンパイラ」と「インタプリタ」
の二種類に分かれる事は初めて知りました。
*コメント*
*コメント*