接続数

COUNTER329230FROM 2012/5/16

MISRA-C diary(C言語日誌)

12345
2018/07/11

初めてプログラムを書く人の知ると良いこと・やると良いこと

Tweet ThisSend to Facebook | by kaizen
当方は、公的試験研究機関として、プログラムを書いたことがない方が、
1週間でプロとしてプログラムが書けるようになる教育・訓練をしています。

#自分が好きな分野、興味を持っている分野のプログラムを写経する

#

#プログラムは設計です。
別に設計書を作るのは愚の骨頂です。


11:52 | 投票する | 投票数(0) | コメント(0)
2018/07/10

Cコンパイラ自作日記(挫折版)

Tweet ThisSend to Facebook | by kaizen
Cコンパイラを自作するまでの日記

1 small Cを打ち込んで動かす。

2 Pascalで書かれたコンパイラをC言語で書き換える

3 Yacc, Lexで書かれたコンパイラの一部をC言語で書き換える。

4 自作
4.1 80286/80386のメモリ管理命令が理解できなかった。

4.2 コンパイラの最適化の処理が理解できなかった

4.3 OBJのシンタックスチェッカを作った
電総研の研修生として3ヶ月滞在するに当たり、
二木厚吉さんからOBJの論文を渡された。

OBJの書き換えは、できそうになかった。
LISP系の言語がよくわかっていない。

戸村哲さんに、LISPはアセンブラだ。
確かに、当時LISP プロセッサが出ていて、
しかし、80386の安価さとの競争で、
80386系のLISPの方が、LISTプロセッサのLISPより
費用対効果が良いという現象が現れていた。


#Cコンパイラをスクラッチから開発してみた(日記)
https://qiita.com/ruiu/items/4d471216b71ab48d8b74

##8cc
https://github.com/rui314/8cc

###cpp.c
https://github.com/rui314/8cc/blob/master/cpp.c


#C コンパイラをスクラッチから開発する日記
https://qiita.com/zakuro9715/items/54f5598247ca6d3be3d6


## mcpp -- a portable C preprocessor 
https://github.com/rui314/8cc


-------------

C言語、昨日、今日、明日

C言語は、CPUを製造・出荷している組織から提供することがある。

IntelのCPUにはIntelのCコンパイラがあり、
ARMのCPUにはARMのCコンパイラがある。

C言語が、なぜこれまで発展してきたかを理解されずに、
C言語の規格、コーディング標準、処理系について、書かれている方々がお見えで、悲しい気持ちになることがしばしばあります。

C言語には、主に3つの機能があります。

1) CPUの性能を最大に実現するアセンブラと同等の機能
2) Cコンパイラの設計、保守、最適化を実現する機能
3) OSの設計、保守、最適化を実現する機能

CPUとCコンパイラとOSの3つに言及せずにC言語を語っているのは、十分ではない。

# 演算子

##三項演算子

##単項演算子

#前処理

00:25 | 投票する | 投票数(0) | コメント(0)
2018/07/08

C言語、C++の曲芸的限界と対策

Tweet ThisSend to Facebook | by kaizen
C言語、C++の曲芸的限界と対策

C言語、C++の困難性の一つは、変数にメモリのアドレスを入れるポインタだとの見解があるらしい。

ポインタと同じくらい曲芸的なのは、ポインタ変数にも用いる、*と&の役割だ。

*には一体幾つの機能があるのだろう。
二項演算子
単項演算子
宣言の型と変数の間において型へのポインタ変数宣言

同様に、&にも
二項論理演算子
単項演算子
宣言と型と変数の間において型への参照変数宣言

ポインタよりも参照の方が難しいかもしれない。

ただ、プログラミング言語は、いくら書いても、
ほとんどお金を取られる心配はない。

電気代と自分の時間だけ。

自分で書くのだから、ひょっとしたら売れるかもしれない。
じゃ、プログラムを書いて勉強すればいいのだ。


```
```c++:starand.cpp
#include <iostream>

#define msg1="1.乗算の二項演算子「*」<変数 * 変数>(定数でも可能)"
void f(){
  int i = 2;
  int j = 3;
  std::cout <<msg1 <<std::endl <<" i * j = "<< i * j << std::endl;
}

#define msg2="2ポインタ変数の宣言「*」 <型名 * 変数>"
void g(){
  int i = 2;
  int* j = &i;
  std::cout <<msg2 <<std::endl <<" int* j=  &i ;"<< j << std::endl;
}

#define msg3= "3.ポインタ変数の中味を取り出す単項演算子「*」<* 変数>"
void h(){
  int i = 2;
  int* j = &i;
  std::cout <<msg3 <<std::endl <<" *j ;"<< *j << std::endl;
}

#define msg4="論理二項演算子「&」<変数 & 変数>(定数でも可能)"

void m(){
  int i = 2;
  int j = 3;
  std::cout<<msg4 <<std::endl  <<" i & j = "<< i & j << std::endl;
}
```

#define msg5 ="5.参照変数の宣言「&」 <宣言子 & 変数>\r\n
    非対称性:宣言と同時に代入\r\n"
void n(){
  int i = 2;
  int& j = i;
  j=3;
  std::cout <<msg5 <<std::endl <<"  i="<< i << std::endl;
}
```
jはiのアドレスを持っている。
jへの代入はiへの代入になる。

あたかも& と*が対称的かのようだが、
NULLが代入できないなど非対称的なところもある。

#define msg6="6.変数のアドレス取得単項演算子「&」 <& 変数>(*の逆)"

void o(){
  int i = 2;
  int* j = &i;
  std::cout<<msg6 <<std::endl  <<" &i "<< &i << std::endl;
}

int main(int argc, char* argv[]){
  f();
  g();
  h();
  m();
  n();
  o();
}
```

22:04 | 投票する | 投票数(0) | コメント(0)
2018/06/25

C++ Template technique

Tweet ThisSend to Facebook | by kaizen
C++ Template technique

C++Standard Committee papers
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/

standard C++
http://isocpp.org

Collected papers of Alexander A.Stepanov
http://www.stepanovpapers.com

cpprefjp
http://sites.google.com/site/cpprefjp/
boostjp
http;//sites.google.com/site/boostjp


C++テンプレート完全ガイド

 Modern C++ Design

C++テンプレートメタプログラミング


ジェネレーてぃぶプログラミング

C++設計と進化


Boost C++ Libraries
13:11 | 投票する | 投票数(0) | コメント(0)
2018/06/24

「組み込み系」「エンタープライズ系」は死語か。"freestanding", "hosted"は生き残るか。

Tweet ThisSend to Facebook | by kaizen
一昔前、「組み込み系」「エンタープライズ系」という言葉が流行った。

「経済産業省が、「組み込み系」に力を入れる」という話があったらしい。
猫も杓子も「組み込み系」に力を入れるようになったらしい。

しかし、誰に聞いても「組み込み系」「エンタープライズ系」の区分の答えは曖昧。

その後、IoT(internet of things)という言葉が流行り、
猫も杓子もIoTに。

また、深層学習(DeepLearning)が実用的になり、
IoTで集めたデータを機械学習で利用することも流行っている。

ここで、「組み込み系」「エンタープライズ系」という定義がわからない言葉から離れて、C言語、C++の言語規格で規定している"freestanding", "hosted"という区分で考えてみる。

05:53 | 投票する | 投票数(0) | コメント(0)
2018/06/23

フリースタンディング環境(C言語)TOPPERS/SSP

Tweet ThisSend to Facebook | by kaizen
C言語規格には、
Freestanding
Hosted
の2つの環境がある。

Hostedは、OSがC言語の未規定の動作のうち、どちらを取るかを

3.1にfreestandingの記述あり
「The compiler selected for the project should meet the requirements of a conforming freestanding implementation for the chose version of the C language.」
shallではないので、hostでも良いと読める。
掲示板で質問。

Dir1.1 freestandingの記述あり。

課題は、設計作業環境はhost環境で、設計対象がfreestandingの場合に、host環境とfreestanding環境の違いがわかっていないと、話が乱れる。

C99では、__STDC_HOSTED_ _が1ならhost、そうでなければfreestanding。

freestandingの場合
1 start-upがmainかそうでないか、および型
2 library 関数(最小以外)
3 終了処理
4 size_t, wchar_tなどのすべての型を用意しなくてもよい。(C99 7.18.3)
がimplementation definition。

freestandingでimplementation definition を確認した時点で、
関係なくなるルールがあるかどうかの検討が済んでないかも。

freestandingの場合でも定義するヘッダファイル(C90とC99共通とC99のみ有)

#include <float.h>
#include <iso646.h>
#include <limits.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __STDC_VERSION__
#include <stdalign.h>
#include <stdnoreturn.h>
#endif 

NULLを規定しているstdlib.hはfreestandingでは必須でない。
標準、入出力stdio.h, 文字列のstring.hも必須ではない。
これらの利用を前提としている規則では、freestandingでは、必ずしも必須でないことについての言及があるとよい。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

ps.
http://www.misra.org.uk/forum/viewtopic.php?f=225&t=1485
In example codes in Rule 11.1 and Rule 11.2

#include <stdlib.h> /* to obtain macro NULL */

in example codes in 11.9

#include <stddef.h>

A freestanding environment needs stdarg.h not sodlib.h.
So I prefer to obtain macro NULL, 
#include <stddef.h> // to obtain macro NULL

Is it reasonable?

ps. in 11.9 
/* Could also be stdio.h, stdlib.h and others */

I prefer
/* A free standing environments needs stddef.h */
/* Could also be stdio.h, stdlib.h and others in host environments */

Best Regards.
Dr. Kiyoshi Ogawa 

05:50 | 投票する | 投票数(0) | コメント(0)
2018/06/22

C++マクロからtemplateへ

Tweet ThisSend to Facebook | by kaizen
##1
マクロVSテンプレート
https://project-flora.net/2013/09/18/マクロvsテンプレート/

```c++:macro.cpp
#define MULTIPLY(a,b) (a)*(b)
```
上記マクロは下記

```c++:template.cpp
template<typename T> T multiply(T a, T b) {
return a * b;
}

int val = multiply<int>(10 * 20);
```
##2
マクロ関数よりもテンプレート関数
http://d.hatena.ne.jp/pknight/20090805/1249462821

#define MACRO_MAX(a,b) ((a)>(b)?(a):(b))

// テンプレート&インラインでのmax関数
template <class T> inline T template_max(const T& a,const T& b) {
    return a > b ? a : b;
}

##3 特注の鋳型
http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02036.html




###4 
よく使って来たマクロ

```
#define  PR1x(a,b) (void)printf(" "#a  " = %" #b "=%x\n", a,a)
```

```
template<type T> T void pr(T a,T b) {
cout << (b)
}


15:07 | 投票する | 投票数(0) | コメント(0)
2018/06/22

構造体入門

Tweet ThisSend to Facebook | by kaizen

構造体入門

C言語

構造体選択演算子

1.
構造体メンバーのアクセス
http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/devwin32/structurememberaccess_xml.html
選択演算子
. (ピリオド)
->(右矢印)

2.
構造体メンバへのアクセス方法
http://www.ie.u-ryukyu.ac.jp/~e075769/study/study/c/ch8/8_2.php

構造体メンバ演算子(structure member operator)
ドット( . )

3.
構造体
http://www.cc.kyoto-su.ac.jp/~yamada/programming/struct.html

メンバ参照(間接参照)
参照するための演算子 "->"


08:05 | 投票する | 投票数(0) | コメント(0)
2018/06/22

プログラマのプログラマによるプログラマ同士の意思疎通のためのプログラミング言語の定義(意味論)

Tweet ThisSend to Facebook | by kaizen

プログラマのプログラマによるプログラマ同士の意思疎通のためのプログラミング言語の定義(意味論)

For the programmer's, by the programmer's and/or of the programmer's programming language definition for the communication, not syntax, but semantics.

  1. psittacism

psittacism is to return the words of the speaker as it is.

  1. Question 2.1 

2.2 5W1H
2.2.1 What

Question about what it is.

2.2 Who

Question about identification of people.

3.



05:35 | 投票する | 投票数(0) | コメント(0)
12345