⇧ 130億光年とか、気が遠くなりますな...
C言語のコンパイラー、GCCとClangのどっち使えば良いのよ...
Linuxのマルチスレッドプログラミングの技術書を読み始めたら、予想外にC言語とかが出てきてしまったので、C言語の開発環境を構築する必要が出てきたことから、Linux環境にC言語の動作する環境を作ろうと思ったのだけど、
⇧ 何やら、C言語のコンパイラーがGCC、Clangの2種類あるっぽい。
GCC(GNU Compiler Collection)
公式のドキュメントの説明によると、
The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, 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.
⇧ C言語以外にも対応してるってことなんかね?
Wikipediaさんによると、
概説
最新標準パッケージには C、C++、Objective-C、Objective-C++、Fortran、Ada、Go、Dのコンパイラ並びにこれらのライブラリが含まれている。 バージョン7以前では、Javaもサポートされていた。
バックエンド部のコード生成部(コードジェネレータ)、および最適化部(オプティマイザ)は全言語で共通である。したがってGCCの対応の言語同士の間では、生成コードの質や対応するCPUの種類は原理的に同じになる。なお、フロントエンドおよびバックエンドの間でやりとりされる中間形式としてレジスタ転送言語 (RTL) が使用される。
⇧ という感じらしい。
Clang
何やら、
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.
⇧ LLVMありきの話なんかね?
プロジェクトの目標は、GNUコンパイラコレクション (GCC) を置き換えることのできるコンパイラを提供することである
背景
2005年初頭、AppleはLLVMシステムを自社で開発している様々なシステム内で利用するための作業を開始した。AppleはObjective-Cを多用しているため、GCCの性能向上に興味を抱いていたがほとんど進展が見られず、Objective-Cの性能を上げるためにGCCをApple版に分岐させるか、新しいコンパイラを採用するかの選択をせまられていた。そこで、AppleはC99、Objective-CおよびC++をサポートするコンパイラを1から作成した。このClangプロジェクトは2007年7月にオープンソース化された。
LLVMは当初、GCCのフロントエンドを使用することを想定していた。しかし、GCCのソースコードは大規模で、やや面倒なシステムである。ある長年のGCC開発者は、「Trying to make the hippo dance is not really a lot of fun.(カバにダンスを踊らせるのは、あまり楽しいことではない)」と述べている。
概要
Clang は名前が示すとおりCやCに似た言語の専用のコンパイラであり、C、C++、Objective-C、Objective-C++、OpenCL、CUDA以外の言語のフロントエンドは提供しない。Fortran、Ada、Go については LLVM は GCC (dragonegg) に依存し続ける。Clang は必要に応じてツールチェイン全体には影響を与えず GCC と交換することができる[要出典]。非公式のサブプロジェクトとしてNVIDIAが開発した Flang により Fortran サポートが追加された。
⇧ なるほど、GCCの切り出しが困難なため、LLVMのフロントエンド部分としてClangを作らざるを得なかったということですか。
C言語のコンパイラーでGCCとClangのどっち使えば良いか分からんが、C言語の開発環境を構築する
とりあえず、
⇧ 前回までで、「WSL 2(Windows Subsystem for Linux 2)」にRocky Linuxの導入して、Dockerまでインストールできているので、Dockerコンテナを作成してみますか。
Rocky Linuxを起動して、SSH接続したらば、適当なディレクトリを作成して、viでDockerfileを新規作成し、編集します。
Dockerfileに追記して、保存。
DockerfileからDockerイメージを作成。
何か、Dockerがsudo付けないと動かんのと、/bin/bashだと接続できんという...
どうやら、
⇧ 上記サイト様によりますと、DockerのベースイメージのOSであるAlpine Linuxにbashが入ってないということらしい。
⇧ 確かに、bashがおりませんな...
代わりに、/bin/ashを使う感じになるらしい、罠過ぎる...
で、sudoの方はと言うと、
⇧ 上記サイト様によりますと、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コンテナに接続できました。
⇧ 上記サイト様を参考に、コンテナに接続してVisual Studio Codeの方で、「Code Runner」という拡張機能をインストールします。
ボタンでコードを実行できるようになるらしいです。
参考サイト様を参考に、ファイル(拡張子「.c」)を追加しソースコードを追記して保存し、拡張機能「Code Runner」で追加されたボタンを押下。
⇧ C言語のコードが実行されたようです。コンパイルまでしてくれるっぽいですね、コンパイラーはgccを使ってるってことなんかね?
コマンドプロンプト側の方にも反映されてるのを確認。
マウントしていたホスト側のディレクトリにファイルが保持されてます。
まぁ、Linux環境にC言語の開発環境を構築できたということにしておこう...
結局、C言語のコンパイラーについて、GCC、Clangのどちらを使えば良いのかは分からんですな...
ちなみに、
⇧ dockerのコンテナができるまでの仕組みの例えとして、LLVMのコンパイルを例に出してるのだけど、そもそもLLVMの仕組みが分からんのでサッパリですわ...
Linux何も分からん...
毎度モヤモヤ感が半端ない...
今回はこのへんで。