1read 100read
2012年1月1期プログラム48: 低水準言語を開発したい (268)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
・ 次のスレ
50: Ruby 初心者スレッド Part 47 (883)
51: 【至急】助けてください。 (196)
52: 関数型プログラミング言語Haskell Part17 (160)
53: Objective-C [ObjC part:6]; (562)
低水準言語を開発したい
- 1 :10/05/30 〜 最終レス :12/01/08
- http://pc12.2ch.net/test/read.cgi/tech/1274015781/l50 の継続スレのかたわれです。
低水準言語に絞ったスレです。言語全般の話題は「新言語を開発したい」のほうへどうぞ。
- 2 :
- このスレッドは天才pンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
- 3 :
- あくまで、GCなしで関数型とか難しいことは置いて置いて
高速なプログラミング言語を作りたい人用らしいです
- 4 :
- FORTHとか?
- 5 :
- 高級アセンブラを目指す言語を考えるということで
- 6 :
- さ、改めてCの問題点から挙げていこうか
・環境依存だらけ
・型不足
・スパゲティマクロ
- 7 :
- いきなりでなんだが、
>>6には失望した
- 8 :
- C++はどっち?
- 9 :
- 理想と言われている構文
・PythonかGo風の文法
- 10 :
- ・パースしずらい構文
・わかりずらい関数ポインタ
・セキュリティホールになる標準関数
- 11 :
- >>7
では有望な意見をよろしく
- 12 :
- >>9
字下げげ方式は賛成だけど、キーワード方式は嫌だな
- 13 :
- Goが理想って言われているというのは初めて聞いたのだけど
どの変がりそうなの?
- 14 :
- 凄いことに気づいた。
C,goだから次はrockだ。
- 15 :
- See、Go、look
- 16 :
- >>13
過去ログ嫁
- 17 :
- C、Go、Rock、Nana、Hatch、Q、Jue
- 18 :
- 日本の時代きたな
- 19 :
- 俺的なまとめ
・C言語のいらない機能は削る。
・GCは無しが基本でオプションで付けられるようにしたらよさそう。
・C++/CLI、c++0x等が参考になる。
・部分適用はカリー化した文法がよさそう。
・マクロは基本無しにする。
・Lisp級のマクロも欲しい人はいるので、
マクロを作りやすいように式ベースにする。
・関数型言語の機能を取り込める部分は取り込む。
・Rubyのようにwithを拡張してみたい。
・関数型言語は並列化に強いらしい。
- 20 :
- >>19
もう一個の方へ行け。
- 21 :
- >>20
嫌です。
- 22 :
- 何故嫌なのかといえば、あくまで低レイヤーな言語を作りたいからです。
- 23 :
- 要求内容が全然低レイヤー向けじゃないんだが
- 24 :
- >>19
スレ違いもここに極まりだな
- 25 :
- >>19のすばらしいところは全てが間違いであることだ。
ここまで見事なアンチパターンを展開できる>>19の実力には
計り知れないものがあると俺には感じられる。
- 26 :
- >>19にひとつ以上該当する方はこちらへどうぞ
新言語を開発したい
http://pc12.2ch.net/test/read.cgi/tech/1275223921/
- 27 :
- >>19
あっちのスレに必要な人材なのにな。
よくあるミスキャストだよな。
- 28 :
- >>19の人気に嫉妬
- 29 :
- 野心的だが簡単には否定できないだろ。
具体的な問題点が指摘できないなら黙ってた方がいい。
- 30 :
- >>19
お前と仕事したら毎日がカーニバルだ
無論ほめ言葉だ
- 31 :
- 取りあえずデータ型は
unsigned char (8bit)
unsined long (CPU依存)
bool (carry flag)
だけだ
符号付はclass定義
- 32 :
- >>19 お前なら、日本国民の腐った依存心を叩きなおすことができる
- 33 :
- 注目をいただき、ありがとうありがとう!!
せっかく注目を浴びているので考えていることを書いて置きます。
・優先順位付きのユーザー定義可能な演算子
・数種類の演算子ですべてを表す。
・括弧演算子aaa{}とローカルブロック{}の結合を止めるにはどうしたらよいか?
・空行を入れる、local{}等とするか、
改行を挟んだ括弧の結合は抑止するのはどちらがいいか?
要するにScalaとC式方式のどっちがいいか?
・圧力は炭素を圧縮し美しいダイヤを作る構想には有難い。
なんてことを考えたり話したいと思ってます。
ということでなにとぞよろしくお願いします。
- 34 :
- >>33
マークシートで0点取るぐらいの天才だな。
- 35 :
- 抽象化されていないデータ扱っているときにそんなもの出されたら、不愉快になるな。
- 36 :
- >>33
関数型言語でこれを動かしてみようか
http://akizukidenshi.com/catalog/g/gK-00179/
- 37 :
- 先に意味論を考えた方がいいんじゃないか。
「コンピュータにどういう処理をさせたいのか」をまず考え、
それからその処理を効率よく指示するための構文を考えないと、
結局C言語より使えない物が出来上がるぞ。
低水準言語を開発するのだから、なおさらな。
>>19 とか見てると、まるで RPG を作るのに、
ストーリーやグラフィックから作り込んでくみたいだ。
- 38 :
- 彼は関数型言語を作りたいと言ってるわけではない。
- 39 :
- >>37
>RPG を作るのに、ストーリーやグラフィックから作り込んでく
RPGツクールならそれでOK
つまり彼はそのレベルなのだよ
- 40 :
- 具体的な指摘もしないユーザーレベル
- 41 :
- いきなり19降臨か
楽しいスレになりそうだなw
go--みたいな感じでどうよ
gcとインターフェースなし
chanとgoroutineはオプショナル
- 42 :
- なんだよ関数型もこっちでやるのかよー。アンチ涙目www
- 43 :
- オーダー固定のビットストリーム型
二進化十進型 (精度固定で符号・循環/無限小数を示すフラグ付き)
とかどうよ?
- 44 :
- >>43
それさえも記述できる低水準。
組み込み型はint byte boolのみ
- 45 :
- unsignedなくて低水準?
- 46 :
- boolがキャリーはやりすぎw
型はstdint系でいんじゃね
- 47 :
- アセンブラ並みにunsignedのみにしよう。
後の型はクラス定義だ
- 48 :
- アセンブラがunsignedのみ?
- 49 :
- 加算器には符号はないし。2の補数と見て処理するかどうかはプログラマしだい。
- 50 :
- お前は加算器に命令だせるのかw
- 51 :
- たいていのcpuにあるadd命令なんてヤツだろが。。
てか符号有無なしとか不便過ぎだろ
整数は8,16,32,64の符号有無で8種と
機種依存の符号有無の2種でどや
dspとか考えたら符合は必須だが
オーバー、アンダーフローは機種依存かね
- 52 :
- マクロ大好きなやつはまたforkして
どんな構文でも作れちゃう万能マクロプロセッサスレとか作ったらどう
- 53 :
- Cのマクロが糞なだけ
- 54 :
- あれ以上は意図的にやってないだけ
- 55 :
- >>51
符号付整数型もclass宣言してしまえばいい。
キャリーがあれば、多倍長整数だってclass宣言すればいい。
浮動小数点も、FPU命令をオペレーターオーバーロードで記述できるようにすればいい。
SIMDも好きに定義すればいい。
- 56 :
- classって意味わかってんのか?
結局全部インライン関数かアセンブラでやる位なら
ただのマクロアセンブラで言語じゃねえし
そもそも演算子オーバーロードなんてマクロと同じ位いらんやろ
- 57 :
- 頭おかしい奴がいる
- 58 :
-
____
/ u \
/ \ /\ 紙光臨とか言ってるし2ちゃねらのことだから
/ し (>) (<) \ 大変なことになってるかも・・・
| ∪ (__人__) J | ________
\ u `⌒´ / | | |
ノ \ | | |
/´ | | |
| l | | |
____
/ u \
/ \ ─\ チラッ
/ し (>) (●) \
| ∪ (__人__) J | ________
\ u `⌒´ / | | |
ノ \ | | |
/´ | | |
| l | | |
____
/::::::::::::::::\
/::::::─三三─\
/:::::::: ( ○)三(○)\ レ、レス56!!これだけか!
|::::::::::::::::::::(__人__):::: | ________
\::::::::: |r┬-| ,/ .| | |
ノ:::::::::::: `ー'´ \ | | |
/::::::::::::::::::::: | | |
|::::::::::::::::: l | | |
- 59 :
- スレを三つに分散してんだからこんなもんだろ。ム板では
- 60 :
- 神は元スレの続き立てたみたいやなw
- 61 :
- ま、せっかくなのでゆるーくつかってってみよっと。
- 62 :
- 基本となる式言語のBNFはこのようになります。
0 exp
1 = exp infix_l exp
2 | exp infix_r exp
3 | exp '(' exp ')'
3 | exp '[' exp ']'
3 | exp '{' exp '}'
4 | exp postfix
5 | prefix exp
6 | '(' exp ')'
6 | '[' exp ']'
6 | '{' exp '}'
7 | keyword '(' exp ')' exp
7 | keyword '[' exp ']' exp
7 | keyword '{' exp '}' exp
8 atom
9 void
infix_l,infix_r,prefix,postfix,keywordは
優先順位付きの登録可能な演算子である。
voidは式の要素が空であることを示す。
atomは整数、不動小数点数、識別子、文字列、文字等を表す。
このような式でC言語のような言語を構成することで
Lisp級のマクロが実現できます。
例えば、ぶら下がりのif else文も、
7の演算子と'if' '(' exp ')' exp
1の演算子 exp 'else' exp
で表すことができます。
- 63 :
- 上でひとつ忘れていたのが、空白による結合です。
10 exp = exp exp
これが8番目の空白演算子でclean bookから取って@で表すことにしています。
下降型の優先順位法を使えば、
この式のパーサの重要な部分は1つの関数で書くことができます。
それゆえにS式のreaderに比べたら複雑ではありますが、
シンプルにパーサを書くことができます。
C言語のシンタックス上の見た目を限りなく削り取るとこのような形になると思います。
これがC言語一族のシンタックス上の本質であると考えています。
- 64 :
- この言語自体は既にほぼ完成しています。
JavaScript,haXe,PHP,Scala,Java,D言語などで実装しています。
ほぼというのには理由があって、バグはつぶしていない事と、
ほとんど自分でしか考えていなくて議論すべき部分が議論されていないからです。
- 65 :
- 議論したい話としては
7 keyword '(' exp ')' exp
という演算子が必要であるかどうかです。
この演算子はなくても何とかなり、なければfor文やwhile文等に{}が必然的に
必要になります。
ただし、if else文の扱いがやや不思議な感じになります。
この7の演算子はjavascriptにfunction(a,b)a+bという記述が入ったことと
javascriptやScala、for文やwhile文に必ず{}が必要というわけではない
ことから付け加えました。
- 66 :
- ただ、これはgolangを見て違うんじゃないかと思うようになりました。
golangではvar a int;のように記述したり、while i == 1 {}
のように記述したりします。これらのvarやwhileは前置2項演算子
といえるでしょう。
keyword ( exp ) exp
の名前は文演算子と名づけていました。
C言語系の多くの文はこのような形をしているからです。
しかし式を書くのに文演算子ってなにやら奇妙な名前なのです。
- 67 :
- とりあえずこっちに居座るつもりと見ていいんだな?
- 68 :
- ここは19専用スレにして別スレ立てればいいよ
- 69 :
- >>67
とりあえずここにいますよ。
寂しくなったら移動すると思いますけど。w
- 70 :
- BNFじゃねえし、式でもねえし
それじゃパーザ作れないよ
- 71 :
- >>70
どのようにしたら作れます?
- 72 :
- >>71
>>62は正しいBNFではないから、どんな構文なのか想像出来ないよ。
- 73 :
- >>62
elseは単体の式として成立しないのに
なぜ1の演算子で表せると思えるのかな?
exp ::= <if-exp> | <if-else-exp> ...
if-exp ::= 'if' '(' <exp> ')' <exp>
if-else-exp ::= 'if' '(' <exp> ')' 'else' <exp>
- 74 :
- >>71
BNFは構文要素を分解して
非終端記号として名前つけていくもんと思って書くんよ
それぞれに対応する処理を書ける感じ
後他の人の指摘もだし、スペースで結合とか空とかもどこに書けるのかも問題
上に書いてあるのじゃ一式だけしか書けない上に終わらないんじゃないか
まずはjavaccやbison/yaccに食わせれるものを作ることを考えたらどう
正しいかどうか判断してくれる
- 75 :
- ちゃんとコンパイルできるBNFじゃないと納得できないってことですね。
わかりました。
>>73
infix_l = 'else' とすれば出来る。
>>74
1式終わったあともトークンがあれば、式としてさらに結合するのです。
とおりあえず、bisonに食わせられるものかいてみます。
- 76 :
- 便宜上必要なのでbisonを通すことが出来るBNFを書きました。
keyword,infix_l,infix_r,postfix,prefixと括弧は実際には登録可能にします。
%token INT FLOAT DOUBLE ID STR
%%
exp : | exp expn
expn : atom
| expn infix_l expn
| expn infix_r expn
| expn postfix
| prefix expn
| '(' expn ')'
| '[' expn ']'
| '{' expn '}'
| expn '(' expn ')'
| expn '[' expn ']'
| expn '{' expn '}'
| keyword '(' expn ')' expn
atom : INT | FLOAT | DOUBLE | ID | STR
keyword : 'if'
infix_l : '+' | '-' | '*' | '/' | 'else'
infix_r : '='
postfix : '++' | '--'
prefix : '++' | '--'
%%
$ bison cexp.y
cexp.y: conflicts: 41 shift/reduce, 22 reduce/reduce
- 77 :
- 我を張らず一度ちゃんと考え直してみてはどう。
結構無理があるぞ。
73が書いてることはifの後に来るelseしか意味がないんだから
ああいうBNFになるよって話でしょ
コンパイル出来るかどうかは基準を示しただけで
75からすると(1 else 2 - 3) なんて式も許されちゃうし
複数の文をどうやって区切るのか、a b c dなんて式も有効なのか
終わりはどうなってんのとか ,とかどうすんの?とか。
繰り返し構文なんかはどうすんのとか
全部じゃなくてもいいが、上のBNF?からは全く読めない
演算子を自由に定義したいらしいが
コード毎に意味の変わる演算子とかまともにプログラム書けないし
どっちにしろスレタイからはちょい離れて
言語設計とBNFの勉強っぽいが
- 78 :
- 低水準との関連を示して欲しいね。
- 79 :
- const必須
- 80 :
- >>76
還元-還元競合が出てるように読めるんだが
- 81 :
- >>77
この言語はLispのS式を置き換えてC言語のような言語を作るための式言語です。
S式のリーダはリストを読み込むだけでLispのプログラムかどうかは
検証できませんし、検証することを意図していません。
同じように、この言語は構文木を読み込むだけです。
だから、ご指摘のように(1 else 2)のような式もかけますし、
そのように意図して作成しています。
プログラムとして動作可能にするには、
構文木を抽象構文木へ変換する段階で検証することになります。
- 82 :
- >>78
低水準との関連は、
S式で低水準な言語を作成すれば構文木を操作することが容易な
言語を作成できます。[1][2]
しかし、一般にS式には可読性が悪いという問題があります。(慣れの問題ではあるのですが)
そこで、S式を改良して可読性を向上させた言語を作成し、
構文木を操作しやすくしたらよいのではという提案をしているわけです。
そのような言語は他にもあります[3][4]が低レベルな記述を目的とはしていないようです。
またC言語に似たシンタックスでもないようなので提案しているわけです。
[1]CiSE http://www.atmarkit.co.jp/news/200909/07/lltv02.html
[2]SC language system http://super.para.media.kyoto-u.ac.jp/~tasuku/sc/index.html
[3]Boo http://boo.codehaus.org/
[4]Cyan http://www.geocities.jp/takt0_h/cyan/index.html
- 83 :
- こっちでやってね> 19
「コンパイラ・スクリプトエンジン」相談室14
http://pc12.2ch.net/test/read.cgi/tech/1258431145/
- 84 :
- >>82
このスレの目的は低水準操作が出来る言語だよ。
- 85 :
- >>73 >>62
たとえば、if ( a ) 3 else 4 という式と 3 else 5という式があった場合
提案しているパーサではどちらも読み込まれます。
("if","(","a",")",( 3, "else", 4))と(3, "else", 5)というように。
それをさらにバリデーションにかけます。(Scalaで書きます)
def exp(e:Any):Any = e match {
case ("if", "(", a, ")", b) => return exp(a) && elseExp(b)
case (a,"+",b) => return exp(a) && exp(b)
case _ => return false
}
def elseExp(e:Any):Any = e match {
case (a,"else",b) => return exp(a) && exp(b)
case a => return exp(a)
}
このようにして正しい式かどうかを検証できます。
実際にはvalidationしながら、ASTに変換すれるとよいです。
それ以降のパスは通常の処理が出来ます。
要するに、xmlで言語作るようにすればいいわけです。
- 86 :
- 関数型言語では、このコードはどうなるのかご教授願いたい
*(volatile unsigned char *)0xFF98 |= 0x0001;
- 87 :
- 自慢げにBNFの説明してるけど、特に目新しい部分もないし
ーレベルにすら達してない
- 88 :
- >>86
peek :: Int -> IO Int
poke :: Int -> Int -> IO ()
x <- peek 0xFF98
poke 0xFF98 (x | 0x0001)
- 89 :
- >>86
自分が考えている言語が関数型言語と言えるのかどうかは分かりませんが
考えてみました。
ポインタの型が悩む所です。
volatileと*は前置演算子にしますので、
char*ではなく、*charと書くことにしたいです。型だから後置演算子とは
できないので。
D言語を参考にして値は常に配列としてアクセスすることとすれば
以下ようになるかと。
(cast(volatile *uchar)0xFF98)[0] |= 0x0001;
castがa(b)cというタイプの演算子になるので括弧をつけないといけません。
Scala風に考えれば、配列のアクセスは()で行うように
0xFF98.asInstanceOf[volatile *uchar](0) |= 0x0001;
ただこれは長いのとCから離れすぎているので
(0xFF98.cast(volatile *uchar))[0] |= 0x0001;
と書けるようにしたらよいのではないかと思います。
ポインタの型は結構難しい話です。
演算子は記号の連続とかんがえていたのですが、そうすると
c言語のint*****のような型が難しくなるので登録されている演算子
のみで字句解析を変更する仕様にしたらいいのかなと思います。
どちらにせよ、ある程度現在のC言語より長く記述することになるでしょう。
- 90 :
- >>87
理解したということですね。よかった。
- 91 :
- どんな言語でもいいがおMemOr(0xff00,1)でよかろう
- 92 :
- ビルドイン関数ですか?
- 93 :
- そうそう。
いや組み込み屋なんだが
直アドレス参照はインラインアセンブラとか組込み関数とかの手段さえあれば
言語自体には無いってのもありかなと
- 94 :
- 後さリンク後にも最適化フェーズ置いて
ループをカウンタじゃなく範囲でも回せるようにしたら
範囲チェックを言語に入れても実用度上がらないかな
- 95 :
- 何百の論説よりも、一つの実例
- 96 :
- 前のはlinuxのinx/outxやwiring
後のはgolang
- 97 :
- あ、goはリンク時に最適化はないが。
- 98 :
- MinCamlをScalaに移植してみてました。
byaccとjflexで構文木読み込みして型推論のところまで。
実例作るだけならできそうだけど、エラー処理が駄目ってなるのは目に見えてるので
地道に着実に実力つけつつ、仕様は仕様で考えてきます。w
- 99 :
- アセンブラを作りたいとして、XByakとかを移植は出来るとは思うのですが、
ちょうどいい教科書的なものってないですかねぇ?
ScalaでいろんなCPUのアセンブラ出来たらいいと思うけど、作るのが難しい。
- 100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
・ 次のスレ
50: Ruby 初心者スレッド Part 47 (883)
51: 【至急】助けてください。 (196)
52: 関数型プログラミング言語Haskell Part17 (160)
53: Objective-C [ObjC part:6]; (562)
-