5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

低水準言語を開発したい

1 :デフォルトの名無しさん:2010/05/30(日) 21:53:19
http://pc12.2ch.net/test/read.cgi/tech/1274015781/l50 の継続スレのかたわれです。
低水準言語に絞ったスレです。言語全般の話題は「新言語を開発したい」のほうへどうぞ。

2 :デフォルトの名無しさん:2010/05/30(日) 22:04:13
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所

3 :デフォルトの名無しさん:2010/05/30(日) 22:14:38
あくまで、GCなしで関数型とか難しいことは置いて置いて
高速なプログラミング言語を作りたい人用らしいです

4 :デフォルトの名無しさん:2010/05/30(日) 22:16:37
FORTHとか?

5 :デフォルトの名無しさん:2010/05/30(日) 22:24:10
高級アセンブラを目指す言語を考えるということで

6 :デフォルトの名無しさん:2010/05/30(日) 22:28:24
さ、改めてCの問題点から挙げていこうか

・環境依存だらけ
・型不足
・スパゲティマクロ

7 :デフォルトの名無しさん:2010/05/30(日) 22:30:40
いきなりでなんだが、
>>6には失望した


8 :デフォルトの名無しさん:2010/05/30(日) 22:30:52
C++はどっち?

9 :デフォルトの名無しさん:2010/05/30(日) 22:31:00
理想と言われている構文
・PythonかGo風の文法

10 :デフォルトの名無しさん:2010/05/30(日) 22:32:25
・パースしずらい構文
・わかりずらい関数ポインタ
・セキュリティホールになる標準関数

11 :デフォルトの名無しさん:2010/05/30(日) 22:32:47
>>7
では有望な意見をよろしく

12 :デフォルトの名無しさん:2010/05/30(日) 22:33:42
>>9
字下げげ方式は賛成だけど、キーワード方式は嫌だな

13 :デフォルトの名無しさん:2010/05/30(日) 22:34:48
Goが理想って言われているというのは初めて聞いたのだけど
どの変がりそうなの?

14 :デフォルトの名無しさん:2010/05/30(日) 22:35:03
凄いことに気づいた。
C,goだから次はrockだ。

15 :デフォルトの名無しさん:2010/05/30(日) 22:40:55
See、Go、look

16 :デフォルトの名無しさん:2010/05/30(日) 22:41:07
>>13
過去ログ嫁

17 :デフォルトの名無しさん:2010/05/30(日) 22:43:07
C、Go、Rock、Nana、Hatch、Q、Jue

18 :デフォルトの名無しさん:2010/05/30(日) 22:47:04
日本の時代きたな

19 :デフォルトの名無しさん:2010/05/30(日) 23:10:20
俺的なまとめ
・C言語のいらない機能は削る。
・GCは無しが基本でオプションで付けられるようにしたらよさそう。
 ・C++/CLI、c++0x等が参考になる。
・部分適用はカリー化した文法がよさそう。
・マクロは基本無しにする。
・Lisp級のマクロも欲しい人はいるので、
 マクロを作りやすいように式ベースにする。
・関数型言語の機能を取り込める部分は取り込む。
・Rubyのようにwithを拡張してみたい。
・関数型言語は並列化に強いらしい。

20 :デフォルトの名無しさん:2010/05/30(日) 23:18:13
>>19
もう一個の方へ行け。

21 :デフォルトの名無しさん:2010/05/30(日) 23:21:10
>>20
嫌です。

22 :デフォルトの名無しさん:2010/05/30(日) 23:33:06
何故嫌なのかといえば、あくまで低レイヤーな言語を作りたいからです。

23 :デフォルトの名無しさん:2010/05/30(日) 23:37:50
要求内容が全然低レイヤー向けじゃないんだが

24 :デフォルトの名無しさん:2010/05/30(日) 23:38:20
>>19
スレ違いもここに極まりだな

25 :デフォルトの名無しさん:2010/05/30(日) 23:38:56
>>19のすばらしいところは全てが間違いであることだ。
ここまで見事なアンチパターンを展開できる>>19の実力には
計り知れないものがあると俺には感じられる。

26 :デフォルトの名無しさん:2010/05/30(日) 23:40:47
>>19にひとつ以上該当する方はこちらへどうぞ

新言語を開発したい
http://pc12.2ch.net/test/read.cgi/tech/1275223921/

27 :デフォルトの名無しさん:2010/05/30(日) 23:42:10
>>19
あっちのスレに必要な人材なのにな。
よくあるミスキャストだよな。

28 :デフォルトの名無しさん:2010/05/30(日) 23:43:07
>>19の人気に嫉妬

29 :デフォルトの名無しさん:2010/05/30(日) 23:47:46
野心的だが簡単には否定できないだろ。
具体的な問題点が指摘できないなら黙ってた方がいい。

30 :デフォルトの名無しさん:2010/05/30(日) 23:48:36
>>19
お前と仕事したら毎日がカーニバルだ

無論ほめ言葉だ

31 :デフォルトの名無しさん:2010/05/30(日) 23:51:50
取りあえずデータ型は
unsigned char (8bit)
unsined long (CPU依存)
bool (carry flag)
だけだ
符号付はclass定義

32 :デフォルトの名無しさん:2010/05/30(日) 23:53:00
>>19 お前なら、日本国民の腐った依存心を叩きなおすことができる

33 :19:2010/05/31(月) 00:04:00
注目をいただき、ありがとうありがとう!!
せっかく注目を浴びているので考えていることを書いて置きます。

・優先順位付きのユーザー定義可能な演算子
・数種類の演算子ですべてを表す。
・括弧演算子aaa{}とローカルブロック{}の結合を止めるにはどうしたらよいか?
 ・空行を入れる、local{}等とするか、
  改行を挟んだ括弧の結合は抑止するのはどちらがいいか?
  要するにScalaとC式方式のどっちがいいか?
・圧力は炭素を圧縮し美しいダイヤを作る構想には有難い。

なんてことを考えたり話したいと思ってます。
ということでなにとぞよろしくお願いします。

34 :デフォルトの名無しさん:2010/05/31(月) 00:05:38
>>33
マークシートで0点取るぐらいの天才だな。

35 :デフォルトの名無しさん:2010/05/31(月) 00:06:40
抽象化されていないデータ扱っているときにそんなもの出されたら、不愉快になるな。

36 :デフォルトの名無しさん:2010/05/31(月) 00:10:40
>>33
関数型言語でこれを動かしてみようか
http://akizukidenshi.com/catalog/g/gK-00179/


37 :デフォルトの名無しさん:2010/05/31(月) 00:16:54
先に意味論を考えた方がいいんじゃないか。

「コンピュータにどういう処理をさせたいのか」をまず考え、
それからその処理を効率よく指示するための構文を考えないと、
結局C言語より使えない物が出来上がるぞ。
低水準言語を開発するのだから、なおさらな。

>>19 とか見てると、まるで RPG を作るのに、
ストーリーやグラフィックから作り込んでくみたいだ。

38 :デフォルトの名無しさん:2010/05/31(月) 00:18:58
彼は関数型言語を作りたいと言ってるわけではない。

39 :デフォルトの名無しさん:2010/05/31(月) 00:30:57
>>37
>RPG を作るのに、ストーリーやグラフィックから作り込んでく
RPGツクールならそれでOK
つまり彼はそのレベルなのだよ

40 :デフォルトの名無しさん:2010/05/31(月) 00:34:16
具体的な指摘もしないユーザーレベル

41 :デフォルトの名無しさん:2010/05/31(月) 00:53:49
いきなり19降臨か
楽しいスレになりそうだなw

go--みたいな感じでどうよ
gcとインターフェースなし
chanとgoroutineはオプショナル

42 :デフォルトの名無しさん:2010/05/31(月) 00:59:58
なんだよ関数型もこっちでやるのかよー。アンチ涙目www

43 :デフォルトの名無しさん:2010/05/31(月) 01:06:09
オーダー固定のビットストリーム型
二進化十進型 (精度固定で符号・循環/無限小数を示すフラグ付き)

とかどうよ?

44 :デフォルトの名無しさん:2010/05/31(月) 01:17:07
>>43
それさえも記述できる低水準。
組み込み型はint byte boolのみ

45 :デフォルトの名無しさん:2010/05/31(月) 01:22:57
unsignedなくて低水準?

46 :デフォルトの名無しさん:2010/05/31(月) 01:27:46
boolがキャリーはやりすぎw
型はstdint系でいんじゃね

47 :デフォルトの名無しさん:2010/05/31(月) 01:29:23
アセンブラ並みにunsignedのみにしよう。
後の型はクラス定義だ

48 :デフォルトの名無しさん:2010/05/31(月) 01:32:31
アセンブラがunsignedのみ?

49 :デフォルトの名無しさん:2010/05/31(月) 01:39:29
加算器には符号はないし。2の補数と見て処理するかどうかはプログラマしだい。

50 :デフォルトの名無しさん:2010/05/31(月) 01:47:39
お前は加算器に命令だせるのかw

51 :デフォルトの名無しさん:2010/05/31(月) 02:05:41
たいていのcpuにあるadd命令なんてヤツだろが。。
てか符号有無なしとか不便過ぎだろ
整数は8,16,32,64の符号有無で8種と
機種依存の符号有無の2種でどや
dspとか考えたら符合は必須だが
オーバー、アンダーフローは機種依存かね

52 :デフォルトの名無しさん:2010/05/31(月) 02:28:34
マクロ大好きなやつはまたforkして
どんな構文でも作れちゃう万能マクロプロセッサスレとか作ったらどう

53 :デフォルトの名無しさん:2010/05/31(月) 02:33:15
Cのマクロが糞なだけ

54 :デフォルトの名無しさん:2010/05/31(月) 05:10:27
あれ以上は意図的にやってないだけ


55 :デフォルトの名無しさん:2010/05/31(月) 12:14:52
>>51
符号付整数型もclass宣言してしまえばいい。
キャリーがあれば、多倍長整数だってclass宣言すればいい。
浮動小数点も、FPU命令をオペレーターオーバーロードで記述できるようにすればいい。
SIMDも好きに定義すればいい。

56 :デフォルトの名無しさん:2010/05/31(月) 17:35:39
classって意味わかってんのか?
結局全部インライン関数かアセンブラでやる位なら
ただのマクロアセンブラで言語じゃねえし

そもそも演算子オーバーロードなんてマクロと同じ位いらんやろ


57 :デフォルトの名無しさん:2010/05/31(月) 23:09:50
頭おかしい奴がいる

58 :19:2010/05/31(月) 23:14:40

         ____
       /   u \
      /  \    /\    紙光臨とか言ってるし2ちゃねらのことだから
    /  し (>)  (<) \  大変なことになってるかも・・・
    | ∪    (__人__)  J |  ________
     \  u   `⌒´   / | |          |
    ノ           \ | |          | 
  /´                | |          |
 |    l             | |          |

         ____
       /   u \
      /  \    ─\    チラッ
    /  し (>)  (●) \
    | ∪    (__人__)  J |  ________
     \  u   `⌒´   / | |          |
    ノ           \ | |          | 
  /´                | |          | 
 |    l             | |          |

           ____
       /::::::::::::::::\
      /::::::─三三─\
    /:::::::: ( ○)三(○)\   レ、レス56!!これだけか!
    |::::::::::::::::::::(__人__)::::  |  ________
     \:::::::::   |r┬-|   ,/ .| |          |
    ノ::::::::::::  `ー'´   \ | |          |  
  /:::::::::::::::::::::             | |          |  
 |::::::::::::::::: l               | |          |


59 :デフォルトの名無しさん:2010/05/31(月) 23:15:47
スレを三つに分散してんだからこんなもんだろ。ム板では

60 :デフォルトの名無しさん:2010/05/31(月) 23:31:19
神は元スレの続き立てたみたいやな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言語系の多くの文はこのような形をしているからです。
しかし式を書くのに文演算子ってなにやら奇妙な名前なのです。

67 :デフォルトの名無しさん:2010/06/01(火) 01:06:05
とりあえずこっちに居座るつもりと見ていいんだな?

68 :デフォルトの名無しさん:2010/06/01(火) 01:22:19
ここは19専用スレにして別スレ立てればいいよ

69 :19:2010/06/01(火) 01:28:02
>>67
とりあえずここにいますよ。
寂しくなったら移動すると思いますけど。w


70 :デフォルトの名無しさん:2010/06/01(火) 03:34:51
BNFじゃねえし、式でもねえし
それじゃパーザ作れないよ

71 :19:2010/06/01(火) 07:39:17
>>70
どのようにしたら作れます?


72 :デフォルトの名無しさん:2010/06/01(火) 10:49:43
>>71
>>62は正しいBNFではないから、どんな構文なのか想像出来ないよ。

73 :デフォルトの名無しさん:2010/06/01(火) 12:01:34
>>62
elseは単体の式として成立しないのに
なぜ1の演算子で表せると思えるのかな?
exp ::= <if-exp> | <if-else-exp> ...
if-exp ::= 'if' '(' <exp> ')' <exp>
if-else-exp ::= 'if' '(' <exp> ')' 'else' <exp>


74 :デフォルトの名無しさん:2010/06/01(火) 16:30:42
>>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

77 :デフォルトの名無しさん:2010/06/02(水) 12:19:31
我を張らず一度ちゃんと考え直してみてはどう。
結構無理があるぞ。

73が書いてることはifの後に来るelseしか意味がないんだから
ああいうBNFになるよって話でしょ

コンパイル出来るかどうかは基準を示しただけで
75からすると(1 else 2 - 3) なんて式も許されちゃうし
複数の文をどうやって区切るのか、a b c dなんて式も有効なのか
終わりはどうなってんのとか ,とかどうすんの?とか。
繰り返し構文なんかはどうすんのとか
全部じゃなくてもいいが、上のBNF?からは全く読めない

演算子を自由に定義したいらしいが
コード毎に意味の変わる演算子とかまともにプログラム書けないし

どっちにしろスレタイからはちょい離れて
言語設計とBNFの勉強っぽいが


78 :デフォルトの名無しさん:2010/06/02(水) 12:27:31
低水準との関連を示して欲しいね。

79 :デフォルトの名無しさん:2010/06/02(水) 12:41:48
const必須

80 :デフォルトの名無しさん:2010/06/02(水) 12:57:06
>>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
>>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 :デフォルトの名無しさん:2010/06/02(水) 19:02:09
こっちでやってね> 19

「コンパイラ・スクリプトエンジン」相談室14
http://pc12.2ch.net/test/read.cgi/tech/1258431145/


84 :デフォルトの名無しさん:2010/06/02(水) 19:46:00
>>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で言語作るようにすればいいわけです。

86 :デフォルトの名無しさん:2010/06/03(木) 00:41:50
関数型言語では、このコードはどうなるのかご教授願いたい

*(volatile unsigned char *)0xFF98 |= 0x0001;

87 :デフォルトの名無しさん:2010/06/03(木) 01:37:51
自慢げにBNFの説明してるけど、特に目新しい部分もないし
オナニーレベルにすら達してない

88 :デフォルトの名無しさん:2010/06/03(木) 08:27:41
>>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
>>87
理解したということですね。よかった。

91 :デフォルトの名無しさん:2010/06/03(木) 13:44:52
どんな言語でもいいがおMemOr(0xff00,1)でよかろう

92 :デフォルトの名無しさん:2010/06/03(木) 16:17:17
ビルドイン関数ですか?

93 :デフォルトの名無しさん:2010/06/03(木) 17:57:18
そうそう。
いや組み込み屋なんだが
直アドレス参照はインラインアセンブラとか組込み関数とかの手段さえあれば
言語自体には無いってのもありかなと

94 :デフォルトの名無しさん:2010/06/03(木) 18:00:54
後さリンク後にも最適化フェーズ置いて
ループをカウンタじゃなく範囲でも回せるようにしたら
範囲チェックを言語に入れても実用度上がらないかな

95 :デフォルトの名無しさん:2010/06/03(木) 23:02:34
何百の論説よりも、一つの実例

96 :デフォルトの名無しさん:2010/06/04(金) 00:05:36
前のはlinuxのinx/outxやwiring
後のはgolang

97 :デフォルトの名無しさん:2010/06/04(金) 00:07:07
あ、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のアセンブラ出来たらいいと思うけど、作るのが難しい。

100 :デフォルトの名無しさん:2010/06/05(土) 06:23:15
リンク時に最適化って出来るの?

101 :デフォルトの名無しさん:2010/06/05(土) 11:45:46
できるよ。

102 :デフォルトの名無しさん:2010/06/05(土) 15:16:50
できないよ。

103 :デフォルトの名無しさん:2010/06/05(土) 15:40:51
できるよ。

104 :デフォルトの名無しさん:2010/06/05(土) 16:21:43
Microsoft Cのリンカはすることができたね。

105 :デフォルトの名無しさん:2010/06/05(土) 17:06:08
far call/jumpをnear call/jumpにとか
near jumpをshort jumpにとか
リンク時にしかできない最適化を普通にやってたな。
MS-Cの時代から。
あと実行時にFPU命令をサポートしないCPUで実行したとき
無効命令をトラップしてFPU命令をライブラリCALL命令に置き換え
以後はライブラリを使うようにするとかも普通に行われてた。

106 :デフォルトの名無しさん:2010/06/05(土) 22:50:29
Jumpやcallの置き換えは他のcpuでも普通にやるね
でも実行時に命令の書き換えは不都合でるし下品だしセキュアじゃないからな
でいわゆるリンカーじゃないな

107 :デフォルトの名無しさん:2010/06/05(土) 23:55:57
リンクせんとアドレスが決まらないからでしょ

108 :デフォルトの名無しさん:2010/06/06(日) 00:08:34
jmp/call 命令はマシン語レベルでは命令が複数あってだな・・・

109 :デフォルトの名無しさん:2010/06/06(日) 06:17:46
>>107
よく読め
リンク時に相対jump等の短い命令に置き換えるのはgnu ldとかでもやれっし
でも実行時にコードセグメント書き換えるのはお下品だとゆってる


110 :デフォルトの名無しさん:2010/06/06(日) 07:30:48
どこを?

111 :デフォルトの名無しさん:2010/06/06(日) 07:33:02
自己書き換えとか普通にやってた
最近はやらんけど

112 :デフォルトの名無しさん:2010/06/06(日) 09:37:52
最近だと実行可能属性と書換え可能属性は排他設定とかいうOSもでてきているしな

113 :デフォルトの名無しさん:2010/06/06(日) 09:47:14
実際のアドレスは実行時にしか決まらないんだから
MMUとPC相対アドレシングモードのないCPUのOS
代表的なものはMS-DOSは常識的に実行時に
セグメントアドレスを書き換えてる。
EXEヘッダにはそのための情報が入っている。

114 :デフォルトの名無しさん:2010/06/06(日) 10:10:19
>>113
??自分で書いてるように、実行環境が仮想アドレスなら
コンパイル時に決められるんでしょ

115 :デフォルトの名無しさん:2010/06/06(日) 13:38:31
だれか、アセンブラ作って

116 :デフォルトの名無しさん:2010/06/06(日) 13:45:15
最適化アセンブラが欲しい。

117 :デフォルトの名無しさん:2010/06/06(日) 13:49:14
OSのプログラムローダが書き換えるのと
プログラム自体が書き換えるのは
話が違うと思うが

118 :デフォルトの名無しさん:2010/06/06(日) 14:06:02
OPTASM?

119 :デフォルトの名無しさん:2010/06/06(日) 18:30:23
>>113
>>117
が全部書いてくれたな

実行時に仮想アドレスをシャッフルするのは安全性のためにもアリな話だが
コード部分は書き換え不可にしたりROMだったりするかもだし
コードセグメントを自分で書き換えするのはJITみたいなの以外はナシだろうな



120 :デフォルトの名無しさん:2010/06/06(日) 18:47:54
実行時ってかロード時な。

121 :デフォルトの名無しさん:2010/06/06(日) 19:01:36
自己書換えはそんなに特殊なテクニックってわけでもない。
たとえば、初期化とかでよくある一回目だけ特別な処理が必要、とかいう場合に、

static flag = true;

if (flag) {
 flag = false;
 特別な処理
}

とすると、毎回フラグチェックが入って無駄なので、自己書換えを使うとか。
自己書換え使わんでも最近のプロセッサなら分岐予測が当たるように最適化すれば
そんなに高コストでもないとは思うが。

122 :デフォルトの名無しさん:2010/06/06(日) 19:03:17
最近はセキュリティ上自己書き換えは許さない方がいいもんなあ

123 :デフォルトの名無しさん:2010/06/06(日) 19:12:45
>>121
もともと自己書き換えは特殊だよ。
昔のプアなCPUだとそういうのもありだったが今時はあまり流行らんわな
デバッガも困るし


124 :デフォルトの名無しさん:2010/06/06(日) 19:14:16
自己書き換えは性能が下がるしね
書き換える前の命令がi-cacheとかに入ってる可能性があるから
適切にフラッシュしなければならない

125 :デフォルトの名無しさん:2010/06/06(日) 19:40:42
書き換える際にdcacheにも入るし
パイプラインもだよね

126 :デフォルトの名無しさん:2010/06/06(日) 20:42:53
初期化時に書き換えて最適化するんだから
性能は上がりこそすれ下がることは無い。
全く論点についてこれないなら素直に認めろよ。

127 :デフォルトの名無しさん:2010/06/06(日) 23:00:28
論点はだな
コードセグメント書き換え不可
書き換える一般的な方法もない
最適化にも対応出来ない
キャッシュとか意識しないとだめ
メリットは少々の高速化
むしろ関数ポインタか呼ぶ前に判定する方が速い
組み込みならそもそも何度も初期化通るドン臭いコードは書かない


128 :デフォルトの名無しさん:2010/06/06(日) 23:43:54
一回初期化で通るだけなら一番最後以外は
全部無意味か間違いってことじゃん

129 :デフォルトの名無しさん:2010/06/07(月) 02:07:34
後付で機能足す時によくやるわな
20年前からやってたが
singletonて名前がついててわろた奴だ
が実はスレッドセーフじゃないからイマイチ

130 :デフォルトの名無しさん:2010/06/07(月) 02:11:14
>>128
いきなりgetとか書いてそん中で
最初だけ初期化もやっちまうとかやね

131 :デフォルトの名無しさん:2010/06/07(月) 07:53:20
出た「組み込みなら」w

132 :デフォルトの名無しさん:2010/06/07(月) 08:59:08
低水準言語つって普通組み込み意識するだろ
golangでさえOS無しで走らせるための
サンプル的なコードが入ってるのに。

133 :19:2010/06/07(月) 22:29:50
むかーし、msxのころに自己書き換えの記述見て凄いなぁ思ったことありました。
懐かしい。
でも、8086ではセグメント地獄だわ、windowsになったらWinAPI地獄だわ、
C++だわなんだわで、すっかり自己書き換えなんて意識しなくなりました。
エミュレータやらVMの場合にJITとかする場合はゴリゴリとマシン語生成したりしますね。
デバッガもプログラム書き換えますね。
自己書き換え可能な言語のPCASTLは面白いですね。

134 :デフォルトの名無しさん:2010/06/07(月) 22:59:09
デバッガは自己書き変えじゃないし
jitも自己書き換えとは別だよね

昔は自己書き変えどころか
同じコードをワザとずれたアドレスで実行したり
実行中にRAMのマッピング変えたり
やりたい放題だったよね

高階な言語と違って
最適化されたRISCのマシンコードとか
実質的に書きかえは難しい

135 :デフォルトの名無しさん:2010/06/07(月) 23:05:55
>>134
> 同じコードをワザとずれたアドレスで実行したり
これは今でもやるだろ。

136 :デフォルトの名無しさん:2010/06/07(月) 23:16:14
リロケータブルな話ちゃうよ
奇数番地とかから実行して別なことさせたり

137 :デフォルトの名無しさん:2010/06/07(月) 23:31:16
>>136
jmp命令の代わりに使うのは、よく知られたテクニックでしょ。

138 :デフォルトの名無しさん:2010/06/08(火) 01:59:27
>>19
MSDOSの頃はオーバーレイとかバンク切り替えとか色々あったやろ
おっさん

139 :デフォルトの名無しさん:2010/06/08(火) 04:40:26
86は黒い歴史が長かったしな

140 :19:2010/06/08(火) 09:23:40
>>138
あったあった。秘功をついた。
おっさんで悪かったな

141 :デフォルトの名無しさん:2010/06/08(火) 13:09:19
プロテクトで実行中コードのあるバンク切り替えて
先のプログラムを走らせたり

142 :19:2010/06/09(水) 10:35:02
今でも、FARポインタとか使う環境ってあるんでしょうか?

143 :デフォルトの名無しさん:2010/06/09(水) 15:07:25
16bit CPUなら大体ある

144 :デフォルトの名無しさん:2010/06/09(水) 21:48:06
セグメントみたいなものは今も健在
マイコンだとセクションごとに使う命令が違ったりする

145 :19:2010/06/09(水) 23:15:39
ひえー、FARポインタとNEARポインタかぁ。
バンク切り替え機能とかあると嬉しいとかっていつの時代だ?
ってかんじだけど、必要なところでは必要なんですね。
そんな古い環境なら古い言語使ってろってことではなく、
新しい言語使いたい!みたいな感じなんですね。
新しい言語でファミコンのゲーム作るぞーみたいな勢いでw

146 :デフォルトの名無しさん:2010/06/10(木) 00:22:13
言動が少しおかしいけど
何かの病気なのかな

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]]となるように修正してみてくれ。

152 :デフォルトの名無しさん:2010/06/10(木) 08:59:17
86使って低レベルやるなら32bitモードでもfarポインタが必要。
アプリケーションレベルでは意識しなくてもいいようにできるが
それを管理する側ではそうはいかない。
そしてそれを作るための言語なら当然そういう機能が必要。

153 :デフォルトの名無しさん:2010/06/10(木) 10:12:00
CPU組み込みのセグメントレジスタなんて
マイコンはないのが主流。RISC系にもない
farとか言語が意識するなんて全く必要ねえな


154 :デフォルトの名無しさん:2010/06/10(木) 11:25:48
78K0RのCSとESを触りまくる俺涙目

155 :デフォルトの名無しさん:2010/06/10(木) 12:10:45
ご愁傷さま
今時CすらないCPUもあるしつらいわな

156 :デフォルトの名無しさん:2010/06/10(木) 12:14:15
要するに、ケチケチしてるとろくなことにならないってことだな

157 :デフォルトの名無しさん:2010/06/10(木) 12:14:56
>>155
CすらないならGCCのバックエンドつくるのが一番手っ取り早いんじゃね

158 :デフォルトの名無しさん:2010/06/10(木) 13:37:30
R8Cだとセグメントレジスタはないが、ルネのコンパイラだと
ポインタの大きさがfar(4byte)、near(2byte)になってる
空間が20bitしかないのに4byteかよ

159 :デフォルトの名無しさん:2010/06/10(木) 13:40:50
Cコンパイラは、最適化しなかったら、相当特殊なターゲットでもない限りあっさり作れるだろ。

160 :デフォルトの名無しさん:2010/06/10(木) 15:58:30
ポインタがintに入れられることを前提としてるプログラムとかたまにあるからな

161 :デフォルトの名無しさん:2010/06/10(木) 16:08:51
>>160
昔はそれで正しかったからね。

162 :デフォルトの名無しさん:2010/06/10(木) 16:09:53
>>161
今も昔も正しくないw

163 :デフォルトの名無しさん:2010/06/10(木) 16:15:10
>>162
K&Rの初版読んでみろ

164 :デフォルトの名無しさん:2010/06/10(木) 16:17:26
>>163
初版?もってないね。
俺がそれを持っていると想定してしまった理由は?

165 :デフォルトの名無しさん:2010/06/10(木) 16:53:40
「昔」をC89以後とするか以前とするか、だなw

166 :デフォルトの名無しさん:2010/06/10(木) 16:58:26
妖しい時はまともなコンパイラなら、警告してくれるでしょ

167 :デフォルトの名無しさん:2010/06/10(木) 17:32:01
キャストすればうるさい警告は消えてくれる
なかったことにできる!

168 :デフォルトの名無しさん:2010/06/10(木) 17:38:21
>>159
CすらないへぼくてマイナーなCPUなんぞ
金もらわんとつくらんでしょw

169 :デフォルトの名無しさん:2010/06/10(木) 17:54:21
PICはアーキひどいけど一応コンパイラあるよね
やっぱシェアの大きさだよね

170 :デフォルトの名無しさん:2010/06/10(木) 18:40:41
何も考えないでキャストすればハマるでしょ

171 :デフォルトの名無しさん:2010/06/10(木) 23:39:53
本当に作りたいのか
妄想を語りたいのか

172 :デフォルトの名無しさん:2010/06/10(木) 23:40:53
思考実験

173 :デフォルトの名無しさん:2010/06/11(金) 22:12:33
作りたい
でも使いたくはない

174 :19:2010/06/11(金) 23:39:24
作って使いたいですけど、完成はいつのことになるやら

175 :デフォルトの名無しさん:2010/06/12(土) 00:48:36
まだいたんだ

176 :19:2010/06/12(土) 22:20:18
いるよー

177 :デフォルトの名無しさん:2010/06/12(土) 23:24:09
言語作るとか考えるより、
それで何を作りたいか考えるべきだ

178 :デフォルトの名無しさん:2010/06/12(土) 23:26:24
言語を作りたい

179 :デフォルトの名無しさん:2010/06/12(土) 23:31:28
英語、英語を勉強しろ

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
http://wonderfl.net/c/cK2B

action scriptで書いてみた

182 :デフォルトの名無しさん:2010/06/17(木) 14:10:39
リンク時に極限まで最適化したいから、それまでは中間言語

183 :19:2010/06/19(土) 23:12:34
今はMinCamlをOCamlからScalaに移植してみてます。
とりあえず、動作確認なしでコンパイルはとおってる状態です。
構文木->名前を単一にしたデータ->クロージャ変換されたデータ->仮想アセンブラ->アセンブラ
という変換をしています。

184 :デフォルトの名無しさん:2010/06/20(日) 01:45:59
つ低水準言語

185 :19:2010/06/20(日) 03:07:27
もちろん、最終的には低水準に持っていこうと思ってますけど、
関数型言語で作る低水準言語のちょうどいい例を知らないのでw。
最適化フェーズもあるし、色々参考になると思ってます。


186 :デフォルトの名無しさん:2010/06/20(日) 06:25:14
関数型のように実行順序というか評価順序が掴みにくい言語は低水準に向かなくね?

187 :デフォルトの名無しさん:2010/06/20(日) 17:03:47
関数型の設計思想そのものが低水準のことを意識していないし。

188 :19:2010/06/20(日) 21:52:09
関数型言語でゲームを作るというのをやろうとしてみたことがあったので、
確かにcamlで逐次実行するプログラムを書くのは確かに書きずらいと思います。

ただコンパイラを実装する言語としても、実装される言語としてもシンプルでいいと思います。
シンプルな関数型言語の実装で学んだことを、複雑な逐次実行型言語の実装に生かせたらいいなと思っています。

189 :デフォルトの名無しさん:2010/06/20(日) 22:01:42
何で関数型にこだわるんだろうね。関数型言語スレ立てれば良いのに。

190 :19:2010/06/20(日) 22:03:19
http://github.com/hsk/mincamlj/tree/master/src/
以下の mincaml を参考にJava&Scalaに移植中の物です。
http://min-caml.sourceforge.net/
OCamlはたまにしか見ないので忘れる、分からなくなる。
OCaml 版の解説見つつ、ソースを読んでみてください。

191 :デフォルトの名無しさん:2010/06/20(日) 22:09:28
それって低水準って言うからにはハードウェアの制御とか書けるの?
例えば8251の通信ドライバーとか

192 :デフォルトの名無しさん:2010/06/20(日) 22:12:25
余裕のよっちゃん

193 :デフォルトの名無しさん:2010/06/20(日) 22:12:39
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です。
いい加減ですいません。

197 :デフォルトの名無しさん:2010/06/21(月) 12:36:59
不勉強で悪いんだが
関数型言語で割り込みとI/Oはどう書くんだろ?

198 :デフォルトの名無しさん:2010/06/21(月) 12:41:29
peek と poke は getc や putc と基本的には同じだろ
メモリマップド I/O でなければ inp と outp という別の関数になるとか

割り込みは、関数をハンドラにする機能を、言語とランタイムに実装

199 :デフォルトの名無しさん:2010/06/21(月) 12:51:47
>>197
割り込みにもいろいろあるけどもっと具体的に言ってくれる?

200 :デフォルトの名無しさん:2010/06/21(月) 19:15:06
>>198
悪い意味じゃないが意外に普通なんだな
86以外じゃI/Oマップドなんて死語になってるよな
関数型言語でVolateなデータはどういう扱いになるのか興味あるな

>>199
割り込みなんてソフトかハードしかねえだろ
どんだけいろいろあんだよ

201 :デフォルトの名無しさん:2010/06/21(月) 21:56:35
BASICみたいなのがでけたりして

202 :デフォルトの名無しさん:2010/06/23(水) 00:09:30
ハードウェアも関数型言語に対応した
つくりにしないとだめだよ。

今のハードウェアは手続き型言語用だから。


203 :デフォルトの名無しさん:2010/06/23(水) 06:28:48
ハードウェアっつーかスタックベースで考えてるからだな

204 :デフォルトの名無しさん:2010/06/23(水) 15:25:13
スタックベースかどうかは関係ないと思うけど

205 :デフォルトの名無しさん:2010/06/23(水) 18:09:31
ハードで処理できる命令が自己増殖すればいいのかな?

206 :デフォルトの名無しさん:2010/06/23(水) 20:45:02
関数型言語向けハードってどんなんだ?
つか関数型的なHDL出来ねえかな
深く考えてないが意外にいけそうな気がする


207 :デフォルトの名無しさん:2010/06/23(水) 21:27:42
関数型言語のモデルにグラフリダクションがあるけど、それをハードウェアで
やってしまえとかいう研究とか、ないではない。

関数型的というか、VerilogないしVHDLからプロセス的なものを全部とっぱらって、
宣言的な機能だけにしたらすっきりするんじゃないかと漠然と思っている。
思っているだけだが。

208 :デフォルトの名無しさん:2010/06/24(木) 17:30:33
>>207
206だが、たぶん似た感想もってそうだな
グラフの縮退とかはある程度コンパイル時に済ませて
分解してからHDL的ななにかにMapして、
投機的に同時に動かしたりデータ駆動的に動く感じだとどうだろね

209 :デフォルトの名無しさん:2010/06/24(木) 17:46:25
ついに新言語のために新ハードを考えるまでになったか
なんという本末転倒っぷりw

210 :デフォルトの名無しさん:2010/06/24(木) 19:40:31
>>208
ヒープメモリどうすんだよ・・・まさかHWでGCするの?

211 :デフォルトの名無しさん:2010/06/25(金) 13:19:53
新言語スレ落ちたぞ・・

212 :デフォルトの名無しさん:2010/06/25(金) 19:57:18
作る気ないからや

213 :デフォルトの名無しさん:2010/06/25(金) 22:13:37
関数型信者が暴れるから

214 :デフォルトの名無しさん:2010/06/25(金) 22:20:13
しかし手続き型を研究してる奴なんて、もういまどきいないぞ。


215 :デフォルトの名無しさん:2010/06/25(金) 23:20:45
今どきの言語研究が低水準を全く意識してないから。

216 :デフォルトの名無しさん:2010/06/28(月) 22:05:53
低水準はC++で間に合ってるからな

217 :デフォルトの名無しさん:2010/06/30(水) 02:25:47
Cだろ

218 :デフォルトの名無しさん:2010/06/30(水) 03:13:11
C++は暗黙のコードを作りすぎ。低水準とは言えない。

219 :デフォルトの名無しさん:2010/06/30(水) 05:30:33
やはり新言語ではハードをリアルタイムにリコンフィグしながら動くでFA?

220 :デフォルトの名無しさん:2010/07/01(木) 09:37:09
ちょっと違うがこんなのあった
ttp://blog.llvm.org/2010/06/tce-project-co-design-of-application.html


221 :19:2010/07/19(月) 00:18:20
まだまだ、低水準な言語が作れる状況ではありませんが、
scalaに移植していたmincamlが動き始めました。
元がspark用の設計のものをx86用に移植中のものの移植なので完全ではないですけど
フロントエンドからバックエンドまで最適化付きで実装されているので
今後の開発の参考になるはずです。

222 :デフォルトの名無しさん:2010/07/19(月) 12:32:41
たまにはあげてみる

47 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)