2017-02-12 7 views
-1

私はコンピュータサイエンスとプログラミングについて学んだので、より高いパフォーマンスを得るために、CやMIPSのような低レベルの言語でコード化し、移植性を高め、より高いレベルの言語を獲得し、 JavaやPerlのようなものです。コンパイラは人間よりも優れたアセンブリコードを生成しますか?

しかし、これはコンパイラが素朴なアセンブリを作成した70年代に当てはまりました。そのため、熟練した人間のコーダが最も効果的でした。現代のコンパイラがマスターアセンブリコーダに似たコードを生成する今日はどうでしょうか?

コンパイラがはるかに優れている場合、MIPSのようなアセンブリを学ぶ価値はありますか?なぜ、厄介でエラーを起こしやすいアセンブリ言語で書くのに時間がかかるのですか?

+2

開発するプラットフォームによって異なります。リソースが限られているデバイスに埋め込みコードを書き込む場合は、実際にコンパイルされた言語で開発する場合でも、低レベルのプログラミングを知る必要があります。すべてのバイトがカウントに使用された時に、あなたは戻ってきます。 –

+1

人間の種類によって、アグナー・フォッグがそれを行うことができます。しかし、それを何度も何度も何度もやり、1日に複数回、すべての詳細に注意を払うことは、人間がいつも目をつけているところです。そうでなければ、決して貧しくない知識の種類です。 –

+0

コンパイラは自動的に人間より優れているとは言えません。あなたが使うことができるからです。最悪の場合、あなたはそれを打ち負かす方法を見つけられないかもしれません。 – harold

答えて

2

コンパイラは人間によって作成され、定義することによって、それらを作る人間より優れているわけではありません。一般に、コンパイラは人間のパフォーマンスを上回ることはできません。彼らは多くの人間よりも優れていますが、人間ではありません。私たちの多くは、プロジェクトのサイズに応じて、コンパイラの出力を調べて少なくとも一部を改善することができます。

ほとんどのコンパイラはシステムを理解していませんが、一般的に教えられているかもしれませんが、メモリを使用するかどうかの選択を知るためにシステムを自動的に知っているわけではありません。システムなど

コンパイラができることは疲れていないし、一貫性があり、人間に対して非常に速いです。だから、どんなサイズのプロジェクトでも、コンパイラは大したものではありません。

注:Cについては何も低レベルではなく、JAVAやPerlのいずれもパフォーマンスという意味では意味がありません。パフォーマンスの問題があっても、高低のためではなく、設計によって遅く、目標が異なり、特に携帯性があるため、使用する選択肢は決してありません。早い段階でCの目標にもかかわらず、C以上。 JAVAはやや誇らしげにそれが最適化されていないと述べており、それに基づいて仮想マシンスタックに設定された仮想命令です。だからそれはすべて遅いです。 Pascalは、このパフォーマンスの文脈では、ADAという別の選択肢でした。後者の2つはやや剛直でコンパイルが容易でCよりもコードがコンパクトであるため、Cよりも低いレベルになります。

たとえば、アセンブリ言語MIPSやARMなどを学ぶことが最大の関心事です。あなたは、例えばあなた自身の質問に対する答えを知っているでしょう。

コメントに記載されているように、これが尋ねられたたびに(なぜこの最後の数十の質問と答えを読んでいないのですか?)、コンパイラには重労働をさせてください。パフォーマンスの低いセクションでコンパイラの出力を取り出し、改善するか、必要に応じて置き換えます。はい、砂の紙だけを使って彫刻を「彫刻」することはできますが、80〜90%の作業で彫刻とハンマーを使用し、そこから砂を採掘することができるときにはそれは価値がありますか?あなたがその出力(アセンブリ言語)を読む方法を知らないなら、あなたは気にしない、コンパイラの使い方を知らないかぎり、プログラミングの場合はまったく砂にする必要はまれです。

これだけでなく、これが尋ねられた回数だけでなく、「なぜコンパイラはこれを行うのですか」という質問をして、最適な解決策であるかもしれない場所を指摘しています。多くの、確かになぜmain()上のスタックは、パフォーマンスの質問ではないです。

もう1つの問題はパフォーマンスの定義です。 x86ターゲットでは、プロセッサとマザーボードが多すぎます。特定の周辺機器で特定のメモリを持つ特定のマザーボード上の特定のチップをチューニングする場合は、そのシステムにとっては魅力的かもしれませんが、他の同様のx86システムの方が遅くなります。 ARMと同じ問題ですが、違います。ベンチマークは操作が簡単なので偽物なので、この道を進む前に自分のパフォーマンスを定義する必要があります。そして、それを行うためにコンパイラを得ようとしてから、出力を調べて、それを改善できるかどうかを決定してください。

いいえ、コンパイラは人間によって作られており、人間よりもスマートではありません。彼らはより一貫性があり、確かにはるかに高速ですが、より一貫しています。

+1

「JAVAは誇らしげにそれが最適化されないと言っています」 - うわー、それは強い声明です。そして、「それはすべて遅いです」とのあなたの結論は間違っています:Javaコンパイラは理由のために最適化しません。JITは、実行時に、実行時に、実際に作成する*シンプル*バイトコードを生成します。センス。 – JimmyB

+0

私は一般的にマシンコードへの最適化をやめて、プロセッサは実行時に最適化を行うべきだと思いますか?そのような場合でも、JAVAの場合でも意味がありません。実行時には遅すぎて遅すぎます.JAVAバイトコードは命令セットであり、命令セットにコンパイルするときに最適化しない理由はありません。 –

+0

実行時の最適化がより良い解決策であった場合、これを標準としているオペレーティングシステムが見えますが、実行時ではなくコンパイル時にデッドコードやその他の改善が見られません。では、なぜ命令セットが特別なのでしょうか?それはない。 –

関連する問題