HN 日本語サマリー

← 一覧へ戻る
プログラミング

SDCC – Small Device C Compiler

SDCC – Small Device C Compiler (sdcc.sourceforge.net)

121 pointsby lioeters29 コメント

要約

SDCC(Small Device C Compiler)は、Intel MCS51、Zilog Z80、Microchip PIC、STMicroelectronics STM8など、多様なマイクロコントローラーをターゲットとする、リターゲット可能で最適化された標準C(ANSI C89、ISO C99、ISO C11、ISO C23)コンパイラスイートである。アセンブラ、リンカ、プリプロセサ、シミュレータ、デバッガなどを含む複数のコンポーネントから構成され、GPLライセンス下で提供されている。最近のリリースでは、C23規格への対応強化や、Rabbit 4000/5000/6000、f8lなどの新しいターゲットへの実験的な対応が進められている。また、プロジェクトは外部からの資金提供を受け、Padauk、Rabbit、Toshiba TLCSマイクロコントローラーのサポート改善、最新ISO C規格への対応強化、リンク時最適化などの開発を進めている。

全文翻訳

SDCC - Small Device C Compiler

SDCCとは?

SDCCは、リターゲット可能で最適化を行う標準C(ANSI C89、ISO C99、ISO C11、ISO C23)コンパイラスイートであり、Intel MCS51ベースのマイクロプロセッサ(8031、8032、8051、8052など)、Maxim(旧Dallas)DS80C390バリアント、Freescale(旧Motorola)HC08ベース(hc08、s08)、Zilog Z80ベースMCU(Z80、Z80N、Z180、SM83、Rabbit 2000、2000A、3000A、4000、SM83、TLCS-90、eZ80、R800)、Padauk(pdk14、pdk15)、STMicroelectronics STM8、MOS 6502、WDC 65C02をターゲットとしています。Rabbit 5000、6000、Padauk pdk13、f8およびf8lターゲットのサポート作業が進められており、Microchip PIC16およびPIC18ターゲットはメンテナンスされていません。SDCCは他のマイクロプロセッサ向けにもリターゲット可能です。

SDCCスイートは、異なるFOSSライセンスを持つ様々なソースから派生した複数のコンポーネントの集合です。SDCCコンパイラスイートには以下が含まれます:

  • sdasおよびsdld:Alan Baldwinが(GPLライセンスで)書いた、リターゲット可能アセンブラおよびリンカ。
  • sdcpp:GCC cppをベースにしたプリプロセッサ(GPLライセンス)。
  • ucsim:Daniel Drotosが(GPLライセンスで)書いたシミュレータ。
  • sdcdb:Sandeep Duttaが(GPLライセンスで)書いたソースレベルデバッガ。
  • sdbinutils:GNU Binutilsから派生したライブラリアーカイブユーティリティ(sdar、sdranlib、sdnm)(GPLライセンス)。
  • SDCC実行時ライブラリ(GPL+LE)。Picデバイスライブラリおよびヘッダーファイルは、Microchipのヘッダー(.inc)およびリンカスクリプト(.lkr)ファイルから派生しています。Microchipは「ヘッダーファイルは、Authentic Microchipデバイスでのみ使用されることを明記する必要がある」と要求しており、これはGPLとの非互換性を生じさせます。
  • gcc-test:gcc-testsuiteから派生した回帰テスト(ライセンスは明示されていませんが、GCCの一部であるため、おそらくGPLライセンス)。
  • packihx(パブリックドメイン)。
  • makebin(zlib/libpngライセンス)。
  • sdcc:Sandeep Duttaが(GPLライセンスで)書いたCコンパイラ。その機能には以下が含まれます:
    • 基盤となるハードウェアを効果的に使用できる、広範なMCU固有の言語拡張機能。
    • グローバル副式除去、ループ最適化(ループ不変、誘導変数強度削減、ループ反転)、定数畳み込みおよび伝播、コピー伝播、デッドコード除去、switch文用のジャンプテーブルなどの標準的な最適化機能。
    • グローバルレジスタアロケータを含むMCU固有の最適化。
    • 他の8ビットMCUに適した、適応可能なMCU固有のバックエンド。
    • 独立したルールベースのピープホールオプティマイザ。
    • char(8ビット、1バイト)、short(16ビット、2バイト)、int(16ビット、2バイト)、long(32ビット、4バイト)、long long(64ビット、8バイト)、float(4バイトIEEE)、_Bool/bool、_BitIntといった、完全なデータ型範囲。
    • 関数内の任意の場所にインラインアセンブラコードを追加できる機能。
    • 関数をアセンブラで書き直すべきかどうかを判断するのに役立つ、関数の複雑性に関するレポートを生成する機能。
    • 自動化された回帰テストの優れたセレクション。

SDCCは元々Sandeep Duttaによって書かれ、GPLライセンスでリリースされました。初期リリース以降、数多くのバグ修正と改善が行われてきました。1999年12月以降、コードはSourceForgeに移管され、すべての「ユーザー兼開発者」が同じソースツリーにアクセスできるようになりました。SDCCは、ユーザーと開発者のすべてのインプットにより、常に更新されています。

ニュース

2026-06-22: SDCC 4.6.0リリース。

STM8、MCS-51、DS390、HC08、S08、Z80、Z180、Rabbit、R800、SM83、eZ80(Z80モード)、Z80N、TLCS-90、MOS 6502、WDC 65C02、Padauk、PICマイクロプロセッサ向けのポータブル最適化コンパイラであるSDCCの新しいリリースが利用可能になりました。(http://sdcc.sourceforge.net)。GNU/Linux amd64、Windows x86およびamd64、macOS amd64向けのソース、ドキュメント、バイナリが利用可能です。

SDCC 4.6.0新機能リスト:

  • C2y _Countof演算子
  • C2y 八進数
  • C2y if-declaration
  • C2y 条件演算子(第2オペランド省略、元々はGNU拡張)
  • C99複合リテラル
  • C23ストレージクラス指定子付き複合リテラル
  • 実験的なf8lポート
  • C2y 幅1の符号付きビット精度整数型
  • C2y ビット精度整数型(enumの固定基底型として)
  • C2y umaxabs
  • C2y ビットユーティリティ
  • realloc(ptr, 0)がC90セマンティクスではなくC99セマンティクスに従うようになりました。
  • Rabbit 4000向けr4kポート
  • Rabbit 5000および6000向け実験的なr5kおよびr6kポート
  • z80関連ポートでのDynamic C呼び出し規約のサポート
  • z80関連ポートのコード生成の大幅な改善
  • ez80ポートがez80_z80ポートに置き換わりました。
  • C2y関数uabs、ulabs、ullabs
  • 無効なC2y(C23までUBだったものも含む)に関する診断の改善
  • C23 constexpr(大部分)
  • C2y containerofマクロ
  • [static assignment-expression]配列パラメータ構文に基づく診断
  • 配列境界外アクセスが発生する配列パラメータの警告
  • 基本的なパラメータ前方宣言(GNU拡張)
  • C23 va_startと可変引数関数
  • _Optional修飾子
  • プレーンなintビットフィールドは符号付きになります。
  • strsep
  • ucsimでのTLCS-870C(1)サポート
  • Rabbitポートでの__farサポート(1MBアドレス空間をデータに使用)

2026-06-14: SDCC 4.6.0 RC2リリース。

amd64 GNU/Linux、amd64 Windows、amd64 macOS向けのSDCC 4.6.0 Release Candidate 2ソース、ドキュメント、バイナリパッケージが、以下の場所の対応するフォルダで利用可能です:http://sourceforge.net/projects/sdcc/files/

2026-05-28: SDCC 4.6.0 RC1リリース。

amd64 GNU/Linux、amd64 Windows、amd64 macOS向けのSDCC 4.6.0 Release Candidate 1ソース、ドキュメント、バイナリパッケージが、以下の場所の対応するフォルダで利用可能です:http://sourceforge.net/projects/sdcc/files/

2025-10-15: SDCCが資金提供を受けました。

SDCCは主に無給のボランティア作業によって開発されています。時折、大学職員が有給時間中にSDCCに時間を割くことを許可されたり、マイクロコントローラベンダーからSDCC開発者がハードウェアサンプルを受け取ったりするなど、外部からの支援もありました。
しかし、この方法の限界を感じることもあります。特に、SDCCに取り組むための数時間があっても、機能やバグの作業を開始したものの、その時間内に完了できなかったり、バグの原因を完全に特定することすらできなかったりすることがあります。そして、その機能やバグに再び取り組むまでに長い時間がかかると、追加の時間や労力が必要になります。代わりに、SDCCの別の側面に作業を開始することもありました。SDCC作業のための資金提供は、このような状況で非常に役立つと考えられます。SDCC作業を停止して他の有給の仕事に戻る代わりに、この作業が有給となるため、機能やバグの作業を続けることができます。SDCC開発者はSDCCプロジェクトの資金提供を申請しており、最近2つの重要な申請が成功したことを発表できることを嬉しく思います。

NGI0 Commons Fundは、様々なターゲットハードウェアのSDCCサポートの改善、および非商用コンパイラとの競争力を高めるためのマシン非依存の改善の実装に寄付しています。ハードウェア固有の改善には、Padaukの人気のある低コストマイクロコントローラサポートの改善、古いIoTデバイスで一般的なRabbitマイクロコントローラサポートの改善、Toshiba TLCSマイクロコントローラサポートの改善が含まれます。マシン非依存の改善の焦点は、最新のISO C標準のサポート強化、ローカル変数のメモリ使用量を削減する最適化、および未使用の関数やオブジェクトを最適化するリンク時最適化の実装に置かれます。後者は近年SDCCユーザーから最も要望の多い機能です。このプロジェクトは5人のSDCC開発者が共同で行います。

Sovereign Tech Fundは、組み込みファームウェアの安全性とセキュリティのためのSDCCの改善に関する作業を委託しました。安全性とセキュリティに関連する最新のC標準および方言の側面へのサポートを改善し、SDCCをポスト量子暗号化に対応させ、潜在的なサイドチャネル攻撃の緩和策に取り組み、あまり使用されないコマンドラインパラメータの組み合わせもカバーする拡張テストを通じてSDCCの信頼性を向上させます。このプロジェクトは1人のSDCC開発者が行います。

これらが組み合わさる例として、eZ80またはRabbit 4000 SoCをベースにしたIoTデバイスのファームウェアを作成する場合が考えられます。このファームウェアを作成するSDCCユーザーは、ターゲットアーキテクチャのサポート改善、効率性と利便性のための最新C機能(すべてNGI0 Commonsプロジェクトの一部)、安全性とセキュリティに関連する最新C機能(ユーザー作成コードのバグ回避を支援)、最新暗号化アルゴリズムのための効率的なサイドチャネルフリーコード(すべてSTFプロジェクトの一部)から恩恵を受けるでしょう。そして、テストの改善とコンパイラバグの修正のおかげで、ファームウェアは非常に確実にコンパイルされ、動作するでしょう(詳細によってはSTFまたはNGI0プロジェクトの一部)。

2025年1月28日: SDCC 4.5.0リリース。

STM8、MCS-51、DS390、HC08、S08、Z80、Z180、Rabbit、R800、SM83、eZ80(Z80モード)、Z80N、TLCS-90、MOS 6502、WDC 65C02、Padauk、PICマイクロプロセッサ向けのポータブル最適化コンパイラであるSDCCの新しいリリースが利用可能になりました。(http://sdcc.sourceforge.net)。GNU/Linux amd64、Windows x86およびamd64、macOS amd64向けのソース、ドキュメント、バイナリが利用可能です。

SDCC 4.5.0新機能リスト:

  • msc51およびds390ポート向けの完全なatomic_flagサポート
  • 実験的なf8ポート
  • ISO C2yケース範囲式
  • ISO C2y _Generic選択式(型オペランド付き)
  • K&Rスタイルの関数構文(予備的に非K&R ISOスタイルの関数セマンティクスで)
  • ISO C23ユーザー指定基底型付きenum
  • 初期化子内のstruct / union

以前のニュース

サポートされているプラットフォームは?

GNU/Linux on amd64、GNU/Linux on x86、Microsoft Windows on amd64、およびmacOS on amd64が、主要な「公式サポート」プラットフォームです。

SDCCはGNU/LinuxおよびmacOS上でgccを使用してネイティブにコンパイルされます。Windowsのリリースおよびスナップショットビルドは、Linuxホスト上でmingw32へのクロスコンパイルによって作成されます。

SDCCは、少なくともaarch64上のGNU/Linux、ppc64上のGNU/Linux、aarch64上のFreeBSDでも動作することが知られています。

Windowsユーザーは、Cygwin(https://www.cygwin.com/)を試すか、サポートされていないMicrosoft Visual C++ビルドスクリプトを試すこともできます。

SDCCのダウンロード

最新リリースバージョン(Linux - amd64、Microsoft Windows - x86、Microsoft Windows - amd64、Mac OS X - ppcおよびamd64向けのソースおよびバイナリパッケージを含む)については、Sourceforgeダウンロードページを参照してください。

主要なLinuxディストリビューションはSDCCインストールパッケージを独自に管理しており、それらのリポジトリで見つけることができます。残念ながら、Linuxディストリビューションに含まれるSDCCパッケージはしばしば古いものです。この場合、ユーザーは最新の公式SDCCリリースまたは最近のスナップショットビルドを自分でコンパイルするか、Sourceforgeダウンロードページから事前コンパイル済みのバイナリをダウンロードすることが推奨されます。

さらに、SDCCは任意のモダンなUnixライクOS上でコンパイルできるはずです。以下のOSは、リリースパッケージと同様に、自動回帰テストに含まれています:

  • Linux - x86
  • FreeBSD - aarch64

SDCCは常に活発に開発されています。バグを見つけた場合、または上記のリリースが2ヶ月以上前のものである場合は、スナップショットビルドのいずれかをダウンロードすることを検討してください。

最新の開発ソースコードはSubversionを使用してアクセスできます。以下のコマンドで最新のソースを取得できます:

svn checkout svn://svn.code.sf.net/p/sdcc/code/trunk/sdcc sdcc

...これにより、現在のディレクトリにsdccディレクトリが作成され、ダウンロードされたすべてのコードがそこに配置されます。Subversionリポジトリはこちらで閲覧できます。

バグを報告する前に、-vオプションを使用してSDCCのバージョンとビルド日を確認し、バグレポートに完全なバージョン文字列を含めるようにしてください。例:

sdcc/bin > sdcc -v SDCC : mcs51/gbz80/z80/avr/ds390/pic14/TININative/xa51 2.3.8 (Feb 10 2004) (UNIX)

SDCCのサポート

SDCCおよび付属のサポートパッケージには、かなりの量のドキュメントと例が含まれています。それらが十分でない場合は、以下の場所でヘルプを見つけることができます。ここに、役立つ応答を得る可能性を大幅に向上させるためのヒントの短いチェックリストを示します。

  1. SDCCでコンパイルしているコードを添付してください。コードは「そのまま」コンパイルできる必要があります。スニペットはコンパイル可能で、必要なヘッダーファイルなどをすべて含める必要があります。不完全な情報は、タイムリーな応答を得る機会を妨げます。
  2. SDCCを実行するために使用する正確なコマンドを指定するか、Makefileを添付してください。
  3. SDCCのバージョン("sdcc -v"と入力)、プラットフォーム、オペレーティングシステムを指定してください。
  4. エラーメッセージまたは不正な出力の正確なコピーを提供してください。

これらの4つの重要な部分を、該当する場合、SDCCに関するすべてのサポート要求または問題やバグの報告に含めるようにしてください。これによりメッセージは長くなりますが、SDCCのユーザーや開発者があなたを助けることができる可能性が大幅に向上します。一部のSDCC開発者は、再現して最終的に問題を修正できるコードが添付されていないバグレポートに不満を感じているため、バグを報告する場合はサンプルコードを必ず提供してください!

  • ウェブページ - あなたは(X)ここにいます。
  • メーリングリスト:[バグ報告](以下参照)を使用して、バグを見つけたと思われる場合は報告してください。
    • 開発者リスト <sdcc-devel.AT.lists.sourceforge.net> - SDCCの開発作業用
    • ユーザーリスト <sdcc-user.AT.lists.sourceforge.net> - [推奨] すべての開発者とすべてのユーザー。
    • ユーザーリストを購読
  • バグ報告 - SDCCの使用中に問題が発生した場合は、お知らせください。問題を再現するためのコードを添付し、開発者が追加情報が必要な場合に連絡できるよう、メールアドレスを必ず提供してください。また、誤った、不足している、または古いドキュメントもここに報告してください。
  • SDCCメッセージフォーラム - 投稿および返信するにはSourceforgeのアカウントが必要です。短く簡単なオンライン記入式です。
  • Open Knowledge Web Site - Thorsten Godau <thorsten.godau.AT.gmx.de> が運営

SDCCの開発者は?

  • Sandeep Dutta <sandeep.AT.users.sourceforge.net> - オリジナル作者(SDCCのTorvalds氏のような存在)。
  • Jean Loius-VERN <jlvern.AT.writeme.com> - バックエンドコード生成における大幅な改善。
  • Daniel Drotos <drdani.AT.mazsola.iit.uni-miskolc.hu> - 8051用フリーウェアシミュレータ。
  • Kevin Vigor <kevin.AT.vigor.nu> - Dallas ds390ツリーへの数多くの機能追加とバグ修正。
  • Johan Knol <johan.knol.AT.users.sourceforge.net> - ds390ツリーのテストとパッチ適用、卓越したバグ修正担当者。
  • Scott Dattalo <scott.AT.dattalo.com> - Microchip PICコントローラターゲット用SDCC。
  • Karl Bongers <karl.AT.turbobit.com> - mcs51サポート、winbinビルド、および時折のバグ修正。
  • Bernhard Held <bernhard.AT.bernhardheld.de> - スナップショットビルドと一般的な管理。
  • Frieder Ferlemann <Frieder.Ferlemann.AT.web.de> - ドキュメントへの貢献とコード生成の最終段階。
  • Jesus Calvino-Fraga <jesusc.AT.ece.ubc.ca> - 数学関数、AOMF51、リンカ改善。
  • Borut Ražem <borut.razem.AT.gmail.com> - WIN32 MSC、cygwinおよびmingwポート、NSISインストーラ、プリプロセッサおよびフロントエンド改善、バグ修正、分散コンパイルファームでのスナップショットビルドなど。
  • Vangelis Rokas <vrokas.AT.otenet.gr> - Microchip PIC18Fマイクロコントローラ向けのPIC16ターゲット開発。
  • Erik Petrich <epetrich.AT.users.sourceforge.net> - フロントエンド、8051、z80、hc08のバグ修正と改善。
  • Dave Helton <dave.AT.kd0yu.com> - ウェブサイトデザイン。
  • Paul Stoffregen <paul.AT.pjrc.com> - mcs51最適化とウェブサイトメンテナンス。
  • Michael Hope <michaelh.AT.juju.net.nz> - 初期Z80ターゲット、追加コーディング、バグ修正。
  • Maarten Brock <sourceforge.brock.AT.dse.nl> - いくつかのバグ修正と改善、特にmcs51ターゲット向け。
  • Raphael Neider <RNeider.AT.web.de> - PIC16のバグ修正と最適化、PIC14ターゲットの完了。
  • Philipp Klaus Krause <pkk.AT.spth.de> - STM8、f8、Z80、Z180、Rabbit、SM83、TLCS-90、eZ80バックエンド、コンパイラ研究に関する作業。
  • Leland Morrison <enigmalee.AT.sourceforget.net> - Rabbit 2000サポート:ターゲットコードジェネレータ、sdasrabアセンブラ、ucsimサポート。
  • Molnár Károly <molnarkaroly.AT.users.sf.net> - picデバイスの追加、picデバイスファイル生成スクリプトの開発と保守。
  • Ben Shi <powerstudio1st.AT.163.com> - フロントエンド、STM8バックエンド、MCS-51バックエンドの保守。

SDCCは、以下を含む多くの外部ソースからの支援を受けています:

  • Alan Baldwin <baldwin.AT.shop-pdp.kent.edu> - ASXXXXおよびASLINKの初期バージョン。
  • John Hartman <noice.AT.noicedebugger.com> - 8051向けのASXXXXおよびASLINKのポート。
  • Dmitry S. Obukhov <dso.AT.usa.net> - mallocおよびシリアルI/Oルーチン。
  • Pascal Felber - 一部のZ80関連ファイルはGameboy Development Kit (GBDK)から借用されています。
  • GCC開発チーム - GNU Cプリプロセッサ(sdcppプリプロセッサおよびgccテストスイートの基盤)について。これはSDCC回帰テストスイートに部分的に含まれています。
  • GNU Binutils開発チーム - GNU Binutils(sdbinutilsの基盤)について。
  • Boostコミュニティ - sdccコンパイラで使用されているBoost C++ライブラリについて。
  • Timo Bingmann - sdccコンパイラで使用されているSTX B+ Tree C++テンプレートクラスについて。
  • Malini Dutta <malini.AT.mediaone.net> - Sandeepの妻。彼女の忍耐とサポートに感謝します。