タグ

C言語に関するigrepのブックマーク (31)

  • 関数の定義位置により結果が変わるコード

    はじめに 少し前、こんなポストをしました。 これは、C言語において、関数の宣言よりも前に関数呼び出しがあり、かつ引数の型が異なる場合、結果が想定の逆になってしまう、というものです。 この現象の質は、暗黙のプロトタイプ宣言とABIにあり、以下の記事で説明は尽きています。 Cの可変長引数とABIの奇妙な関係 ですが、先のポストへの反応を見ていると、いまいち何が起きているかが伝わっていないようだったので、簡単に説明しようと思います。 以下、使用コンパイラはGCC 9.3.0、環境はWSL上のUbuntu 20.04です。 現象 まず、この現象はprintf関数が質ではありません。それを見るため、以下のようなコードを書いてみましょう。

    関数の定義位置により結果が変わるコード
  • 2で割ることと3で割ること - Qiita

    この記事でお題にするのはCPUレジスタ上の整数除算です。以下、単に除算とも書きます。 除算は非常に高コストな演算なため、コンパイラは最適化によって、できるだけ整数除算を別の計算に置き換えようとします。 最適化ができる場合の一つとして、割る数が定数である場合があります。頭のいいコンパイラは、除算を乗算とビットシフト等を駆使した演算に置き換えます。この記事では、そういった最適化の背景にある理屈を部分的に解説します。 計算機環境としてはモダンなx86 CPUを仮定します。したがってレジスタは32/64ビットであり、負数は2の補数表現になっています。ある程度は他の命令セットでも通用する話になっているかもしれません。 そもそも整数の除算とは プログラミングにおける整数の除算の定義について確認します。整数$n$を整数$d$で割るとき $$ n = q \times d + r $$ が成り立つように除

    2で割ることと3で割ること - Qiita
  • セルフホストできるCコンパイラを作ってみた - Qiita

    低レイヤを知りたい人のためのCコンパイラ作成入門 (以下 コンパイラブック) を一通り読んでCコンパイラを作ってみました。 このはまだ完全でなく(2020/09/01現在)、例えば構造体の実装の説明などは文章としては存在せず、このの参照実装である chibicc を写経がてら作っていきました。 (実際には今現在進行中の @rui さんの Cコンパイラ作成のオンラインコースを始めます の参加者のみに現状は公開されているchibiccよりもうちょっと改善されたcコンパイラ実装が参照実装だそうです) もともと構文解析とかはちょっと興味があったりして、qiitaでも [ruby] Parsletで構文解析する[その1] [ruby] Parsletで正規表現をパースしてvm型のエンジンを実装してみる[その1] パース〜ASTまで みたいな記事は書いていたんですが、あんまりややこしいパーサーは書

    セルフホストできるCコンパイラを作ってみた - Qiita
  • ZetZ is a Formally Verified Dialect of C

  • C言語から0番地へアクセスする方法についての個人的まとめ - /var/log/hikalium

    発端はuchan_nos氏によるこのツイートでした。 C言語で、当にメモリの0番地にデータを書きたいときはどうすりゃええの?— うー@技術書典8 Day1う31 BitNOS (@uchan_nos) 2020年2月12日 それに対する私のリプライ: uint8_t *p = 1; p--; *p = v;— hikalium (@hikalium) 2020年2月12日 私はこれで話が終わると思っていたのだが、どうやらそうではなかったらしく、色々な視点からの意見が加わりながら、話は混沌を極めたのでした…。 ということで、ここに私のこのツイートに対しての見解とか、わかったことをまとめておこうと思います。 私のリプライの背景について uchanさんが求める「0番地にデータを書きたい」という課題設定を、私はこのように解釈しました。 C言語において、整数0をポインタに変換すると、それはNULL

    C言語から0番地へアクセスする方法についての個人的まとめ - /var/log/hikalium
    igrep
    igrep 2020/02/17
    やっぱOS書くときはないと困るんだ。
  • Rustこそがシステムプログラミングの未来(で、C言語はもはやアセンブリ相当)なら、Rustで書かれたドライバのコードをLinuxカーネルは受け入れるべきなのか? - YAMDAS現更新履歴

    Intel の主席エンジニアの Josh Triplett の Open Source Technology Summit 2019 での講演 Intel and Rust: the Future of Systems Programming を取り上げ、Rust こそがシステムプログラミングの未来であり、C 言語はもはやかつてのアセンブリ言語である。つまり、未だに OS などのシステムプログラミングの大部分で使われる C 言語は Rust に置き換えられるのではないかと見る記事である。 「Cを愛して…」という文章をワタシが訳したのももはや10年以上前、C が他言語に置き換えられる未来が遂に来るのかと遠い目になってしまう。もっともワタシ自身、4年近く C 言語でコーディングしてないんだよね……。 でも、当にそうなるのだろうか? 手近なシステムプログラミングの現場である Linux カーネ

    Rustこそがシステムプログラミングの未来(で、C言語はもはやアセンブリ相当)なら、Rustで書かれたドライバのコードをLinuxカーネルは受け入れるべきなのか? - YAMDAS現更新履歴
  • Why is the asterisk before the variable name, rather than after the type?

    igrep
    igrep 2019/07/19
    “The dereferenced value of a is of type int. So in fact the asterisk in this declaration can also be seen as a dereference operator, which also explains its placement”
  • ポインタを使ったデータ構造をHaskellの代数的データ型と相互変換したい

    struct ST_VEC3D_LIST { double x; double y; double z; struct ST_VEC3D_LIST * next; }; というような構造体を定義してやるのが常套手段です。 要素を追加するときは next ポインタでつないでいって、リストを手繰るときは next ポインタを再帰的に参照していくことになります。リストの終端は next に NULL を代入することで表現します。 さて、このようなデータをHaskellで扱いたくなったときのことを考えます。上記のようなデータを受け取ったり返したりするCの関数をFFIで呼びたくなったとか、そういうCの関数を QuickCheck でテストしたくなったとか。 とりあえずHaskellに用意されている Foreign.Ptr を使って、struct ST_VEC3D_LIST と同じ構造を定義してみまし

  • LLVMを拡張してメモリ空間安全性をCで実現するChecked C

    「FinOps、アプリケーション単位の経済性、クラウドコストの最適化について、ロワ・ラヴホン氏語る」 このエピソードでは、Finoutの共同設立者兼CEOであるRoi Ravhon氏が、InfoQポッドキャストの共同ホストであるDaniel Bryant氏と対談し、FinOpsの出現と業界の採用について議論した。この対談では、FinOpsを採用するメリット、クラウド・コストについてもっと知りたいと考えている組織の典型的な道のり、実装を成功させるために必要な様々な文化やツールといったトピックが取り上...

    LLVMを拡張してメモリ空間安全性をCで実現するChecked C
  • C言語の現代化を目指すC2

    Spring BootによるAPIバックエンド構築実践ガイド 第2版 何千人もの開発者が、InfoQのミニブック「Practical Guide to Building an API Back End with Spring Boot」から、Spring Bootを使ったREST API構築の基礎を学んだ。このでは、出版時に新しくリリースされたバージョンである Spring Boot 2 を使用している。しかし、Spring Boot3が最近リリースされ、重要な変...

    C言語の現代化を目指すC2
    igrep
    igrep 2018/03/13
    Zigみたいな感じになるの?
  • 例え話をしないC言語のポインタの説明 | 右や左の旦那様

    まえおき 巷では「プログラマーになりたい人に初学者にとって、ポインタという考え方がわけわかめ」という話がよくあります。 そこでいろいろな人が「ポインタは住所だ」とか「変数がハコで」とか手を変え品を変え分かりやすいように説明してくれています。 それでもなお「ポインタがわかりづらい」という人が後を絶ちません。 もういっそのこと、例え話をやめてド直球で攻めたらいいんじゃないでしょうか。 Hello, Worldより簡単に サンプルコード 以下のコードを考えます。 void main() { int a; int b; int c; a = 1; b = 2; c = a + b; } 「#include <stdio.h>」なんていう謎のオマジナイはこの際ナシです。あんなもの無くたってC言語は成り立ちます。 まぁ見ての通り、どこにも何も出力されませんが。 このプログラムは、「c = a + b」

    例え話をしないC言語のポインタの説明 | 右や左の旦那様
    igrep
    igrep 2018/02/01
    絶対的なアドレスはやっぱり実行時に決まる、という理解で合っていますよね?
  • 2017年に最もシェアを伸ばしたプログラミング言語は?

    TIOBE Softwareから、2018年1月のTIOBE Programming Community Index (PCI)および2017年に最もインデックス値を伸ばしたプログラミング言語アワードが発表された。2017年プログラミング言語・オブ・ザ・イヤーに輝いたのはC言語となった。 C言語は2017年も1.67%の増加を見せた。この値は決して大きくはないが、他のプログラミング言語の増加分がかなり小さかったため、今回の結果につながったという。 一方、TIOBE PCIは複数の検索エンジンの検索結果から対象となるプログラミング言語がどれだけ話題になっているかをインデックス化したもの。2018年1月におけるインデックスは次のとおり。

    2017年に最もシェアを伸ばしたプログラミング言語は?
  • Big bag of pagesで型情報を節約する - 思考録++

    言語実装アドベントカレンダー20174日目の記事です。 言語実装、特に動的型付け言語の実装においては、実行時に値を扱う際、値体の他に型などのメタ情報を持たせる必要がある。 静的に解析が可能な言語と違って実行時にしか解析ができないからだ。 しかし、言語の特性を考慮して実装をしないと非効率的なメモリの使い方をしてしまう場合がある。 その対応策として Big bag of pages というメモリの扱い方があるので、どういう部分で有用なのか紹介する。 例えば、C言語で純粋に実装をすると、ゲスト言語*1上で整数を解釈する場合 // guest language input: 35 typedef struct lang_value { union { int i; double d; struct fat_struct object; } val; enum lang_type type; }

    Big bag of pagesで型情報を節約する - 思考録++
  • GitHub - xoreaxeaxeax/movfuscator: The single instruction C compiler

    You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert

    GitHub - xoreaxeaxeax/movfuscator: The single instruction C compiler
    igrep
    igrep 2017/12/02
    moveだけのアセンブリーにコンパイルするCコンパイラー。おまえは何を言っているんだ。。。って感じ。。。
  • 「ふつうのLinuxプログラミング」でLinuxの基本概念やシェルの仕組みについて学んだ - $shibayu36->blog;

    最近golangでCLIツールを作っていたのだけど、Linuxのお作法とかいまいち分かっていなかった。そこでそのあたりのことが学べそうな「ふつうのLinuxプログラミング」を読んだ。 ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道 作者:青木 峰郎SBクリエイティブAmazon このLinuxにおいてC言語でプログラミングする方法を、Linuxでの重要な概念も含めて教えてくれる。このを読めばとりあえずC言語を使ってLinux用のプログラムを書き始めることが出来るようになりそうだった。 それでC言語を使わない場合でも役に立つの?ということだけど、非常に役立ちそうで面白かった。なぜなら、単なるプログラミングの方法を教えてくれるだけではなくて、 Linuxの重要な考え方をファイルシステム・プロセス・ストリームという概念にまとめて教えてくれ

    「ふつうのLinuxプログラミング」でLinuxの基本概念やシェルの仕組みについて学んだ - $shibayu36->blog;
  • コンピューター:C言語講座:mmapについて

    コンピューター:C言語講座:mmapについて 概要 mmapはファイルをメモリにマッピングするものです。わかりやすく言うと、UNIXのOSが行なっているページングやスワッピングを自プロセスで行なうようなものです。 これを使うメリットとしては、メモリ確保サイズが確保開始時に決定できない場合、簡単にはmalloc()で適当な量を確保し、足りなければrealloc()を使用して拡大することになりますが、realloc()を繰り返すとメモリ領域中に空きが出来やすく、大規模なシステムでは実際使用しているメモリより空き空間の方が数倍大きくなってしまい、メモリ不足で実行不可能になる場合があります。mmapを使用すれば、別々に拡大していくような管理が可能なので、また、スワップスペースとは別の位置に置くことにより、多数の動的メモリを必要とする場合に安全に動作することが可能になる場合があります。ただし、基

  • C言語でインクルードするだけで使えるNon-movingで正確なコピーGCを作った - Qiita

    インクルードするだけで使えるNon-movingで正確なGCをC言語用に作りました。 行数がコメントを除いて100行に満たない非常に小さなライブラリです。 GCのアルゴリズムとしてはCheneyのコピーGCを採用しています。 通常のCheneyのコピーGCではメモリ空間のうち半分が無駄になってしまいメモリ効率が悪かったり、 GC発生時にオブジェクトが移動してしまいC言語のようなポインタを直接触れる言語との相性が悪いという欠点がありました。 今回はヒープ全体を二重連結リストとして管理することでそのような問題を解決しています。 ちなみにこれはTreadmill GCのアイデアと同じです。(が、アルゴリズム自体はTreadmill GCではありません。) APILinuxのlist.hに非常に近い見た目になっています。 ある構造体をgcで管理したい場合はstruct gc_head型のメンバを

    C言語でインクルードするだけで使えるNon-movingで正確なコピーGCを作った - Qiita
  • C言語で部分適用したい!(実は、できるアーキテクチャがあるんです) - 簡潔なQ

    通常、C言語の関数ポインタは、クロージャではない。したがって、関数を部分適用したり、カリー化したり、ローカル変数をキャプチャーした関数ポインタを返したりすることはできない。しかし、実際にC言語が動作する環境のなかには、そのようなことが実現できるものがある。PowerPC64 System V ABIは、そのひとつである。 PowerPC64 System V ABIは、Linux等において高級言語のコードをPowerPC64機械語に翻訳するさいの取り決めである。 多くのABIでは、関数ポインタは関数の最初の命令のアドレスに翻訳されるが、PowerPC64 System V ABIはそれとは異なる定義をしている。具体的には、関数ポインタは以下のような構造体 struct Funptr { void *jump_target; /* ジャンプ先 */ void *initial_r2; /*

    C言語で部分適用したい!(実は、できるアーキテクチャがあるんです) - 簡潔なQ
  • プログラミングの勉強を始めたときに、文系が挫折しやすい7つのポイント - paiza times

    こんにちは。谷口です。 ITエンジニア転職プログラミング学習に関する仕事をしている私ですが、学生の頃は文系の学部に所属し、プログラミングには全く触れたことがありませんでした。 新卒の時はそんな状態で、自分に特性があるのかどうかもよく分からないまま、面接をしてくれた人事担当者の「プログラミングは研修を受ければできるようになるから大丈夫」の言葉を信じて、受託開発をしている企業に入社しました。 そして新人研修で生まれて初めてプログラミングに触れ、勉強する中で、一歩進もうとする度につまずき、進んだと思ったら二歩前に覚えたことを忘れ、ということを繰り返しながら、何とか働いてきた時期がありました。 プログラミングのプの字も知らなかった新人の頃にどこでつまずいてきたかを思い出しながら書いてみたいと思います。 ■代表的なつまずきポイント ◆1.Hello Worldの段階からつまずく 研修で最初に勉強

    プログラミングの勉強を始めたときに、文系が挫折しやすい7つのポイント - paiza times
    igrep
    igrep 2015/10/22
    僕が教える立場だったらちゃんと説明してあげたい!!!!!いやその前にCを勧めないけど!!!!
  • Webエンジニアが組み込みプログラミングをすることになったときに知っておきたかったC言語の知識 - Qiita

    IoTエンジニアになって半年が過ぎたkazuphです。 (IoTって言葉はいつごろまで使えるんですかね(・∀・)?) PerlRubyでWebアプリケーションを書いていたエンジニアが、C言語でゴリゴリ組み込みプログラミングをすることになったときに、どんなことを知っていたかったかなと思い出しながら書いてみたいと思います。 その辺にある普通のC言語の入門書には載ってない知識が中心です。 ちなみにArduinoの例が多いですが、実際にはほとんどの期間を某チップの某SDKを使って開発しました。 わかる方はそれを想像しながらだと面白いかもしれません(・∀・) 半年の半分はiOSアプリ作っていたので、実質3ヶ月くらいの知識だと思ってください。 間違いの指摘など是非々々お待ちしておりますm(_ _)m こんな記事も書いてます。 IoTやるならまず知っておきたいパーツ屋・オンラインショップ IoTアプリ

    Webエンジニアが組み込みプログラミングをすることになったときに知っておきたかったC言語の知識 - Qiita