その53 C言語を使ったことがない人がびっくりしそうなC言語の特徴

แชร์
ฝัง

ความคิดเห็น • 153

  • @heppocogne9778
    @heppocogne9778 2 ปีที่แล้ว +165

    C言語で一番驚いたのはarray[index]は内部的には*(array+index)でしかないからarray[index]はindex[array]でも参照できる、ってやつ。

    • @satlinuxtube5260
      @satlinuxtube5260  2 ปีที่แล้ว +21

      わたしもびっくりしました。し、最初はなんでそうなるのか理解できなかったです

    • @143658906
      @143658906 2 ปีที่แล้ว +3

      これ未だによく分かっていないのですが、なぜこのような仕様になってしまったのでしょうか…

    • @TGrisS
      @TGrisS 2 ปีที่แล้ว +9

      @@143658906 二項演算子の+は2つの項が可換だから。C言語の文法の対称的な美しさだと思います。

    • @あぴよん-i5h
      @あぴよん-i5h 2 ปีที่แล้ว +3

      でも書き方によっては最適化が変わって動作速度に影響が出るんだよなぁ

    • @bassHeroKomi957
      @bassHeroKomi957 2 ปีที่แล้ว +1

      ほえおもろ

  • @mighty-999
    @mighty-999 2 ปีที่แล้ว +73

    DOS時代にCでプログラムしていると、自由にメモリアクセスして(もちろんよくぶっ飛ぶw)ハードを直接制御できたりして、目の前のパソコンを自分がすべて乗っ取った気分になって楽しかった気がします。VRAM領域に適当に値を書き込んだら画面上にゴミとして表示されたりw、コンピューターの基礎構造が近く感じられて勉強にもなりましたね。

    • @n-bun1um3
      @n-bun1um3 2 ปีที่แล้ว +1

      楽しそう

  • @phononmaser1024
    @phononmaser1024 2 ปีที่แล้ว +12

    こういう動画のコメントにはプログラマの体験談やプログラムがあるから勉強になるし読んでて面白い。

  • @mo-39
    @mo-39 2 ปีที่แล้ว +51

    C言語から入った人間からすると、メモリ管理しない言語の方が不安がある。
    Javaとかで原因が分からないエラーとかに当たると、ガベージコレクションとか疑う。

  • @エールエア
    @エールエア 2 ปีที่แล้ว +84

    C++とかいうCの皮を被った全く別の化け物言語すこ

  • @numauo
    @numauo 2 ปีที่แล้ว +50

    今現役でCの開発、コーディングをしていて、Cしかまともに使ったことが無い新人プログラマーだけど、これがここまで丁寧に説明されないとわからないくらい他の言語ではありえないって事実に逆にびっくりしてる
    業務上mapファイルでメモリの配置やソフトでアセンブリ言語に変換後のコードを見てms以下の単位で高速化を見たことあるので、ここまでではないにしろ他の言語でもメモリ配置は大まかに管理してるものだと思ってました

  • @lurefishing5350
    @lurefishing5350 2 ปีที่แล้ว +15

    Cは便利なアセンブラってイメージですね。DOSの頃の知人は標準ライブラリ使わずに、まんまアセンブラ代わりにプログラミングしてました。

  • @ぷにぷに-r9r
    @ぷにぷに-r9r 2 ปีที่แล้ว +46

    図鑑にない変なポケモンを捕まえたりできた理由かもしれない。というか、ほぼ確定的にそう。

    • @lv.4854
      @lv.4854 2 ปีที่แล้ว +5

      このコメントのおかげで何を言っているか理解できた
      本当にありがとうございます

    • @katsuk6295
      @katsuk6295 2 ปีที่แล้ว +7

      ぷにぷに あのバグの原因はまさにこれなんですよね・・・

    • @SakuY6517
      @SakuY6517 2 ปีที่แล้ว +11

      アイテムや技の入れ替え裏技はポインタバグによるもの。

    • @phononmaser1024
      @phononmaser1024 2 ปีที่แล้ว

      めちゃくちゃしっくりきた。ありがとう

  • @soul5tealer99
    @soul5tealer99 2 ปีที่แล้ว +5

    教授みたいな声で聞いてて凄い安心する

  • @あるご-y2o
    @あるご-y2o 2 ปีที่แล้ว +3

    C全然知らないんですが、こうやって特徴だけ教えてくれると楽しく勉強できるので良かったです

  • @newmarimo
    @newmarimo 2 ปีที่แล้ว +19

    ポインタが難しいのは文法の設計と記号の使いまわしのせい
    だと思う。

  • @xx--xx5457
    @xx--xx5457 2 ปีที่แล้ว +27

    プログラミング学習はPython3から入った勢だけど、1年前に初めてC言語触った時は眩暈がしそうだった...
    「こんな面倒くさい言語が何のために存在するのか」と......今は存在意義をチョットダケ理解していると思います

    • @kyoniti2681
      @kyoniti2681 2 ปีที่แล้ว +20

      言語単体を存在意義で考えると当然新しい言語の方が利便性が高く優れた点が多いのは間違いないですが、
      その言語がいつ、何に使われているのか?ということを考えると、なぜ今現在も存在するのか理解できます
      例えば自動車はC言語で書かれているプログラムがたくさんあります
      なぜか?
      それは今までの実績あるコードを捨てて、新たに書き直すなんてことはコストがかかるからしません
      ほとんどがテストにとてつもなく膨大な時間と労力が費やされます
      自動車はテストがアホみたいなにたくさんあってたった一行書き換えただけなのに数か月のプロジェクトとかあります
      そのほとんどがテストです

    • @matsuoka-601
      @matsuoka-601 2 ปีที่แล้ว +13

      実は Python の処理系で最もメジャーなものは C で書かれてるんですよね。現代的なプログラミング言語を縁の下で支えているのは、多くの場合 C 言語なのです。

    • @phononmaser1024
      @phononmaser1024 2 ปีที่แล้ว

      @@kyoniti2681 ありがとう!
      そういう意味で今もまだ使われている事もあるんですね!

  • @0tes_tes
    @0tes_tes 2 ปีที่แล้ว +6

    ポインターの説明が分かりやすくて助かりました!

  • @damselfly-masakazu
    @damselfly-masakazu 2 ปีที่แล้ว +28

    char s[6];
    sprintf(s, “apple”);
    s[5] = ‘!’;
    printf(“%s”, s);
    この実行結果を保証できないC言語。
    解説:char型配列sに文字列“apple“を入れると、’e’の次の配列の要素はヌル文字が自動的に入る。
    C言語ではヌル文字が来たら文字列の終端と見做しているので
    ヌル文字が’!’に変わった途端文字列の終端がわからなくなり実行結果を保証できなくなる。
    また
    int *a;
    a = 256;
    *a = 1024;
    とやるだけで一般保護例外でOSが落ちるプログラムを作れるのもC言語。

    • @n506higo
      @n506higo 2 ปีที่แล้ว +8

      初めまして。僕の昔の失敗談ですが、ヌル文字でなくてstdio.hで宣言されているgetc()と同じところで定義されているEOFで困ったことが起きたことがありました。簡単な部分コードですが、以下のものが期待通り動く処理系と動かない処理系があったのです。
      FILE *fp;
      char c;
      // fp をfopenし終えたものとする
      while ((c=getc(fp)) != EOF) {
      putchar(c);
      }
      何がまずかったかというと、char c; (←ここ訂正しました)のところで c が signed char になるか unsigned char になるかが処理系依存だったのです(大きなプログラムで異常を発見してからここに到達するまでに一晩徹夜しました)。いずれの場合もEOFは -1 と定義されていました。教訓として「getc のプロトタイプ宣言通り、getc の値を代入する先は int にするべきこと、またはどうしても char に代入したければ signed char とするべきこと」を得ました。他の言語でもそうですが、ある言語がどうこういうより、ライブラリのバージョンとか処理系依存性を気にすることが大切だと思いました。
      (追記 本文中 char c; とするべきところを間違って int c; と書いていたので訂正しました。)

    • @suenucata6964
      @suenucata6964 2 ปีที่แล้ว

      同じ経験しましたよ。POSIXが制定される前にRTOSにかかわりはじめ、今でいうスレッドセーフで無い!ソースにもげんなりしたことがあります。

  • @龘䨺齉纞靐鼱麤鸞驫
    @龘䨺齉纞靐鼱麤鸞驫 2 ปีที่แล้ว +8

    初めてのプログラミング言語がC言語でよかった。

  • @Kamogashira-25-1-17-Osaka
    @Kamogashira-25-1-17-Osaka 2 ปีที่แล้ว +14

    アセンブラはメモリアドレスも明示するからコードを書く人が挙動を理解しているけど、Cはメモリ空間の割当はコンパイラ任せなので、オーバーフローした配列の領域に何が入ってるかわからないから、アセンブラより危険ですね。

  • @QuadraPro
    @QuadraPro 2 ปีที่แล้ว +16

    C言語の元は読み書きしやすいDEC アセンブラ MACRO11です。
    DECのアセンブラのアドレッシングモードそのまま、というのがポインターです。
    ポインターが意味しているものは、まさにメモリーのアドレスそのものでした。

    • @suenucata6964
      @suenucata6964 2 ปีที่แล้ว +2

      Cやったあと、PDP-11のアセンブラやりましたが、アドレッシングモードがCと同じで楽だったです。VAX11に移っても楽だったですね。。。懐かしい。

    • @QuadraPro
      @QuadraPro 2 ปีที่แล้ว

      @@suenucata6964 R1にアドレス入れて(R1)で中身にアクセス。でしたっけ。@R1なんてのも。スタックポインターはR6、-(R6)でパラメーター保存して、(R6)+で取り出す。
      これ、--iとi++の原形。なので、Cはiの前にも後ろにも使えるから便利〜と感激した記憶があります。

    • @suenucata6964
      @suenucata6964 2 ปีที่แล้ว +2

      @@QuadraPro  そうそう!。インテル・モトローラもあわせてやっていて混乱しましたが。。。レジスタにまつわる流儀はその後ARMに継承された感じです。

    • @神谷了
      @神谷了 6 หลายเดือนก่อน +1

      pop-11のアセンブラだとレジスタ相対アドレッシングモードが非対称で R++と ---Rしか無かったので自然に C 言語でもそう書きます。

  • @suenucata6964
    @suenucata6964 2 ปีที่แล้ว +3

    ミニコン時代にCを覚えました。その前には紙テープを切り貼りしFORTRAN3000で高級言語を勉強をした世代です。
     昔のCはK&R仕様でコンパイラも大らか・・・「引数の数」が合わなくてもパスしていました。(VMS-C)処理系の制約で変数などの文字数制限などは当たり前。。。
     メモリ節約のためにあらゆる技を使いましたが、現在では悪いこと?に使われるので墓場にまで持っていきます。RISCプロセッサが登場したころ、当時のコンパイラが生成するマシンコードはコンパクトで驚いた記憶があります。
     当時汎用性を高める(かなり性能は落ちる)ソースの工夫がいろいろありましたが、現在のPythonに受け継がれています。コンストラクタ・デストラクタのアイディアも当時からありましたが、メモリーリークすると「ほぼ瞬時に」落ち、バグとなったので現在ほど危険視されなかったです。主記憶MByte級になり検査ツールが重要視されてきましたね。

  • @nadotsuchi7116
    @nadotsuchi7116 2 ปีที่แล้ว +38

    ハード寄りのC言語等しか触れてこなかったので、近年の高級言語の利便性が分かりました。
    組込み系なら製品の小型化、低コスト化、リアルタイム性などを考え、必要最低限のコンピュータ(マイコン等)を
    高速動作させる必要が出てきます。
    なのでオーバーヘッドが小さく高速動作するC言語を使用しているようです。

    • @あぴよん-i5h
      @あぴよん-i5h 2 ปีที่แล้ว

      組み込みをVxWorks(というUNIX系OS)で昔からよくやってました。
      昔はオールアセンブラでしたが(80386時代位まで)、今はブート時のコードがアセンブラ必須で(というか先ずVxWorksのポーティングしないと話にならない)
      ファームもC++で書くのが普通になってきてますね。

  • @きつねねね-q5u
    @きつねねね-q5u 2 ปีที่แล้ว +57

    初学者向けプログラミング講義を受けたとき、初めてC言語を触ったが、絶対初学で習うような言語じゃないだろと思った。この動画を見て実際そうっぽくて安心した……配列の要素数を途中から増やせないとか嘘だろ??って思ったし……

    • @NKnakamura
      @NKnakamura 2 ปีที่แล้ว +23

      でもホントは他の言語では増えたときに全コピーしてくれるだけなんですよね

    • @hideonakai4773
      @hideonakai4773 2 ปีที่แล้ว +21

      mallocで配列作ってreallocすれば要素数変えられますよ

    • @吹越弘崇
      @吹越弘崇 2 ปีที่แล้ว +34

      アセンブラとかBASICみたいなメモリ直書き時代と比べると、充分初学者向けになってるんですよねぇ···
      時代の流れって恐ろしい

    • @bake3209
      @bake3209 2 ปีที่แล้ว +12

      最初にC++じゃなくてよかったと思うしかないですね。

    • @sanagi3181
      @sanagi3181 2 ปีที่แล้ว +15

      本当に低レベル言語は奥が(闇が)深い

  • @tom36260
    @tom36260 2 ปีที่แล้ว +7

    配列範囲外へのアクセスは未定義動作なので、仕様の上では任意の処理が実行されうるんですよね。
    もちろん殆どの処理系は範囲外にそのままアクセスすると思いますが

  • @lotad4695
    @lotad4695 2 ปีที่แล้ว +1

    c言語の特徴としてアセンブリ言語を呼び出せるというのがありますよね

  • @_Love_And_Peace
    @_Love_And_Peace 11 หลายเดือนก่อน +1

    面白いです。ありがとうございます。

  • @godcity888
    @godcity888 2 ปีที่แล้ว +1

    C言語を始めて習った時はポインタの概念がなかなか理解できなかったのですが、アセンブラを知るとすんなり理解できて、先にアセンブラを教えてくれればよかったのに、と思いました。

  • @YuFanLou
    @YuFanLou 2 ปีที่แล้ว +9

    興味深く拝見させていただきました。Cのメモリモデルに関わって色々面白いですね。9:56のところで「結構危険なところがあります」についてちょっと補足したいと思います。データの破壊を発生しかねないほか、そういった「out of bound」なアクセスが「undefined behavior」であり、コンパイラーが最適化することでコードを変形して違う意味になってしまう場合もあります。例えば、コードにない無限ループを生み出してしまうかもしれません。改めて、気をつけないと。

  • @棚橋吉男
    @棚橋吉男 2 ปีที่แล้ว +3

    cは知ってるけどGOは初めて見たから異星人見てる気分やw 変数の後ろに:って新鮮だわ

  • @coil0816
    @coil0816 2 ปีที่แล้ว +6

    組み込み系だとそもそもマイコンメーカーがC言語のコンパイラしか用意してないので仕方なくC言語使ってるという意識の人も多いかも。
    個人の主観ではマイコンの各種機能使おうとするとレジスタをいじり倒すことになるのでメモリを直接操作できるC言語が色々と都合がいいのかなと思う。
    まあ、CPUが変わると命令セットが違うので機械語もアセンブリ言語も変わってしまうのでその一つ上の水準になるC言語が一番組み込み屋さん的には使いやすいよねってだけの話でしょうけどね。
    OSを作るような人たちだとさらにCPUモードとか例外レベルとかそういうCPUの仕様レベルの話が必要だからアセンブリ言語から逃れられないらしいけど…本当かどうかは知らない。

  • @x700xt
    @x700xt 2 ปีที่แล้ว +3

    メモリを壊しながら進んで落ちた場合、その上書きした内容から壊した個所を予想しながらデバッグしてもんです。
    COBOL→Cの後にVB6を使いましたが、どうやってメモリ管理してるんだ?という気持ちになりましたね。string型とか。

  • @ポンコツ屋末代
    @ポンコツ屋末代 12 วันที่ผ่านมา

    ポインタで面白いと思ったのは、関数のポインタも作れるっていう点ですね。いわゆるコールバック関数を使えるし、関数の配列というのも作れる。

  • @merdekaataumati1949
    @merdekaataumati1949 2 ปีที่แล้ว +8

    変数aの値が格納されているメモリアドレスと、変数bが格納されているメモリアドレスは、必ず隣り合っているかは分からない。
    配列a[1]とa[2]なら必ず隣り合うので、ポインタの演算する時は、だいたい配列と関係がある。
    逆に、配列と関係無いところでポインタの演算は、しない方がバグが減る。

    • @MedakaNoBoo
      @MedakaNoBoo 2 ปีที่แล้ว +4

      マルチプロセッサでなければ、配列でなくても結局は隣り合うので、それ前提にコーディングすることはあった。というかポインタは配列でなくリスト構造でつかう。あくまでも動画は比較するための無理やりな例示だから、これはこれでアリだと思う。

  • @nkkatsu4819
    @nkkatsu4819 2 ปีที่แล้ว +1

    第一言語(?)がpythonで次の言語としてcを授業で習ったときは難しかったのを思い出しました

  • @アロエ-i3e
    @アロエ-i3e 2 หลายเดือนก่อน

    びっくりしたこと
    ・sprintf が文字列の変数代入に使われてること
    ・atoiが ASCII to Integer (文字列型から数値型への型変換)の略であること
    ・デバッグの時などのログ出力でも型を気にしなければいけないこと
    ・使われているメソッドの参照元を探すのが難しいこと(そもそもメソッドの中身を見に行かなければ分からない設計なのも悪いけど)
    ・try-catch機構が無いこと
    java,python,typescriptとか触った後にやると発狂しかける

  • @kagohdk7124
    @kagohdk7124 2 ปีที่แล้ว +4

    プログラマーとして仕事をやって初めて分かる恐ろしさ
    Cさわりたく無くなった

  • @gtofuji
    @gtofuji 2 ปีที่แล้ว +11

    PICみたいな、メモリーが1KB以下のマイコンを使っていると、おそらく将来的にもC(もしくはアッセンブラ)が最適。
    高級言語は遅いとかメモリー食うと言うけど、それはつまり「電気を食う」ということで、
    電池駆動やワイアレス給電、太陽電池給電のように、ギリギリの電力で動かすアプリケーションでは、致命的な欠点になる。
    まあ、どんな言語使っても、パンチカードやマークシートでプログラム書いてた時代からすれば楽。

  • @おっくん-v8r
    @おっくん-v8r 2 ปีที่แล้ว +15

    cobolとBASICしかやったことのない自分がC見るとプログラム短くてびっくりしました。変数の宣言もシンプル。
    あと、ループの終了条件も、COBOLなら「Aになるまで」と定義するのが、Cは「Aにならない間」と定義するので、最初は混乱しました。あと、桁落ちの処理ってCOBOLだとあり得ないので、それもびっくり。

  • @benikoji3
    @benikoji3 2 ปีที่แล้ว +2

    ポインタと配列が曖昧なのを悪用して、3次元配列に見せかけた3重ポインタ配列とか謎コード書いた記憶が💦

  • @TaTa-sz5nw
    @TaTa-sz5nw 2 ปีที่แล้ว +6

    今はCが高級言語に含まれない事に驚いた。

    • @satlinuxtube5260
      @satlinuxtube5260  2 ปีที่แล้ว +18

      これは口が滑った(テキストにも書いちゃってますが)ので反省しています。そもそも高級言語と低級言語というのが明確に定義されていない言葉なので安易に使わずに「アセンブリ言語といまどきのリッチな機能を持つ言語の間」くらいの言い方をすべきてした。

  • @なんでも指摘する先輩
    @なんでも指摘する先輩 2 ปีที่แล้ว +2

    ネット黎明期にC言語を習っていたけど、すぐにC++とか出てきてさらにhtmlとかやらされたりで全部投げ捨てた記憶がある。

  • @nobunak-digitalartrd1980
    @nobunak-digitalartrd1980 2 ปีที่แล้ว +16

    長いのでチャプター分けしてくれると🙏

  • @ewof
    @ewof 2 ปีที่แล้ว +1

    shoutout to the youtube algorithm for recommending this to me when i don't speak japanese

  • @君主ボーイ
    @君主ボーイ 2 ปีที่แล้ว +2

    プログラマーの掲示板みたいな所で、C言語は最も低級言語に近い高級言語と仰っている方がいらっしゃったのですが、実際そんな感じなのでしょうか?

    • @satlinuxtube5260
      @satlinuxtube5260  2 ปีที่แล้ว +2

      はい、そんなかんじです

    • @SuperPi3.14
      @SuperPi3.14 2 ปีที่แล้ว

      生産性の良いアセンブラみたいな感じですね。

  • @ninjakid256
    @ninjakid256 2 ปีที่แล้ว +2

    PC用C言語と組込み用C言語は別物のように感じます。
    前者はソフトウェア上でお膳立てされて他言語とそれほど違和感なく使える。
    後者はハードウェアの構造・挙動の理解前提でないと使えない。
    結局「CPUが何か」という部分が、他言語はPC前提でOS依存になってるから知らなくても動く。
    …合ってます?

    • @satlinuxtube5260
      @satlinuxtube5260  2 ปีที่แล้ว +1

      はい、おおむねそんなかんじです

  • @hagehagehage
    @hagehagehage 2 ปีที่แล้ว +1

    配列のサイズについて。厳密にはCにおいても配列が定義されたスコープであればsizeof(a)のようにサイズを取ることができる。ただ他の関数に渡したときにはどうやっても配列はポインタになってしまうのでサイズが取れない。
    ただし配列へのポインタという宣言ができてそこで配列のサイズを指定できる。それで配列を受け取るようにすると一応はサイズを取ることができるけど、関数の定義時にサイズを知ってなきゃならんのであんまり意味がない。つまりこういうこと。
    $ cat a.c
    #include
    void func(char (* ap)[100]) { /* apは要素数100のcharの配列へのポインタ */
    printf("%ld
    ", sizeof(*ap));
    }
    int main(void) {
    char a[100];
    func(&a);
    return 0;
    }
    $ cc a.c && ./a.out
    100
    という結果が得られる。非常に重箱の隅をつついた話だし、全く知らなくてもCのプログラムはかけるので本当に要らない情報でしたw

  • @かたくり-b8s
    @かたくり-b8s 2 ปีที่แล้ว +2

    配列の要素数はCだとsizeofで配列全体の大きさを一つ分の要素数でわるんだっけ

  • @n506higo
    @n506higo 2 ปีที่แล้ว +6

    初めまして。僕はCやC++を長らく使っていた者ですが、興味深く拝見しました。他の方もコメントでおっしゃっていますが、自分でメモリ管理(あるいは配列の長さの管理)をするならするで、最後まで面倒見ないと気持ち悪いと思いました。少し気になったのですが、最初の要素5個からなるint型の配列aについて、C言語でもsizeof(a)を使えば配列aの長さはわかるのではないでしょうか?もちろんアドレスaを他のポインタpに代入してしまうとpがポイントしているところの長さの情報は失われますが。個人的には自分がCで一からプログラムを書く場合はあまり変なバグを仕込んで困ったことはありませんが、他人のCのコードを見たりデバッグするのは苦痛ですね。

  • @miko33rd
    @miko33rd 2 ปีที่แล้ว +7

    C言語、自由度が高くて良いよね。

  • @merlioneko
    @merlioneko 2 ปีที่แล้ว +1

    あまり気にせずC使ってて結構あぶない使い方してたんだなって思った(小並感)

  • @LinksBareLeg1
    @LinksBareLeg1 2 ปีที่แล้ว +2

    これ、昔似た様なことを試したことがありますが、実行されずにbus errorで停止しました。
    なぜだろう。

    • @satlinuxtube5260
      @satlinuxtube5260  2 ปีที่แล้ว +3

      それはこの挙動が実装依存だからだと思います。環境によって挙動が変わって、多くの場合は動画のようになる、といった具合です

  • @KN-jq8xd
    @KN-jq8xd 2 ปีที่แล้ว +1

    関係ないけど、めっちゃ大学のオンライン講義受けてる感覚になる動画(現役大学生並感)

  • @KYMP_
    @KYMP_ 2 ปีที่แล้ว

    Cしか知らないからこその驚きがあって面白かった

  • @kazemichiSPR
    @kazemichiSPR 2 ปีที่แล้ว +24

    エラーを出す主体者が現代の高級言語とCでは違います。現代の高級言語はスクリプト言語なので動作時にチェックが走りますが、C言語でコンパイラオプションで違うって言ってるのはそもそもコンパイラオプションでビルドした実行ファイルが起動時に確保するメモリ領域です。gccなんかだと最適化レベルを下げるとメモリ領域を余分に確保するためにこの例のような範囲外のアクセスができますが、最適化オプションを上げると静的メモリの確保についてはだいぶ最適化されるので範囲外のアクセスはOSによって殺されます。

    • @luasimt2514
      @luasimt2514 2 ปีที่แล้ว +2

      現代の高級言語がスクリプト言語であるというのは乱暴だと思います。例えばシステムプログラミング言語であるRustはスクリプト言語ではないですし、ここで挙げられてるGoもスクリプト言語ではありません。

  • @yazi1122
    @yazi1122 2 ปีที่แล้ว +2

    画像処理系だとポインタの加算とかはよくやるかなー

  • @par6619
    @par6619 2 ปีที่แล้ว +1

    初心者のころsegmentation fault 地獄だった思い出

  • @yuki_0120
    @yuki_0120 2 ปีที่แล้ว +2

    範囲外のデータを読み書きして起こったバグってどうやって見つけるんだろう?
    確定的におかしな事が起こるとも思えないし、ランダムでバグるって最悪の事態に遭遇する気がするのですが。

    • @satlinuxtube5260
      @satlinuxtube5260  2 ปีที่แล้ว +4

      はい、おっしゃるとおりの最悪の事態になります。エスパー能力を駆使してなんとかします。一言ではとちょっと説明しづらいですねテン

    • @yuki_0120
      @yuki_0120 2 ปีที่แล้ว +1

      @@satlinuxtube5260
      考えただけでも絶対にやりたくないバグとりだな。
      影響範囲も運次第ではシステムトラブルで起こりうる最悪を引きかねないし。

  • @netbsdmania716
    @netbsdmania716 2 ปีที่แล้ว +12

    メモリ管理は初期化でPoolし、終了時にまとめてメモリ廃棄する考えでやるとバグが減りますね。経験則ですが、局所的に mallocで確保、廃棄を繰り返すと、コード量の増加に伴い、リークが増えますね。

    • @MedakaNoBoo
      @MedakaNoBoo 2 ปีที่แล้ว +2

      その経験則はOS(エンジン)依存じゃないかなあ。リーク起こさないようスレッドに分けてた記憶があるよ。

    • @netbsdmania716
      @netbsdmania716 2 ปีที่แล้ว +1

      @@MedakaNoBoo 確かにスレッド調停は必要ですね。

    • @MedakaNoBoo
      @MedakaNoBoo 2 ปีที่แล้ว +1

      @@netbsdmania716 >……
      この動画では配列(情的割り当て)だからなあ。よく知らないけどGoってのは変数(?)を動的にとるのじゃないかな。そういう意味から、確保と廃棄を繰り返すところを危惧するって話ならあるだろうし判る気がするよ。

  • @くまみみ-v5o
    @くまみみ-v5o 3 หลายเดือนก่อน

    学部でC言語をはじめに習って、その後の講義を大体C言語でこなしていたので、専門分野で他の言語を使うときにC言語ライクな書き方をしてしまうのは情報工学徒あるあるだろうか。

  • @143658906
    @143658906 2 ปีที่แล้ว +1

    競プロや研究などではC++のSTLにだいぶお世話になっています…(それでもdangling pointerやメモリリークは起きうるけど)
    やっぱり組み込み系はC++じゃなくてCを使わざるを得ないのかな?

  • @TO-tb3up
    @TO-tb3up ปีที่แล้ว

    GoってPascalっぽいですね。
    Cは配列の範囲外にアクセス出来ることが判ってて、態と構造体変数の複数の配列変数の塊のStructure{a[1,2,3], b[4,5,6], c[7,8,9]}のbやcの領域までaでアクセスしちゃえってことも出来ますね。
    可読性が悪くなるのでアルゴリズムの途中ではあまりやりませんけど。初期化の時だけとかね。aのforループ1個で全領域にHxFFを埋めるとか。

  • @グレミィ
    @グレミィ 2 ปีที่แล้ว

    はえ〜すっごいわかりやすい…
    これが所謂メモリ管理が必要とされる所以ですかね?

  • @LoveHaskell
    @LoveHaskell 2 ปีที่แล้ว +1

    懐かしいなC言語。
    配列の要素数は構造体にラッピングして使ってたな~。
    関数内ではポインタを動かせないように、ポインタ自体をconst引数にしたり初歩的なバグを出さないように書いてたな。
    もうちょい型安全な設計にして欲しかった。

  • @デフォルト-f1o
    @デフォルト-f1o 2 ปีที่แล้ว +2

    大学のオンデマンド授業受けてる気分だ

  • @baltanbeam
    @baltanbeam 2 ปีที่แล้ว +24

    ヒープオーバーを意識するのが苦手すぎて高級言語系の仕事に転職したから感慨深い内容でした😂
    Cの組み込みって開発の後半でメモリバグフリーズ原因発見に難航のパターン多発しがち💦欠陥言語とまでは言わないけれどC言語は使用する人を選ぶ認識です😇
    (ハードの知識が無い人間はやめたほうがいいってはっきり分かったんですよ😇)
    もう組み込み系には戻りたくないし、今のほうが楽だしお金もいいし偉そうに怒られないし(アセンブラやC言語使いは偏屈で意地悪な人も多かったなぁ…😭)
    …自分語り失礼しました!😭
    昔を思い出させる良い動画をありがとうございました!✨

    • @HN-hy9sn
      @HN-hy9sn 2 ปีที่แล้ว +2

      C言語に詳しい先生、嫌味臭くて嫌いだった。ディスプレイ挟んでメールでやり取りするのが限界だった

    • @神谷了
      @神谷了 6 หลายเดือนก่อน

      40年 C/C++ で組込み系のコードを書いています。 C言語を使っていても実際は #define で配列のサイズを切って使うので説明の様な事は起きないですけどね。
      組込みでも C言語だけから C++ 言語も使える様になり、, とか使えば Java と同じ様にコードを書けて楽に成りました。
      元々電気科出身でハード設計もしていたし、永く組込みをやってしまうと他の業界へは移り難いです、Web系とかやりたくても呼んでくれないです。
      移れたのだったら羨ましいです。組込み系は何10年やっても変化が無くてつまらないです。

  • @johnlennon2009nyc
    @johnlennon2009nyc 2 ปีที่แล้ว +3

    どうでしょう・・
    Int a, bは連続のアドレスにコンパイラが振ってくれれば良いですが
    アドレスpのインクリメントは危険ではありませんか?

  • @yasut.8208
    @yasut.8208 2 ปีที่แล้ว

    昔、制御系(プロコン)のプログラムを作った事があります・・・。プロコンでは、独自のプログラム言語のコンパイラは厳格に構文チェックされエラーを取るのが大変でしたが、ある時期にC言語によるプログラミングによる”移植”をする事になり、C言語の真髄を知る良い経験をしました!!ただ、実際にデバックに入ると、コンパイラの構文チェックが甘いなという感じを持ちました、今はどうなんでしょうね・・・

    • @satlinuxtube5260
      @satlinuxtube5260  2 ปีที่แล้ว

      警告とかはコンパイラ依存で、少なくとも昔に比べると今はかなり良くなったように思います

  • @はぎのつき-q3j
    @はぎのつき-q3j 2 ปีที่แล้ว +1

    ポインタ p に対する p++ は、次の変数を指し示すだろうか?
    自分の感覚では、p +=4 とかじゃないのかなって思うんですけど。

    • @satlinuxtube5260
      @satlinuxtube5260  2 ปีที่แล้ว +5

      たとえばintのポインタだとすると++でアドレスがひとつぶん(sizeof(int))進みます。4つ足すとsizeof(int)*4進みます。まあ配列外にいっちゃうと本来参照結果は未定義なんですが

    • @suenucata6964
      @suenucata6964 2 ปีที่แล้ว +2

      これはPDP-11、VAX11マシンコードの名残ですよ。アドレスレジスタは8/16/32ビットを区別した体系でした。

  • @contactMiu
    @contactMiu 2 ปีที่แล้ว

    「ここ十数年で生まれた言語」は「だいたいそう」と限定をしたのが気になります。
    ・ここ十数年以降で生まれた言語でも少ないながらあるのでしょうか?
    ・30年前から十数年前までの間の言語ではどうなのでしょうか?
    メモリ管理が必要なのって、アセンブラ, C, C++くらいしか知らないので、他にもいろいろあるなら教えてほしいです。

    • @satlinuxtube5260
      @satlinuxtube5260  2 ปีที่แล้ว

      「だいたいそう」という予防線を張ったのは、マイナーな言語で自前でメモリ管理してるものがあると困るので、こう言いました。余計分かりにくい表現になったかもですね。ごめんなさい。
      たとえば20年ほど前に私が使っていたObject Pascalは自前でメモリ管理していました。最新版では違うかもですが

  • @jean_pierre_stephan
    @jean_pierre_stephan 2 ปีที่แล้ว

    配列の範囲の話、昔のドラクエかなんかで、129 回逃げるコマンドを実行したら変なことが起こる、みたいな感じの裏技ってこう言うことなんだろうなっておもいました。

    • @ace10220
      @ace10220 หลายเดือนก่อน

      それ8bit符号あり整数じゃね?
      配列とは関係ないような…

  • @yasminosibilla
    @yasminosibilla 2 ปีที่แล้ว

    昔はH/Wに依存したソフトを作ることが多かったから、ある程度H/Wを知った人がソフトを作ってたので、メモリに書き込まれている状態をイメージしてプログラムを書いてたんですよ。だから、配列を参照する別のポインタを敢えて作って別の配列として使ったり、switch文でbreakを入れずに次のcaseへわざと落としまくったりと、プログラマの技量というかセンスが問われる言語だったんですよ。w

  • @rtype2922
    @rtype2922 2 ปีที่แล้ว +1

    23:50 未来予測ができないのなら、現在をインクリメントすれば良いじゃない(C言語

  • @Satou-hirokI
    @Satou-hirokI 2 ปีที่แล้ว

    こんな感じな言語だけど、構造体の代入演算子でのコピーができる事。(ANSI C)

  • @あぴよん-i5h
    @あぴよん-i5h 2 ปีที่แล้ว

    古くはパスカル言語でも同様ですね
    配列に対するインデックス(指標)の範囲をチェックしてるのはパスカルの方
    チェックしないのでC言語は実行速度が速いという利点もある訳だが。

  • @MedakaNoBoo
    @MedakaNoBoo 2 ปีที่แล้ว

    因みに、Goって、Object Pascalなの?

  • @SadoleNijino
    @SadoleNijino 2 ปีที่แล้ว

    元々機械語(アセンブラ)から入ってるからCのポインタ概念は理解簡単だったなぁ。特に68000のアセンブラやってたら親和性高くて困らない。

  • @juuxlb9401
    @juuxlb9401 2 ปีที่แล้ว

    C++やC#は?

  • @七星破軍
    @七星破軍 2 ปีที่แล้ว +1

    goto C言語の世界

  • @nishimuratakashi8027
    @nishimuratakashi8027 2 ปีที่แล้ว

    すみませんやらかしました面食らいました怒られました💦C言語辞典(技術評論社)みたいな、関数が中で何をしてるかの資料は必須なんですよね・・・

  • @coconuz
    @coconuz 2 ปีที่แล้ว +2

    C言語を初めて見たとき、ちょっとアセンブラっぽいなと思ったなあ

  • @karusonafon
    @karusonafon 2 ปีที่แล้ว +6

    C言語とC+++しか使ったことないからコレが常識だと思ってる
    今のところ業務で別言語を使うこともないしなあ

    • @tasasaki
      @tasasaki 2 ปีที่แล้ว +5

      もしかして: C++

    • @readme-exe
      @readme-exe 8 หลายเดือนก่อน +1

      c+++とか脳細胞で核融合が起きそうw

  • @SuperPi3.14
    @SuperPi3.14 2 ปีที่แล้ว

    組み込みではありませんが、PLCのラダー言語に比べれば、Cは高級なイメージがあります。

  • @NANA-ht8oo
    @NANA-ht8oo 2 ปีที่แล้ว

    今はc言語って必修じゃないのか

  • @ytradish8671
    @ytradish8671 2 ปีที่แล้ว

    いつの間に組込系はC言語使わなくなったの?

  • @gugulecus8782
    @gugulecus8782 9 หลายเดือนก่อน

    まあ、動画の中でも「アセンブリ言語」という単語が出てきましたが、この辺がわかってないとCはマトモに扱えないということでしょう。
    アセンブリ言語となれば当然、CPUの仕組みに関わってくるわけですからねぇ。
    レジスタ(アキュムレータ、インデックス、スタックポインタ、etc)だのフラグ(キャリーフラグ、ゼログラグ、etc)だのアドレス(0000H〜FFFFHとか)だの。

  • @MedakaNoBoo
    @MedakaNoBoo 2 ปีที่แล้ว

    (今どきの)言語は共通動作環境(エミュレータ)のなかで動くので、メモリ管理の必要はない。C言語でも(パソコン、スマホなどでは)それらと同じ動作環境のなかで動くことから、メモリ管理にも意味が無かったりする。ただ、ロボットやら家電やハードウェア制御(俗に「組み込み系」)では、こうしたポインタの罠が普通なので神経をつかう。

  • @MedakaNoBoo
    @MedakaNoBoo 2 ปีที่แล้ว

    動画ではデータベース上の値とメモリ上の値とを同列に例え話として扱っている。アクセス保護が違うんだが、まあ雰囲気だけなら間違いでもないかなあ。

  • @這い上がるアラフィフ
    @這い上がるアラフィフ 2 ปีที่แล้ว

    結局、最後は TASM か Jusmin なんだよね(´ω`)
    by 昭和のおっさんです。

  • @shirokuma1962
    @shirokuma1962 2 ปีที่แล้ว

    C言語は基本高級アセンブラ。21世紀以降に現れた言語は、メモリ管理しているのじゃないか?。ずいぶん昔は書いていていたけど、今は書きたくないなあ。

  • @山田士郎-r3l
    @山田士郎-r3l 2 ปีที่แล้ว

    ポインタ好きすぎてWeb系でゲーム作るの辛い^^

  • @hirokey2685
    @hirokey2685 2 ปีที่แล้ว

    ポケモン、セレクトバグはc言語だったから起きたのか?

    • @ababtanaka4365
      @ababtanaka4365 2 ปีที่แล้ว +2

      ゲームボーイのプログラミングはCじゃなくてアセンブラだったらしいよ

    • @山田士郎-r3l
      @山田士郎-r3l 2 ปีที่แล้ว

      配列を感じるバグを味わいたいならファミコンのFF3やるのがおすすめ。

  • @jacky827
    @jacky827 2 ปีที่แล้ว

    gcは便利だと思うけど気持ち悪く感じてしまう、c好きのオッサンです…

  • @ああ-y6s8d
    @ああ-y6s8d 2 ปีที่แล้ว +3

    cプラからでいい

    • @Gransel
      @Gransel 2 ปีที่แล้ว +2

      ふふふふふ、そんなあなたには多重継承問題(菱形継承問題)をプレゼント。これがあったからC++はメジャーになりきれなかったんだと思う

    • @神谷了
      @神谷了 6 หลายเดือนก่อน

      @@Gransel 最近は Go とか Rust とか Class が無いのが流行りなので C++ でも使わないければ良いのでは、C++全部使える人はいないと思います。