【超高速】C/C++に代わる低級言語を開発したい 5
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/05/07(金) 11:36:35しかし、2010年の今、もしもCが発明されていなかったとして、低レベルなシステム開発のためのプログラミング言語を
新たに作るとしたら、Cとは違う言語になるだろう。少なくとも、全く同じにはならないはずだ。
そこで、このスレッドでは、
低レベルなシステム開発のためのプログラミング言語
を一から考えたい。
既存の言語を使って何かをすることが目的ではなく、新たなプログラミング言語を考えることが目的であるから、
「既存のXX言語を使えばいい。」という類の発言は無意味である。
「既存のYY言語のZZ機能は、WWと言う点で有用だから採用したい。」という発言は歓迎だ。
現代の一流のプログラミング言語研究者が、最先端の研究成果を盛り込んで、
一から低レベルなシステム開発のためのプログラミング言語を作るとしたら、どのような言語になるだろうか、
という観点で考えたい。
◆前スレ
【超高速】C/C++に代わる低級言語を開発したい 4
http://pc12.2ch.net/test/read.cgi/tech/1271980246/
0002デフォルトの名無しさん
2010/05/07(金) 11:37:28(1)ハードウェアを直接操作する低レベルの記述が可能
(2)プログラマーが勘違いしてプログラマーの意図と違う動作をしないように言語仕様が直感的で学習が容易
(3)最新のオサレ機能が使えてワクワクしながらプログラミング可能
◆主な要望◆
・デバドラ屋だって、オサレ言語で開発したい!
・プログラマーの言語仕様の学習不足によるヒューマンエラーを最小限にするために、できるだけ小さな言語仕様にしたい。
・組込み屋だけど、関数型とダックタイピングしたい。
・shared_ptrの構文糖が欲しいな
・低レベル記述性(絶対条件) > 構文の美しさ(読みやすさ、学習の容易さ) > 再利用性(抽象性)
・算術演算以外の演算子は後置
・割込み、例外、非同期IOとかを統一扱えるイベント機能が欲しい。
0003デフォルトの名無しさん
2010/05/07(金) 11:40:03C言語の問題点。
1、コンパイラを軽く書きたいので色々端折ってる
2、軽く書きたいと良いながら、先読みが必要だったりする
3、軽く書けるので膨大な方言が発生し、それの取りまとめで仕様がボロボロ
4、機能の追加が必要最小限に留められているので、色々中途半端
C++の問題点
1、C言語との互換性を重視したので、記号が珍妙
2、追加、追加が多すぎて、なにがなんだか状態
3、オブジェクト指向の学識が高まるのと歩調を合わせた結果仕様が複雑
4、C言語の欠点を引き継いでしまってる
さて、以上の欠点は総て、言語が生まれた当時はまだ分かっていないことや、
当時では無理だったことが、後年解決された事など、色々に理由があって、
単に順調に成長した言語だから発生したとも言える。
そこで、プログラミング言語40年の歴史から学べる知見を総動員して、
C言語的なプログラミング言語を過去の遺産にとらわれず、今、開発
するとすればどんな仕様になるのだろうか?という事。
0004デフォルトの名無しさん
2010/05/07(金) 11:42:16GC有り言語とGC無し言語ではメモリに関する考え方がまるで違うから、
学習者からすれば一つの言語に混在するのは良くないんじゃないかな。
低レベルならC/C++でいいけど、
何でも有りすぎて「やっちゃいけない」ことが多すぎるから、
できることを減らしていいからミスが少なくなるようなコンパクトな文法がいいな。
標準ライブラリの整理(scanfなんかいらない)や充実も必要に思う。
良い言語の条件は、
・読みやすい・メンテしやすいこと(他人の書いたperlコードなんて読みたくない)
・ライブラリが充実してること(画像読み取りぐらいは標準ライブラリに欲しい)
・熟練者じゃなくてもミスのないプログラムが書けること
なんじゃないかなと思う。
0005デフォルトの名無しさん
2010/05/07(金) 11:48:25Ruby, Python, Haskell, OCaml, Scala, Clojure, Erlang, …
烏合のごとく言語が生まれてきているのにどれも似たようなLLばかりで、ハードウェア制御のような低レベル処理を行える言語が無い。
一方、Cは40年使われ続けてきているわけで、そろそろ置き換えられる言語が出てきてもいいだろう。
そこで、C程度の性能が出せて、Cが使われている分野を全てカバーでき、
過去の互換性に囚われて構文を妥協せず、今時の機能を使えてCよりもプログラミングしやすい新言語を作りたい。
0006デフォルトの名無しさん
2010/05/07(金) 11:48:500007デフォルトの名無しさん
2010/05/07(金) 11:49:39言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
0008デフォルトの名無しさん
2010/05/07(金) 11:50:05ミニマリストにとってはマクロは魅力なのよ。下のほうからシームレスに弄れるし。
低水準言語だとForthなんかがそんな感じだよね。
まあ、マクロ無しでもインライン&引数評価なし関数で十分代用できるけどね。
これでもまだ落とし穴たくさんあるけど。
816* 名前:デフォルトの名無しさん [sage] 投稿日:2010/05/05(水) 01:52:41
最近じゃめっきりアセンブラを使うことは減ったが
アセンブリでやる必要があるのはOSだけじゃないがね。
ちょいスレチな風味だが
直I/Oとか割り込みハンドラなどの低レベルライブラリが
CPU毎に異なってるのが組み込み屋の悩みだな
メーカ提供のライブラリの出来も千差万別だし
言語の話と離れるが、共通化してくれたらいいのにね
0009デフォルトの名無しさん
2010/05/07(金) 11:50:40言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
0010デフォルトの名無しさん
2010/05/07(金) 12:01:590011デフォルトの名無しさん
2010/05/07(金) 12:04:590012デフォルトの名無しさん
2010/05/07(金) 12:10:59Mona言語とかしぃ++(thi++)言語でいいんじゃね?
0013デフォルトの名無しさん
2010/05/07(金) 12:36:480014デフォルトの名無しさん
2010/05/07(金) 12:38:440015デフォルトの名無しさん
2010/05/07(金) 12:50:230016デフォルトの名無しさん
2010/05/07(金) 13:07:32速度にこだわった低級言語といえばアセンブラ
0017デフォルトの名無しさん
2010/05/07(金) 13:08:26文法はJavaベースで
0018デフォルトの名無しさん
2010/05/07(金) 13:10:38スレタイの事に労力を費やすなら、Dとか有望株を改良したりドキュメントを翻訳したり
積極的に採用して著名なアプリを作るとかしたほうがいいとおもうんだが。
こんな事は5スレ目だから、何度も言われているかな?
0019デフォルトの名無しさん
2010/05/07(金) 13:12:53何を言っているんだ。このスレッドは雑談スレッドだぞ。
新しい言語を作るという妄想に浸りながら雑談するのが正しいスタイルだ。
新入り君はそこのところ勘違いしないほうがいい。
0020デフォルトの名無しさん
2010/05/07(金) 13:13:16その発想は無かった
0021デフォルトの名無しさん
2010/05/07(金) 13:13:24今は、話題に集まった奴が適当なことを言い合ってるだけ。
0022デフォルトの名無しさん
2010/05/07(金) 13:15:56そんな色気は仕様が固まってから考えれば良いこと。
Dで良いと思う人はDに行けば良い、
Cで良いと思う人はCを使えば良い、
LWLが好きな人は好きで居続ければ良い、
COBOLしか分からない人はそれで良い、
0023デフォルトの名無しさん
2010/05/07(金) 13:22:55Dの問題点、CのリプレイスではなくてC++の置き換えを目指してる、
曰く、Cとして読める構文はCと同じ動きをする事等など。
Cの問題点、既出
LWLの問題点、論外、
JAVAの問題点、論外、
COBOLの問題点、論外。
これらはランタイムを必要とする。
関数型言語、論外
Cの代替を目指す言語にはならない。
0024デフォルトの名無しさん
2010/05/07(金) 13:28:50COBOLってランタイムいるの?
0025デフォルトの名無しさん
2010/05/07(金) 13:29:260026デフォルトの名無しさん
2010/05/07(金) 13:30:32主にI−Oセクションだけどね。
0027デフォルトの名無しさん
2010/05/07(金) 13:31:56・3項演算子はif式がよいんだか、よくないんだか?
・多値があるとよさそう。
・インクルードは自動生成がいい。
っていうかんじですか?
0028デフォルトの名無しさん
2010/05/07(金) 13:33:450029デフォルトの名無しさん
2010/05/07(金) 13:34:00>・多値があるとよさそう。
おいらはこれに反対なんだけど、議論にならないので放置してる(w
0030デフォルトの名無しさん
2010/05/07(金) 13:35:370031デフォルトの名無しさん
2010/05/07(金) 13:40:00もっというとstructだろう。って言い出すとまた前スレッドを蒸し返せるよ
0032デフォルトの名無しさん
2010/05/07(金) 13:46:20取れないこと。文法がC言語と違ってもC言語と同じ形式のバイナリー
フォーマットを維持できれば、旧来の資産を継承できるんだけどね。
まぁその辺はトレードオフなので、多値戻しが好きな人はそっちで煮詰めて欲しい
と思う。頑張れって思う。良い仕様が出来たら説得されちゃう用意は何時でもある。
だけど今の議論はちょっと、あり得ない、LWL作ってるのか?とか思う。(wwww
0033デフォルトの名無しさん
2010/05/07(金) 13:50:22既存の言語の古い制約に引きづられて、新言語の仕様を妥協はしない方がいい。
0034デフォルトの名無しさん
2010/05/07(金) 13:54:31きみがそのらっぱーなら、どうぞ、どうぞ。
ちぇけらっちょ♪
0035デフォルトの名無しさん
2010/05/07(金) 13:59:340036デフォルトの名無しさん
2010/05/07(金) 14:02:470037デフォルトの名無しさん
2010/05/07(金) 14:06:44どうせ多値なんだから返却する型の順序は決まっているわけで。
0038デフォルトの名無しさん
2010/05/07(金) 14:07:40OSから全部作り直しになるけど、頑張ってください。
確かに意欲的な方向で考えるのは悪くはないと思うんですよ。
そこまで見えてやり遂げるつもりなら誰も止めません。
0039デフォルトの名無しさん
2010/05/07(金) 14:10:57順序付きの複数の値をまとめられるデータ構造のリテラルがあればいいね。
C++的には「初期化リスト」と呼ぶけど、「リスト」という呼び名が嫌なら別にポチでもミケでも何でもいい。
とにかく、そういうものが欲しい。
0040デフォルトの名無しさん
2010/05/07(金) 14:12:50その「作り直さなければいけないOS」とやりとりをしたいときだけ、多値を使わなければいいだけじゃん。
多値があるからOSから全部作り直しになるなんてことはないよ。
0041デフォルトの名無しさん
2010/05/07(金) 14:13:03提案コードを書いてみては?議論はそこからかな?
0042デフォルトの名無しさん
2010/05/07(金) 14:17:000043デフォルトの名無しさん
2010/05/07(金) 14:18:34例えば、C風で申し訳ないが、
{int, int} div(int a, int b)
{
return {a/b, a%b};
}
{int, int} c = div(5, 3); // c[0]に商(1)、c[1]に剰余(2)
int d = div(10, 6); // dに商(1)、剰余は捨てられる
多値内の要素の指定方法は要検討だが。。
0044デフォルトの名無しさん
2010/05/07(金) 14:28:47無名構造体って感じなんだけど色々突っ込む前に。
てか突っ込めるほど堅くなさそうな気が。
で、一点、剰余だけ欲しい場合は?
こう言うのを一回でUP出来ると、あぁこの人は考えてるなー
って思う。
0045デフォルトの名無しさん
2010/05/07(金) 14:34:14だから、名前は何でもいいよ無名構造体でもミケでもタマ。
暗黙のキャストはよく使われる要素が出てくればいいと思うよ。
この場合、商の方がよく使う要素だろうから、商が出てくる。
剰余が欲しい場合は、
int e = div(10,6)[1];
とか
{int, int} f, g = div(10,6);
でfを捨てたりするんじゃないの。
構文についてはもう少し考えないとね。
0046デフォルトの名無しさん
2010/05/07(金) 14:37:15考えてから、多値が欲しいって言うべきかな?
この構文ならすっきり出来るし、とか、そこから
議論始めようよ、突っ込まれて考え中とか無しだよ。
もちろん、その考えが駄目かも知れないんだから、
こうやって議論するんだけど、何も考えずに欲しいとか
まだ考えてないけど欲しいってのは、議論じゃねーですよ?
0047デフォルトの名無しさん
2010/05/07(金) 14:39:12あなたがそうしたいならあなた自身その方針でどうぞ。
欲しい物を欲しいと表明するのは別に問題ないよ。
0048デフォルトの名無しさん
2010/05/07(金) 14:40:27関数はdiv_tを返すという宣言のまま、初期値リストの逆みたいな構文を許せばいいんじゃない?
div_t Dとしたら
D = { 3, 4} と出来るけど、逆に
int deno, rem として
{ deno, rem } = D とするSyntax sugarを加えるだけ.そうすれば
div_t div(int a, int b);の宣言のまま
{ deno, rem } = div(10,6)と出来るのでは。 {} が無名構造体を作るという
流れに一貫して奇麗だと思うんだけど。
0049デフォルトの名無しさん
2010/05/07(金) 14:40:28突っ込みどころ見つけてケチつけるのは、議論じゃねーですよ?
0050デフォルトの名無しさん
2010/05/07(金) 14:45:33構造体(のポインタやリファレンス)を返す事と見比べると、
あやふやな点が増えるだけに感じるのだが?
今までどおり構造体返しより得られるメリットは何?
0051デフォルトの名無しさん
2010/05/07(金) 14:45:48それだと、div_tを宣言しなければいけないのが、ちょっと美しくない感じが。
無名でできるものは無名にしたいよね。
だから、divの戻り値の方も無名にしたいかな。
0052デフォルトの名無しさん
2010/05/07(金) 14:58:00v,r = a /% b
v = a / b
r = a % b
みないな感じでいんじゃね
Cの延長ならどうせ無名構造体と型推論はありだろうから
{ int a, int } foo () ... と宣言させておいて
{a, b} = foo()とa,b = foo()は構文糖で同じ意味って感じはどう
多値返しは使い方次第とはいえたいして重くはならないと思う
どうせならちょい違うが積和演算も出来たら面白いなw
0053デフォルトの名無しさん
2010/05/07(金) 15:00:38> v,r = a /% b
これいいな。MISD(Multi Instruction Single Data)だな。
調子にのってこんな構文があってもいいかも。
v, r = div,mod(a, b);
0054デフォルトの名無しさん
2010/05/07(金) 15:03:06普通に割り算インストラクションは商と剰余を同じ返す奴が多いから
それをイメージしてるだけだけどw
0055デフォルトの名無しさん
2010/05/07(金) 15:04:53商と剰余は同じに求まるんだよなw
0056デフォルトの名無しさん
2010/05/07(金) 15:06:32まあ、割り算は分かりやすいから例として使っているだけだろw
005748
2010/05/07(金) 15:06:56>今までどおり構造体返しより得られるメリットは何?
ない。 遊び遊び.
>>51
ああ、そうか。 {int, int} は div_tの無名記法と考えれば{int, int} div(int a, int b)も
納得できるな。
だったら43と48を合わせて
{int, int} div(int a, int b)
{
return {a/b, a%b};
}
{deno, rem } = div(5,3)
0058デフォルトの名無しさん
2010/05/07(金) 15:09:19関数を置けるところに関数のリスト置けてもいいな。
v, r = {div,mod}(a, b);
それをパラに処理してくれると嬉しい。
0059デフォルトの名無しさん
2010/05/07(金) 15:10:57> 今までどおり構造体返しより得られるメリットは何?
オサレでかっこいい。
0060デフォルトの名無しさん
2010/05/07(金) 15:12:47多値があったらいいんよね
Cは本来の値以外に特殊な値を定義したり
変なグローバル変数を使ったりするからイマイチ
golangみたいな ret, ok = foo()記法は慣れると結構わかりよい
0061デフォルトの名無しさん
2010/05/07(金) 15:17:59それいいな(゚A゚;)ゴクリ
0062デフォルトの名無しさん
2010/05/07(金) 15:23:04例外処理の使い勝手の悪さ問題だよね。
例外処理が使えればエラー値戻しは
必要ないと思うんだが。
多値戻しは鬼門になりそうな気がするんだけどなぁ。
0063デフォルトの名無しさん
2010/05/07(金) 15:29:08例外処理って本来は大域脱出の延長だから多用すべきではないんだよ
正常な処理としてのエラー処理と例外処理を同列に考えて
構文に入れちまったのが問題だと思うんだよな
無用なオーバーヘッドだってあるしね
0064デフォルトの名無しさん
2010/05/07(金) 15:31:15しかし、Python, Ruby, Goとすでに使われてるよね。 他にもあったっけ?
0065デフォルトの名無しさん
2010/05/07(金) 15:36:490066デフォルトの名無しさん
2010/05/07(金) 15:39:23S5R5は多値に対応してるな。
0067デフォルトの名無しさん
2010/05/07(金) 15:40:340068デフォルトの名無しさん
2010/05/07(金) 15:42:10構文的には多値風だけど。
0069デフォルトの名無しさん
2010/05/07(金) 15:43:070070デフォルトの名無しさん
2010/05/07(金) 16:19:54こんな感じですね:
def mul():
return 5,6
>>> a,b = mul()
>>> a,b
(5, 6)
>>> a = mul()
>>> a
(5, 6)
>>>b,c = a
>>> b,c
(5, 6)
つまり、タプルを複数の変数に代入出来るという機構があるだけという感じですね。
0071デフォルトの名無しさん
2010/05/07(金) 16:49:00他意のない単なる質問だけど、その「タプル」とLispのリストって機能的な違いってあるの?同じもの?
0072デフォルトの名無しさん
2010/05/07(金) 17:18:31タプルは変更付加
ちょい汚いけどC++0xにも導入されてるね
0073デフォルトの名無しさん
2010/05/07(金) 17:21:170074デフォルトの名無しさん
2010/05/07(金) 17:23:59なるほど。ありがとう。
それなら、今はまだいいけど、
用語をタプル/可変タプルとか、リスト/定数リストのような感じで機能を表すようにして欲しいな。
慣れなのかもしれないけどね。
0075デフォルトの名無しさん
2010/05/07(金) 17:30:03タプルは作ったら変更不可で自身も無名、メンバーも無名なstructって感じと思えばいい
0076デフォルトの名無しさん
2010/05/07(金) 17:31:33ビックリしたぁ、標準ライブラリじゃん。
0077デフォルトの名無しさん
2010/05/07(金) 17:38:120078デフォルトの名無しさん
2010/05/07(金) 17:43:320079デフォルトの名無しさん
2010/05/07(金) 18:04:43言語の話してるときに標準ライブラリの話持ち出さない
程度の、なんかは無いのか?
0080デフォルトの名無しさん
2010/05/07(金) 18:05:46名を残すなんて用意ではないぞ。
まつもとゆきひろのようになるのも大変かと。
ましてやオブジェクト指向言語を作るとなると
コンパイラコンパイラで作るのもものすごい苦労するのではないかと。
Java言語を作った集団は10年以上もかけて研究してきた研究者だからな。
Javaを超える言語を作るのも至難の業。
0081デフォルトの名無しさん
2010/05/07(金) 18:06:51C++がOKでJavaが論外というのが矛盾だらけだ。
JavaはJVMなしでネイティブで動かすこともできるのだが。
0082デフォルトの名無しさん
2010/05/07(金) 18:09:26どうせならJavaのenum以上に高機能であることが望ましいな。
interfaceを実装できてクラスのように扱うことができジェネリックス(テンプレート)も使える。
そして列挙変数にメソッドを持たせることもできる。
JavaのenumはC++やC#のenumとも異なる超高機能列挙型だから
それを超えるenumが欲しい。
includeよりimportとpackage(namespace)のほうがいい。
ディレクトリやファイルパスという方式はヘッダファイル地獄に陥る。
0083デフォルトの名無しさん
2010/05/07(金) 18:11:07リスト型、structというかオブジェクト(class)で返すべき。
C++STLのvector型、JavaのListオブジェクト(型)のように。
そして当然ながらGenerics(template)と併用できる。
0084デフォルトの名無しさん
2010/05/07(金) 18:11:210085デフォルトの名無しさん
2010/05/07(金) 18:12:270086デフォルトの名無しさん
2010/05/07(金) 18:12:50C++STLのvectorやJavaのjava.util.Listオブジェクトの真似をすることの何が不満なんだ
配列で返してもいいし、オブジェクトで返してもいい。
0087デフォルトの名無しさん
2010/05/07(金) 18:20:22> {int, int} div(int a, int b)
> {
> return {a/b, a%b};
> }
なんかMATLABっぽい文法だな。MATLABだとこう書く。
[x, y] = function(a, b);
x = a / b;
y = a % b;
そしてファイル名をdiv.mとして保存してパスを通して
A = div(1,1)
とやると配列になって
A = [1, 0]
と出力される。
そしてJavaやC++だとこうなる。
<T extends Number> List<T> div(T a, T b){
List<T> result = new ArrayList<T>();
result.add(a / b);
result.add(a % b);
return result;
}
int[] div(int a, int b){
int[] result = new int[2];
result[0] = a / b;
result[1] = a % b;
return result;
}
0088デフォルトの名無しさん
2010/05/07(金) 18:23:02> 多値のコンテキストと単値のコンテキストはコンパイラには区別出来るわけだしな
> v,r = a /% b
それを許すと
v= 1, r = a / b;
という記述(C言語のv = 1; r = a / b;と同じ)がかわってしまうが、その点はどう対応する?
途中改行を許さないという文法にでもする?
0089デフォルトの名無しさん
2010/05/07(金) 18:24:29例外処理に不満があるならC#の真似をしてみては。
あれはあれで問題を起こし、Java方式とC#方式で賛否両論があるが
0090デフォルトの名無しさん
2010/05/07(金) 18:25:51低水準といっておきながらC++に変わる言語を作れっていう時点で
無理がある
あるていど高級言語にせざるをえないんでは。
しかも例外処理の話までしてる。
0091デフォルトの名無しさん
2010/05/07(金) 18:29:29, で式をつなげるのは無しにすればいいかな。
0092デフォルトの名無しさん
2010/05/07(金) 18:30:58低水準に”も”使えればいいんだよ。無理はないよ。
0093デフォルトの名無しさん
2010/05/07(金) 18:31:57次のスレは、C++をはずそう。
0094デフォルトの名無しさん
2010/05/07(金) 18:35:37返り値を多値型にキャスト出来れば、別に何を返してもいいよ。
a, b, c, d = func();
で、func()の戻り値の配列なりオブジェクトなりの要素を何らかの法則に従って順序付けて並べたときの1,2,3,4番目の要素を、a,b,c,dに代入できればいい。
0095デフォルトの名無しさん
2010/05/07(金) 18:37:58ちょっとウザイけど
c = 1, [v,r] = a/b;
とかでもいいかな。
0096デフォルトの名無しさん
2010/05/07(金) 19:17:43Cのカンマ演算子は中途半端だから廃止でいいんじゃない
複数の式を1つにまとめるのといろんなもんの区切りが同じ,ってのは
いまいちな感じしないかな
forとか考えるといい構文も思いつかないんだけどw
0097デフォルトの名無しさん
2010/05/07(金) 19:19:250098デフォルトの名無しさん
2010/05/07(金) 19:23:19ああ。確かにライブラリだな
でもC++0xそのままは汚いっていうのはそういうのも込みの印象ね
無名、メンバー無名のstruct的なデータ型はFirst Classとして
アリなんじゃないかと思ったからさ
0099デフォルトの名無しさん
2010/05/07(金) 19:26:580100デフォルトの名無しさん
2010/05/07(金) 19:27:08C++は過去を引きずり過ぎてあんな感じにならざるをえないんだろうね。
そういう意味で、新言語は過去に引きずられて妥協することのないようにしたい。
0101デフォルトの名無しさん
2010/05/07(金) 19:28:45ぶっちゃけいうと俺はCとgolangでいいとおもってるけど
C++とかいらねw
でもスレはネタとして楽しんでるよ
■ このスレッドは過去ログ倉庫に格納されています