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


20

私はプログラミングにやや慣れていないので、この質問に答える最良の方法は例です。

JavaとC#で基本的なことを行う方法を知っています。小さなウィンドウのようなものは、アプリケーションを形成するか、汎用クラスを作成します。私は基本的に学習してきましたが、まだ大きなことをしようとはしていません。とにかく、「フードの下で」物事がどのように行われるかについて、私はいつも興味がありました。

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

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

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

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

言い換えると、WROXのProfessional C#やOReillyのC#のプログラミングのような本を読んだ場合、これらの方法を知っていますか?それとも、アセンブリ言語や、C ++のようなより低レベルのものを学ぶ必要がありますか?


7
「内部」で何が起こっているかを理解するための1つの秘Oneは、段落に焦点を合わせて使用​​することで、読みやすく理解しやすいものにすることです。読みやすくするために、この質問を編集してください。
-S.ロット

1
興味があれば、Charles Petzoldのコード:コンピュータハードウェアとソフトウェアの隠された言語のコピーを手に入れたいかもしれません。良い読み物です。 amazon.com/Code-Language-Computer-Hardware-Software/dp/...
DKnight

@ S.Lott救助へ:
マーティンウィックマン

@Martin Wickman:非常に素晴らしい仕事ですが、@ fender1901が編集したりフォーカスしたりするのに役立ちましたか?
-S.ロット

1
@Martin Wickman:変更を元に戻すことは重要ではありません。他の人にやることによって学ぶように奨励することが私のポイントです。あなたはすでに知っています。@ fender1901は実行することで学習する必要があります。私の質問はこれです:「@ fender1901を編集またはフォーカスするのに役立ちましたか?」どう思いますか?
-S.ロット

回答:


9

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

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

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

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

アセンブリは最近非常に専門化されています。そのレベルで何が起こるかを理解するために、少なくとも簡単なコースを取ることは良いことです。レジスタが空になっている間にレジスタを埋めるためにアセンブリを記述すると、各プログラミング言語層が到達しなければならない種類の長さを理解し始めます。

HTH


中間言語で実際にプログラミングできますか、それとも検査のためにそこにありますか?
fender1901

「バイトコード」ソースコードを書くことができるかどうか尋ねていますか?
Martijn Verburg

おもう。javaやc#と同じように、バイトコードまたはilを使用してコーディングを開始できるかどうか疑問に思っていますか?
fender1901

JavaやC#、非常に少数の人々は、人々のしかし、大規模なセットが特定の上位レベルのコードは、つまるところ何バイトコードを見てください、バイトコードを操作するにしている
マルタインVerburg

4

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

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

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

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


2

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

ただし、初心者なので、このような膨大な作業から始めることはお勧めしません。C / C ++、Linux(または他のUnix系OS、FreeBSDなど)、コンピューターアーキテクチャ、アセンブラーについて少し学ぶことをお勧めします。数年かかる可能
性があります。動機と忍耐。


2

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


2

C#またはJava(または他のほとんどの言語)で低レベルのものを実行できますが、ほとんどの人はできません。したがって、どちらを選んでも合理的に人気のある本は、低レベルのものを除外します。彼らはあなたが必要とする言語機能をカバーする可能性が高いですが、あなたが興味を持っている方法でそれらを適用しないでください。同様に、低レベルのものに関する本はおそらくCで、おそらく小さなアセンブリ言語で書かれています。

C#プログラマーにとって、C自体の学習は、ポインター操作を除いて難しくはありませんが、C#で学習するのに時間がかかります。CはC#よりも表現力の低い言語であるため、C#で効率的に行う方法を知っているいくつかのことは、Cではるかに異なる、多くの場合不器用な方法で行う必要があります。

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


私の現在の最大の問題は、これらのトピックの多くは、背景がわからないために把握するのが難しいことだと思います。私はそれらの地域への橋が必要だと思います。
fender1901

@ fender1901:それが問題になる可能性があります。Linuxカーネルは、オペレーティングシステムが何をするのか理解していない人には本当に奇妙に見えることをします。あなたが言及したものの中で、エミュレータはおそらく最も理解しやすいでしょう、そして初期のマイクロコンピュータのためにしばしばそこに簡単なエミュレータがあります。
デビッドソーンリー

1

使用するプラットフォーム/言語で低レベル機能を実行できるかどうかを確認する必要があります。

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

ええと、言語の選択はランダムでなければならないようです。


-2

質問にはいくつかの答えがあります。1. JavaとC#は、メモリを管理する既存のオペレーティングシステムでのアプリケーション開発用に開発された高レベル言語です(これにより、異なるシステムで実行できるハイブリッドプログラムを作成できます)。2.低レベルプログラミングが必要な領域は、OS開発、ドライバー開発、AAAゲーム開発などです。通常、低レベルプログラミングはJavaまたはC#では行われず、C / C ++およびアセンブリ言語を使用して実行されます。

この2点だけで、低レベルプログラミングは個別に行われ、高レベルプログラミングでは低レベルプログラミングの必要はないと言えます。I / Oなどの低プログラミングが必要な部分は、低レベル言語で記述されたインタープリターによって実行されます(たとえば、JavaのJVMはCで記述されています)。

あなたの質問の主な答えは、このことはJavaとC#を使用して開発されていないことです。このことはCとアセンブリで行われますので、JavaとC#でそれを行う方法を見つけるのではなく、Cとアセンブリを学ぶのを手伝う必要がありますプログラミングとはい、大きな利点は、低レベルで書かれたプログラムが小さくて高速であることです。


これは作られたポイントを超える大幅な提供の何にも思えるし、数年前に投稿した以前の6つの回答で説明していません
ブヨ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.