このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
あくまで、GCなしで関数型とか難しいことは置いて置いて
高速なプログラミング言語を作りたい人用らしいです
FORTHとか?
高級アセンブラを目指す言語を考えるということで
さ、改めてCの問題点から挙げていこうか
・環境依存だらけ
・型不足
・スパゲティマクロ
C++はどっち?
理想と言われている構文
・PythonかGo風の文法
・パースしずらい構文
・わかりずらい関数ポインタ
・セキュリティホールになる標準関数
>>9 字下げげ方式は賛成だけど、キーワード方式は嫌だな
13 :
デフォルトの名無しさん:2010/05/30(日) 22:34:48
Goが理想って言われているというのは初めて聞いたのだけど
どの変がりそうなの?
凄いことに気づいた。
C,goだから次はrockだ。
See、Go、look
C、Go、Rock、Nana、Hatch、Q、Jue
日本の時代きたな
19 :
デフォルトの名無しさん:2010/05/30(日) 23:10:20
俺的なまとめ
・C言語のいらない機能は削る。
・GCは無しが基本でオプションで付けられるようにしたらよさそう。
・C++/CLI、c++0x等が参考になる。
・部分適用はカリー化した文法がよさそう。
・マクロは基本無しにする。
・Lisp級のマクロも欲しい人はいるので、
マクロを作りやすいように式ベースにする。
・関数型言語の機能を取り込める部分は取り込む。
・Rubyのようにwithを拡張してみたい。
・関数型言語は並列化に強いらしい。
何故嫌なのかといえば、あくまで低レイヤーな言語を作りたいからです。
要求内容が全然低レイヤー向けじゃないんだが
>>19のすばらしいところは全てが間違いであることだ。
ここまで見事なアンチパターンを展開できる
>>19の実力には
計り知れないものがあると俺には感じられる。
>>19 あっちのスレに必要な人材なのにな。
よくあるミスキャストだよな。
野心的だが簡単には否定できないだろ。
具体的な問題点が指摘できないなら黙ってた方がいい。
>>19 お前と仕事したら毎日がカーニバルだ
無論ほめ言葉だ
取りあえずデータ型は
unsigned char (8bit)
unsined long (CPU依存)
bool (carry flag)
だけだ
符号付はclass定義
>>19 お前なら、日本国民の腐った依存心を叩きなおすことができる
33 :
19:2010/05/31(月) 00:04:00
注目をいただき、ありがとうありがとう!!
せっかく注目を浴びているので考えていることを書いて置きます。
・優先順位付きのユーザー定義可能な演算子
・数種類の演算子ですべてを表す。
・括弧演算子aaa{}とローカルブロック{}の結合を止めるにはどうしたらよいか?
・空行を入れる、local{}等とするか、
改行を挟んだ括弧の結合は抑止するのはどちらがいいか?
要するにScalaとC式方式のどっちがいいか?
・圧力は炭素を圧縮し美しいダイヤを作る構想には有難い。
なんてことを考えたり話したいと思ってます。
ということでなにとぞよろしくお願いします。
>>33 マークシートで0点取るぐらいの天才だな。
抽象化されていないデータ扱っているときにそんなもの出されたら、不愉快になるな。
先に意味論を考えた方がいいんじゃないか。
「コンピュータにどういう処理をさせたいのか」をまず考え、
それからその処理を効率よく指示するための構文を考えないと、
結局C言語より使えない物が出来上がるぞ。
低水準言語を開発するのだから、なおさらな。
>>19 とか見てると、まるで RPG を作るのに、
ストーリーやグラフィックから作り込んでくみたいだ。
彼は関数型言語を作りたいと言ってるわけではない。
>>37 >RPG を作るのに、ストーリーやグラフィックから作り込んでく
RPGツクールならそれでOK
つまり彼はそのレベルなのだよ
具体的な指摘もしないユーザーレベル
いきなり19降臨か
楽しいスレになりそうだなw
go--みたいな感じでどうよ
gcとインターフェースなし
chanとgoroutineはオプショナル
なんだよ関数型もこっちでやるのかよー。アンチ涙目www
オーダー固定のビットストリーム型
二進化十進型 (精度固定で符号・循環/無限小数を示すフラグ付き)
とかどうよ?
>>43 それさえも記述できる低水準。
組み込み型はint byte boolのみ
unsignedなくて低水準?
boolがキャリーはやりすぎw
型はstdint系でいんじゃね
アセンブラ並みにunsignedのみにしよう。
後の型はクラス定義だ
アセンブラがunsignedのみ?
加算器には符号はないし。2の補数と見て処理するかどうかはプログラマしだい。
お前は加算器に命令だせるのかw
たいていのcpuにあるadd命令なんてヤツだろが。。
てか符号有無なしとか不便過ぎだろ
整数は8,16,32,64の符号有無で8種と
機種依存の符号有無の2種でどや
dspとか考えたら符合は必須だが
オーバー、アンダーフローは機種依存かね
マクロ大好きなやつはまたforkして
どんな構文でも作れちゃう万能マクロプロセッサスレとか作ったらどう
Cのマクロが糞なだけ
あれ以上は意図的にやってないだけ
>>51 符号付整数型もclass宣言してしまえばいい。
キャリーがあれば、多倍長整数だってclass宣言すればいい。
浮動小数点も、FPU命令をオペレーターオーバーロードで記述できるようにすればいい。
SIMDも好きに定義すればいい。
classって意味わかってんのか?
結局全部インライン関数かアセンブラでやる位なら
ただのマクロアセンブラで言語じゃねえし
そもそも演算子オーバーロードなんてマクロと同じ位いらんやろ
頭おかしい奴がいる
58 :
19:2010/05/31(月) 23:14:40
____
/ u \
/ \ /\ 紙光臨とか言ってるし2ちゃねらのことだから
/ し (>) (<) \ 大変なことになってるかも・・・
| ∪ (__人__) J | ________
\ u `⌒´ / | | |
ノ \ | | |
/´ | | |
| l | | |
____
/ u \
/ \ ─\ チラッ
/ し (>) (●) \
| ∪ (__人__) J | ________
\ u `⌒´ / | | |
ノ \ | | |
/´ | | |
| l | | |
____
/::::::::::::::::\
/::::::─三三─\
/:::::::: ( ○)三(○)\ レ、レス56!!これだけか!
|::::::::::::::::::::(__人__):::: | ________
\::::::::: |r┬-| ,/ .| | |
ノ:::::::::::: `ー'´ \ | | |
/::::::::::::::::::::: | | |
|::::::::::::::::: l | | |
スレを三つに分散してんだからこんなもんだろ。ム板では
神は元スレの続き立てたみたいやなw
61 :
19:2010/05/31(月) 23:38:13
ま、せっかくなのでゆるーくつかってってみよっと。
62 :
19:2010/05/31(月) 23:56:38
基本となる式言語の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 :
19:2010/06/01(火) 00:08:34
上でひとつ忘れていたのが、空白による結合です。
10 exp = exp exp
これが8番目の空白演算子でclean bookから取って@で表すことにしています。
下降型の優先順位法を使えば、
この式のパーサの重要な部分は1つの関数で書くことができます。
それゆえにS式のreaderに比べたら複雑ではありますが、
シンプルにパーサを書くことができます。
C言語のシンタックス上の見た目を限りなく削り取るとこのような形になると思います。
これがC言語一族のシンタックス上の本質であると考えています。
64 :
19:2010/06/01(火) 00:13:37
この言語自体は既にほぼ完成しています。
JavaScript,haXe,PHP,Scala,Java,D言語などで実装しています。
ほぼというのには理由があって、バグはつぶしていない事と、
ほとんど自分でしか考えていなくて議論すべき部分が議論されていないからです。
65 :
19:2010/06/01(火) 00:21:34
議論したい話としては
7 keyword '(' exp ')' exp
という演算子が必要であるかどうかです。
この演算子はなくても何とかなり、なければfor文やwhile文等に{}が必然的に
必要になります。
ただし、if else文の扱いがやや不思議な感じになります。
この7の演算子はjavascriptにfunction(a,b)a+bという記述が入ったことと
javascriptやScala、for文やwhile文に必ず{}が必要というわけではない
ことから付け加えました。
66 :
19:2010/06/01(火) 01:03:44
ただ、これはgolangを見て違うんじゃないかと思うようになりました。
golangではvar a int;のように記述したり、while i == 1 {}
のように記述したりします。これらのvarやwhileは前置2項演算子
といえるでしょう。
keyword ( exp ) exp
の名前は文演算子と名づけていました。
C言語系の多くの文はこのような形をしているからです。
しかし式を書くのに文演算子ってなにやら奇妙な名前なのです。
とりあえずこっちに居座るつもりと見ていいんだな?
ここは19専用スレにして別スレ立てればいいよ
69 :
19:2010/06/01(火) 01:28:02
>>67 とりあえずここにいますよ。
寂しくなったら移動すると思いますけど。w
BNFじゃねえし、式でもねえし
それじゃパーザ作れないよ
71 :
19:2010/06/01(火) 07:39:17
72 :
デフォルトの名無しさん:2010/06/01(火) 10:49:43
>>62 elseは単体の式として成立しないのに
なぜ1の演算子で表せると思えるのかな?
exp ::= <if-exp> | <if-else-exp> ...
if-exp ::= 'if' '(' <exp> ')' <exp>
if-else-exp ::= 'if' '(' <exp> ')' 'else' <exp>
>>71 BNFは構文要素を分解して
非終端記号として名前つけていくもんと思って書くんよ
それぞれに対応する処理を書ける感じ
後他の人の指摘もだし、スペースで結合とか空とかもどこに書けるのかも問題
上に書いてあるのじゃ一式だけしか書けない上に終わらないんじゃないか
まずはjavaccやbison/yaccに食わせれるものを作ることを考えたらどう
正しいかどうか判断してくれる
75 :
19:2010/06/02(水) 10:51:44
ちゃんとコンパイルできるBNFじゃないと納得できないってことですね。
わかりました。
>>73 infix_l = 'else' とすれば出来る。
>>74 1式終わったあともトークンがあれば、式としてさらに結合するのです。
とおりあえず、bisonに食わせられるものかいてみます。
76 :
19:2010/06/02(水) 11:51:46
便宜上必要なので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
我を張らず一度ちゃんと考え直してみてはどう。
結構無理があるぞ。
73が書いてることはifの後に来るelseしか意味がないんだから
ああいうBNFになるよって話でしょ
コンパイル出来るかどうかは基準を示しただけで
75からすると(1 else 2 - 3) なんて式も許されちゃうし
複数の文をどうやって区切るのか、a b c dなんて式も有効なのか
終わりはどうなってんのとか ,とかどうすんの?とか。
繰り返し構文なんかはどうすんのとか
全部じゃなくてもいいが、上のBNF?からは全く読めない
演算子を自由に定義したいらしいが
コード毎に意味の変わる演算子とかまともにプログラム書けないし
どっちにしろスレタイからはちょい離れて
言語設計とBNFの勉強っぽいが
低水準との関連を示して欲しいね。
const必須
>>76 還元-還元競合が出てるように読めるんだが
81 :
19:2010/06/02(水) 13:26:31
>>77 この言語はLispのS式を置き換えてC言語のような言語を作るための式言語です。
S式のリーダはリストを読み込むだけでLispのプログラムかどうかは
検証できませんし、検証することを意図していません。
同じように、この言語は構文木を読み込むだけです。
だから、ご指摘のように(1 else 2)のような式もかけますし、
そのように意図して作成しています。
プログラムとして動作可能にするには、
構文木を抽象構文木へ変換する段階で検証することになります。
82 :
19:2010/06/02(水) 13:54:19
>>82 このスレの目的は低水準操作が出来る言語だよ。
85 :
19:2010/06/02(水) 23:49:08
>>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で言語作るようにすればいいわけです。
関数型言語では、このコードはどうなるのかご教授願いたい
*(volatile unsigned char *)0xFF98 |= 0x0001;
自慢げにBNFの説明してるけど、特に目新しい部分もないし
オナニーレベルにすら達してない
>>86 peek :: Int -> IO Int
poke :: Int -> Int -> IO ()
x <- peek 0xFF98
poke 0xFF98 (x | 0x0001)
89 :
19:2010/06/03(木) 08:29:02
>>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 :
19:2010/06/03(木) 08:33:12
どんな言語でもいいがおMemOr(0xff00,1)でよかろう
ビルドイン関数ですか?
そうそう。
いや組み込み屋なんだが
直アドレス参照はインラインアセンブラとか組込み関数とかの手段さえあれば
言語自体には無いってのもありかなと
後さリンク後にも最適化フェーズ置いて
ループをカウンタじゃなく範囲でも回せるようにしたら
範囲チェックを言語に入れても実用度上がらないかな
何百の論説よりも、一つの実例
前のはlinuxのinx/outxやwiring
後のはgolang
あ、goはリンク時に最適化はないが。
98 :
19:2010/06/05(土) 00:26:46
MinCamlをScalaに移植してみてました。
byaccとjflexで構文木読み込みして型推論のところまで。
実例作るだけならできそうだけど、エラー処理が駄目ってなるのは目に見えてるので
地道に着実に実力つけつつ、仕様は仕様で考えてきます。w
99 :
19:2010/06/05(土) 00:35:30
アセンブラを作りたいとして、XByakとかを移植は出来るとは思うのですが、
ちょうどいい教科書的なものってないですかねぇ?
ScalaでいろんなCPUのアセンブラ出来たらいいと思うけど、作るのが難しい。
リンク時に最適化って出来るの?
できるよ。
できないよ。
できるよ。
Microsoft Cのリンカはすることができたね。
far call/jumpをnear call/jumpにとか
near jumpをshort jumpにとか
リンク時にしかできない最適化を普通にやってたな。
MS-Cの時代から。
あと実行時にFPU命令をサポートしないCPUで実行したとき
無効命令をトラップしてFPU命令をライブラリCALL命令に置き換え
以後はライブラリを使うようにするとかも普通に行われてた。
Jumpやcallの置き換えは他のcpuでも普通にやるね
でも実行時に命令の書き換えは不都合でるし下品だしセキュアじゃないからな
でいわゆるリンカーじゃないな
リンクせんとアドレスが決まらないからでしょ
jmp/call 命令はマシン語レベルでは命令が複数あってだな・・・
>>107 よく読め
リンク時に相対jump等の短い命令に置き換えるのはgnu ldとかでもやれっし
でも実行時にコードセグメント書き換えるのはお下品だとゆってる
どこを?
自己書き換えとか普通にやってた
最近はやらんけど
最近だと実行可能属性と書換え可能属性は排他設定とかいうOSもでてきているしな
実際のアドレスは実行時にしか決まらないんだから
MMUとPC相対アドレシングモードのないCPUのOS
代表的なものはMS-DOSは常識的に実行時に
セグメントアドレスを書き換えてる。
EXEヘッダにはそのための情報が入っている。
>>113 ??自分で書いてるように、実行環境が仮想アドレスなら
コンパイル時に決められるんでしょ
115 :
デフォルトの名無しさん:2010/06/06(日) 13:38:31
だれか、アセンブラ作って
最適化アセンブラが欲しい。
OSのプログラムローダが書き換えるのと
プログラム自体が書き換えるのは
話が違うと思うが
OPTASM?
>>113 >>117 が全部書いてくれたな
実行時に仮想アドレスをシャッフルするのは安全性のためにもアリな話だが
コード部分は書き換え不可にしたりROMだったりするかもだし
コードセグメントを自分で書き換えするのはJITみたいなの以外はナシだろうな
実行時ってかロード時な。
自己書換えはそんなに特殊なテクニックってわけでもない。
たとえば、初期化とかでよくある一回目だけ特別な処理が必要、とかいう場合に、
static flag = true;
if (flag) {
flag = false;
特別な処理
}
とすると、毎回フラグチェックが入って無駄なので、自己書換えを使うとか。
自己書換え使わんでも最近のプロセッサなら分岐予測が当たるように最適化すれば
そんなに高コストでもないとは思うが。
最近はセキュリティ上自己書き換えは許さない方がいいもんなあ
>>121 もともと自己書き換えは特殊だよ。
昔のプアなCPUだとそういうのもありだったが今時はあまり流行らんわな
デバッガも困るし
自己書き換えは性能が下がるしね
書き換える前の命令がi-cacheとかに入ってる可能性があるから
適切にフラッシュしなければならない
書き換える際にdcacheにも入るし
パイプラインもだよね
初期化時に書き換えて最適化するんだから
性能は上がりこそすれ下がることは無い。
全く論点についてこれないなら素直に認めろよ。
論点はだな
コードセグメント書き換え不可
書き換える一般的な方法もない
最適化にも対応出来ない
キャッシュとか意識しないとだめ
メリットは少々の高速化
むしろ関数ポインタか呼ぶ前に判定する方が速い
組み込みならそもそも何度も初期化通るドン臭いコードは書かない
一回初期化で通るだけなら一番最後以外は
全部無意味か間違いってことじゃん
後付で機能足す時によくやるわな
20年前からやってたが
singletonて名前がついててわろた奴だ
が実はスレッドセーフじゃないからイマイチ
>>128 いきなりgetとか書いてそん中で
最初だけ初期化もやっちまうとかやね
出た「組み込みなら」w
低水準言語つって普通組み込み意識するだろ
golangでさえOS無しで走らせるための
サンプル的なコードが入ってるのに。
133 :
19:2010/06/07(月) 22:29:50
むかーし、msxのころに自己書き換えの記述見て凄いなぁ思ったことありました。
懐かしい。
でも、8086ではセグメント地獄だわ、windowsになったらWinAPI地獄だわ、
C++だわなんだわで、すっかり自己書き換えなんて意識しなくなりました。
エミュレータやらVMの場合にJITとかする場合はゴリゴリとマシン語生成したりしますね。
デバッガもプログラム書き換えますね。
自己書き換え可能な言語のPCASTLは面白いですね。
デバッガは自己書き変えじゃないし
jitも自己書き換えとは別だよね
昔は自己書き変えどころか
同じコードをワザとずれたアドレスで実行したり
実行中にRAMのマッピング変えたり
やりたい放題だったよね
高階な言語と違って
最適化されたRISCのマシンコードとか
実質的に書きかえは難しい
>>134 > 同じコードをワザとずれたアドレスで実行したり
これは今でもやるだろ。
リロケータブルな話ちゃうよ
奇数番地とかから実行して別なことさせたり
>>136 jmp命令の代わりに使うのは、よく知られたテクニックでしょ。
>>19 MSDOSの頃はオーバーレイとかバンク切り替えとか色々あったやろ
おっさん
86は黒い歴史が長かったしな
140 :
19:2010/06/08(火) 09:23:40
>>138 あったあった。秘功をついた。
おっさんで悪かったな
プロテクトで実行中コードのあるバンク切り替えて
先のプログラムを走らせたり
142 :
19:2010/06/09(水) 10:35:02
今でも、FARポインタとか使う環境ってあるんでしょうか?
16bit CPUなら大体ある
セグメントみたいなものは今も健在
マイコンだとセクションごとに使う命令が違ったりする
145 :
19:2010/06/09(水) 23:15:39
ひえー、FARポインタとNEARポインタかぁ。
バンク切り替え機能とかあると嬉しいとかっていつの時代だ?
ってかんじだけど、必要なところでは必要なんですね。
そんな古い環境なら古い言語使ってろってことではなく、
新しい言語使いたい!みたいな感じなんですね。
新しい言語でファミコンのゲーム作るぞーみたいな勢いでw
言動が少しおかしいけど
何かの病気なのかな
147 :
19:2010/06/10(木) 00:32:13
ひえー、FARポインタとNEARポインタかぁ。
バンク切り替え機能とかあると嬉しいとかっていつの時代だ?
ってかんじだけど、必要なところでは必要なんですね。
そんな古い環境なら古い言語使ってろってことではなく、
新しい言語使いたい!みたいな感じなんですね。
新しい言語でファミコンのゲーム作るぞーみたいな勢いでw
148 :
19:2010/06/10(木) 00:33:36
まちがえた。
病気といえば、病気ですが、性格と言えば性格ですね
149 :
19:2010/06/10(木) 07:36:07
私が考えている言語のプログラミング言語の核となるパーサの作り方を説明しよう。
パーサは文字列から人の列を作りだし、トーナメント戦を行うようにして構文木を作成する。
通常のトーナメント戦ではトーナメント表が先に出来上がっているが、
戦いが終わって初めてトーナメント表が出来上がるところが通常のトーナメント戦との違いである。
まず式を読み込む大会(meet)を開催する。
大会ではまず糸(string)から人々の列(guys)を作りだす。入場行進のようなものだ。
普通はこの処理を字句解析と呼ぶ。
次に戦うやつらが持っている力の表(powers)を作成する。
次にトーナメント戦を行う。
このトーナメント戦が終われば戦いの結果であるトーナメント表が出来上がるというわけだ。
ここでトーナメントのルールを説明しよう。
トーナメントはチーム戦である。チームは1〜N人で構成される。
特にN人で構成されるチームは愛(Aloha)と友情によって強く結ばれる。
各々のチームは力を持っていて力が強いほうが勝ち抜く。
勝ったチームは負けたチームを自分の配下に置き、こぶしとこぶしをぶつけ合わせた
熱い愛と友情によって新たなチームを結成する。
最初は力0でトーナメントを開始する。
トーナメントを開始したら、やつらの中から1人取り出し1人のチームを作ってもらう。
次に戦うやつの力とその場の力を戦わせる。
やつが負ければバトルは終了しチームは帰ってもらう。
やつが勝てば列から取り出し、やつの力で次のトーナメントを行う。
トーナメントの結果から選ばれたチームをやつのチームに加えて次の戦いを行う。
このような戦いの結果1つの大きなチームが形成される。
これがトーナメント戦の戦いの結果であり思い描いていたツリー状のトーナメント表であり
構文木となる。
150 :
19:2010/06/10(木) 07:37:30
以下が説明したパーサのプログラム例である。
<script>
function Aloha(g, l, r) {
this.g = g;
this.l = l;
this.r = r;
}
Aloha.prototype.toString = function() { return this.g+"["+this.l+","+this.r+"]" }
Aloha.meet = function (str) {
var guys = str.split(/\s+/)
var powers = {"+":10,"-":10,"*":20,"/":20};
function tournament(power) {
var team = guys.shift();
while (powers[guys[0]] > power) {
var champion = guys.shift();
team = new Bond(champion, team, tournament(powers[op]));
}
return team;
}
return tournament(0);
}
alert(C.meet("1 + 2 * 3 * 5"))
</script>
151 :
19:2010/06/10(木) 07:47:51
上の例にはバグが潜んでいる。
結果、+[1,*[*[2,3],5]]となるように修正してみてくれ。
86使って低レベルやるなら32bitモードでもfarポインタが必要。
アプリケーションレベルでは意識しなくてもいいようにできるが
それを管理する側ではそうはいかない。
そしてそれを作るための言語なら当然そういう機能が必要。
CPU組み込みのセグメントレジスタなんて
マイコンはないのが主流。RISC系にもない
farとか言語が意識するなんて全く必要ねえな
78K0RのCSとESを触りまくる俺涙目
ご愁傷さま
今時CすらないCPUもあるしつらいわな
要するに、ケチケチしてるとろくなことにならないってことだな
>>155 CすらないならGCCのバックエンドつくるのが一番手っ取り早いんじゃね
R8Cだとセグメントレジスタはないが、ルネのコンパイラだと
ポインタの大きさがfar(4byte)、near(2byte)になってる
空間が20bitしかないのに4byteかよ
Cコンパイラは、最適化しなかったら、相当特殊なターゲットでもない限りあっさり作れるだろ。
ポインタがintに入れられることを前提としてるプログラムとかたまにあるからな
>>163 初版?もってないね。
俺がそれを持っていると想定してしまった理由は?
「昔」をC89以後とするか以前とするか、だなw
妖しい時はまともなコンパイラなら、警告してくれるでしょ
キャストすればうるさい警告は消えてくれる
なかったことにできる!
>>159 CすらないへぼくてマイナーなCPUなんぞ
金もらわんとつくらんでしょw
PICはアーキひどいけど一応コンパイラあるよね
やっぱシェアの大きさだよね
何も考えないでキャストすればハマるでしょ
本当に作りたいのか
妄想を語りたいのか
思考実験
作りたい
でも使いたくはない
174 :
19:2010/06/11(金) 23:39:24
作って使いたいですけど、完成はいつのことになるやら
まだいたんだ
176 :
19:2010/06/12(土) 22:20:18
いるよー
言語作るとか考えるより、
それで何を作りたいか考えるべきだ
言語を作りたい
英語、英語を勉強しろ
180 :
19:2010/06/13(日) 00:54:46
smart.fm Lang-8 あたりお勧め。
Let's talk about making of programming language dream using English!!
181 :
19:2010/06/13(日) 02:06:03
リンク時に極限まで最適化したいから、それまでは中間言語
183 :
19:2010/06/19(土) 23:12:34
今はMinCamlをOCamlからScalaに移植してみてます。
とりあえず、動作確認なしでコンパイルはとおってる状態です。
構文木->名前を単一にしたデータ->クロージャ変換されたデータ->仮想アセンブラ->アセンブラ
という変換をしています。
つ低水準言語
185 :
19:2010/06/20(日) 03:07:27
もちろん、最終的には低水準に持っていこうと思ってますけど、
関数型言語で作る低水準言語のちょうどいい例を知らないのでw。
最適化フェーズもあるし、色々参考になると思ってます。
関数型のように実行順序というか評価順序が掴みにくい言語は低水準に向かなくね?
関数型の設計思想そのものが低水準のことを意識していないし。
188 :
19:2010/06/20(日) 21:52:09
関数型言語でゲームを作るというのをやろうとしてみたことがあったので、
確かにcamlで逐次実行するプログラムを書くのは確かに書きずらいと思います。
ただコンパイラを実装する言語としても、実装される言語としてもシンプルでいいと思います。
シンプルな関数型言語の実装で学んだことを、複雑な逐次実行型言語の実装に生かせたらいいなと思っています。
何で関数型にこだわるんだろうね。関数型言語スレ立てれば良いのに。
190 :
19:2010/06/20(日) 22:03:19
それって低水準って言うからにはハードウェアの制御とか書けるの?
例えば8251の通信ドライバーとか
余裕のよっちゃん
Cにできることはすべてできる
194 :
19:2010/06/20(日) 22:35:17
書けません。勉強用の資料です。
まずこれで作り方勉強してそれから、低水準言語を実装しようという
気の長ーいことを考えてます。だから、まだ当分、低水準言語を
作りたいけど作れないんですw
195 :
19:2010/06/20(日) 22:39:29
fail-safe cを次に読めばいいのかもしれないですね
196 :
19:2010/06/20(日) 22:40:35
訂正、Fail-Safe Cです。
いい加減ですいません。
不勉強で悪いんだが
関数型言語で割り込みとI/Oはどう書くんだろ?
peek と poke は getc や putc と基本的には同じだろ
メモリマップド I/O でなければ inp と outp という別の関数になるとか
割り込みは、関数をハンドラにする機能を、言語とランタイムに実装
>>197 割り込みにもいろいろあるけどもっと具体的に言ってくれる?
>>198 悪い意味じゃないが意外に普通なんだな
86以外じゃI/Oマップドなんて死語になってるよな
関数型言語でVolateなデータはどういう扱いになるのか興味あるな
>>199 割り込みなんてソフトかハードしかねえだろ
どんだけいろいろあんだよ
BASICみたいなのがでけたりして
ハードウェアも関数型言語に対応した
つくりにしないとだめだよ。
今のハードウェアは手続き型言語用だから。
ハードウェアっつーかスタックベースで考えてるからだな
スタックベースかどうかは関係ないと思うけど
ハードで処理できる命令が自己増殖すればいいのかな?
関数型言語向けハードってどんなんだ?
つか関数型的なHDL出来ねえかな
深く考えてないが意外にいけそうな気がする
関数型言語のモデルにグラフリダクションがあるけど、それをハードウェアで
やってしまえとかいう研究とか、ないではない。
関数型的というか、VerilogないしVHDLからプロセス的なものを全部とっぱらって、
宣言的な機能だけにしたらすっきりするんじゃないかと漠然と思っている。
思っているだけだが。
>>207 206だが、たぶん似た感想もってそうだな
グラフの縮退とかはある程度コンパイル時に済ませて
分解してからHDL的ななにかにMapして、
投機的に同時に動かしたりデータ駆動的に動く感じだとどうだろね
ついに新言語のために新ハードを考えるまでになったか
なんという本末転倒っぷりw
>>208 ヒープメモリどうすんだよ・・・まさかHWでGCするの?
新言語スレ落ちたぞ・・
作る気ないからや
関数型信者が暴れるから
しかし手続き型を研究してる奴なんて、もういまどきいないぞ。
今どきの言語研究が低水準を全く意識してないから。
低水準はC++で間に合ってるからな
Cだろ
C++は暗黙のコードを作りすぎ。低水準とは言えない。
やはり新言語ではハードをリアルタイムにリコンフィグしながら動くでFA?
221 :
19:2010/07/19(月) 00:18:20
まだまだ、低水準な言語が作れる状況ではありませんが、
scalaに移植していたmincamlが動き始めました。
元がspark用の設計のものをx86用に移植中のものの移植なので完全ではないですけど
フロントエンドからバックエンドまで最適化付きで実装されているので
今後の開発の参考になるはずです。
たまにはあげてみる
記述する言語は unicode のみ許可
unicode から sjis や euc への変換は標準関数でサポート
1行は必ずセミコロンで閉じたいのです
構造体必須だといいな
正規表現あると楽ちん
変数は宣言必須 (初心者のケアレスミスは減らそうぜ!)
型宣言も必須 (文字変数に整数代入は warning じゃなくてエラーに!)
変換関数を通さない型の違う代入はエラー
1つの事をしたいのに、書き方が複数存在することは避ける (悪い例として perl とかね)
環境構築が面倒なのはやだ (たとえば Java とか PHP とか) ← 何気に重要
C#はMS-OSでしか満足に動かないから却下
Monoの人が聞いたら怒るぞ
Monoは完全に動作するわけではないし、所詮はハックなんだよ。
Monoが動いたとしてもXNAみたいな付属品も満足に動かせないしなぁ。
満足にC#が使えるのはMS-OSだけだよw
iso, jis の範囲内なら動作するんじゃないのかな?
このスレで、具体的に実装されている処理系の優劣や、言語仕様と関係ないライブラリの話を持ち出して何がしたいんだ。
ほぼpasca...いや、なんもない
どうやら低水準言語はC/C++で十分なんですね。
移植が簡単にできて、他の言語処理系が記述しやすい言語ってないのかな?
233 :
デフォルトの名無しさん:2011/02/15(火) 07:52:29
バイトコードのトランスレータとかってどんな状況なんだろう?
とりあえずアセンブラも分からん奴を弾かないと会話が成り立たないスレ
が、書いたことある奴は別に新言語なんか要らずに冷やかしに見に来ているだけなので、結局会話が
成り立たないスレ
235 :
デフォルトの名無しさん:2011/02/15(火) 08:35:30
絶対にまともな物が完成しないと確実に断言できるスレ、だな
とりあえずアセンブリ言語の方言をなんとかしようぜ。
237 :
デフォルトの名無しさん:2011/02/15(火) 09:30:22
>>232 言語処理系なんて環境依存ほとんどないからC/C++でいい。
高位合成はまだまだ研究段階で
汎用言語には適用できないはずだが
>>238 むしろC++の処理系が書きやすい言語が欲しい。
>>237 で、記述がテキストでなく LabView みたいに回路図入力。
それなんてVHDL
>>206 bluespec
今はVerilogライクなHDLを出してるけど以前はHaskellライクなHDLを出してた。
スタックマシンとかアセンブラレベルのトランスレータってなんかない?
C/C++以上の物が作れないといういつもの末路
Cの括弧の代わりに階層化行番号を導入しよう。
低水準言語って、コンパイル→アセンブル→リンクの過程で、
コンパイル過程以降機械語以前で使う言語だよな。アセンブリが含まれるのは当然だけど、
バイトコードも低水準言語に含まれるのか?
含まれるわけがない
アセンブリは低水準言語じゃないしな
>>250 低水準言語だから
厳密に低水準言語と言えるのはマシン語とアセンブラしかない
c言語は高級アセンブラの異名は持ってるけど、高水準言語
マシンコードは言語なんだろうか
機械語という立派な言語
へたすりゃ人間だって話せるやつがいるんだぜ
こんなネタがあったな。
真のウィザードは口で受話器に「ピー、ヒョロヒョロ」と発声すると相手のFAXに絵を送れるってやつ。
食玩で電話を只がけしたクラッカーは実在する
昔キャリーラボのBase80とかを
いじった記憶があるな
あれをC風にすりゃ
昔は普通にメモリダンプ読んで
直接書き換えしたよな
逆に今最高水準の言語は何だよ(´・ω・`)?
LISP
LLVMは高水準もカバーするが最高水準はねーわ
高水準の意味ちゃんと分かってるのか知らんけど
最高水準となるとシェルスクリプトかGUIか
右へ行くほど低水準:
Sh & GUI -> グルー言語 -> コンパイル&インタプリタの非グルー言語 -> 中間言語 -> アセンブリ -> 機械語
まるで水準の意味が違う
そもそもGUIがプログラミング言語とか
計算機利用のレイヤのことを語りたかったんじゃないかな
わかった!LabViewのことか
267 :
デフォルトの名無しさん:2012/01/08(日) 15:11:48.17
カリー化カリー化言ってるうちに10スレぐらい消化していたが
1行もコードを生み出さなかったプログラム板最低最悪の糞スレ
LLVMアセンブラでいいじゃん