「プログラミング言語=PCへの命令」というのは理解しています。
しかし、なぜ人間に近い言葉で書いたものをPCが機械語にコンパイルできるのでしょうか?疑問で仕方ありません。色々なプログラミング言語がありますが、それぞれ文法や表現方法も異なるのに機械語に変換されます。
そもそもプログラミング言語をどういう風にして作るのでしょうか。
また、作った後にそれらをどのようにしてPCに認識させるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答11件
0
まず、プログラミング言語自体の発想とは、難解な機械語を人間にも理解できる言語で記載できるようにしたものということになります。
我々の時代であれば世の中で利用されているプログラミング言語が非常にたくさんありますが、少し前(今40〜70歳)の時代であれば機械語に近い形でプログラミングしていた人たちもいるはずです。
機械語に近付けば近付くほど低級な言語、遠ざかれば遠ざかるほど高級な言語という言い方をします。
高低に良い悪いの違いはありません。機械を下に、人間を上にした場合に、より機械に近い部分で記載された命令を低級と位置づけています。
現在流行しているプログラミング言語は殆どが高級言語ですね。
しかし低級な言語を扱える人というのは非常に特殊な技術の持ち主であり、扱える言語が低級か高級かということに技術の高低はありませんので注意してください。
繰り返しになりますがプログラミング言語とは難解な機械語を人間に理解できるように記載できるようにしたものであり、機械はプログラミング言語自体を読むことはできません。
プログラミング言語が最初に作られた歴史というのは私も不勉強でよく分かりませんが、最初に流行したプログラミング言語はCOBOLというプログラミング言語です。
これはほぼ英文法に近い形で人間が機械に命令したい内容を記載することができ、コンパイルという機械語に翻訳する作業を行うことで機械への命令文に翻訳することができます。
これによって一般人でもコンピュータを扱うことができるようになり、役所や企業などはこぞってコンピュータを購入し事務処理をコンピュータに任せるようになっていきました。
なぜそれまでコンピュータが広まらなかったかというと機械語かそれに近い低級な言語を扱える技術者しかコンピュータを扱うことができなかったからです。
このCOBOLというプログラミング言語が流行したことで、その後のプログラミング言語も同様にある程度の英文法に則った形で記載でき、機械語に翻訳するような形が広まりました。
最初の質問はなぜプログラミング言語をコンパイルすることができるのかということでしたね。
プログラミング言語がなければ、機械語あるいは機械語に近い低級な言語を扱える技術者しかコンピュータを扱えないことになります。
そこで世の中にもっとコンピュータを広めるために、世の中をもっとよくするために、機械語や低級言語を扱える技術者は、英文法に近い記載内容を機械語に変換できるような技術を開発します。
それが現在一般にプログラミング言語と呼ばれている高級言語であり、最初に流行したプログラミング言語がCOBOLです。
低級言語技術者が、高級言語で書かれた内容を機械語に変換するよう作った処理をコンパイラと呼びます。
コンパイラは高級言語と機械語の翻訳機であり通訳です。
相手の話す言葉が分からなければ通訳はできません。
最初にコンパイラを作った人は、機械の言葉が分かったのでしょうね。
なぜプログラミング言語をコンパイルできるのかということになると、コンパイラを作った人は機械語が分かったからということになると思います。
より違った言い方をすれば、機械語の分かる人が、機械語の分からない人にも機械を扱えるよう、わざわざ用意したものがプログラミング言語でありコンパイラである、ということになると思います。
このような説明で、疑問は解消されますでしょうか。
※C言語のコンパイラはC言語で書かれているということもあり、この説明が完全に合っているかは保障できません。ただ私としては上記のような感じで理解しておりほぼ納得しています。
他の方の回答にもありますようにWikipediaなども併用しコンピュータの歴史から遡るなどするとより理解が深まると思います。
投稿2019/07/20 00:34
総合スコア1947
0
電源を入れると BIOS というソフトがまず起動します。これは電源を落としても消えない不揮発メモリに機械語で書かれていて、電源を入れた時からメモリ上にあります。
次に BIOS はディスクやネットワークといったハードウェアを使って OS をメモリ上に読み込み、それに制御を移します。OS は機械語で書かれていて、大抵の場合ディスクの特定位置にあります。
OS はディスクの構造(ファイルシステム)を解析し、そこから機械語で書かれた実行ファイルをメモリ上に読み込み、それに制御を移します。
大雑把に言って、これがプログラム実行の簡単な流れです。
プログラムは機械語で、メモリ上で実行されるということです。CPU はメモリ上の機械語を読み取り、それに従ってメモリの読み書きをしたり、各種レジスタやハードウェアに指令を出したりすることができます。CPU は様々な回路を精密かつ複雑に組み合わせたもので、要するにソフトウエアではなくハードウェアによるプログラミングがなされています。
コンパイルは人間の書いたプログラムを機械語に直す手順です。プログラミング言語は厳密に文法が定められているので、機械語に翻訳することができます。
コンパイラの前にインタプリタの話をします。これは指令書を読み取り、その通りに動くソフトです。例えば指令書に a = 10 と書かれていたら、メモリの特定の箇所を確保し、それに a という名前をつけ、そこに 10 という値を書き込むよう動きます。
インタプリタは指令書を読みながら動くので、指令書の解析という手順が必要で、それに時間を取られます。
そこであらかじめ指令書を読んで解析し、その通りに動く機械語を組み立てて保存しておくと、効率的に実行できます。この手順をコンパイルと呼び、それをするソフトをコンパイラと呼びます。
コンパイラはすべての言語をコンパイルできるわけではありません。自分の知っている言語を指令書とし、それに従って人間の代わりに機械語のプログラミングをするだけです。
コンパイラによって作られた機械語のプログラムは、実行ファイルとして保存され、実行すると OS によってメモリにロードされ、そこに制御が移されます。
投稿2019/07/20 01:29
編集2019/07/20 01:52総合スコア28662
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/20 03:20 編集
2019/07/20 04:28
2019/07/20 05:07
2019/07/20 13:14 編集
2019/07/20 13:22
2019/07/20 14:37
2019/07/20 14:55
2019/07/20 15:16
2019/07/20 15:16
2019/07/20 15:21
2019/07/20 15:22
0
プログラミング言語がいくら人間の使う自然言語に近いと言っても、プログラミング言語は人工的に作られたものです。構文が完全に決まっていて、形式的に定義されているのが普通です。
単なる文字列を機械語に変換することはできませんが、この構文でこう書いてあるならこの機械語に変換する、ということを決めておけば、構文解析までやったあとに機械語に変換することは可能になります。if文ならcmpとjzでという感じでしょうか。構文解析はプログラミング程度ならそう難しい技術ではない(というか構文解析がちゃんと成功するように定義している)ので、できるのかできないのかでいえばできますし、どんなコンパイラ・インタプリタもやっています。
投稿2019/07/20 06:36
総合スコア30935
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
しかし、なぜ人間に近い言葉で書いたものをPCが機械語にコンパイルできるのでしょうか?
PCが、翻訳するのではありません。翻訳用のソフトウェアが翻訳します。通常、「compiler」と呼ばれます。
コンパイラは、どんなプログラミング言語でも翻訳できるわけではありません。人間は、マルチリンガル(multilingual)な人がいますが、ソフトウェアは大抵1種類のみの言語を翻訳できます。対象ではない言語で書かれたコードを渡しても、理解できないと返ってくるだけです。
投稿2019/07/19 22:26
総合スコア995
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
(質問)なぜ人間に近い言葉で書いたものをPCが機械語にコンパイルできるのでしょうか?
(回答)プログラミング言語が機械語にコンパイルできるようなアーキテクチャしているからPCは機械語にコンパイルできるようになっています。
(質問)プログラミング言語をどういう風にして作るのでしょうか。
(回答)プログラミング言語の具体的な作り方はまだ分かっていません
「コンパイラ」「プログラミング言語の作り方」などでググってみてはいかがでしょうか?(質問)作った後にそれらをどのようにしてPCに認識させるのでしょうか?
(回答)プログラミング言語が機械語にコンパイルできるようなアーキテクチャすることで、PCに認識できるようになります。
低評価の回答のためサイトの内容に不適切な投稿と判断し削除
戻す方が良いという意見があるので、回答内容を戻す
(質問)なぜ人間に近い言葉で書いたものをPCが機械語にコンパイルできるのでしょうか?
(回答)プログラミング言語が機械語にコンパイルできるようなアーキテクチャしているからPCは機械語にコンパイルできるようになっています。
(質問)プログラミング言語をどういう風にして作るのでしょうか。
(回答)プログラミング言語の具体的な作り方はまだ分かっていません
「コンパイラ」「プログラミング言語の作り方」などでググってみてはいかがでしょうか?(質問)作った後にそれらをどのようにしてPCに認識させるのでしょうか?
(回答)プログラミング言語が機械語にコンパイルできるようなアーキテクチャすることで、PCに認識できるようになります。
低評価理由
情報価値0:1件
投稿2020/06/04 14:05
編集2020/06/06 13:35総合スコア13
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/06 00:57
2020/06/06 02:22
2020/06/06 02:24
2020/06/06 02:30
2020/06/06 02:44
2020/06/06 02:48
2020/06/06 03:04
2020/06/06 03:23
0
なぜ人間に近い言葉で書いたものをPCが機械語にコンパイルできるのでしょうか?
ちょっと何が疑問なのか分からないのですが、まずコンパイラと呼ばれるプログラムがその変換作業をしているのはよろしいですね?
コンパイラはそのように作られているから、あるいはプログラミング言語はそのようなことが出来るように作られているから、というのは答えになりますか?
あるいは「チューリング完全」という性質があって、その性質を満たす言語(機械語も含む)は本質的に同じ表現能力を持つので互いに翻訳可能という説明はいかがでしょう。
色々なプログラミング言語がありますが、それぞれ文法や表現方法も異なるのに機械語に変換されます。
どの言語も、機械語も、チューリング完全という点では同じ表現力を持ちます/同じ表現力しか持ちません。
(マルチプロセス対応は多少話が違うが、本質ではない)
そもそもプログラミング言語をどういう風にして作るのでしょうか。
これはまあ「(既存の言語で)この処理を書くと長ったらしいな→短く書けるようにしよう」の繰り返しではないかと想像します。
また、作った後にそれらをどのようにしてPCに認識させるのでしょうか?
コンパイラ(あるいはインタプリタ)を作ります。
投稿2019/07/20 06:43
総合スコア3047
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
本質的な疑問を短くまとめますね。他の方もおっしゃっているように短い回答は困難ですが、トライしてみます。
しかし、なぜ人間に近い言葉で書いたものをPCが機械語にコンパイルできるのでしょうか?疑問で仕方ありません。
人が使う「文字」に「文字コード」を割り当て、「文字」をコンピュータへ入力する手段(昔は紙テープやパンチカード、現代はキーボード)を用意しています。キーボードの A
を押すと A
に割り当てられた「文字コード」がコンピュータに入力されます。(厳密にはちょっと異なりましが、細かい部分は端折ります)
そして、例えば、LDAA
を 「アキュムレータA(CPUが内蔵するレジスタの1つ)へロードする命令」へ変換すると約束します。そのような約束を履行するプログラムは「アセンブラ」と呼ばれます。
そのようなアセンブラへLDAA $1234
と入力すると 1234番地からアキュムレータAへデータをロードする機械語命令へ変換されます。
そのようなアセンブラはCPUメーカが開発し提供するケースが多く、CPU毎に命令体系も文法も異なります。
昔のプログラマはそれらの命令を組み合わせて有用なプログラムを記述し、アセンブラを使って機械語へ変換・デバッグし、バグが十分に無くなったと感じたら、機械語命令の形式でリリースしていました。
こんなレベルで開発していると時間がいくら有っても足りません。なので、もう少し人間がプログラムを書きやすく記述するための言語がプログラミング言語です。(黎明期はFORTRANやCOBOL等が有名です。)
それらのプログラミング言語で記述されたソース・ファイルを読み込んで、機械語プログラムへ変換するソフトのことをコンパイラと呼びます。
もちろんFORTRANコンパイラやCOBOLコンパイラも多数ありますし、CコンパイラやC++コンパイラ等も有名ですね。
Cコンパイラもアセンブラと同様CPUメーカが開発し提供する場合も多いですが、Visual C++は多くのPCのCPUメーカであるインテルではなくマイクロソフトが提供していますが、このようにCPUメーカでないベンダーが有償や無償で提供するケースも多いです。
また、gccのようにオープン・ソース・プロジェクトで開発されるメジャーなコンパイラも存在します。
これらのコンパイラは、int x;
というコードがあれば、(多くのPCでは)4バイトの記憶領域を確保し、それにxという名前をつけ、多くのソース・コードがxという名前でアクセスできるようにします。for(int i=0; i < 10; ++i){...}
というこコードがあれば、同様に4バイトの記憶領域を確保し、0に初期化後、+1しながら、10になるまで、...
の部分を繰り返し実行するような機械語へ変換します。
コンパイラは同様な変換機能を多数持っています。
色々なプログラミング言語がありますが、それぞれ文法や表現方法も異なるのに機械語に変換されます。
そのプログラミング言語を解釈できる適切なコンパイラを使って機械語へ変換します。
多くのコンパイラ管理ツール(例えばgcc)は拡張子で適切なコンパイラを選択します。拡張子を付け間違うと間違ったコンパイラが選択され、コンパイル・エラーになります。
例えば、C++で記述したプログラムに .c という拡張子を付けて多数のエラーに見舞われたことのある人はそこそこ多いと思います。
そもそもプログラミング言語をどういう風にして作るのでしょうか。
頑張って作ります。基本はソース・コードを機械語へ変換するだけですから、頑張れば作れます。
とはいえ、複雑な変換処理を頑張るだけで作るのはあまりに大変です。
少しでも楽に開発するため、いろいろな工夫がなされます。ブートストラップ問題を見てみると多少雰囲気が伝わるかも知れません。
また、作った後にそれらをどのようにしてPCに認識させるのでしょうか?
OS毎に約束事があります。その約束事に則ったバイナリ・ファイルをリンカが出力します。
そのため、例えば、Mac用のバイナリをWindowsで起動することはできません。
なお、最近は他のOSのバイナリを起動できるような仕組みが徐々に実用化されつつあります。Windows Subsystem for Linuxなど。
投稿2019/07/20 06:34
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/20 13:24
2019/07/20 13:45
2019/07/20 15:17
2019/07/21 11:45
0
なぜ人間に近い言葉で書いたものをPCが機械語にコンパイルできるのでしょうか?
既に指摘のあるように、翻訳するプログラムがあります。
まあ、中で小人さんが頑張ってるという冗談もありますが、最初は、人が機械語に(手作業で)翻訳した事もあるようです。
翻訳するためのプログラムを(最初は人が)機械語に翻訳し、そのプログラムを使って、更に良い翻訳プログラムを作成する、という歴史ですね。
今だと最初は、別のコンピュータ(PC)を使って、新しいコンピュータ用の翻訳プログラムを作成するので、人が直接、翻訳する事はまず無いでしょうが。
[追記]
そもそもプログラミング言語をどういう風にして作るのでしょうか。
また、作った後にそれらをどのようにしてPCに認識させるのでしょうか?
この質問の意図が分かりません。
"新しいプログラミング言語がどのように作られるか?" ならば、今までのプログラミング言語に不満があるから。とは言うものの、全く新規に作られる事は無く、既存の言語(Cとか)を参考にして作られます。 昔のCOBOLは、事務処理用言語として開発(米国なので、英語に近い記述)。FORTRAN は、数値演算が容易にできるようにと。(Wikipedia記述では、広く使われた最初の高級言語とか)
等々.... (と、Wikipediaを見るとそれぞれの言語の歴史とかあり、結構興味深い)
次に、言語の仕様が明確になったら、それを機械語に翻訳するためのツールの作成を行います。上に書いた様に、初期の頃は、手作業もありましたが、今は、既存の言語を使って機械語への翻訳ツール(コンパイラ)を作成する手順となります。
ただ、機械語への翻訳と言っても、環境によってその保存されるデータ形式(機械語のデータファイル形式)は異なり、Windows用、Linux用とか、システム起動用もまた別の形式となります。(機械語そのものは、CPUに依存)
PCは、それぞれの手順に従って作成されたプログラムファイル(大抵は機械語のデータファイル)をメモリに読込み、実行する事になる。(と言い切りたかったが、Windowsの.NETは、MSILと呼ばれるバイトコード。CPUは直接、実行しない -- 違うと言う指摘もあり、興味ある方は調べてください。MSILとかで検索すれば、情報はあります)
と、色々と複雑になってます。
投稿2019/07/20 01:21
編集2019/07/21 12:03総合スコア6385
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/20 15:16
2019/07/20 15:36
2019/07/20 15:39
2019/07/20 15:41
2019/07/21 11:52
2019/07/21 11:54
2019/07/21 11:57
2019/07/21 12:05
0
例えば動物に芸を教え込む場合、
人間の命令(合図)に対してどうすればよいかを覚えさせます。
動物は人間の命令(意図)がわかってやってるわけではなく
単にそうすると褒めてもらえたりオヤツがもらえるから
そうしているだけですね。
翻ってコンピューターの場合、なんらかの入力に対して
なんらかの出力をする、そういう風につくられています。
プログラマーの意図をくみとって動いているのでなく
淡々と入力を出力にしているだけなんスね。
もちろん、人間の意図を直接コンピューターに伝えるのは
難しいので、間をとりもつコンパイラーやインタープリター
なんてものが手伝っているというわけです。
プログラミング言語の作り方に関してはよく分からないので
まつもとゆきひろさんなどの著作を読んでみてはいかが?
もちろん興味があればコンパイラーの専門書を読むのが
いちばんいいと思います。
投稿2019/07/19 23:49
総合スコア7460
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/20 01:34