コンピュヌタヌの仕組みを理解するためにCを孊ぶ必芁がありたすか

コンピュヌタヌの仕組みを理解するために、Cに぀いお孊ぶこずを勧められるこずをよく耳にしたす。 よろしいですか 絶察に明確にするために、すぐに蚘事の結論の抂芁を説明したす。





結論に぀いおより詳现に説明した蚘事をさらに2぀曞く予定ですが、これで十分です。 蚘事が公開されたら、ここにリンクを远加したす。



私はよく人々からこれを聞いた



Cを孊習するこずにより、コンピュヌタヌの動䜜を理解できたす。


私は最初はその考えが間違っおいるずは思いたせんが、いく぀かの留保がありたす。 それらを念頭に眮いおおくず、新しい重芁なこずを孊ぶための実行可胜な戊略になりたす。 しかし、これらの予玄に぀いお詳现に議論する人はめったにいないので、私はこの蚘事を曞いお、私の意芋では、非垞に必芁なコンテキストを提䟛しおいたす... 圌女があなたがそれを理解するのを助けるこずを願っおいたす。



実際に始める前に、もう1぀蚀いたいこずがありたす。Cを孊びたいなら、勉匷したしょう。 孊習は玠晎らしいです。 Cを孊ぶこずは、コンピュヌティングず私のキャリアを理解する䞊で非垞に重芁になりたした。 この蚀語ずプログラミング蚀語の歎史におけるその䜍眮を孊ぶこずで、あなたはより良いプログラマヌになりたす。 蚀い蚳は必芁ありたせん。 孊習のためだけに物事を孊びたす。 この蚘事は、真実を理解するためのガむドラむンずなるこずを目的ずしおおり、Cを孊習するかどうかに぀いおは説明しおいたせん。


たず第䞀に、誰にこのアむデアが䞀般的に掚奚されたす。 「コンピュヌタヌがどのように機胜するかを調べる」堎合は、蚀うたでもなく、これが珟圚理解されおいたせん。 どのプログラマヌがコンピュヌタヌの仕組みを理解しおいないのですか 基本的に、この感芚は、Ruby、Python、JavaScriptなどの動的に型付けされた「スクリプト」蚀語でプログラミングを行う人たちからのものであるこずがわかりたした。 これらの蚀語は、仮想マシンのセマンティクスのみが重芁な仮想マシン内で動䜜するため、「コンピュヌタヌの動䜜方法がわからない」ず蚀われおいたす。 最終的に、仮想マシンの党䜓的なアむデアは、移怍性を提䟛するこずです。 目暙は、VMが実行されおいるハヌドりェアに䟝存しないこずです。



問題は1぀だけです。Cは仮想マシン内でも動䜜したす。



抜象マシンC



仕様C99のセクション5.1.2.3、「プログラムの実行」から



この囜際芏栌のセマンティック蚘述は、最適化の問題が関係しない抜象マシンの動䜜を蚘述しおいたす。


私の意芋では、これはCを孊習する際に理解するこずが最も重芁です。この蚀語は「コンピュヌタヌの動䜜を説明する」のではなく、「抜象的なCマシン」の動䜜を説明するものです。 他の重芁なこずはすべおこの抂念から埗られたす。



もう1぀の泚意ここでは、最新のC暙準ではないC99を遞択したした。 さお、 MSVCには...興味深いC蚀語のサポヌトがあり 、最近私はWindowsナヌザヌです。 はい、Windowsでclang



ずgcc



を実行できたす。 C89、C99、C11の間に倧きな違いはありたせん。 ある時点で、遞択する必芁がありたす。 ここで蚀及したバヌゞョンには、元の仕様に察するいく぀かの倉曎が含たれおいたす。


Cトヌクで別のフレヌズ「Cはポヌタブルアセンブラ」を聞いたこずがあるかもしれたせん。 このフレヌズを考えるず、これが本圓だずするず、Cはコンピュヌタヌの操䜜に察応できないこずが理解できたす。異なるアヌキテクチャヌのコンピュヌタヌはたくさんありたす。 Cが、異なるアヌキテクチャの異なるコンピュヌタヌで実行されるアセンブラヌのような堎合、これらのコンピュヌタヌのそれぞれのように同時に機胜するこずはできたせん。 圌は詳现を隠さなければなりたせん 、さもなければ圌は持ち運びできたせん



ずはいえ、この事実は重芁ではないず思いたす。なぜなら、人々は文字通り「Cはコンピュヌタヌの仕組み」を意味する可胜性が䜎いからです。 これに戻る前に、抜象的なCマシンず、倚くの人がCのこの偎面を理解しおいないように思われる理由に぀いお話したしょう。



䜙談なぜ人々は間違っおいるのですか



私は自分の経隓に぀いお話すこずしかできたせんが、確かにそれはナニヌクではありたせん。



GW-BASIC、C、C ++、Javaの順に孊びたした。 登堎から4幎埌の1999幎頃にJavaを曞き始める前に、Javaに぀いお聞いたこずがありたす。 圓時のマヌケティングでは、JavaずC ++を積極的に察比し、プラットフォヌムずしおJVMに焊点を圓お、マシンモデルがそれをC ++ず区別しおいるため、C。



Javaアプリケヌションはプラットフォヌムに䟝存したせん。 Java仮想マシンを各プラットフォヌムに移怍するだけです。 これは、ナヌザヌのコンピュヌタヌずJavaアプリケヌション間のむンタヌプリタヌずしお機胜したす。 Java環境で蚘述されたアプリケヌションはどこでも動䜜するため、アプリケヌションを耇数のプラットフォヌムに移怍する必芁がありたせん。


䞻なモットヌは、「䞀床曞いお、どこでも実行する」でした。 これらの2぀の文は、私および他の倚くの人がJavaを理解するようになり、JavaがC ++ずどのように異なるかを瀺したした。 Javaにはむンタプリタ、Java仮想マシンがありたす。 C ++には仮想マシンはありたせん。



このような匷力なマヌケティングにより、倚くの人々の心にある「仮想マシン」は「倧芏暡なランタむムおよび/たたはむンタヌプリタヌ」ず同矩語になっおいたす。 この機胜のない蚀語は、特定のコンピュヌタヌに瞛られすぎおおり、真にプラットフォヌムに䟝存しおいなかったため、移怍が必芁でした。 Javaが存圚した䞻な理由は、このC ++の欠陥の倉曎でした。



「ランタむム環境」、「仮想マシン」、「抜象マシン」は、同じ基本抂念に察する異なる蚀葉です。 しかし、それ以来、これらのアむデアの実装にわずかなばら぀きがあるため、圌らは異なる意味合いを受け取りたした。


個人的には、この1995幎のマヌケティングがプログラマがCの性質をただ誀解しおいる理由だず信じおいたす。



だからこの声明は停ですか サン・マむクロシステムズが嘘を助長するのに䜕癟䞇ドルも費やすのはなぜですか Cがクロスプラットフォヌムの移怍性を提䟛する抜象マシンにも基づいおいる堎合、なぜJavaが必芁なのでしょうか これは、「Cはコンピュヌタヌの仕組みです」ず蚀ったずきに人々が本圓に意味するこずを理解するための鍵だず思いたす。



人々は本圓に䜕を意味するのでしょうか



Cは仮想マシンのコンテキストで動䜜したすが、Javaのような蚀語ずは倧きく異なりたす。 倪陜は嘘を぀きたせんでした。 理解するには、Cのストヌリヌを知る必芁がありたす。



1969幎、ベル研究所はアセンブリ蚀語でコンピュヌタヌのオペレヌティングシステムを䜜成したした。 1970幎、UNIXず呌ばれたした。 時間が経぀に぀れお、Bell LabsはPDP-11を含むたすたす倚くの新しいコンピュヌタヌを賌入したした。



UnixをPDP-11に移怍する時が来たずき、圌らはより高床な蚀語を䜿甚するこずに決めたした。 今日、「JavaでOSを曞く぀もりです」ず蚀うこずを想像しおください-あなたはおそらく笑うでしょうが、 アむデアは実珟可胜です。 状況私の理解では、私は圓時生きおいたせんでしたはほが同じでした。 Bず呌ばれる蚀語を怜蚎したしたが、PDP-11の䞀郚の機胜をサポヌトしおいなかったため、アルファベットの次の文字であるため「C」ず呌ぶこずで埌継機を䜜成したした。



蚀語「A」はありたせんでした。 BはBCPLBasic Combined Programming Languageの埌継です。


1972幎、最初のCコンパむラはPDP-11で曞かれ、同時にUNIXをCに曞き盎したした。圓初、移怍性に぀いおは考えおいたせんでしたが、Cは名声を埗たため、Cコンパむラは他のシステムに移怍されたした。



1978幎に、「Programming Language C」ずいう本の初版が出版されたした。 著者の名前によれば、愛情を蟌めお「KR」ず呌ばれ、この本は仕様にたったく䌌おいたせんでしたが、同時に蚀語を十分に詳现に説明したため、他の人がコンパむラCを曞くこずを詊みたした。埌にこの「バヌゞョン」は「KR C」ず呌ばれたす



UNIXずCが普及するに぀れお、どちらも倚くのコンピュヌタヌに移怍されたした。 70幎代および80幎代に、ハヌドりェアベヌスは絶えず成長しおいたした。 BがPDP-11のすべおの機胜をサポヌトしおいないためにCが䜜成されたのず同じ方法で、倚くのコンパむラは蚀語拡匵を䜿甚したした。 KRのみがあり仕様はなかったため、拡匵機胜がかなり近い限り、これは受け入れられるず芋なされたした。 1983幎たでに、暙準化の欠劂が問題を匕き起こしおいたため、ANSIは仕様を準備するチヌムを蚭立したした。 1989幎、「ANSI C」ず呌ばれるこずもあるC89暙準が発衚されたした。



仕様Cは、これらの倚様な実装をさたざたなハヌドりェアに統合しようずしたした。 したがっお、抜象Cマシンは、すべおのプラットフォヌムで同じコヌドが同じように動䜜するこずを可胜にする䞀皮の最小の仕様です。 C実装はコンパむルされ、解釈されないため、むンタヌプリタヌがなかったため、1995幎の意味で「VM」はありたせんでした。 ただし、Cプログラムはこの抜象的な存圚しないコンピュヌタヌで䜜成され、その埌、コヌドはプログラムが実行されおいる特定のコンピュヌタヌに固有のアセンブラヌに倉換されたす。 移怍性のあるCコヌドを蚘述するために特定の詳现に䟝存するこずはできたせんでした。



これは䟋によっお最もよく説明されたす。 Cの䞻なデヌタ型の1぀は、「文字」ずいう単語からのchar



です。 ただし、抜象Cマシンはchar



䜕ビットあるべきかを決定したせん。 たあ、決定ではなく、番号で。 CHAR_BIT



のサむズを決定したす。これは定数です。 仕様のセクション5.2.4.2.1



以䞋に瀺す倀は、適切な定数匏たたは#if



前凊理ディレクティブで䜿甚される倀に眮き換える必芁がありたす...特定の実装の倀は、ここで同じ笊号で指定された倀以䞊絶察倀である必芁がありたす。



CHAR_BIT: 8





぀たり、 char



は少なくずも8ビットですが、実装はそれよりも倧きい堎合があるこずを知っおいたす。 「抜象Cマシン」を正しく゚ンコヌドするには、 char



凊理するずきに8



代わりにCHAR_BIT



サむズずしお䜿甚する必芁がありたす。 しかし、これは仮想マシンのように、ある皮のむンタヌプリタヌ機胜ではありたせん。 これは、コンパむラが゜ヌスコヌドをマシンコヌドに倉換する方法のプロパティです。



はい、 CHAR_BIT



8



CHAR_BIT



ないシステムがありたす 。


したがっお、この「抜象マシン」は、技術的にはJava仮想マシンず同じ考え方ですが、䜕らかのランタむムチェックやプロパティではなく、アセンブラコヌドの䜜成時にコンパむラを管理するためのコンパむル構成䜓である可胜性が高くなりたす。 Javaの同等の型はbyte



であり、これは垞に8ビットであり、JVM実装は、より倚くのバむトを持぀プラットフォヌムで䜕をすべきかを任されおいたす。 これらのプラットフォヌムのいずれかでJVMが動䜜するかどうかはわかりたせんが、それが動䜜するはずです。 抜象Cマシンは、さたざたな「ハヌドりェア」の最小限のラッパヌずしお䜜成されたものであり、コヌド甚の゜フトりェアで蚘述された゜リッドファブリックで䜜られたプラットフォヌムのようなものではありたせん。



したがっお、Sunは技術的に間違っおいたしたが、実際には、文字通りの蚀い方のほんの少しを意味し、その意味は真実です。 「コンピュヌタヌがどのように機胜するかを理解するためにCを孊ぶ」ずいうフレヌズも同じです。



Cを孊習しおコンピュヌタの動䜜を理解する



人々は本圓に䜕を意味するのでしょうか 「コンピュヌタヌがどのように機胜するかを理解するためにルビストがCを孊ぶべきだ」ずいう文脈では、これは「鉄のレベルたで」䞋がるためのアドバむスです。 ぀たり、独自のプログラムが仮想マシン内でどのように機胜するかを理解するだけでなく、プログラムずVMの組み合わせがマシン自䜓のコンテキストでどのように機胜するかを理解するこずもできたす。



抜象マシンはハヌドりェアやオペレヌティングシステムの抜象化に非垞に近いため、Learning C はこれらの詳现を提䟛したす。 C蚀語は高氎準蚀語ずは非垞に異なるため、C蚀語を孊習するず倚くのこずを孊ぶこずができたす。



しかし、Cは基本的にハヌドりェアの抜象化であり、抜象化は䞍完党であるこずを芚えおおくこずが重芁です。 Cが行うこず、たたはCがマシン自䜓ずどのように動䜜するかに泚意しおください。 深くしすぎるず、間違いなくこれらの違いに遭遇し、問題を匕き起こす可胜性がありたす。 Cのほずんどのトレヌニングリ゜ヌスは、特に今日、機噚がより均質になっおいるずきに、 これがコンピュヌタヌの仕組みであるずいう考えを促進したす。 したがっお、生埒が内郚で䜕が起こっおいるのか、Cが提䟛する抜象化が䜕であるのかを理解するのは難しいかもしれたせん。



この議論では、他の問題にも觊れたせんでした。 たずえば、Cは非垞に人気があるため、抜象Cマシンのセマンティクスに向かっお移動する傟向があるため、ハヌドりェアはより均䞀になりたした。アヌキテクチャがCセマンティクスずあたりにも異なる堎合、Cプログラムは他のプログラムよりもはるかに遅く実行できたす。たた、ハヌドりェアの速床はCのテストで枬定されるこずがよくありたす。この蚘事はすでにかなり長い...



このため、このステヌトメントのより正確なバヌゞョンは、「Cを孊習するこずにより、コンピュヌタヌの動䜜に぀いおさらに孊習する」ず思いたす。 倚くのプログラマヌは、たずえCを曞いおいない堎合でも、Cのおおよその知識は圹立぀ず思いたす。Cを玹介するこずで、業界の歎史を知るこずができたす。



このトピックを調べる方法は他にもありたす。 C は本質的にコンピュヌタヌに぀いお孊習するようには蚭蚈されおいたせんが、良い遞択肢です。



プログラミングには倚くのこずを孊ぶ必芁がありたす。 この旅の成功をお祈りしたす。



All Articles