※当サイトの記事には、広告・プロモーションが含まれます。

C言語のコンパイラーでGCCとClangのどっち使えば良いか分からんが、C言語の開発環境を構築する

scienceportal.jst.go.jp

⇧ 130億光年とか、気が遠くなりますな...

C言語コンパイラー、GCCとClangのどっち使えば良いのよ...

Linuxのマルチスレッドプログラミングの技術書を読み始めたら、予想外にC言語とかが出てきてしまったので、C言語の開発環境を構築する必要が出てきたことから、Linux環境にC言語の動作する環境を作ろうと思ったのだけど、

arstechnica.com

⇧ 何やら、C言語コンパイラーがGCC、Clangの2種類あるっぽい。

GCCGNU Compiler Collection)

公式のドキュメントの説明によると、

The GNU Compiler Collection includes front ends for CC++, Objective-CFortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,...). GCC was originally written as the compiler for the GNU operating system. The GNU system was developed to be 100% free software, free in the sense that it respects the user's freedom.

https://gcc.gnu.org/

C言語以外にも対応してるってことなんかね?

Wikipediaさんによると、

概説

最新標準パッケージには CC++Objective-CObjective-C++FortranAdaGoDコンパイラ並びにこれらのライブラリが含まれている。 バージョン7以前では、Javaもサポートされていた。

GNUコンパイラコレクション - Wikipedia

構成

GCCは通常のコンパイラと同様にフロントエンド部、最適化部、バックエンド部から構成される。

GNUコンパイラコレクション - Wikipedia

フロントエンド部は字句解析構文解析などを行い、対応言語ごとに用意されている。たとえばC++フロントエンド、Javaフロントエンドなどがある。

GNUコンパイラコレクション - Wikipedia

バックエンド部のコード生成部(コードジェネレータ)、および最適化部(オプティマイザ)は全言語で共通である。したがってGCCの対応の言語同士の間では、生成コードの質や対応するCPUの種類は原理的に同じになる。なお、フロントエンドおよびバックエンドの間でやりとりされる中間形式としてレジスタ転送言語英語版 (RTL) が使用される。

GNUコンパイラコレクション - Wikipedia

⇧ という感じらしい。

Clang

何やら、

clang.llvm.org

Clang: a C language family frontend for LLVM

The Clang project provides a language front-end and tooling infrastructure for languages in the C language family (C, C++, Objective C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project. Both a GCC-compatible compiler driver (clang) and an MSVC-compatible compiler driver (clang-cl.exe) are provided. You can get and build the source today.

https://clang.llvm.org/

LLVMありきの話なんかね?

プロジェクトの目標は、GNUコンパイラコレクション (GCC) を置き換えることのできるコンパイラを提供することである

https://ja.wikipedia.org/wiki/Clang

背景

2005年初頭、AppleLLVMシステムを自社で開発している様々なシステム内で利用するための作業を開始したAppleObjective-Cを多用しているため、GCCの性能向上に興味を抱いていたがほとんど進展が見られず、Objective-Cの性能を上げるためにGCCApple版に分岐させるか、新しいコンパイラを採用するかの選択をせまられていた。そこで、AppleC99Objective-CおよびC++をサポートするコンパイラを1から作成した。このClangプロジェクトは2007年7月にオープンソース化された。

https://ja.wikipedia.org/wiki/Clang

LLVMは当初、GCCのフロントエンドを使用することを想定していた。しかし、GCCソースコードは大規模で、やや面倒なシステムである。ある長年のGCC開発者は、「Trying to make the hippo dance is not really a lot of fun.(カバにダンスを踊らせるのは、あまり楽しいことではない)」と述べている

https://ja.wikipedia.org/wiki/Clang

概要

Clang は名前が示すとおりCやCに似た言語の専用のコンパイラであり、C、C++Objective-CObjective-C++、OpenCLCUDA以外の言語のフロントエンドは提供しない。FortranAdaGo については LLVMGCC (dragonegg) に依存し続ける。Clang は必要に応じてツールチェイン全体には影響を与えず GCC と交換することができる[要出典]。非公式のサブプロジェクトとしてNVIDIAが開発した Flang により Fortran サポートが追加された

https://ja.wikipedia.org/wiki/Clang

⇧ なるほど、GCCの切り出しが困難なため、LLVMのフロントエンド部分としてClangを作らざるを得なかったということですか。

C言語コンパイラーでGCCとClangのどっち使えば良いか分からんが、C言語の開発環境を構築する

とりあえず、

ts0818.hatenablog.com

⇧ 前回までで、「WSL 2(Windows Subsystem for Linux 2)」にRocky Linuxの導入して、Dockerまでインストールできているので、Dockerコンテナを作成してみますか。

Rocky Linuxを起動して、SSH接続したらば、適当なディレクトリを作成して、viでDockerfileを新規作成し、編集します。

Dockerfileに追記して、保存。

DockerfileからDockerイメージを作成。

何か、Dockerがsudo付けないと動かんのと、/bin/bashだと接続できんという...

どうやら、

kazu22002.hatenablog.com

⇧ 上記サイト様によりますと、DockerのベースイメージのOSであるAlpine Linuxbashが入ってないということらしい。

⇧ 確かに、bashがおりませんな...

代わりに、/bin/ashを使う感じになるらしい、罠過ぎる...

で、sudoの方はと言うと、

qiita.com

⇧ 上記サイト様によりますと、dockerグループなるものに、ユーザーを追加してあげないといけないらしい。

dockerグループは存在していると。

dockerグループに追加して、Docker deamonを再起動して、再ログインしたところ、sudoなしでdockerコマンド実行できるようになりました。

ホストのディレクトリとマウントさせるディレクトリをコンテナ内に作成しておきたいので、Dockerfileを編集。

Dockerイメージを作り直します。

ホストのディレクトリとコンテナのディレクトリをマウントしてコンテナを起動。

で、Visual Studio CodeにRemote接続する拡張機能をインストールしていれば、WSL 2のRocky Linuxに接続し、

Rocky Linuxに接続されてる状態になったら、さらに同じ要領で左下の接続アイコンをクリックし「Attach to Running Container...」を選択で、

Rocky Linuxの中のDockerコンテナに接続できました。

kumipuro.tech

⇧ 上記サイト様を参考に、コンテナに接続してVisual Studio Codeの方で、「Code Runner」という拡張機能をインストールします。

ボタンでコードを実行できるようになるらしいです。

参考サイト様を参考に、ファイル(拡張子「.c」)を追加しソースコードを追記して保存し、拡張機能「Code Runner」で追加されたボタンを押下。

C言語のコードが実行されたようです。コンパイルまでしてくれるっぽいですね、コンパイラーはgccを使ってるってことなんかね?

コマンドプロンプト側の方にも反映されてるのを確認。

マウントしていたホスト側のディレクトリにファイルが保持されてます。

まぁ、Linux環境にC言語の開発環境を構築できたということにしておこう...

結局、C言語コンパイラーについて、GCC、Clangのどちらを使えば良いのかは分からんですな...

ちなみに、

www.docker.com

⇧ dockerのコンテナができるまでの仕組みの例えとして、LLVMコンパイルを例に出してるのだけど、そもそもLLVMの仕組みが分からんのでサッパリですわ...

Linux何も分からん...

毎度モヤモヤ感が半端ない...

今回はこのへんで。