アセンブリーよりもCを使用することの利点/欠点は何ですか?[閉まっている]


15

現在、電気通信および電子工学の工学を勉強しており、マイクロプロセッサプログラミングでアセンブラからCに移行しました。これが良い考えだとは思わない。アセンブリと比較したCの長所と短所は何ですか?

私が見る利点/欠点は次のとおりです。

利点:

  • C構文は、アセンブラー構文よりもはるかに簡単に学ぶことができます。
  • Cはより複雑なプログラムを作成するのに使いやすいです。
  • Cを学習することは、アセンブラーを学習することよりも生産性が高いため、アセンブラーよりもCの周辺に開発物が多くあります。

短所:

  • アセンブラはCよりも低レベルのプログラミング言語であるため、ハードウェアへの直接プログラミングに適しています。
  • メモリ、割り込み、マイクロレジスタなどを操作することを示唆しているはるかに柔軟です。

17
ええと...新世紀へようこそ。ここで気に入るはずです。.NETJavaLinuxを実行するマイクロコントローラーがあり、Pythonを使用してPICをプログラムする人もいます。
ZJR

@ZJRどのようにPythonを使用してPICをプログラミングしますか?どの絵?
明らかに

2
@detly本格的なpythonではなく、コアのサブセットです。必要に応じて、コントローラー機能を覆うPython構文のコートpyastraは私がグーグルアウトした最初の例ですが、別のドキュメントを読んだことを覚えています。それはATMELも行いました。
ZJR

4
正直に言うと、最新のプロセッサの複雑さにより、多くのプログラマーが最新のCコンパイラーが生成できるよりもタイトで効率的なアセンブラーを書くことができたら驚くでしょう。私はプログラムしようとする憎むEPICアーキテクチャのインスタンスのアセンブラでCPUを- メルは右と一緒に家になりItaniumベース。* 8 ')
マークブース

5
@ZJRこの新しい世紀は刺激的です!しかし、これらのマイクロコントローラー用の.NETランタイム、Java VM、およびLinuxは、どの言語で書かれているのでしょうか?同様に、実際のマイクロコントローラーのプログラミングはどの言語で行われましたか?ああ... Cまたは今世紀も

回答:


17

役立つ可能性のあるスタックオーバーフローの回答を次に示します(これらがトップの回答であり、受け入れられている回答です)。

長所

/programming/143561/is-there-a-need-to-use-assembly-these-days(10Kユーザーのみ)、またはアーカイブ

  • アセンブリは、ブートローダーの初期段階で使用されます。CPUがスタックの電源をオンにできない場合、Cコンパイラがスタックに物を保存しようとするのを防ぐのは困難です。それにもかかわらず、初期の初期化が完了すると、ブートローダーの大部分はCで記述されます。
  • アセンブリは、相互排他ロックプリミティブを記述するために使用されます。Cコンパイラに必要な場所でメモリバリア命令を発行させることは本質的に不可能です。
  • memset()やmemcpy()などのルーチンは、多くの場合、アセンブリで実行されます。たとえば、大きなアンロールループを使用してmemset()を作成しました。このループは、分岐アドレスを動的に計算して、1回の最終反復でループの中間にジャンプします。ACルーチンはより多くのコードを生成し、余分なI $ミスが発生します。同様に、CPU命令セットには、Cコンパイラが利用しないmemcpy()を劇的に高速化できるキャッシュラインロードまたはその他の命令が含まれていることがよくあります。

欠点

/programming/2684364/why-arent-programs-written-in-assembly-more-often

  • ASMの可読性は低く、高レベルの言語と比較して実際にはメンテナンスできません。
  • また、Cなどの他の一般的な言語に比べて、ASM開発者がはるかに少なくなっています。
  • さらに、より高いレベルの言語を使用し、新しいASM命令(たとえばSSE)が使用可能になった場合、コンパイラを更新するだけで、古いコードで新しい命令を簡単に使用できます。

以下の最後の投稿は、シナリオの概要を説明するStack Overflow投稿です。この投稿では、Cよりも高速なアセンブリの例を示します(同じ機能を実行する場合)。

/programming/577554/when-is-assembler-faster-than-c


20
  • Cは、アセンブリに比べてプログラミングが簡単です。再ハッシュする価値のない明らかな理由があります。

  • Cは使いやすいため、プログラムをより速く書くことができます。一般に、これらのプログラムはデバッグも保守も簡単です。さらに、Cで大規模で複雑なプログラムを管理するのが簡単です。

  • 多くの場合、コンパイラによって生成されたコードは、手書きのアセンブラと同じくらい(速度と効率の点で)優れています-良くない場合。

  • Cはかなり低レベルであり、もっと低くしたいことはめったにありません。追加された抽象化レイヤーを持つことはめったに悪いことではありません。

  • 低くする必要がある場合は、アセンブリを使用できます。それ以外の場合は、Cを使用できます。

  • アセンブリはCコードで記述できますが、アセンブリコードではCを記述できません。


6
Cコンパイラに最適化されたマシンコードは、手書きのアセンブリコードよりも優れていることがあります。
ユーザー

@crucified-これは90年代半ばから後半にかけてすでに一般的な(そして通常正当化される)主張でした。コンパイラは、機会に気付いたときだけでなく、最適化を確実かつ体系的に適用します。
Steve314

15

ACプログラムは、さまざまなマイクロプロセッサアーキテクチャにコンパイルできます。


4

マイクロプロセッサプログラミングでアセンブラからCに移行しました。これはいい考えだと思う

恐れるな、100%アセンブラーで新しいプログラムを開発する人はもういません。最近では、Cは、最も小さくてくだらない8ビットアーキテクチャでも使用できます。ただし、アセンブラーを知っていると、非常に優れたCプログラマーになります。また、アセンブラーで作成する必要があるプログラムには、常に1つまたは2つの小さな詳細があります。

C構文は、アセンブラー構文よりもはるかに簡単に学ぶことができます。

はい、確かに構文は簡単です。ただし、迷惑な詳細をすべて使用してC言語全体を学習することは、特定のアセンブラーのすべての詳細を学習するよりもはるかに複雑です。Cははるかに大きくて広い言語です。しかし、もう一度、すべての詳細を学ぶ必要はないかもしれません。

Cはより複雑なプログラムを作成するのに使いやすいです。

実際、Cは、カプセル化やローカルスコープ/ローカル変数など、モジュールプログラム設計のメカニズムを提供します。また、Cには標準ライブラリと、過去30年間に書かれた膨大な量のリソースがあります。そして最も重要なことは、Cは移植性があるということです。

Cを学習することは、アセンブラーを学習することよりも生産性が高いため、アセンブラーよりもCの周辺に開発物が多くあります。

Cには、事前に作成された機能、ライブラリ、およびリソースがたくさんあるため、車輪の再発明が少なくなります。しかし、それとは別に、あなたの声明は主観的です。個人的な好みの問題だと思います。

たとえば、私は経験豊富なCプログラマであり、C ++をときどきプログラミングしています。私はC ++での生産性がはるかに低いと感じています。なぜなら、その言語もCも知っていないからです。しかし、そのように感じるからといって、必ずしもCでのプログラミングがC ++でのプログラミングより生産的であることを意味するわけではありません。経験豊富なC ++プログラマーは、間違いなく反対の意見を持つでしょう。

そして、「生産的」には多くの側面があります。非常に重要な側面は、メンテナンス時間、特にメンテナンスによって引き起こされるバグの修正にかかる時間です。Cは、アセンブラよりも保守がはるかに簡単です。

アセンブラはCよりも低レベルのプログラミング言語であるため、ハードウェアへの直接プログラミングに適しています。

ハードウェアプログラミングは、どちらの言語でも直接実行できます。Cでできないことは、CPUコア自体のスタックポインターや条件レジスタなどにアクセスすることだけです。したがって、ハードウェアプログラミングで自分のCPUと話すことを意味する場合、はい、アセンブラーはCより少し多く許可します。外部ハードウェアにアクセスすることを意味する場合、アセンブラーはCよりも利点がありません。特定の外部デバイス用の汎用アセンブラコード、汎用Cコード。

メモリ、割り込み、マイクロレジスタなどを操作することを示唆しているはるかに柔軟です。

これは正しくありません。Cでは、これらすべてを行うこともできますが、interruptキーワードなどのコンパイラ固有のCコードに依存する必要がある場合があります。


最後に、Cを重視してMCUをプログラミングするには両方の言語を知っている必要があります。


C言語全体は、より難解な機械言語のいくつかよりもどのように複雑ですか?両方を行ったので、ライブラリのないCはかなり複雑ではないと思います。C標準ライブラリを参照している場合、有用なことを行うには、アセンブラでもそのようなものが必要です。Cはより大きくより広い言語かもしれませんが、同じ詳細レベルでそれを知る必要はありません。 a = b[i] + c;ロードb[i](計算cが必要)およびレジスタ(使用可能にする必要があります)にロード、追加、および保存する命令よりも複雑ではありません。
デビッド

1
@DavidThornley Cについて学べば学ぶほど、Cの複雑さを実感できます。何百もの未定義/未指定/実装定義の動作を知っていますか?すべての暗黙的な型昇格規則(整数昇格、通常の算術変換)を詳しく知っていますか?型指定子に関するすべての固有のルールと構文は?配列ポインター(配列の最初の要素へのポインターと混同しないように)を含む静的/動的多次元配列のすべてのさまざまな形式C99およびC11のすべての機能 等々。

1
@Lundin:Cで重要なことは、これらの質問をすべて尋ねて具体的な答えを見つけることができるということです。標準に準拠するコンパイラーは、62の(「数百」ではなく)実装定義の動作に対する動作を文書化する必要があります。Assemblyのシンプルさは、昼食の持ち込みを可能にし、Cが処理する複雑さを自分のコードに負担をかけないようにします。特定のアーキテクチャ向けにアセンブリで記述された浮動小数点ライブラリの数と、その動作が実装定義である理由を尋ねることで、あなたの議論に反論することができました。
Blrfl

1
@Lundin:62は、GCCマニュアルのセクション4にリストされているコンパイラ定義の動作の数です。アセンブリ用の標準ライブラリがないため、ライブラリで定義されたものを除外すると、リンゴ同士の比較になります。文書化の要件は、§J.3の最初の文です。GCCと、C89が批准されて以来購入または使用したいくつかの商用コンパイラ(Intel、Sun、IBM、Portland Group)のドキュメントです。標準といえば、Intel構文で書かれたx86をAT&T構文のアセンブラーでどのように組み立てますか?
Blrfl

1
@Lundin:私の車は素晴らしい、ありがとう。ステアリングホイール、アクセル、ブレーキ、クラッチ、ターンシグナルストークはすべて標準の場所にあり、標準の動作を持ち、他のコントロールはすべてISO標準シンボルで明確にマークされています。エンターテインメントシステム、HVAC、ナビゲーション、クルーズコントロールなど、実装で定義されたものはすべて、グローブコンパートメントのファットブックに記載されています。アセンブリは、1973年のプリマスのようなものです。それほど多くはありませんでしたが、生の形式では、現在運転しているものほど近くにはありませんでした。アセンブリも同じ方法です。追加するものに複雑さが伴います。
Blrfl

1

埋め込みの必要性に応じて、Cは大きくて遅いプログラムを作成します。これにより、製品のその部分のコストが著しく増加します。製品全体が海に落ちたり、製品が根本的に変わる可能性があります。はい、ソフトウェアの開発とメンテナンスの努力はより安価であると言うかもしれませんが、それは深く埋め込まれ、低電力、小さく、安価な部分を目指している場合、多くのコードについて話していない場合、真または偽である可能性があります。そのコードは、そのベンダーまたはその特定のチップにほとんど固有であるため、Cに移植しても移植性のメリットはありません。とにかく各ターゲットを書き直す必要があります。ARMのcortex-mシリーズでは、Cをasmと競合させることができるようになりました。組み込み製品でCやその他の高レベル言語を使用していた人たちではなく、

C対ASMの議論は、専門的には、最終的にはCで記述し、正当化できる場所でASMを使用することです。そして、あなたはそれを正当化することができます。組み込みの世界にはパフォーマンスとサイズがあります。

このディスカッションにターゲットを含める必要があります。多くはCをMicrochip(mipsであるpic32ではなく、古い写真)で莫大なコストで使用しましたが、コンパイラーにとっては恐ろしい命令セットであり、非常に教育的で興味深い命令セットですが、コンパイラーは使いにくいです。msp430、avr、arm、thumb、mips、すべてコンパイラーに適しています。8051も悪い。

言語のツールよりもさらに。特にコードの開発と管理を心配することが論議されるような場合には、今日と明日にツールが必要です。1つのグループで管理されている単一のgcc modを含む単一のソースツールを持つことは、ビジネスの観点からは危険です。複数のアセンブラーを見つける可能性が高く、そのチームの一員にふさわしい人なら誰でも週末にアセンブラーを作成することができます(作成するアセンブリーがギーウィズディレクティブでなく、マクロに満足している限り)。asmとCの両方で、10年前のLinuxディストリビューションを実行するために仮想マシンを使用することを意味する場合でも、より良いチャンスが得られるオープンソースツール(または社内ツール)を使用します。製品の寿命。

一番下の行も、Cとasmの両方​​を使用/学習/教育し、Cから始めて、正当化できる場所でasmを使用します。


これらの議論は時代遅れに聞こえます。過去10年間に作成された最新のコンパイラを使用している場合、Cプログラムよりもはるかに効果的なアセンブラプログラムを作成するのに苦労すると思います。おそらく、PICや8051のような30年前の恐竜アーキテクチャを使用している場合を

最新のgccとllvmによって生成される遅いアセンブリを修正するのは非常に簡単です。4.x gccは、3.xシリーズよりも低速で効率の悪いコードを生成します(一部のターゲットでは、少なくともARMを評価したものなど)。コンパイラーは人間よりも優れているという概念を否定することが重要だと思います。そして、たとえそれが行われたとしても、人間が彼らが何をしているかを知っているときだけそれをします。効果的に使用したい場合は、「ツールを知ってください」。Cから始めて、必要に応じてASMを使用します(正当化できる場合)
-old_timer

gccはオープンソースであるため、奇妙な獣です。たぶんその特定のポートは不完全に作られています。すべてのコードの最適化は特定のプラットフォームに対して行う必要がありますが、これは簡単な作業ではありません。手動アセンブラーとそのプラットフォームの市販コンパイラーのパフォーマンスを比較する方がより公平です。

gccはマルチターゲットであるため、平均的にはかなり良い仕事をしますが、特定のターゲットにとっては素晴らしい仕事ではありません。そしてそれが期待されていることです。しかし、過去10年など、最新のコンパイラについてのあなたの意見は当てはまりません。コンパイラは、コードが生成される限り改善されていません。最新のコンパイラは可能な限り最高のコードを作成するという概念は、単に間違っています。平均して、ハンドコーディングされたアセンブラよりもはるかに優れており、asmで適切なサイズのプロジェクトをCよりも優れたものにするのは難しいことです
old_timer

ほとんどの人は、問題が発生するまでCを使用し、正当化できる場合はasmで問題を手動で修復すると言う理由です。あなたは本当にそのパフォーマンスの少しの向上が必要ですか、それは本当にあなたのパフォーマンスの問題がある場所です、あなたはasmを使ってこのコードを維持したいですか許容レベルなどに
old_timer

1

アセンブリには、コードの保守性とパフォーマンスの間に避けられない妥協があります。アセンブリを読みやすく、保守しやすいように記述したり、高度に最適化されたコードを記述したりできます。しかし、両方を行うことはできません。

Cの場合、妥協点は完全に消えることはありませんが、それほど目立ちません。合理的に十分に最適化されたCを読みやすく、維持しやすいように書くことができます。

優れたアセンブリ言語プログラマーは、ほとんど常にコンパイラーを破ることができますが、ほとんどの場合、代わりに読みやすいコードを保守することを意図的に選択します。そのため、ほとんどの場合、優れたアセンブリ言語プログラマーはコンパイラーにbeatられます。

スマートな方法は、アセンブリとCの両方を使用することです(アセンブリのみまたはCのみではなく)。たとえば、優れたアセンブリ言語プログラマーが保守可能/遅いコードを記述し、残り(「高度に最適化され、保守が難しい」が実際に正当化される場合)。


-3
  1. プログラミング効率に比較的適しています。
  2. アセンブリを使用するのではなく、c言語を使用してプログラムするのは簡単です。
  3. C言語は、アセンブリ言語よりもかなり高速です。
  4. Cコードでアセンブリを記述することはできますが、アセンブリコードでCを記述することはできません。

3
利点のみ..
キランSapkale 14

3
これは主に、アセンブリよりもCを使用することの長所/短所は何ですか?; ここでの議論には何も追加していません。
マーティンピーターズ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.