No video

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

  Рет қаралды 119,127

satlinuxtube

satlinuxtube

Күн бұрын

C言語を使ったことがない人向けに、いまどきの言語ユーザが見ると面食らいそうなC言語の特徴を説明しました。使われる場面が減りつつあるとはいえ今もC言語が現役で使われ続けている理由についても述べています。
テキスト
speakerdeck.co...
メンバーになるにはこちらをクリックしてください。とくに特典はないですが、メンバー数が多くなるとうれしくなって動画をアップロードする頻度が高まるかもしれません。
/ @satlinuxtube5260

Пікірлер: 148
@user-uh8mh2my6q
@user-uh8mh2my6q Жыл бұрын
C++とかいうCの皮を被った全く別の化け物言語すこ
@heppocogne9778
@heppocogne9778 Жыл бұрын
C言語で一番驚いたのはarray[index]は内部的には*(array+index)でしかないからarray[index]はindex[array]でも参照できる、ってやつ。
@satlinuxtube5260
@satlinuxtube5260 Жыл бұрын
わたしもびっくりしました。し、最初はなんでそうなるのか理解できなかったです
@143658906
@143658906 Жыл бұрын
これ未だによく分かっていないのですが、なぜこのような仕様になってしまったのでしょうか…
@TGrisS
@TGrisS Жыл бұрын
@@143658906 二項演算子の+は2つの項が可換だから。C言語の文法の対称的な美しさだと思います。
@user-xu2vt8ew5y
@user-xu2vt8ew5y Жыл бұрын
でも書き方によっては最適化が変わって動作速度に影響が出るんだよなぁ
@bassHeroKomi957
@bassHeroKomi957 Жыл бұрын
ほえおもろ
@mighty-999
@mighty-999 Жыл бұрын
DOS時代にCでプログラムしていると、自由にメモリアクセスして(もちろんよくぶっ飛ぶw)ハードを直接制御できたりして、目の前のパソコンを自分がすべて乗っ取った気分になって楽しかった気がします。VRAM領域に適当に値を書き込んだら画面上にゴミとして表示されたりw、コンピューターの基礎構造が近く感じられて勉強にもなりましたね。
@n-bun1um3
@n-bun1um3 Жыл бұрын
楽しそう
@mo-39
@mo-39 Жыл бұрын
C言語から入った人間からすると、メモリ管理しない言語の方が不安がある。 Javaとかで原因が分からないエラーとかに当たると、ガベージコレクションとか疑う。
@numauo
@numauo Жыл бұрын
今現役でCの開発、コーディングをしていて、Cしかまともに使ったことが無い新人プログラマーだけど、これがここまで丁寧に説明されないとわからないくらい他の言語ではありえないって事実に逆にびっくりしてる 業務上mapファイルでメモリの配置やソフトでアセンブリ言語に変換後のコードを見てms以下の単位で高速化を見たことあるので、ここまでではないにしろ他の言語でもメモリ配置は大まかに管理してるものだと思ってました
@phononmaser1024
@phononmaser1024 Жыл бұрын
こういう動画のコメントにはプログラマの体験談やプログラムがあるから勉強になるし読んでて面白い。
@user-ql3qd4bc9k
@user-ql3qd4bc9k Жыл бұрын
図鑑にない変なポケモンを捕まえたりできた理由かもしれない。というか、ほぼ確定的にそう。
@lv.4854
@lv.4854 Жыл бұрын
このコメントのおかげで何を言っているか理解できた 本当にありがとうございます
@katsuk6295
@katsuk6295 Жыл бұрын
ぷにぷに あのバグの原因はまさにこれなんですよね・・・
@sy3017
@sy3017 Жыл бұрын
アイテムや技の入れ替え裏技はポインタバグによるもの。
@phononmaser1024
@phononmaser1024 Жыл бұрын
めちゃくちゃしっくりきた。ありがとう
@nadotsuchi7116
@nadotsuchi7116 Жыл бұрын
ハード寄りのC言語等しか触れてこなかったので、近年の高級言語の利便性が分かりました。 組込み系なら製品の小型化、低コスト化、リアルタイム性などを考え、必要最低限のコンピュータ(マイコン等)を 高速動作させる必要が出てきます。 なのでオーバーヘッドが小さく高速動作するC言語を使用しているようです。
@user-xu2vt8ew5y
@user-xu2vt8ew5y Жыл бұрын
組み込みをVxWorks(というUNIX系OS)で昔からよくやってました。 昔はオールアセンブラでしたが(80386時代位まで)、今はブート時のコードがアセンブラ必須で(というか先ずVxWorksのポーティングしないと話にならない) ファームもC++で書くのが普通になってきてますね。
@lurefishing5350
@lurefishing5350 Жыл бұрын
Cは便利なアセンブラってイメージですね。DOSの頃の知人は標準ライブラリ使わずに、まんまアセンブラ代わりにプログラミングしてました。
@user-mk4os4uh9t
@user-mk4os4uh9t Жыл бұрын
アセンブラはメモリアドレスも明示するからコードを書く人が挙動を理解しているけど、Cはメモリ空間の割当はコンパイラ任せなので、オーバーフローした配列の領域に何が入ってるかわからないから、アセンブラより危険ですね。
@newmarimo
@newmarimo Жыл бұрын
ポインタが難しいのは文法の設計と記号の使いまわしのせい だと思う。
@xx--xx5457
@xx--xx5457 Жыл бұрын
プログラミング学習はPython3から入った勢だけど、1年前に初めてC言語触った時は眩暈がしそうだった... 「こんな面倒くさい言語が何のために存在するのか」と......今は存在意義をチョットダケ理解していると思います
@kyoniti2681
@kyoniti2681 Жыл бұрын
言語単体を存在意義で考えると当然新しい言語の方が利便性が高く優れた点が多いのは間違いないですが、 その言語がいつ、何に使われているのか?ということを考えると、なぜ今現在も存在するのか理解できます 例えば自動車はC言語で書かれているプログラムがたくさんあります なぜか? それは今までの実績あるコードを捨てて、新たに書き直すなんてことはコストがかかるからしません ほとんどがテストにとてつもなく膨大な時間と労力が費やされます 自動車はテストがアホみたいなにたくさんあってたった一行書き換えただけなのに数か月のプロジェクトとかあります そのほとんどがテストです
@kicchan123
@kicchan123 Жыл бұрын
実は Python の処理系で最もメジャーなものは C で書かれてるんですよね。現代的なプログラミング言語を縁の下で支えているのは、多くの場合 C 言語なのです。
@phononmaser1024
@phononmaser1024 Жыл бұрын
@@kyoniti2681 ありがとう! そういう意味で今もまだ使われている事もあるんですね!
@QuadraPro
@QuadraPro Жыл бұрын
C言語の元は読み書きしやすいDEC アセンブラ MACRO11です。 DECのアセンブラのアドレッシングモードそのまま、というのがポインターです。 ポインターが意味しているものは、まさにメモリーのアドレスそのものでした。
@suenucata6964
@suenucata6964 Жыл бұрын
Cやったあと、PDP-11のアセンブラやりましたが、アドレッシングモードがCと同じで楽だったです。VAX11に移っても楽だったですね。。。懐かしい。
@QuadraPro
@QuadraPro Жыл бұрын
@@suenucata6964 R1にアドレス入れて(R1)で中身にアクセス。でしたっけ。@R1なんてのも。スタックポインターはR6、-(R6)でパラメーター保存して、(R6)+で取り出す。 これ、--iとi++の原形。なので、Cはiの前にも後ろにも使えるから便利〜と感激した記憶があります。
@suenucata6964
@suenucata6964 Жыл бұрын
@@QuadraPro  そうそう!。インテル・モトローラもあわせてやっていて混乱しましたが。。。レジスタにまつわる流儀はその後ARMに継承された感じです。
@user-yw8vo7np6i
@user-yw8vo7np6i 2 ай бұрын
pop-11のアセンブラだとレジスタ相対アドレッシングモードが非対称で R++と ---Rしか無かったので自然に C 言語でもそう書きます。
@user-bz6pc8eu3h
@user-bz6pc8eu3h Жыл бұрын
C全然知らないんですが、こうやって特徴だけ教えてくれると楽しく勉強できるので良かったです
@kawakitasaika_majinukeru
@kawakitasaika_majinukeru Жыл бұрын
業務ではC言語とPythonを使ってます。二つの言語が違いすぎて頭がキーンとなります。
@龘䨺齉纞靐鼱麤鸞驫
@龘䨺齉纞靐鼱麤鸞驫 Жыл бұрын
初めてのプログラミング言語がC言語でよかった。
@soul5tealer99
@soul5tealer99 Жыл бұрын
教授みたいな声で聞いてて凄い安心する
@damselfly-masakazu
@damselfly-masakazu Жыл бұрын
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 Жыл бұрын
初めまして。僕の昔の失敗談ですが、ヌル文字でなくて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 Жыл бұрын
同じ経験しましたよ。POSIXが制定される前にRTOSにかかわりはじめ、今でいうスレッドセーフで無い!ソースにもげんなりしたことがあります。
@fgetaoist
@fgetaoist Жыл бұрын
今世紀に入ってからはCとご無沙汰でしたので、懐かしく拝見しました。 Cの盛期は80年代から90年代にかけてのような気がしますが(コードの保守はその後も続きますけど)、あの時代のマシンスペックでは今時の高級言語の処理系を走らせるのはキビしかったです。初期の Javaは遅くて使えないという評価で一時廃れかけましたし、Perl も 4.036 の時代は DOS エクステンダーで 32 bit 化して使ってた記憶があります。 CPUの処理速度もそうですが、16 bit 時代はメモリ空間の制約が厳しかったですね。 Cのむき出しさ加減は、あの時代のハードウェア性能にあわせてチューニングされていたように思います。インラインアセンブラなんかはその名残ですよね。 組込系では今後も需要があるでしょうし、アーキテクチャを理解せざるを得ないので習得できれば力がつく、という面からも若い人には経験してもらいたい言語ではありますけど。 私自身は中高年になってしまったので、Cでコードを書く体力と集中力はもうないです。
@suenucata6964
@suenucata6964 Жыл бұрын
ミニコン時代にCを覚えました。その前には紙テープを切り貼りしFORTRAN3000で高級言語を勉強をした世代です。  昔のCはK&R仕様でコンパイラも大らか・・・「引数の数」が合わなくてもパスしていました。(VMS-C)処理系の制約で変数などの文字数制限などは当たり前。。。  メモリ節約のためにあらゆる技を使いましたが、現在では悪いこと?に使われるので墓場にまで持っていきます。RISCプロセッサが登場したころ、当時のコンパイラが生成するマシンコードはコンパクトで驚いた記憶があります。  当時汎用性を高める(かなり性能は落ちる)ソースの工夫がいろいろありましたが、現在のPythonに受け継がれています。コンストラクタ・デストラクタのアイディアも当時からありましたが、メモリーリークすると「ほぼ瞬時に」落ち、バグとなったので現在ほど危険視されなかったです。主記憶MByte級になり検査ツールが重要視されてきましたね。
@YuFanLou
@YuFanLou Жыл бұрын
興味深く拝見させていただきました。Cのメモリモデルに関わって色々面白いですね。9:56のところで「結構危険なところがあります」についてちょっと補足したいと思います。データの破壊を発生しかねないほか、そういった「out of bound」なアクセスが「undefined behavior」であり、コンパイラーが最適化することでコードを変形して違う意味になってしまう場合もあります。例えば、コードにない無限ループを生み出してしまうかもしれません。改めて、気をつけないと。
@tom36260
@tom36260 Жыл бұрын
配列範囲外へのアクセスは未定義動作なので、仕様の上では任意の処理が実行されうるんですよね。 もちろん殆どの処理系は範囲外にそのままアクセスすると思いますが
@coil0816
@coil0816 Жыл бұрын
組み込み系だとそもそもマイコンメーカーがC言語のコンパイラしか用意してないので仕方なくC言語使ってるという意識の人も多いかも。 個人の主観ではマイコンの各種機能使おうとするとレジスタをいじり倒すことになるのでメモリを直接操作できるC言語が色々と都合がいいのかなと思う。 まあ、CPUが変わると命令セットが違うので機械語もアセンブリ言語も変わってしまうのでその一つ上の水準になるC言語が一番組み込み屋さん的には使いやすいよねってだけの話でしょうけどね。 OSを作るような人たちだとさらにCPUモードとか例外レベルとかそういうCPUの仕様レベルの話が必要だからアセンブリ言語から逃れられないらしいけど…本当かどうかは知らない。
@user-nl7xj6jj4s
@user-nl7xj6jj4s Жыл бұрын
初学者向けプログラミング講義を受けたとき、初めてC言語を触ったが、絶対初学で習うような言語じゃないだろと思った。この動画を見て実際そうっぽくて安心した……配列の要素数を途中から増やせないとか嘘だろ??って思ったし……
@NKnakamura
@NKnakamura Жыл бұрын
でもホントは他の言語では増えたときに全コピーしてくれるだけなんですよね
@hideonakai4773
@hideonakai4773 Жыл бұрын
mallocで配列作ってreallocすれば要素数変えられますよ
@user-fk5gy6ey6e
@user-fk5gy6ey6e Жыл бұрын
アセンブラとかBASICみたいなメモリ直書き時代と比べると、充分初学者向けになってるんですよねぇ··· 時代の流れって恐ろしい
@bake3209
@bake3209 Жыл бұрын
最初にC++じゃなくてよかったと思うしかないですね。
@sanagi3181
@sanagi3181 Жыл бұрын
本当に低レベル言語は奥が(闇が)深い
@user-vp4vk4qm5y
@user-vp4vk4qm5y Жыл бұрын
cobolとBASICしかやったことのない自分がC見るとプログラム短くてびっくりしました。変数の宣言もシンプル。 あと、ループの終了条件も、COBOLなら「Aになるまで」と定義するのが、Cは「Aにならない間」と定義するので、最初は混乱しました。あと、桁落ちの処理ってCOBOLだとあり得ないので、それもびっくり。
@merdekaataumati1949
@merdekaataumati1949 Жыл бұрын
変数aの値が格納されているメモリアドレスと、変数bが格納されているメモリアドレスは、必ず隣り合っているかは分からない。 配列a[1]とa[2]なら必ず隣り合うので、ポインタの演算する時は、だいたい配列と関係がある。 逆に、配列と関係無いところでポインタの演算は、しない方がバグが減る。
@MedakaNoBoo
@MedakaNoBoo Жыл бұрын
マルチプロセッサでなければ、配列でなくても結局は隣り合うので、それ前提にコーディングすることはあった。というかポインタは配列でなくリスト構造でつかう。あくまでも動画は比較するための無理やりな例示だから、これはこれでアリだと思う。
@0tes_tes
@0tes_tes Жыл бұрын
ポインターの説明が分かりやすくて助かりました!
@gtofuji
@gtofuji Жыл бұрын
PICみたいな、メモリーが1KB以下のマイコンを使っていると、おそらく将来的にもC(もしくはアッセンブラ)が最適。 高級言語は遅いとかメモリー食うと言うけど、それはつまり「電気を食う」ということで、 電池駆動やワイアレス給電、太陽電池給電のように、ギリギリの電力で動かすアプリケーションでは、致命的な欠点になる。 まあ、どんな言語使っても、パンチカードやマークシートでプログラム書いてた時代からすれば楽。
@godcity888
@godcity888 Жыл бұрын
C言語を始めて習った時はポインタの概念がなかなか理解できなかったのですが、アセンブラを知るとすんなり理解できて、先にアセンブラを教えてくれればよかったのに、と思いました。
@x700xt
@x700xt Жыл бұрын
メモリを壊しながら進んで落ちた場合、その上書きした内容から壊した個所を予想しながらデバッグしてもんです。 COBOL→Cの後にVB6を使いましたが、どうやってメモリ管理してるんだ?という気持ちになりましたね。string型とか。
@kagohdk7124
@kagohdk7124 Жыл бұрын
プログラマーとして仕事をやって初めて分かる恐ろしさ Cさわりたく無くなった
@benikoji3
@benikoji3 Жыл бұрын
ポインタと配列が曖昧なのを悪用して、3次元配列に見せかけた3重ポインタ配列とか謎コード書いた記憶が💦
@nobunak-digitalartrd1980
@nobunak-digitalartrd1980 Жыл бұрын
長いのでチャプター分けしてくれると🙏
@baltanbeam
@baltanbeam Жыл бұрын
ヒープオーバーを意識するのが苦手すぎて高級言語系の仕事に転職したから感慨深い内容でした😂 Cの組み込みって開発の後半でメモリバグフリーズ原因発見に難航のパターン多発しがち💦欠陥言語とまでは言わないけれどC言語は使用する人を選ぶ認識です😇 (ハードの知識が無い人間はやめたほうがいいってはっきり分かったんですよ😇) もう組み込み系には戻りたくないし、今のほうが楽だしお金もいいし偉そうに怒られないし(アセンブラやC言語使いは偏屈で意地悪な人も多かったなぁ…😭) …自分語り失礼しました!😭 昔を思い出させる良い動画をありがとうございました!✨
@HN-hy9sn
@HN-hy9sn Жыл бұрын
C言語に詳しい先生、嫌味臭くて嫌いだった。ディスプレイ挟んでメールでやり取りするのが限界だった
@user-yw8vo7np6i
@user-yw8vo7np6i 2 ай бұрын
40年 C/C++ で組込み系のコードを書いています。 C言語を使っていても実際は #define で配列のサイズを切って使うので説明の様な事は起きないですけどね。 組込みでも C言語だけから C++ 言語も使える様になり、, とか使えば Java と同じ様にコードを書けて楽に成りました。 元々電気科出身でハード設計もしていたし、永く組込みをやってしまうと他の業界へは移り難いです、Web系とかやりたくても呼んでくれないです。 移れたのだったら羨ましいです。組込み系は何10年やっても変化が無くてつまらないです。
@_Love_And_Peace
@_Love_And_Peace 7 ай бұрын
面白いです。ありがとうございます。
@user-jr1qh7es8k
@user-jr1qh7es8k Жыл бұрын
ネット黎明期にC言語を習っていたけど、すぐにC++とか出てきてさらにhtmlとかやらされたりで全部投げ捨てた記憶がある。
@nkkatsu4819
@nkkatsu4819 Жыл бұрын
第一言語(?)がpythonで次の言語としてcを授業で習ったときは難しかったのを思い出しました
@n506higo
@n506higo Жыл бұрын
初めまして。僕はCやC++を長らく使っていた者ですが、興味深く拝見しました。他の方もコメントでおっしゃっていますが、自分でメモリ管理(あるいは配列の長さの管理)をするならするで、最後まで面倒見ないと気持ち悪いと思いました。少し気になったのですが、最初の要素5個からなるint型の配列aについて、C言語でもsizeof(a)を使えば配列aの長さはわかるのではないでしょうか?もちろんアドレスaを他のポインタpに代入してしまうとpがポイントしているところの長さの情報は失われますが。個人的には自分がCで一からプログラムを書く場合はあまり変なバグを仕込んで困ったことはありませんが、他人のCのコードを見たりデバッグするのは苦痛ですね。
@user-ru3mn8eo4p
@user-ru3mn8eo4p Жыл бұрын
cは知ってるけどGOは初めて見たから異星人見てる気分やw 変数の後ろに:って新鮮だわ
@ewof
@ewof Жыл бұрын
shoutout to the youtube algorithm for recommending this to me when i don't speak japanese
@ninjakid256
@ninjakid256 Жыл бұрын
PC用C言語と組込み用C言語は別物のように感じます。 前者はソフトウェア上でお膳立てされて他言語とそれほど違和感なく使える。 後者はハードウェアの構造・挙動の理解前提でないと使えない。 結局「CPUが何か」という部分が、他言語はPC前提でOS依存になってるから知らなくても動く。 …合ってます?
@satlinuxtube5260
@satlinuxtube5260 Жыл бұрын
はい、おおむねそんなかんじです
@TaTa-sz5nw
@TaTa-sz5nw Жыл бұрын
今はCが高級言語に含まれない事に驚いた。
@satlinuxtube5260
@satlinuxtube5260 Жыл бұрын
これは口が滑った(テキストにも書いちゃってますが)ので反省しています。そもそも高級言語と低級言語というのが明確に定義されていない言葉なので安易に使わずに「アセンブリ言語といまどきのリッチな機能を持つ言語の間」くらいの言い方をすべきてした。
@miko33rd
@miko33rd Жыл бұрын
C言語、自由度が高くて良いよね。
@netbsdmania716
@netbsdmania716 Жыл бұрын
メモリ管理は初期化でPoolし、終了時にまとめてメモリ廃棄する考えでやるとバグが減りますね。経験則ですが、局所的に mallocで確保、廃棄を繰り返すと、コード量の増加に伴い、リークが増えますね。
@MedakaNoBoo
@MedakaNoBoo Жыл бұрын
その経験則はOS(エンジン)依存じゃないかなあ。リーク起こさないようスレッドに分けてた記憶があるよ。
@netbsdmania716
@netbsdmania716 Жыл бұрын
@@MedakaNoBoo 確かにスレッド調停は必要ですね。
@MedakaNoBoo
@MedakaNoBoo Жыл бұрын
@@netbsdmania716 >…… この動画では配列(情的割り当て)だからなあ。よく知らないけどGoってのは変数(?)を動的にとるのじゃないかな。そういう意味から、確保と廃棄を繰り返すところを危惧するって話ならあるだろうし判る気がするよ。
@lotad4695
@lotad4695 Жыл бұрын
c言語の特徴としてアセンブリ言語を呼び出せるというのがありますよね
@hagehagehage
@hagehagehage Жыл бұрын
配列のサイズについて。厳密には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
@LoveHaskell
@LoveHaskell Жыл бұрын
懐かしいなC言語。 配列の要素数は構造体にラッピングして使ってたな~。 関数内ではポインタを動かせないように、ポインタ自体をconst引数にしたり初歩的なバグを出さないように書いてたな。 もうちょい型安全な設計にして欲しかった。
@user-uk9zn6vg8q
@user-uk9zn6vg8q Жыл бұрын
配列の要素数はCだとsizeofで配列全体の大きさを一つ分の要素数でわるんだっけ
@merlioneko
@merlioneko Жыл бұрын
あまり気にせずC使ってて結構あぶない使い方してたんだなって思った(小並感)
@KN-jq8xd
@KN-jq8xd Жыл бұрын
関係ないけど、めっちゃ大学のオンライン講義受けてる感覚になる動画(現役大学生並感)
@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を埋めるとか。
@user-ct3gn1lm7p
@user-ct3gn1lm7p Жыл бұрын
大学のオンデマンド授業受けてる気分だ
@kazemichiSPR
@kazemichiSPR Жыл бұрын
エラーを出す主体者が現代の高級言語とCでは違います。現代の高級言語はスクリプト言語なので動作時にチェックが走りますが、C言語でコンパイラオプションで違うって言ってるのはそもそもコンパイラオプションでビルドした実行ファイルが起動時に確保するメモリ領域です。gccなんかだと最適化レベルを下げるとメモリ領域を余分に確保するためにこの例のような範囲外のアクセスができますが、最適化オプションを上げると静的メモリの確保についてはだいぶ最適化されるので範囲外のアクセスはOSによって殺されます。
@luasimt2514
@luasimt2514 Жыл бұрын
現代の高級言語がスクリプト言語であるというのは乱暴だと思います。例えばシステムプログラミング言語であるRustはスクリプト言語ではないですし、ここで挙げられてるGoもスクリプト言語ではありません。
@143658906
@143658906 Жыл бұрын
競プロや研究などではC++のSTLにだいぶお世話になっています…(それでもdangling pointerやメモリリークは起きうるけど) やっぱり組み込み系はC++じゃなくてCを使わざるを得ないのかな?
@KYMP_
@KYMP_ Жыл бұрын
Cしか知らないからこその驚きがあって面白かった
@par6619
@par6619 Жыл бұрын
初心者のころsegmentation fault 地獄だった思い出
@jean_pierre_stephan
@jean_pierre_stephan Жыл бұрын
配列の範囲の話、昔のドラクエかなんかで、129 回逃げるコマンドを実行したら変なことが起こる、みたいな感じの裏技ってこう言うことなんだろうなっておもいました。
@user-jg6vl1es1q
@user-jg6vl1es1q Жыл бұрын
他言語でnewを使ってインスタンスを生成してるのを見ると一瞬ヒヤッとしてしまう今日この頃 配列は基準アドレスからの距離で見てるっぽいから、ポインタと実質的な違いはないっぽそう(小並感)
@user-yl4ch5cg7b
@user-yl4ch5cg7b Жыл бұрын
プログラマーの掲示板みたいな所で、C言語は最も低級言語に近い高級言語と仰っている方がいらっしゃったのですが、実際そんな感じなのでしょうか?
@satlinuxtube5260
@satlinuxtube5260 Жыл бұрын
はい、そんなかんじです
@SuperPi3.14
@SuperPi3.14 Жыл бұрын
生産性の良いアセンブラみたいな感じですね。
@yasminosibilla
@yasminosibilla Жыл бұрын
昔はH/Wに依存したソフトを作ることが多かったから、ある程度H/Wを知った人がソフトを作ってたので、メモリに書き込まれている状態をイメージしてプログラムを書いてたんですよ。だから、配列を参照する別のポインタを敢えて作って別の配列として使ったり、switch文でbreakを入れずに次のcaseへわざと落としまくったりと、プログラマの技量というかセンスが問われる言語だったんですよ。w
@johnlennon2009nyc
@johnlennon2009nyc Жыл бұрын
どうでしょう・・ Int a, bは連続のアドレスにコンパイラが振ってくれれば良いですが アドレスpのインクリメントは危険ではありませんか?
@user-xu2vt8ew5y
@user-xu2vt8ew5y Жыл бұрын
古くはパスカル言語でも同様ですね 配列に対するインデックス(指標)の範囲をチェックしてるのはパスカルの方 チェックしないのでC言語は実行速度が速いという利点もある訳だが。
@yasut.8208
@yasut.8208 Жыл бұрын
昔、制御系(プロコン)のプログラムを作った事があります・・・。プロコンでは、独自のプログラム言語のコンパイラは厳格に構文チェックされエラーを取るのが大変でしたが、ある時期にC言語によるプログラミングによる”移植”をする事になり、C言語の真髄を知る良い経験をしました!!ただ、実際にデバックに入ると、コンパイラの構文チェックが甘いなという感じを持ちました、今はどうなんでしょうね・・・
@satlinuxtube5260
@satlinuxtube5260 Жыл бұрын
警告とかはコンパイラ依存で、少なくとも昔に比べると今はかなり良くなったように思います
@yuki_0120
@yuki_0120 Жыл бұрын
範囲外のデータを読み書きして起こったバグってどうやって見つけるんだろう? 確定的におかしな事が起こるとも思えないし、ランダムでバグるって最悪の事態に遭遇する気がするのですが。
@satlinuxtube5260
@satlinuxtube5260 Жыл бұрын
はい、おっしゃるとおりの最悪の事態になります。エスパー能力を駆使してなんとかします。一言ではとちょっと説明しづらいですねテン
@yuki_0120
@yuki_0120 Жыл бұрын
@@satlinuxtube5260 考えただけでも絶対にやりたくないバグとりだな。 影響範囲も運次第ではシステムトラブルで起こりうる最悪を引きかねないし。
@LinksBareLeg1
@LinksBareLeg1 Жыл бұрын
これ、昔似た様なことを試したことがありますが、実行されずにbus errorで停止しました。 なぜだろう。
@satlinuxtube5260
@satlinuxtube5260 Жыл бұрын
それはこの挙動が実装依存だからだと思います。環境によって挙動が変わって、多くの場合は動画のようになる、といった具合です
@gugulecus8782
@gugulecus8782 5 ай бұрын
まあ、動画の中でも「アセンブリ言語」という単語が出てきましたが、この辺がわかってないとCはマトモに扱えないということでしょう。 アセンブリ言語となれば当然、CPUの仕組みに関わってくるわけですからねぇ。 レジスタ(アキュムレータ、インデックス、スタックポインタ、etc)だのフラグ(キャリーフラグ、ゼログラグ、etc)だのアドレス(0000H〜FFFFHとか)だの。
@yazi1122
@yazi1122 Жыл бұрын
画像処理系だとポインタの加算とかはよくやるかなー
@Satou-hirokI
@Satou-hirokI Жыл бұрын
こんな感じな言語だけど、構造体の代入演算子でのコピーができる事。(ANSI C)
@rtype2922
@rtype2922 Жыл бұрын
23:50 未来予測ができないのなら、現在をインクリメントすれば良いじゃない(C言語
@SadoleNijino
@SadoleNijino Жыл бұрын
元々機械語(アセンブラ)から入ってるからCのポインタ概念は理解簡単だったなぁ。特に68000のアセンブラやってたら親和性高くて困らない。
@contactMiu
@contactMiu Жыл бұрын
「ここ十数年で生まれた言語」は「だいたいそう」と限定をしたのが気になります。 ・ここ十数年以降で生まれた言語でも少ないながらあるのでしょうか? ・30年前から十数年前までの間の言語ではどうなのでしょうか? メモリ管理が必要なのって、アセンブラ, C, C++くらいしか知らないので、他にもいろいろあるなら教えてほしいです。
@satlinuxtube5260
@satlinuxtube5260 Жыл бұрын
「だいたいそう」という予防線を張ったのは、マイナーな言語で自前でメモリ管理してるものがあると困るので、こう言いました。余計分かりにくい表現になったかもですね。ごめんなさい。 たとえば20年ほど前に私が使っていたObject Pascalは自前でメモリ管理していました。最新版では違うかもですが
@coconuz
@coconuz Жыл бұрын
C言語を初めて見たとき、ちょっとアセンブラっぽいなと思ったなあ
@user-ve8gm2eq8s
@user-ve8gm2eq8s Жыл бұрын
はえ〜すっごいわかりやすい… これが所謂メモリ管理が必要とされる所以ですかね?
@MedakaNoBoo
@MedakaNoBoo Жыл бұрын
(今どきの)言語は共通動作環境(エミュレータ)のなかで動くので、メモリ管理の必要はない。C言語でも(パソコン、スマホなどでは)それらと同じ動作環境のなかで動くことから、メモリ管理にも意味が無かったりする。ただ、ロボットやら家電やハードウェア制御(俗に「組み込み系」)では、こうしたポインタの罠が普通なので神経をつかう。
@user-vt1gn2hc9w
@user-vt1gn2hc9w Жыл бұрын
goto C言語の世界
@user-en3ji8lf2h
@user-en3ji8lf2h Жыл бұрын
ポインタ p に対する p++ は、次の変数を指し示すだろうか? 自分の感覚では、p +=4 とかじゃないのかなって思うんですけど。
@satlinuxtube5260
@satlinuxtube5260 Жыл бұрын
たとえばintのポインタだとすると++でアドレスがひとつぶん(sizeof(int))進みます。4つ足すとsizeof(int)*4進みます。まあ配列外にいっちゃうと本来参照結果は未定義なんですが
@suenucata6964
@suenucata6964 Жыл бұрын
これはPDP-11、VAX11マシンコードの名残ですよ。アドレスレジスタは8/16/32ビットを区別した体系でした。
@nishimuratakashi8027
@nishimuratakashi8027 Жыл бұрын
すみませんやらかしました面食らいました怒られました💦C言語辞典(技術評論社)みたいな、関数が中で何をしてるかの資料は必須なんですよね・・・
@karusonafon
@karusonafon Жыл бұрын
C言語とC+++しか使ったことないからコレが常識だと思ってる 今のところ業務で別言語を使うこともないしなあ
@tasasaki
@tasasaki Жыл бұрын
もしかして: C++
@readme-exe
@readme-exe 4 ай бұрын
c+++とか脳細胞で核融合が起きそうw
@SuperPi3.14
@SuperPi3.14 Жыл бұрын
組み込みではありませんが、PLCのラダー言語に比べれば、Cは高級なイメージがあります。
@NANA-ht8oo
@NANA-ht8oo Жыл бұрын
今はc言語って必修じゃないのか
@MedakaNoBoo
@MedakaNoBoo Жыл бұрын
動画ではデータベース上の値とメモリ上の値とを同列に例え話として扱っている。アクセス保護が違うんだが、まあ雰囲気だけなら間違いでもないかなあ。
@juuxlb9401
@juuxlb9401 Жыл бұрын
C++やC#は?
@MedakaNoBoo
@MedakaNoBoo Жыл бұрын
因みに、Goって、Object Pascalなの?
@user-eq2dh7fm1m
@user-eq2dh7fm1m Жыл бұрын
結局、最後は TASM か Jusmin なんだよね(´ω`) by 昭和のおっさんです。
@ytradish8671
@ytradish8671 Жыл бұрын
いつの間に組込系はC言語使わなくなったの?
@shirokuma1962
@shirokuma1962 Жыл бұрын
C言語は基本高級アセンブラ。21世紀以降に現れた言語は、メモリ管理しているのじゃないか?。ずいぶん昔は書いていていたけど、今は書きたくないなあ。
@user-hk5bb4oy7e
@user-hk5bb4oy7e Жыл бұрын
ポインタ好きすぎてWeb系でゲーム作るの辛い^^
@hirokey2685
@hirokey2685 Жыл бұрын
ポケモン、セレクトバグはc言語だったから起きたのか?
@ababtanaka4365
@ababtanaka4365 Жыл бұрын
ゲームボーイのプログラミングはCじゃなくてアセンブラだったらしいよ
@user-hk5bb4oy7e
@user-hk5bb4oy7e Жыл бұрын
配列を感じるバグを味わいたいならファミコンのFF3やるのがおすすめ。
@jacky827
@jacky827 Жыл бұрын
gcは便利だと思うけど気持ち悪く感じてしまう、c好きのオッサンです…
@user-sh5to3su1v
@user-sh5to3su1v Жыл бұрын
cプラからでいい
@Gransel
@Gransel Жыл бұрын
ふふふふふ、そんなあなたには多重継承問題(菱形継承問題)をプレゼント。これがあったからC++はメジャーになりきれなかったんだと思う
@user-yw8vo7np6i
@user-yw8vo7np6i 2 ай бұрын
@@Gransel 最近は Go とか Rust とか Class が無いのが流行りなので C++ でも使わないければ良いのでは、C++全部使える人はいないと思います。
その54 仮想記憶 ~概念編~
17:23
satlinuxtube
Рет қаралды 2,1 М.
SPONGEBOB POWER-UPS IN BRAWL STARS!!!
08:35
Brawl Stars
Рет қаралды 18 МЛН
Happy birthday to you by Tsuriki Show
00:12
Tsuriki Show
Рет қаралды 11 МЛН
Yum 😋 cotton candy 🍭
00:18
Nadir Show
Рет қаралды 7 МЛН
C言語を超かんたんに解説【例えで直感的に理解可能】
16:17
なかしーの電子工作部
Рет қаралды 272 М.
コードレビューや変数名やメソッド名の命名は AI に任せちゃおう
10:33
8分でわかるレイトレーシング
8:14
ヘロンの数学ちゃんねる
Рет қаралды 68 М.
SPONGEBOB POWER-UPS IN BRAWL STARS!!!
08:35
Brawl Stars
Рет қаралды 18 МЛН