web-dev-qa-db-ja.com

プログラマーは高水準言語での低水準ソフトウェア開発にどのように対処しますか?

私はプログラミングにいくらか慣れていないので、この質問をする最良の方法は例を示すことです。

私はJavaおよびC#で基本的なことを行う方法を知っています。小さなウィンドウフォームアプリケーションのようなものや、汎用クラスを作成します。とにかく、私は物事が「内部で」どのように行われるかについて常に興味を持っていました。

私はそれがすべて1と0に要約され、アセンブリ言語が基本的に1と0のパターンにコマンドを与えることを知っていますが、そこからこのジャンプがあるようです:これにライブラリを使用するためのライブラリ。ライブラリがなくてもC#でできることはすべて、算術論理演算とバイナリ論理であるように思えます。入力または出力を取得するには、ライブラリなどを使用します...

この質問はおそらく一部の人にとっては明白だと思うし、学ぶべきことがたくさんあることは知っているが、このような質問からどこから始めればよいかさえわからない。ありがとうございました。

だから私の質問はこれです:

誰かが仮想マシンやPlayStationエミュレーター、オペレーティングシステム、ドライバーを作成したり、メディアプレーヤーにmp3サポートを追加したり、独自のファイルタイプを作成したりする場合...方法は? C#やJavaでどのように行われるかわかりません。

つまり、WROXによるProfessional C#やOReillyによるProgramming C#などの本を読んだ場合、これらの方法を知っていますか?または、アセンブリ言語またはC++のようなより低レベルの何かを学ぶ必要がありますか?

21
fender1901

興味深い質問です! JavaやC#などの言語は、実際にはかなり低レベルのプログラミングをサポートしています。たとえば、OpenJDK for JavaのいくつかのI/Oソースコードを見てください。より高いレベルのメソッドは、より低いレベルのソケットテクノロジー、バイト配列、およびビットトゥウィドリングで実装されています。

C#とJavaに関しては、これらの言語はバイトコードにコンパイルされ、仮想マシン上で実行されます。実際には、バイトコードを非常に楽しく表示して学ぶことができます(たとえば、JavaがStringオブジェクトの連結を処理する方法を確認する)。

開発中の環境がこれらの上位レベルのVMの1つをホストしていない場合(多くの場合、スペースとパフォーマンスの要件が原因)、「下位レベル」の言語を使用する必要があります。

メモリ管理とデータ構造をn次まで微調整できるので、C/C++はまだ低レベルのドライバーの作成などの領域でルーズを支配していると思います。

アセンブリは最近かなり専門化されており、そのレベルで何が起こるかを理解するために、少なくともクイックコースを講じることは良いことです。アセンブリを書き込んで、レジスタが空になる間にレジスタを埋め戻すと、各プログラミング言語層が到達しなければならない種類の長さを理解し始めます。

HTH

9
Martijn Verburg

ほとんどの「低レベル」プログラミングは、基本的にオペレーティングシステムと直接インターフェースすることになります。これを行う「明白な」方法があるように思われない理由は、一般的に言えば、Javaのような高レベルの言語は、使いやすさと移植性に努めているからです。オペレーティングシステムとのインターフェイスは、抽象化されていない限り、一般に多くのless上位レベルのコードよりも移植性があります。

CやC++などの低レベル言語では、オペレーティングシステムAPIに直接アクセスできます(ほとんどのオペレーティングシステムはCで記述されているため、C言語を介してAPIを公開しているためです)。たとえば、UNIXシステムのCでは、ioctl関数を呼び出して、デバイスと直接インターフェースすることができます。

もちろん、JavaやC#などの高水準言語もオペレーティングシステムと通信する必要があります。ファイルを開いたり、ネットワークソケットから読み込んだりするたびに、OSとやり取りしています。 JavaおよびC#は、低レベルのOSシステムコールをSocketオブジェクトのような高レベルの抽象化でラップします。この高レベルのアプローチには、同じJavaコードはさまざまなプラットフォームで機能します。一方、UNIXのCでソケットを開く方法は、Windowsで行う方法とはかなり異なります。

一般に、言語のレベルが高くなるほど、プログラムがオペレーティングシステムとどのようにインターフェイスするかを制御できなくなります。とはいえ、あなたが言及することの多くはあるより高いレベルの言語で行うことが可能です。たとえば、JavaまたはC#で仮想マシンを作成できない理由はありません。

4
Charles Salvia

良いニュースはcan JavaまたはC#で実行できることです。知っておくべき唯一の問題はhow。基本的に、ハードウェアアーキテクチャに関するこの小さな知識(PCは必要ありませんが、それがエミュレートしたい場合はPlayStationです)を知っておく必要があります。そして、アセンブラのように深く掘り下げる必要があると思いますと機械語。
すべてのALU、レジスタ、MMUなどは、高水準言語で抽象化およびエミュレートできます。低レベルの関数を呼び出してハードウェアサポートを取得することもできます(たとえば、PInvokeとJNAについて学習します)。

しかし、あなたは初心者なので、そのような巨大なタスクから始めることはお勧めしません。 C/C++、Linux(または他のUnixライクなOS、つまりFreeBSD)、コンピュータアーキテクチャ、そしてアセンブラについて少し学ぶことをお勧めします...数年かかるかもしれないので...
本当に必要なのは、動機と忍耐です。

2
Paweł Dyda

高水準言語(Java)を学んだことで私がしたことは、低水準言語とハードウェアについて、あなたと同じようにもっと興味を持つようになりました。最も原始的な状態では、コンピューターは電子機器です。 1と0は、電荷(オンとオフ)の単なる数値です。プロセッサの背後にあるロジックと、算術論理演算ユニットの内部を理解し始めると、物事は実際に起こりました。
私はあなたが勉強を始めるべきだと思いますブール論理(AND、OR、XORなど)のようなもので、次に小さなALUの設計を開始し、メモリとレジスタがどのように機能するかを調べます。その後、いくつかのアセンブリ言語を学び、コンパイルの仕組みを理解します。すぐに高水準言語は退屈に見えるでしょう! :) 冗談だ。すべてがどのように配置されるかは美しいですが、学ぶことは楽しいはずです。好奇心の道を歩み始めると、すぐに物事を拾うでしょう。

2
Trevor Arjeski

C#やJava(または他のほとんどの言語))を使用して低レベルのことを行うことはできますが、ほとんどの人はそうしません。必要な言語機能をカバーしているかもしれませんが、興味のある方法でそれらを適用しているとは限りません。同様に、低レベルのものに関する本はおそらくCで、おそらく少しのアセンブリ言語で書かれています。

ポインター操作を除いて、C自体を学習することは、C#プログラマーにとって難しいことではありませんが、その中で何かを習得するのには時間がかかります。 CはC#よりも表現力の低い言語であるため、C#で効率的に実行する方法を知っているいくつかのことは、Cでは非常に異なった、そしてしばしば不格好な方法で行われる必要があります。

次に探す必要があるのは、学習したい下位レベルの書籍です。たとえば、Linuxカーネルに関する本はありますが、カーネルレベルのプログラミングは、背景がないと理解するのが難しいため、最初にオペレーティングシステムの基礎を勉強することをお勧めします。

2
David Thornley

あなたが知る必要があります、それは使用されたプラットフォーム/言語で低レベルの機能を実行することが可能かどうかです:

  • 変数にバイトを格納し、
  • バイト単位でのファイルの読み取り/書き込み、
  • バイト配列の設定、要素へのアクセス、
  • 真の手続き型機能、OOP、
  • 画面、キーボード、ソケットへのアクセス。

うーん、言語の選択はランダムにすべきだと思います。

1
ern0