0

CとC++って低水準言語なの?

最終更新日 投稿日 2023年08月03日

はじめに追記

まず投稿後に私の言葉の拙さのせいでも勘違いをされそうだなと感じ追記としてはじめに言っておきます。
以下のケンブリッジ大学の記事によるとタイトルからCとC++は低水準言語ではないことが言われていますが、コンピュータ科学者のAlan Perlisの低水準の定義"A programming language is low level when its programs require attention to the irrelevant"に当てはまることが言及されており、Cの低水準言語的機能について紹介しています。そのために混乱する人もいるのかも知れません。
この記事は私自身はCやC++を高水準言語として理解していたため、CやC++を低水準言語として扱っている人が思った以上におりびっくりしたので書かせていただきました。

あと記事を付け加えたりして思ったのが高水準言語と低水準言語の違いやなぜCやC++は高水準なのかについて説明してなかったのですが、そこは他の方の記事であったりWikipediaなどを参考にしてもらえると助かります。

え、CとC++って低水準言語なの?

最近、海外のエンジニアからの投稿が目に入り気になりました。彼は「プログラミングを学び始める際には、低水準言語とされるCやC++よりも、Pythonのような言語から学んだ方が良い」と提案していました。

コメント欄には、「CやC++は高水準言語である」と主張する声とC、C++が低水準言語であるのを当たり前のように賛同するコメントも見受けられました。私が初めてプログラミング言語を学んだのはC言語で、それは8年くらい前のことです。当時、C言語はもちろんのように高水準言語として学び、アセンブリ言語や機械語は低水準言語として学びました。C言語から学んだ私は、メモリや構造体の概念に苦しみ、PythonやJavaScriptに触れるまで「プログラミングは自分には向いていない」と感じ、一時は諦めようとも思ったことがあります。だからこそ、Pythonのような言語から学び始めるという提案には異論を挟みませんが、C言語やC++を低水準言語として扱うことには違和感があります。

ということで調査を行ってみました。

その結果、非公式的に低水準言語と高水準言語の定義は、人やその状況により変化することが分かり、低水準と考える人が増えてきたのだとわかりました(ちょっとなんだそれって感じで、僕自身も納得していないのですが笑)

これから紹介する記事はCやC++が低水準であることを証明するものではないのですが、使われていた例であったり、議論されていた例であったりといくつかピックアップさせていただきました。

以下のリンク先であるstackexchange.comの記事'Is C programming language low level or high level?'では、
回答者はC言語は全体的な文脈による。PHPなどと比較すると低水準であり、しかしアセンブリと比べると高水準であるとの意見が見受けられます。また、この記事は7年以上前のものであり、C言語が低水準と認識され始めたのは最近の話ではないようです。

以下のjavatpoint.comのリンクでは、

  • 'The C and C++ programming languages come under the category of middle-level languages. Low-level languages provide little or no abstraction of programming concepts, whereas C and C++ programming languages provide the least degree of abstraction to performance and efficiency for the least amount of money.'

CやC++は抽象化の概念を提供しており、そのため低水準とは言い難いとのような記載をしていると同時に、中水準言語として考えられるとの言及もあります。

さらに、ノルウェーのオスロ大学の情報学部が発表した論文(下はリンク先)では、マイクロコントローラなどのデバイスでの低水準言語と高水準言語について議論しています。その中で、

  • 'Microcontrollers with little available resources, such as program memory, RAM and speed, are in most cases programmed in low level languages such as Assembly, C and C++, these languages can be hard to learn for new programmers and therefore hold them away from microcontroller programming.' (Jan Ole Skotterud, 2012)

と、C言語とC++が低水準言語として扱われています。また、知人の投稿のお題のようにプログラミング初学者にとってC言語やC++を学ぶのは難しいとの意見も述べられています。(しかもこれ2012年と10年以上前の記事なのね笑)

CやC++は確かに低水準としての機能も持ち合わせて入るのですが、高水準としての機能を持っているため低水準とは言い難いです。(しかし、両方の特徴を持つため中水準として扱うのはいいかも?)
ただ、プログラミング言語の「水準」はある意味相対的なとこをもあり、それは学び手の経験や状況、使用するハードウェアなどによって変化することを理解することももしかしたら重要かもしれません。

また、知人の投稿に戻ると結局のところプログラミング学習の初期段階にどの言語を選択するかは、学び手自身の目標や興味、そして学習リソースに大きく依存するのではないでしょうか?

というわけで、知人の投稿内容そのものにはあまり関係ないのですが、私のプログラミング学習における固定概念みたいなところがまたひとつ崩され改めて水準とは何かについて学んだ機会ではある知人の投稿でした。
ついでにPythonなどの言語から学ぶことに対して反対ではないのですが、私個人ははじめにC言語から触ったことで得たメモリ等に関する発見や、エンジニア人生を送るにあたりどんな難しいものにも挑戦するといった基盤を築くことができたと思っているのでCから始めて逆に良かったとも感じます。

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について
takeyoshinitta
@takeyoshinitta(新田 剛良)
海外でCSの学士を取得し、その間にWeb系エンジニアとしての経験を経て、現在は帰国し外資系IT企業でITコンサルおよび技術営業として活動しています。でもやっぱりプログラミングもしっかりしたくなってしまい副業でフリーのソフトウェアエンジニアもしてます。
この記事は以下の記事からリンクされています

コメント

(編集済み)

その結果、低水準言語と高水準言語の定義は、人やその状況により変化することが分かりました。(ちょっとなんだそれって感じですが笑)

そんなことありません。
プログラミング言語を高水準言語と低水準言語に分類するなら、今も昔も低水準言語は事実上アセンブリ言語・機械語のみであり、その他の言語は全て高水準言語であるというのが一般的な理解だと思います。

探せば「C言語は低水準言語である」という意見がいくらかは見つかるかもしれませんが、それは少数派の意見であり、その数百・数千倍の記事や文献が存在するはずです。

3
(編集済み)

@error_401
コメントありがとうございます。私もそのように思っていましたし今でもヒトが理解しやすい言語だからやっぱり高級言語だよなと思っているところもあります。しかし、低水準言語の定義そのものが年々変わってきているというのもあるのではないでしょうか?今回は3つだけピックアップしたのですが、調べるとCは低水準言語である(となろうとしている)という英文記事が以前と比べ増えてきているように思います。もちろん高水準言語であるというのが一般的でその記事は数百倍、数千倍かもしれないですが、このような動きからこれからどうなってくるかわからないというのが正直なところではないでしょうか?

そのような観点でも興味深いなと思いながら私の記事を楽しんでくださると幸いです。

追記:
以下の記事は今年のものですが、昔はC言語は高水準だが現在は低水準として考慮され得ることと、低水準の定義がかなり変化してきたことを言及しております。では現在の高水準と低水準の違いはってところまで記しておりますので読んでみると面白いかもしれません。(ついでにこの記事はCは中水準言語として扱っております。)
https://www.coursereport.com/blog/a-guide-to-low-level-programming-for-beginners#:~:text=C%20and%20C%2B%2B%20are%20now,the%20inception%20of%20computer%20science.

0

高級言語と低級言語の違いについてよくわかってない人が増えたとしてC言語が低級言語になるわけはありません。多数決か何かと勘違いされてないですか?

1

このような動きからこれからどうなってくるかわからないというのが正直なところではないでしょうか?

うーん、そうでしょうか・・・。

もちろん、以前からC言語は低水準言語だと見なしている人たちがいることは承知していますし、高・中・低水準言語に分類するとすれば中水準に分類する意見が多いことは承知してます。

以下の記事

これ以上この件について突っ込んだ調査をするつもりはないんですが、(人をそれで判断するのはどうかとも思いますが)その記事のお二人りともCSを専攻していないようなので、ちょっと信頼度は個人的には低くなります・・・。

0
(編集済み)

@fujitanozomu
他の方の意見も聞けて嬉しいです。
間接的な話で言うと多数決の可能性も大いにあると思います。
ただ、開発に使われる言語が増えてきていることからそこに新たな定義を加え、過去に高級言語であったことと水準の本来の定義を理解したことを踏まえた上でC言語が低級になりつつあるという記事も多数みます。私もCやC++は高級言語だと思っているのですが、このような現実があると頭を硬くしてもいられないのかなと言った印象です。

0

新たな概念であれば別の用語を創るなりして割り当てるべきであり、従来からある用語の意味を捻じ曲げることに正当性はないと思います。
誤りに迎合する意味もないですね。

1
(編集済み)

@error_401
もしかしたらそういったCSを学んでいない方々の声が大きいので世間的にそっちに合わせている傾向があるのかもしれないですね…
(嫌味では全くないのですが、経験上ビジネス系出身でテクノロジーについて関わる人って声が大きかったり競争心とかが強かったりする印象があるので…特にアメリカは…不快に思った人には申し訳ないですが)

0
(編集済み)

@fujitanozomu
自分の持っている意見を変えてまで迎合する必要性は全くないです。ただ、特に英語圏ではそのように言われてきているのも受け入れ難いことかも知れないですが事実なので、そこに対してうまく説明できたり、なぜ彼らはそのように考えるのかを理解できたらさらに良いなと今さらながら思いました。

ついでに今見つけた記事である計算機協会(ACM)が5年前に提供したケンブリッジ大学の論文ではCは低水準ではないことが言及されていますが、同時に初代チューリング賞受賞者でありコンピュタサイエンスのパイオニアと呼ばれるAlan Perlisの低水準言語の定義"A programming language is low level when its programs require attention to the irrelevant"からするとC言語はそれにも当てはまることが記載されておりそれもあって混乱を招く人もいるようです。

後に記事に付け加えておきます。

0

なぜ彼らはそのように考えるのかを理解できたら

この話題は(ひょっとすると前世紀から)死ぬほど繰り返されてきた話であり、それをみてきた人は、なぜそういうことになるのか理解してると思います。

およそ、以下のどちらかです。

  • プログラミング言語の「水準」の定義を知らない人が、C言語が高水準言語と聞いて混乱する、あるいは納得がいかない
  • 定義は知っているが、他の言語と比較する文脈では、C言語は「低水準寄り」だと理解している
0
(編集済み)

計算機科学の研究者や本当のエンジニアからみた絶対基準はそれほど変わっていないと思います. 基準は, 機械語と一対一(ラベルやマクロは除く)かだと思います. Python, PHP, Javaなどと比較すれば誰でも低水準だと言うと思います.
ノルウェーのオスロ大学の情報学部が発表した論文, thesisで判断されても困るのですが, これも従来マイクロコントローラで使われてきた言語より高水準な言語を論じていますよね?
ACMの論文, これはなんだろarticleかな, についても, PDP-11のエミュレータを論じているのであって絶対的にC言語が低水準かについて論じているわけではないですよね? PDP-11に対する初期のC言語はほぼ機械語と一対一だから低水準言語だよね, 程度にしか書かれていないように読めました.

比較を持ち出してC/C++を低水準言語と定義したがるのは, 習得が難しい印象を与えた方が, ITコンサルタント, 技術営業, 人材派遣にとっては都合がいいから, 全体がそういう風に見えている(見たい)だけではないでしょうか?

0
(編集済み)

@taqu
意見ありがとうございます。
その二つの論文に関してですが、C言語についてそのような紹介をされていると言う意味で紹介をさせていただきました。私としてもその論文全体がCの水準を判断するためのものとして紹介されていないことは理解していたつもりですが、言葉足らずでそのような印象を与えてしまい申し訳ございません。

ノルウェーのオスロ大学の情報学部が発表した論文, thesisで判断されても困るのですが, これも従来マイクロコントローラで使われてきた言語より高水準な言語を論じていますよね?

オスロ大学についてですが、9ページに確かにアセンブリと比べて高水準言語と言及しておりますが、ここでは"C can be seen as a high level language compared to assembly"というフレーズが使われており、高水準言語としてみなすことができると高水準言語であることを強く宣言しておらず、Javaと比べて低水準との記載もあるのでそれに対し違和感を覚えているところがあり紹介させていただきました。ですので、ここに関してオスロ大学の論文はCが高水準であることははっきりと明言されておりません。ただ、おっしゃる通りこれは言語の水準について結論づけている論文ではないのでそこで判断するのは間違っているのかも知れません。Cが低級としてみなされている例の一つとして興味深いと思い紹介させていただきました。

ACMの論文, これはなんだろarticleかな, についても, PDP-11のエミュレータを論じているのであって絶対的にC言語が低水準かについて論じているわけではないですよね?

最終的にはPDP-11のエミュレータを論じておりそれが主題となっているのですが、タイトルから前半にかけて低水準言語の特徴とそれを踏まえた上でのPDP-11のエミュレータについて話しているのでCの水準そのものの断定はしていないのですが、Cの低水準的機能についての話をしているので参考資料としては十分だと判断しました。また、私の言葉足らずで非常に申し訳ないのですが、この記事に関しては私はCが低水準言語として紹介されているとの紹介をしたつもりではなく、混乱を招く理由の一つとして紹介したつもりでしたのでご理解いただけると幸いです。

比較を持ち出してC/C++を低水準言語と定義したがるのは, 習得が難しい印象を与えた方が, ITコンサルタント, 技術営業, 人材派遣にとっては都合がいいから, 全体がそういう風に見えている(見たい)だけではないでしょうか?

私も皆さんの意見や他の記事を見るとそのように感じますが、それにしてもCが低水準言語であると思っている人の数が圧倒的に多くそのような記事が当たり前のようにあるので驚いたところです。日本語の記事ではそのようなものは少ない(というよりも見つけることができませんでした)のでそこも不思議に感じておりました。

0
(編集済み)

@error_401

プログラミング言語の「水準」の定義を知らない人が、C言語が高水準言語と聞いて混乱する、あるいは納得がいかない
定義は知っているが、他の言語と比較する文脈では、C言語は「低水準寄り」だと理解している

それはもちろんそうだと思うのですが、だとしてもCを当たり前のように低級言語と思っている人や意見を変えて思い始めた人が想像以上に多いなという印象を持ち驚きました。そう言った意味でもこれから変化していったり、わかりやすい方向へと持っていくムーブメントが増えエンジニアとしてのあり方も結果として変わったりするのかなと思っていた次第です。

0
(編集済み)

プログラミング言語の水準について論じていない論文を, 単語や文節だけ抜き出して自分の論説の補強とするのはおかしくないですか?
ほとんどのプログラミング言語と比較すればC言語は低水準ですし, 初学者も含めて誰もがそのレベルで議論しているだけなのではないですか?

0
(編集済み)

@taqu
それは申し訳ございませんでした。
私としてはこのムーブメントが拡大されCが段々と当たり前のように低水準として扱われていることついて例をいくつか紹介し将来的にどうなるのかを含め議論をしたいと思って投稿したつもりでCが低水準か高水準についてしっかりと議論したかったわけではないのですが、このような投稿は初めてでしたので、うまく伝えることができなかったのだと反省しております。
私の投稿に対しての誤解を閲覧者が生んでしまうのは申し訳ないのですが、急に投稿を削除してしまうのもこれまでコメントされた方に失礼だと思いますので、しばらく時間をおいてから本日中に投稿は削除させていただきます。

0

@takeyoshinittaさん、

以下のケンブリッジ大学の記事によるとタイトルからCとC++は低水準言語ではないことが言われていますが、コンピュータ科学者のAlan Perlisの低水準の定義"A programming language is low level when its programs require attention to the irrelevant"に当てはまることが言及されており、Cの低水準言語的機能について紹介しています。

件の記事を読まれていてこのような説明になるわけはないと思いますが、読まれた上での説明でしょうか?

0
(編集済み)

@fujitanozomu

はい、まず、Alan氏の低水準の定義に属しているが、低水準ではないとのステートメントが1ページ目の終わりから行われております。私の紹介の仕方が非常に悪いのですが、私はこの記事はCが低水準のようだが、そうではないというつもりで共有させていただいたものになります。
以下がその抜粋になります。太字にさせていただいたところがそこについてはっきりと説明しているところだと私は思いました。特に初めの太字部分では「この定義(Alanの低水準言語の定義)はCに当てはまりますが、人々がCを低水準言語であると捉えるものではありません。さまざまな特質によって人々が言語を低水準であると考えてしまう」とのことを言っております。

Computer science pioneer Alan Perlis defined low-level languages this way:
“A programming language is low level when its programs require attention to the irrelevant.”5
While, yes, this definition applies to C, it does not capture what people desire in a low-level language. Various attributes cause people to regard a language as low-level. Think of programming languages as belonging on a continuum, with assembly at one end and the interface to the Starship Enterprise’s computer at the other. Low-level languages are “close to the metal,” whereas high-level languages are closer to how humans think.

また、記事にはハードウェアの処理やメモリについての説明もなされておりましたのでそこを私はCの低水準的な機能として勝手に解釈してしまったところでございます。ソースを集めることだけに集中してしまいきちんと読めていなかったところもあると思いますので、その点に関しては読んだ上での説明ではなかったと反省しております。

自分勝手な解釈で説明をしてしまい非常に申し訳ございません。この投稿は今日中に削除させていただくのですが、何か少しでも学びがありましたら幸いです。

0

まあどこか標準団体が用語を定めているわけでもなく、高い低いという言葉自体に厳密な基準がなく、相対的な意味合いも入るので、C を低水準と呼びたくなる気持ちはわからないでもないです。

でも水準の位置を調整したとして、高水準言語と低水準言語という用語を使って言語を二種類に分けるのであれば、その言葉を使うべき理由、区別する理由が必要なのではないかと思います。
Python の方が C より読み書きしやすくてデータ型が抽象化されているからというのは、少し理由としては弱い気がします。

たとえばアセンブリ言語は、ニーモニックに加えてマクロやメモリ位置の自動計算などの前処理が使えるので、機械語に比べて明らかに人に優しいです。
しかしこれが高水準言語と呼ばれた歴史はありません。
なぜなら、アセンブリ言語は対応する機械語に解釈の余地なく厳密に変換されるからです。
つまりプロセッサ毎にソースを書く必要があり、他のプロセッサに使いまわしできません。
機械のスイッチのオンオフをマニュアル操作する言語ですね。

それに対して C 言語は、実行環境の違いをある程度吸収する機能を持っています。
C 言語で書かれるのは抽象的な処理手順であり、実際のスイッチのオンオフは隠蔽されます。
そのため、プロセッサーを変更しても、主処理はそのまま僅かな変更で対応できます。
これらの違いから、アセンブリ言語と C 言語含めた高級言語では、用途が異なってきます。
なにせハードウェアの進化と移り変わりは速いですから。

仮にアセンブリ言語と C 言語を同じグループにして、その他の言語と分ける場合、その二グループ間には、わざわざ用語を分けて区別しなければならないほどの明確な違いがあるでしょうか?

1

@Zuishin
私の拙い投稿に対して、コメントありがとうございます。

でも水準の位置を調整したとして、高水準言語と低水準言語という用語を使って言語を二種類に分けるのであれば、その言葉を使うべき理由、区別する理由が必要なのではないかと思います。

それはある意味当たり前なのかも知れないですが、非常に重要なポイントだと思いました。ただ、おっしゃる通りデータ型の抽象化等の理由で水準を区別されるとモジュールの普及等で抽象化を後に実現したという言語もありますので、明らかに不変の特徴を持つところで区切るなどといった配慮も持つ必要があるかも知れません。

たとえばアセンブリ言語は、ニーモニックに加えてマクロやメモリ位置の自動計算などの前処理が使えるので、機械語に比べて明らかに人に優しいです。
しかしこれが高水準言語と呼ばれた歴史はありません。
なぜなら、アセンブリ言語は対応する機械語に解釈の余地なく厳密に変換されるからです。
つまりプロセッサ毎にソースを書く必要があり、他のプロセッサに使いまわしできません。
機械のスイッチのオンオフをマニュアル操作する言語ですね。

確かにニーモニック等アセンブリ言語には人にも機械語と比べると優しくなるような機能があるにも関わらず、それが高水準(比較的高水準含む)と呼ぶ方はいないですね。私はアセンブリ言語と機械語は大学でしか触れた経験がないのでそこまでの知識を持っているわけではないのですが、そのように従来の高水準言語は大学だけで完結してしまう方や、CS系以外の出身のエンジニアの方だと一生触ることのない言語でもありますので気にする人が少ないのもあるのかも知れません。しかし、その解釈の余地なく厳密に変換されると言った説明は逆になぜアセンブリ言語は高水準ではないのかということに対しわかりやすくて非常に助かります。

それに対して C 言語は、実行環境の違いをある程度吸収する機能を持っています。
C 言語で書かれるのは抽象的な処理手順であり、実際のスイッチのオンオフは隠蔽されます。
そのため、プロセッサーを変更しても、主処理はそのまま僅かな変更で対応できます。
これらの違いから、アセンブリ言語と C 言語含めた高級言語では、用途が異なってきます。
なにせハードウェアの進化と移り変わりは速いですから。

確かに抽象的な処理の観点からそれを低水準とは言えないという記事は私が投稿内に引用したものも含めたくさんありました。そのためわざわざここであらためていうことではないのかも知れないのですが、この処理の抽象化というのが水準を決める一つの重要なものになってくると思うと同時に、その概念を理解する人が減ってきた(というより段々と全てのエンジニアが理解する必要性がなくなってきたり、スクールや独学で学んだ人のための説明として省かれてきた)のかも知れません。

仮にアセンブリ言語と C 言語を同じグループにして、その他の言語と分ける場合、その二グループ間には、わざわざ用語を分けて区別しなければならないほどの明確な違いがあるでしょうか?

そこは今回私が疑問に思ったところの一つでもあります。

話は飛躍しそうではありますが、現にインタプリタかコンパイル、オブジェクト指向かそうではないかなどを含めすでに分類するための指標は多くありますのでそちらを使った方が良いのではとも思いながら、高水準低水準がこれから勉強する人やバックグラウンドを持たない人にとってはわかりやすいのかなとも感じます。特に英語ですとhigh level/low levelと小学生でもわかるような英単語を使用しておりますので。

1
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
記事投稿キャンペーン開催中
100万人に届けたい!私のお気に入りガジェット
~
100万人に伝えたい!失敗を乗り超えた話を共有しよう
~
0