C言語はなぜ簡単な関数すら実装されていないのでしょうか?
何かと便利でperlを昔から使っているのですが、今回Arduino制御のためC言語を少し勉強しています。
そこで疑問に思ったのですがC言語は長く使われているにもかかわらず、なぜ簡単な関数すら用意されていないのか不思議に思っています。
perlであれば仮に標準でなくても誰かが作成した簡単な関数なりモジュールなりが一般に出回ってます。
例えばですが下記のような物でもperlなら簡単ですがC言語ではまだ書ける段階ではありませんが、文字列の分解や置換だけでもかなり面倒な気がします。
または、私が気付かないだけで便利なモジュールや関数がありますか?
# 例1 splitで文字と数字にすぐ分けられる
my $word = "TOKYO-2019";
my ($str,$int) = split(/-/,$word)
print "$str ";#TOKYO
print $int + 1;#2020
# 例2 文字列を1行で置換できる
my $word =~ s/-2019/ 2020/;
print $word;#TOKYO 2020
A 回答 (12件中1~10件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
>C言語はなぜ簡単な関数すら実装されていないのでしょうか?
そうですねーなぜかと言われれば無駄を無くすためでしょうかね?
C言語は組込みの分野で多く使われる言語です。
今のPCではそういった心配はありませんが
組込み分野となると、今でもメモリ量に制限があるため
プログラムに無駄なものを入れるわけにはいきません
それにリアルタイム性が問われるものが多いため
処理の高速性が求められます。
そのため、暗黙のコード生成やバックグラウンドで動く処理が無い。
プログラマが意図したコードだけがコンパイラで生成されるため、
実行ファイルが肥大化してしまうことも無く生成コードに無駄がなくコンパクト
が売りであるC言語に余計なものを組込むのは無粋なものです
perlを使ったことないので分かりませんが
例えば、例にも書いてある文字と数字を分ける処理
my ($str,$int) = split(/-/,$word)
これがその部分なのでしょうが
これ、内部的にどういう動作をしているか質問者さんは理解していますか?
理解しなくても使えるのがこういう高級言語のいい所でもありわるい所でもあります
C言語で記述する場合は嫌でもこの内部構造を理解しなくてはいけません
それがいい所でもあり悪いところでもある...w
せっかくC言語を学ぶのですから
関数を探すのではなく、関数を作りましょう
そうすることで、perlのプログラミングもより理解が深まり
質問者さんの技術力向上に絶対に役に立ちます
回答いただきありがとうございます。
歴史的に見ればそうなのですね。確かに細かく制御できる事には意味がありますね。
splitが内部でどのように動いているか考えたことがありませんでした。
というか、そもそもなぜコンピュータが動くのか不思議で不思議で半加算機から入ったこともあるのですが先が長く挫折中です。(ゆっくり勉強中)
また、一時期アンセンブラ入門を勉強していたこともあったのですがこちらは途中で挫折して完全に中断しています。
最近は、中古100円のPCでも個人の作る気軽なプログラムなら起動直後に完結するほどハードウェアがあり得ないほどリッチになっていますし、
アルゴリズムや関数を勉強して手早く動くような物を作ることも重要ではないかと思っています。
ブラックボックスがあるのは気持ち悪いですが、ArduinoでPCからコマンド(文字列)のやりとりを行い専用のリモコンを作るだけで
ここまで勉強する必要があるのは大変と思っています。また、過去の経験から挫折しそうです。
ただArduinoはメモリが少なく配列など派手に使うと動かず、その段階になって少しずつ深く学びたいとも思っています。
面白いには面白いのですが、初歩的な動作で動かないのは辛い。
また、perlのような高級言語を使っていると、Cも現在では多くの場所で使われていますし年数も長く動作する場所も多いです。
その為、もう少し便利に使える関数やモジュールは作られなかったのでしょうか?
文字列の分割程度、程度と言っていい物か分かりませんが、ここから勉強してガジェットを作るのは骨が折れるなぁーと思ったりもしています。
簡単な関数もあるけどハードウェアギリギリまで攻めたい時にはよりアンセンブラに近い言語を使う感じには進歩しないのでしょうか?
No.2
- 回答日時:
C言語の由来を知らないからです。
それを必要とする人はC言語でなくてもいいはずですね。
C言語はアセンブラレベルの代替えとして開発されたのですから、そもそもmain しか定義しておらず、入出力すら実装していないのはそのためなのです。
炊飯器のコントロールるprintfなんて必要ないし、そもそも限られたメモリーに組み込むためにはシンプルがいいのです。
Cは他の言語とは立ち位置が全く違う。perlはなんの言語で作られてると思ってたんですか?
windows os や word や excel などはなんの言語で作られてると思いますか?
Cは空気のような存在です。あらゆるところにあります。
perl もその目的をもってCで書かれてるのですからね。
回答いただきありがとうございます。
Arduinoを制御するには残念ながらC言語が必要なのです。
歴史的にはそうであってもアンセンブラの代替だけではなく、実際にはかなりの所で使われていますし、年数も長いです。
その為、もう少し便利に使える関数やモジュールは作られないのでしょうか?
No.3
- 回答日時:
なるほど。
ですがこれを不便と思う人か自分の扱いやすいようにする、、という文化なのです。ところで例は別になんでも無いように思うのですが、どうしてもperlみたいに書きたいのなら、似たようなの作ったらいいのです。自身のライブラリに登録すれば、標準と同様に振る舞うのですから、、、
再度回答いただきありがとうございます。
Cの歴史は長く、この件について私がはじめて不便だと感じたとは思えないので、過去の蓄積の公開はないのでしょうか?
perlとpythonしか知りませんが、こちらは、不便だと感じる人がいれば、汎用性がある物については自身の専用ライブラリではなく公開のライブラリとして存在しています。
No.4
- 回答日時:
C言語のコマンドは、電子回路におけるトランジスタやコンデンサ、
ダイオードの様なレベルの部品です。
それらを使いICやLSI等の部品を作り、電子回路を作るのに便利な
物にしたとしても、それらで対応できない場合には、新規にトラン
ジスタやコンデンサ、ダイオード等を使って回路設計をしなければ
いけません。
色々なライブラリを使って、高度なプログラムを作れるけれども、
新規のライブラリ群を一から構築し、全く別の物を作る事もできる
のがC言語です。
回答いただきありがとうございます。
確かに小さな部品というのは分かります。
ただ、電子工作をしていると最近はモジュールやキットが驚くほどの廉価で存在しています。
それをパズルのように組み立てるだけで動いたりします。
勿論、一からそれを作ることもできますが、時代が進むと便利な物もできていますしC言語も古くから、驚くことに今も現役で使われています。
パフォーマンス追求は行いつつも、それと並行して簡単に使えるものができても良いのではないかと思うのです。
C言語の場合、例えば例に挙げたような操作ができたり、デファクトスタンダード化しているようなライブラリというものはありますか?
No.5
- 回答日時:
貴方は、いわゆる初心者とは言いませんが、プログラミングに関しては、いわゆるperlやpythonの人(Cの文化に馴染めない人は多数です)の為に色々と工夫した言語仕様なんです。
型を意識しなくてもいいとか安全に設計している。メモリー効率や速度的な面は考えてないのです。組み込みの装置の言語としてperlやpython使わないでしょ?貴方がなぜに制御系である Arduino に迷い込んだかわからないのですが、Cはもう完結した言語です。これをどうこうしようなんてないわけですね。なぜって、だからperlやpythonが作られたのですから、、
個人のライブラリはそこら中にあるし、例で上げた様なのはCをする人ならそのまま書いちゃう(ほとんど同じように書けるし貴方が知らないだけなのです)
不便と感じるかはその人のスキルになんです。Cは制限を持たない(つまりは暴走するプログラムを作ることすら制限されない)のですから、人の考えたそのようなレベルのものは必要無いという事なんです。
確かに以前はそうでしょうが最近ではJavaなど広がっている気がします。Cももう少し気軽に使えても良いなと思ったりもしたわけです。Javascriptは詳しく知りませんがjQueryなどで完成した言語だったものが再度見直された気もしています。
また、私がArduinoを使いたいと思ったのは単純で、最近のIT技術の進歩によりROMライターすら不要になり本物のシリアル通信をする必要もなく、気軽にWindwos 7とArudinoがUSBでシリアル通信ができて簡単なプログラムで様々な身の回りにある機器が制御ができるためです。一例を挙げればルンバの壁も1個4000円しますが簡単なIR発信で同じ機能が複数台作れます。他にも植物を育てるための温度変化や湿度の記録と条件によっての水やり、CTで家庭内の電力量の把握など幅広く使えます。お値段もArduinoとIR-LEDで送料込み4ドル程度と安く買えるます。最近では小学生がArduinoを触ったりもする時代ですし、マイコン時代ならそうでしょうが、現在は単なる制御系という枠組みから脱皮しつつあるきもしています。
No.6
- 回答日時:
こちらがあなたの求めているライブラリかもしれません。
SLI(Simple and Light Interface) ライブラリ for C users
http://www.ir.isas.jaxa.jp/~cyamauch/sli/index.n …
No.7
- 回答日時:
>perlであれば仮に標準でなくても誰かが作成した簡単な関数なりモジュールなりが一般に出回ってます。
C言語向けのライブラリは探せばいくらかは見つかります。
文字列操作系だと、メールの解析などではgmimeとか、文字コード系などではlibiconvとかがよく使われていると思いますが、どれもこれもとても複雑な処理を行っていて、これを省力化するという目的で使われていると思います。私はCでプログラムを作る業務に携わって結構長いですが、C言語のライブラリが体系的に集められたものを知らないので、きっと探すにも苦労すると思います。目的をキーワードにすると見つかることがあるかもしれません。
perlのsplitみたいなものは、取り出した値をその後の処理にどう使うかがプログラムによってまちまちなので、処理自体簡単に書けてしまうこともありライブラリというよりは自前で作ってしまうのだと思います。
ありがとうございます。
体系的には集められていないのですね・・・とても参考になりました。
また、具体的なライブラリの紹介ありがとうございます。
split一つなら簡単でしょうが実際には簡単な操作は大量にありますし、
それらを記述しているとタイプ数もかなりの物になりそうです。
タイプする時間が無駄なのではないのかなぁーと思ったりもしますが、
そういうことはないのでしょうか?
No.9
- 回答日時:
>C言語はなぜ簡単な関数すら実装されていないのでしょうか?
関数は言語に含めず、使うライブラリで実装する
というのがC言語の特長だからでしょうかね。
おかげで「C言語に関して覚えること」は少しだけで済みますよ。
たとえて言えば、
使うかもしれないアプリがたくさんインストールされている国産PCと
OSと、必要最小限のアプリしかインストールされていない某メーカーのPC
の違いのようなものでしょうかね。
ありがとうございます。
確かに覚えることは少しで済みますね。ただ、効率的なアルゴリズムを覚える必要があり全体で見るとかなり難易度が高くなっている気がします。
PCに例えるとPCはただの箱でしたがPCの普及とともにVectorなどでフリーで使えるWindwosアプリが大量に作られそれを自由にダウンロードして使えるようになりました。Perlなどでもモジュール単位では同じような感じになっています。しかし、Cでは全て自分で作る必要があります。多くの人が使っているなら、どこかが取りまとめてみんなで利用という方向になら無かったわけで不思議に思っています。
No.10
- 回答日時:
ま、貴方の意図はなんなのかわからないけど、貴方中心に世界は回っていない、つまりは貴方の価値観でCの環境が変えたいのなら、貴方がそれを作ればいい。
もしかしたら貴方の思想に共感する人が現れてNextCができるかもしれない。
Cはその目的が達成されていて、もはや空気のようにあるんです。JavaもCによって書かれているし、PerlのパターンマッチングなんてUnixのコマンドレベルを模擬したものだし、、まぁ、、、いいか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラミングについて(Python) 添付した画像はC言語で簡単に作ったソースで、1つの配列に5つ 3 2022/09/10 19:15
- C言語・C++・C# C言語について。 3 2022/11/05 20:30
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- その他(Microsoft Office) WordやExcelで英数字のみ半角または全角にしたい 6 2022/08/03 08:18
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Ps+のフリープレイでDestiny2の...
-
Google ColaboでGUI作成
-
python urlopen error について...
-
Windows Media Playerを開くと...
-
本格的なGUIを作るのにおすすめ...
-
scipy っていうのをいれようと...
-
マイコンSHでSQRT(平方根)が...
-
DirectX Graphics と OpenGLっ...
-
【iTunes】CDをiPhoneに取り込...
-
VB.Netでの暗号化通信
-
ベッセル関数を使う
-
LIBCMT.LIBをリンクしてコンパ...
-
WAVE⇔MP3のためのライブラリ
-
sleep関数
-
iMovieのライブラリを移動する方法
-
VB.NET Blowfishで文字列を暗号化
-
ATLとSTLの違いは何でしょうか?
-
DLL読み込み時エラー
-
declaration of 'index' shadow...
-
Dreamweaverのライブラリが反映...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Ps+のフリープレイでDestiny2の...
-
Windows Media Playerを開くと...
-
本格的なGUIを作るのにおすすめ...
-
python urlopen error について...
-
Google ColaboでGUI作成
-
scipy っていうのをいれようと...
-
システムコールと標準ライブラ...
-
ライブラリ作成時のグローバル...
-
強化学習の環境作成、AI。自動...
-
プログラマーで「使えない人」...
-
unix-c と linux-c の違いは?
-
C++ 標準ライブラリの実際の中...
-
マウスのクリックを自動で
-
C# EXCELセルの入力規則設定に...
-
LIBCMT.LIBをリンクしてコンパ...
-
gcc に mktemp 危険と怒られ...
-
Dreamweaverのライブラリが反映...
-
静的ライブラリから静的ライブ...
-
DLL読み込み時エラー
-
sleep関数
おすすめ情報