K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[333] 「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

こんばんは、はじめまして。緒方と申します。 新しく始められた「プログラミング言語を作る」は僕にとってすごくタイムリーな話題です。僕も今年に入ってから独自言語の「構想」を練っています。 lex/yaccを使用するか(この場合実装はC/C++)JavaCCを使用するか(これなら実装はJava)、それとも構文解析機は手書きするか(だとすると実装はD)、かなり長い間悩みました(電卓がいくつか出来上がりました^^;)。前橋さんがlex/yaccで作られるので、やっぱりそうかぁ~、ということで僕もそうしようと思います。 連載楽しみにしています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[335] Re:「プログラミング言語を作る」
投稿者:(ぱ)
2007/02/20 02:13:25

>こんばんは、はじめまして。緒方と申します。  どうも。はじめまして。書き込みありがとうございます。 >新しく始められた「プログラミング言語を作る」は僕にとってすごく >タイムリーな話題です。僕も今年に入ってから独自言語の「構想」を練っています。  独自言語の構想を練るのも楽しいですよね。  欲張りすぎると発散するケースが多いのですが… (経験上) >前橋さんがlex/yaccで作られるので、やっぱりそうかぁ~、ということで >僕もそうしようと思います。 いやどうせならここは敢えて違う方法をとってみるということでひとつ。 # 別にプレッシャーかけるつもりはないですが… (^^; >連載楽しみにしています。  それがその、最近体調が優れないのと、仕事のほうがアレなので、あまり時間が 避けそうにない状況です。  ただ、まぬけなバグが2件、残ったままになっているのは気持ちが悪いので、マイナー バージョンアップ版(配列なしでbooleanとネイティブポインタ型を組み込んだ版)を、 さっさと出そうと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[336] Re:「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

こんばんは。緒方です。 >>前橋さんがlex/yaccで作られるので、やっぱりそうかぁ~、ということで >>僕もそうしようと思います。 > >いやどうせならここは敢えて違う方法をとってみるということでひとつ。 ># 別にプレッシャーかけるつもりはないですが… (^^; それぞれで作った場合の「あがり」について考えるわけです。「あがり」というのはサラリーマンなら社長、政治家なら総理大臣、フリーターなら発明家、という人生ゲームのそれです。 lex/yaccで独自言語を作った場合、gccのフロントエンドにして各種Linuxディストリビューションに標準で組み込まれるのが、もっともよいあがりですか。 JavaCCの場合は、Java VM上で動くようなバイトコードを吐いてWrite Once, Run Anywhereなんでしょうか。 Dで独自にパースする場合は、D言語フロンティアになる、ってところでしょうか。 他にもSmalltalkで書いてSmalltalk VM上で動作するようにしようかとか、C#で書いて.NET上で動作するようにしようかとかも考えたのですが、現実的なのはコンパイラコンパイラで作る方法なので、というかフルスクラッチはさすがにげんなりですね。 まだlex/yaccかJavaCCか確定していませんが、理解度からすると8:2でlex/yaccですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[337] Re:「プログラミング言語を作る」
投稿者:(ぱ)
2007/02/20 02:13:25

>lex/yaccで独自言語を作った場合、gccのフロントエンドにして各種Linuxディストリ >ビューションに標準で組み込まれるのが、もっともよいあがりですか。 現状で、個人作の独自言語で成功しているものというと、私としては PerlとかRubyとかPythonとかが浮かぶわけですが、このへんはたいてい ネイティブコードに落とさずインタプリタで実行していますよね。 # Dは違いますけど。 でも、多少なりとも速度を求めるのなら、JITでJavaやC#に勝負を挑むのは無謀なので、 gccのバックエンドを使ってネイティブコードを吐かせるというのは妥当な手段の ような気もします。というわけで自分用のメモ。 GCC Frontend HOWTO http://www.tldp.org/HOWTO/GCC-Frontend-HOWTO.html >JavaCCの場合は、Java VM上で動くようなバイトコードを吐いてWrite Once, >Run Anywhereなんでしょうか。 JVMのバイトコードを吐くのは簡単だと思うのですが、JVMはJavaの言語仕様に 強く依存しているのがなんとも… CLRはよく知らないのですが、JVMより制限が緩いようなら、勉強しようという 気になります。 >Dで独自にパースする場合は、D言語フロンティアになる、ってところでしょうか。 「フロンティア」は「あがり」なのか「ババをひく」係なのか… いやその第三者的には是非ともがんばっていただきたく(ひでぇ) >まだlex/yaccかJavaCCか確定していませんが、理解度からすると8:2でlex/yaccですね。 了解です。もしよろしければ公開を希望、という意思表示だけしときます、 ということにさせていただきたく存じますです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[338] Re:「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

>「フロンティア」は「あがり」なのか「ババをひく」係なのか… >いやその第三者的には是非ともがんばっていただきたく(ひでぇ) 前橋さんもおっしゃってましたけど、DはCやJavaに比べて決定的にライブラリやツールが不足していて、言語仕様的には同等あるいは勝っているにも関わらず、ちょっと大き目のコードを書こうと思うととたんに苦しくなります。 Java並みとはいわないまでも、Digital Marsにはもうちょっとがんばって、標準ライブラリをもう少し整えてもらいたいものです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[340] Re:「プログラミング言語を作る」
投稿者:(ぱ)
2007/02/20 02:13:25

>前橋さんもおっしゃってましたけど、DはCやJavaに比べて決定的にライブラリや >ツールが不足していて、言語仕様的には同等あるいは勝っているにも関わらず、 >ちょっと大き目のコードを書こうと思うととたんに苦しくなります。  なるほど。  でも、Cと比べれば、これだけ揃ってればまあそこそこ、という気もします。  http://www.kmonos.net/alang/d/phobos.html  GUIはWindowsのAPIを叩けるわけですよね。 >Java並みとはいわないまでも、Digital Marsにはもうちょっとがんばって、 >標準ライブラリをもう少し整えてもらいたいものです。  むむ。言語作りかけの身としてはプレッシャーです (^^;  言語そのものの機能が一通り揃ったら、鬼車でもくっつけるか、 いっそWindowsに特化してゲームとかを楽に作れる言語にしようか、とか 考えているところです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[341] Re:「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

>>Java並みとはいわないまでも、Digital Marsにはもうちょっとがんばって、 >>標準ライブラリをもう少し整えてもらいたいものです。 > > むむ。言語作りかけの身としてはプレッシャーです (^^; うっ、墓穴だったかも(^-^;; でも思うに、言語仕様はシンプルで、機能はライブラリとして実現するのがやっぱり移植性とかメンテナンスとかを考えるとベストなので、ライブラリ作りは必須ですよね。でも、それこそシェアを握っている言語のライブラリ相当をそろえるのは不可能なので、 >いっそWindowsに特化してゲームとかを楽に作れる言語にしようか、とか >考えているところです。 特定用途に特化したライブラリでテリトリーを構築するのはよい案ですね。かくいう僕はターゲットはまだ決めてないんですが、プロトタイプはこんな言語にしようと考えています。 ・いわゆる型なし ・制御構文はとりあえずifとgotoのみ(とほほ・・・) ・他の制御構文はifとgotoで実装してライブラリ提供 def foo(x, y) { #関数宣言 return x + y, x * y #戻り値の数は任意個数 } a, b = foo(10, 20) #セミコロン不要 b, a = a, b #スワップ print(b, " ", a) 上記コードで 30 200 と表示されるような。
[この投稿を含むスレッドを表示] [この投稿を削除]
[342] Re:「プログラミング言語を作る」
投稿者:(ぱ)
2007/02/20 02:13:25

>・制御構文はとりあえずifとgotoのみ(とほほ・・・) >・他の制御構文はifとgotoで実装してライブラリ提供  どのような形式で実行する言語を想定しておられますでしょうか。  gotoって、現状のcrowbarのような、解析木実行形式の言語だと、結構実装が 難しいと思っています。バイトコード実行形式だと楽なんですが。  制御構造をライブラリで提供する、というのは、crowbarでも考えてはいて、 クロージャで実現できると思ってはいますが…  foreach(collection, function(item) { print(item); }); こんな感じだと読みにくいですかねえ。 > return x + y, x * y #戻り値の数は任意個数 >b, a = a, b #スワップ これはおそらくリストのような概念を導入し、コンマで区切った式でリストが 生成され、代入時左辺がリストで区切られていると、対応する要素に代入される、 ということですよね。 関数呼び出しの際も引数がコンマで区切られていますが、これも、リストとして 渡されて、仮引数に代入される、ということでしょうか。面白そうだと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[343] Re:「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

>>・制御構文はとりあえずifとgotoのみ(とほほ・・・) >>・他の制御構文はifとgotoで実装してライブラリ提供 > > どのような形式で実行する言語を想定しておられますでしょうか。 むむっ、実はあまり考えていません。あれこれ空想する際には、アセンブリのイメージで考えていて、無条件ジャンプと条件ジャンプがあればとりあえず事足りるかな、という風に思って上記のように書きました。 中間コードを吐くタイプにしようかと考えていて、中間コードはXMLにしようかとも思っています。 > foreach(collection, function(item) { > print(item); > }); > >こんな感じだと読みにくいですかねえ。 そんなことはないですよ。むしろ読みやすいと思います。 >> return x + y, x * y #戻り値の数は任意個数 >>b, a = a, b #スワップ > >これはおそらくリストのような概念を導入し、コンマで区切った式でリストが >生成され、代入時左辺がリストで区切られていると、対応する要素に代入される、 >ということですよね。 >関数呼び出しの際も引数がコンマで区切られていますが、これも、リストとして >渡されて、仮引数に代入される、ということでしょうか。面白そうだと思います。 すごい考察です。僕はそこまで考えていませんでした(^-^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[350] Re:「プログラミング言語を作る」
投稿者:Shin
2007/02/20 02:13:25

>> foreach(collection, function(item) { >> print(item); >> }); >> >>こんな感じだと読みにくいですかねえ。 > >そんなことはないですよ。むしろ読みやすいと思います。 Ruby なら collection.foreach { |item| print item } なわけで、メソッド/クロージャによるライブラリ的実装の ほうがよっぽど読みやすいとは言えそうですねぇ。 # 他のに多様な仕組みとの共通性という意味で これはクロージャの構文の勝利ですね。 foreach と using を分けた C# もそれはそれで偉い、というか 何でもクロージャよりそっちのほうが個人的にはまっとうな 考え方という気が現在はしていますけどね。 # Net::HTTP.start(host) { |http| ... } みたいに # 後始末のためにクロージャを使うのってなんか変な感じがしている
[この投稿を含むスレッドを表示] [この投稿を削除]
[353] Re:「プログラミング言語を作る」
投稿者:(ぱ)
2007/02/20 02:13:25

>foreach と using を分けた C# もそれはそれで偉い、というか >何でもクロージャよりそっちのほうが個人的にはまっとうな >考え方という気が現在はしていますけどね。 私も基本的にはそう思うんですが、時々思うのは、 「言語仕様がライブラリに依存しているのはなんかヘン」ってことです。 foreachはIEnumerableに依存していますよね。 まあでもそれを言えばピュアなOO言語は数値などのリテラルもクラスの インスタンスですし、Cだってexit()に依存しているとは言えるので、 気にするほうがおかしいのかもしれません。 crowbarも、配列の生成は、配列リテラルを除きネイティブ関数に頼るつもりですし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[359] Re:「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

>>>・制御構文はとりあえずifとgotoのみ(とほほ・・・) >>>・他の制御構文はifとgotoで実装してライブラリ提供 >> >> どのような形式で実行する言語を想定しておられますでしょうか。 > >むむっ、実はあまり考えていません。あれこれ空想する際には、アセンブリのイメージで考えていて、無条件ジャンプと条件ジャンプがあればとりあえず事足りるかな、という風に思って上記のように書きました。 実装を始めて気がついたのですが、goto文って実はもっとも単純だと思っていたのですが、実は難しいのですね。 今はソースを読み込んだら即構文木を作って評価するインタープリタを作っているのですが、今のインタープリタにgoto文を実装するとすると、上方向にジャンプする場合も下方向にジャンプする場合も、入力ストリームをラベル位置まで巻き戻したりスキップしたりしなければなりません。BASICのgoto文ってどういう実装になっているか調べてみようかと思っています。 >>>b, a = a, b #スワップ 他にも難しい実装に気がつきました。Ruby のように文の区切り文字を省略させたいのですが、これがまたかなり難しいです。Ruby だと 1 + 2 # 1+2 と評価される 1 # 1 と評価される + 2 # +2 と評価される 1 # 1 と評価される + # この時点では式が継続するものと予測されるので評価しない 2 # 上の行と合わせて +2 と評価される 1 + # そういえばこのケースは試してないですが、 2 # 多分 1+2 と評価されるのでは? というように、状況に応じて改行を文の区切り文字と認識したりあるいは無視したりしています。Ruby では Lex などの字句解析機を使わずに自前の実装を使われているそうなので、ありものの字句解析機を利用しなかったのは、利用できなかったからなのでは?と勝手に想像しています。 というのも、上記のような改行仕様を flex で実装しようとしたところ、状態遷移だけでかなり複雑になってしまい、私ではお手上げでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[362] Re:「プログラミング言語を作る」
投稿者:(ぱ)
2007/02/20 02:13:25

>実装を始めて気がついたのですが、goto文って実はもっとも単純だと >思っていたのですが、実は難しいのですね。  です。crowbarにgotoがないのはそのためです(w。かろうじてbreakとcontinueは ありますが、これも戻り値でちまちま返すことになってしまっています。 # Rubyはこのへんをsetjmpとlongjmpでやっているようですが。 >というように、状況に応じて改行を文の区切り文字と認識したりあるいは >無視したりしています。Ruby では Lex などの字句解析機を使わずに自前の >実装を使われているそうなので、ありものの字句解析機を利用しなかったのは、 >利用できなかったからなのでは?と勝手に想像しています。  いきなり答をばらす行為になるのかもしれませんが、Rubyの実装については、 以下のページに詳細な説明があります。 http://i.loveruby.net/ja/rhg/index.html  「状態付きスキャナ」にも、1章が割り当てられています。
[この投稿を含むスレッドを表示] [この投稿を削除]