トップページ⇒tech
71コメント26KB

インタプリタ言語に求められる事とは

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/06/05(日) 03:13:24
現在あるインタプリタ言語の良い点、悪い点を並べて行き
いいとこ取り、穴なしのインタプリタ言語の設計を目指すスレです。
0002デフォルトの名無しさん2005/06/05(日) 03:15:24
何でここでやらないか

「コンパイラ・スクリプトエンジン」相談室6
http://pc8.2ch.net/test/read.cgi/tech/1115335709/
0003デフォルトの名無しさん2005/06/05(日) 04:20:35
なんだよインタプリタ言語って

言語仕様とは関係ないだろ

Cをインタプリタで実行したりPerlをコンパイルして実行したりだってアリだろ
0004デフォルトの名無しさん2005/06/05(日) 09:19:41
>>1が穴だらけな件について。
0005デフォルトの名無しさん2005/06/05(日) 09:39:41
COBOLがインタプリタに」
0006デフォルトの名無しさん2005/06/05(日) 09:45:03
すみません。改行をまちがえたら実行してしまった。つづき。

COBOLがインタプリタに向かない理由を述べたり、
考察いけばよいわけですね。
0007デフォルトの名無しさん2005/06/05(日) 09:50:30
すみません。改行をまちがえたら実行してしまった。つづき。

COBOLがインタプリタに向かない理由を述べたり、
考察いけばよいわけですね。

そう言えば大学に小堀というCG担当の先生が居てな、
0008デフォルトの名無しさん2005/06/06(月) 12:22:04
というか絶対コンパイル不可能ななにかやばい仕様が必要だよな。
実行時にプログラムを書き換えることができるとか。
0009デフォルトの名無しさん2005/06/06(月) 16:01:56
LISPやPrologはコンパイルしてしまうと
値打ちが下がってしまいますね。
0010102005/06/06(月) 20:39:16
>>9
ネタだとしても意味が不明
0011デフォルトの名無しさん2005/06/06(月) 22:03:15
LispもPrologもデータとプログラムが不可分であるところに
特徴があるのであって、コンパイルして、プログラムを
プログラミングの「対象」にできなくなると、面白みが
損なわれるの意味。
0012デフォルトの名無しさん2005/06/07(火) 02:11:14
何か本末転倒だな。
コンパイルしてもソースコードは残るし、Smalltalk 程ではないけど inspect 出来るじゃん。
0013デフォルトの名無しさん2005/06/07(火) 05:13:42
ソースコードなんて関係ないんじゃないかな。実行環境で
得られるもの=たとえばPrologのlisting(_述語)だけが
ソースコードなんじゃないか。
さすがにここまでいうとネタっぽいね。
0014デフォルトの名無しさん2005/06/07(火) 06:25:31
>>11
下着を見て風呂を見ないようなもんだな。
0015デフォルトの名無しさん2005/06/07(火) 08:02:49
中西正和氏は「LISP入門」オーム社(1977)の中で
「LISP1.5が他の言語処理系と異なる最も大きな特徴は、
基本的にインタプリタで動く系であるということである。」
と述べた。この部分は書評で批判を浴びることになる。とはいえ
この言語の比較的初期段階では、識者がどうとらえていたか
知ることができるという点で興味深い。
0016デフォルトの名無しさん2005/06/07(火) 08:11:32
Prologに関しては、
http://pc8.2ch.net/test/read.cgi/tech/1102664221/132
http://pc8.2ch.net/test/read.cgi/tech/1102664221/154
あたりかな。
0017デフォルトの名無しさん2005/06/07(火) 10:10:23
>>12 インタプリタというと2相あって、
第一義的には解釈実行系であること。
第二に必須ではないが永続した会話系であること。
永続システムの場合には、内部環境の変化を
静的な部分に、ここではソースコードですが、
反映することに課題が出てきます。
LISPやPROLOGを挙げられたのはこの2つの言語ともに
永続会話系のシステムだからだと思います。
0018デフォルトの名無しさん2005/06/07(火) 13:27:54
永続会話でない=スクリプト
で、いいのかな
0019デフォルトの名無しさん2005/06/07(火) 15:53:39
そうです。一方は言語自体が実行環境を持っています。
0020デフォルトの名無しさん2005/06/07(火) 17:11:20
Rubyが廃れすぎてて困る。
0021デフォルトの名無しさん2005/06/07(火) 17:53:41
Rubyってまだあったのか・・・・・・
0022デフォルトの名無しさん2005/06/07(火) 18:02:07
>>18 あまり差が無いような気がしてきた。
batch的な香りが強いか弱いかくらい。ただ、この差は
言語の構造からきているのでこのスレのテーマとしては
面白いと思います。
0023デフォルトの名無しさん2005/06/07(火) 20:01:48
Scheme ではトップレベルを分けて考えてるみたいね。

http://www.sampou.org/scheme/sicp/mailingList/msg01467.html

定義をボカしているってだけで、発展的話題になるかどうかは知らんけど。
0024デフォルトの名無しさん2005/06/08(水) 00:20:56
edとsedの違いか。
0025デフォルトの名無しさん2005/06/08(水) 06:38:54
>>1 全実行環境をプログラマが自らセーブできること。要素ごとに。
プログラムの部分文字列をParseする関数があること。
0026デフォルトの名無しさん2005/06/08(水) 07:19:04
>>23 のリンク。難しい・・・。
0027デフォルトの名無しさん2005/06/08(水) 07:29:11
>>12 >>14
解り易いのはデバッガを書くケース。コンパイルされていたら
stepperとしては働かない。デバッガでなくてもこういう
記述は随所に現われるから、コンパイルされたコードは
使う気がしない。
0028デフォルトの名無しさん2005/06/08(水) 23:09:23
コンパイル時に一緒にシンボルテーブルを吐けばいいじゃない
0029デフォルトの名無しさん2005/06/08(水) 23:51:22
なんか、よほど特殊な環境に居る人なのか、まるっきり妄想で妄言吐いてる人なのか
よく判らんスレだ。と感じた。
0030デフォルトの名無しさん2005/06/09(木) 07:15:22
私の場合、文字列から項を解析、生成するparse_atom/5が923箇所。
ある副目標が現われると一旦停止する'立ち止まり'/2が19箇所。
副目標ごとに停止しながら実行する'歩み'/2が6箇所。
デバッガで使用されている部分は勘定から除いてあります。
現在使われていないものや、事実上の重複はあると思いますが。
0031デフォルトの名無しさん2005/06/09(木) 07:42:30
parse_atom/5は埋め込みタグの解析のようなところで使うので、
それこそどこにでも現われます。
デバッガ的な2述語はWebサービスで回答をした時に同時に
使われた述語と副目標を表示できるハイパーリンクがあり、その中の
オプションとして、デバッグ的な確認ができるようにしてあります。
その場合、Webですので対話形式というわけにも行かず、クライアントの
ブラウザのサポートアプリケーションとして動作します。ということは、
全環境をコピーせねばならず(16MB)、データベースの所在の問題もあり、
難題山積ということになります。
さらに、副作用(ファイルの入出力など)の伴う質問の再確認の実行は
同じ結果が得られないですし、データを破壊することがあります。
結局のところ、このオプションの付加が許されている部分はごく限られて
います。
0032デフォルトの名無しさん2005/06/10(金) 08:59:48
S式のLISPや全ては項というPrologが構造的な
観点からはインタプリタ向きであることはわかった。
新しい、インタプリタ言語を設計する参考にする
ことにしよう。それはそれとして、>>1は
使い手にとって望ましいインタプリタ向きの命令とは
どんなものなのか論じたかったのだろう。
この観点に話題を切り替えよう。
0033デフォルトの名無しさん2005/06/10(金) 19:27:51
まあ変数宣言はあっても型の宣言はしないとか?
0034312005/06/11(土) 08:02:51
Prologの話を打ち切るに当たって
Prologがインタプリタ言語として特に優れている点を挙げておこう。
・ 質問と解答で実行が進む設計になっている。
・ 単一化(unification)という強力なパターンマッチング機構が利用できる。
・ 以下のようなメタ述語(命令)が充実している。
parse_atom 文字列から(実行可能な)項を切り出す。
read_term ストリームから逐次(実行可能な)項を切り出す。
functor 項を関数部分と引数に分解する。
arg 項から引数部分を取り出す。
=.. 項を関数を第一要素、引数を第二要素以下とするリストに変換する。リストから項への変換も可能。
assert 項(節)を述語として追加定義する。
retract 述語から節定義を一つ削除する。
clause 定義された述語の節を一つ取り出して、頭部と条件に分解する。
abolish 述語定義を削除する。
listing 述語の定義を出力する。
call または exception_handler 項を実行する(Lispのeval)。
0035デフォルトの名無しさん2005/06/11(土) 08:31:50
少々重過ぎる話題がつづいたようで。
我々がインタプリタとしてすぐピンとくるのはRubyとかPerl。
ここら辺のところをもっと洗練するにはどうすればよいかを
話そうよ。
0036デフォルトの名無しさん2005/06/11(土) 08:48:55
嫌です
0037デフォルトの名無しさん2005/06/11(土) 08:49:47
多くのインタプリタに欠けてる物:使いやすい FFI とネイティブスレッド
0038デフォルトの名無しさん2005/06/11(土) 08:50:29
だがそれがい
0039デフォルトの名無しさん2005/06/11(土) 08:52:27
ところでRubyを目の敵にする人が多いのはなぜ。
0040デフォルトの名無しさん2005/06/11(土) 08:52:59
>>35
>少々重過ぎる話題がつづいたようで。

「難しくて全然分かりませんでした」って正直に言えよwwww
0041デフォルトの名無しさん2005/06/11(土) 09:01:30
>>40
お主は正直でヨロしい
0042デフォルトの名無しさん2005/06/11(土) 09:03:52
>>40 たしかに。wwww
0043デフォルトの名無しさん2005/06/11(土) 09:09:07
>>35
>我々がインタプリタとしてすぐピンとくるのはRubyとかPerl。

「我々」は一人称ではないな。

0044デフォルトの名無しさん2005/06/11(土) 09:09:43
>>39 Ruby厩の連中が独り善がりだから。
0045デフォルトの名無しさん2005/06/11(土) 09:17:43
変数の宣言がいらないってのは利点なんだろうか
0046デフォルトの名無しさん2005/06/11(土) 09:23:25
>>5-7 喪前はインタプリタ言語しか使えんだろ?
0047292005/06/11(土) 10:02:01
Lispの鬼のおいらにピンと来ない議論だと思ったら、
やっぱProlog厨のレスか(>>30-34)。

> 私の場合、文字列から項を解析、生成するparse_atom/5が923箇所。
> ある副目標が現われると一旦停止する'立ち止まり'/2が19箇所。
> 副目標ごとに停止しながら実行する'歩み'/2が6箇所。

> parse_atom/5は埋め込みタグの解析のようなところで使う

> 全環境をコピーせねばならず(16MB)、データベースの所在の問題もあり、

意味不明なスペックが散りばめられてるな。
Web上でSession管理も無しに Prologインタプリタ動かしてるの?
もしかして ThoughtWorksの向こうをはって PrologでWebアプリ作ってたりしてw


> S式のLISPや全ては項というPrologが構造的な
> 観点からはインタプリタ向きであることはわかった。

あの〜、普通その特性は「メタプログラミングがし易い」と理解する事が多いんだが。
0048デフォルトの名無しさん2005/06/11(土) 10:34:43
LISPのコードはコンパイルしたからといっても、
別にソースまで無くなってしまうわけじゃないし、
S式として必要な箇所があるならまた読み込めばいい。
どのみちeval通すと別のものになるんだから
コンパイルしない理由なんてない。
0049デフォルトの名無しさん2005/06/11(土) 10:34:51
>>47 LISP屋さんにも意味不明か。反省。
Parse_atomの箇所が妙に多いのは、例えばPSコードを生成するなどへの
文字列処理中にPrologの負節が現われたら、一旦実行してから、コード生成を
続けるといった記述箇所が多いから。
サーバーの方はたしかにPrologWebServerだが、Prologが有利だと思うのは
ソースコードで述語定義が
集信数(_給油所名,_日付) :- .... /* 2引数とも入力 出力は標準出力 */
の時、
<H2>集信数</H2>
   給油所名 <input type="text" name="給油所名">
   日付 <input type="text" name="日付">
を自動生成できる。これは変数に漢字が使えないとどうにもならない。
インタプリタとは関係ないですが。
メタプログラミングについては仰るとおり。
話の行きがかり上、ああいうことを主張せざるを得なくなった。
0050デフォルトの名無しさん2005/06/11(土) 10:45:13
Prolog WebServerでDB系アプリ(?)とは、
なかなか面白そうなテーマですね。

Prolog WebServerというのは、一般的なものなの?
それとも独自開発ですか?
0051デフォルトの名無しさん2005/06/11(土) 11:24:23
>>50 自前ですね。オペレータ定義することによって、
?- select * into X from 売上 where 給油所名=志村 and 日付='20050611'.

くらいの記述はできますから、後は、
atom_concat([select,*,from,売上,where,給油所名,and,日付,=,20050611],' ',S),
で生成したSをデータベースに渡せばよい。
実際には"'"の処理等そう簡単ではありません。
0052デフォルトの名無しさん2005/06/11(土) 11:27:36
atom_concat([select,*,from,売上,where,給油所名,=,志村,and,日付,=,20050611],' ',S),

=,志村が抜けてしまいましたね。
0053デフォルトの名無しさん2005/06/11(土) 11:57:56
後ろ!後ろ!
も抜けてる
0054デフォルトの名無しさん2005/06/11(土) 12:17:46
>>53 ?
ごめんなさい。atom_concatではなくてconcat_atomでした。

select _射影項 into _解 from _表 where _条件
:-
射影項を文字列かする(_射影項,_射影項文字列),
表を文字列する(_表,_表文字列),
条件を文字列する(_条件,_条件文字列),
concat_atom([select,_射影文字列,from,_表文字列,where,_条件文字列],
' ',_SQL文字列),
call_database(_SQL文字列,_解).
のようなプログラムになります。「条件を文字列する/2」あたりの
述語定義は相当に複雑になります。
私は現在はこのような外部データベースシステムとの交渉を
極力さけ、Prologの内部データベースのみで同様の処理を
可能とするよう整備中です。
0055542005/06/11(土) 12:22:27
おんやまあ、字化けかな。
文字列する -> 文字列化する
文字列かする -> 文字列化する
に訂正。
0056デフォルトの名無しさん2005/06/13(月) 09:52:43
アプリケーションプログラムを開発するということは、
その利用者向けの新しい言語を開発するということです。
その中で、ネイティブな言語(ここではインタプリタ言語)が
直接どのくらい利用できるかという点は結構重要なんでは
なかろうか。
0057デフォルトの名無しさん2005/06/13(月) 15:44:00
ユーザが入力する情報と言語表現の親和性ということですか?
0058デフォルトの名無しさん2005/06/13(月) 21:23:12
「言語」の定義を勝手に広げられても・・・
0059デフォルトの名無しさん2005/06/13(月) 23:59:25
>>57 そうです。
>>58 そこまで深い意味ではありません。
「帳表」や「入力画面」を見てもその情報の配置などにより言語的な
意味づけしています。窓からinputされた情報は何らかの解析がなされ
メソッドが呼ばれます。この「解析がなされ」という部分を「言語」として
見ている、ということです。したがって
>>56 はinputされた情報に於いてプログラミング言語の生の
表現をどのくらい利用できるかということをいっています。
0060デフォルトの名無しさん2005/06/14(火) 01:03:08
奇矯な話になります。もう20年近くも前ですか、「信長の野望」を
やっていました。このころは経営ゲーム的な色彩がつよかったのですが。
自分が信長になって、番が回ってきて「治水をする」とその後他国の戦闘を
延々と眺めていなくてはなりません。8086の時代だから、結構待たされます。
待たされているうちに、あれをやりたい、これもやりたいということになる。
予約したくなるわけです。条件付けもしたくなる。
アプリを制作するときにはまず第一に言語設計が重要と痛感したのはこの
時が最初ですね。
0061デフォルトの名無しさん2005/06/14(火) 21:51:56
Emacsみたいなことかな
0062デフォルトの名無しさん2005/06/14(火) 22:51:22
excel使っとけ。
0063デフォルトの名無しさん2005/06/15(水) 02:49:22
>>61 Prolog-KABAがEmacs風エディタ上で動く作りになっていたので、
いまだに私のユーザーインターフェイスはEmacs風です。LISPでは
なくてPrologですが。でもEmacs上で入力した字面を使ったりしながら
プログラムを動かすには関数型の方がいいですね。
以下に述べるようなセルレベルのインターフェイスとしても当然こういうものが
採用されるべきです。
>>62 カルクモノと馬鹿にしていたのが間違いで奥が深いですね。
ただ、私のいってることは最終的にすべてのセル入力に対して必ず最初に
juman(形態素解析プログラム)がかかるように設計すべきだというような
ことになるので少々Excelでは荷が重いのではないかと思います。
0064デフォルトの名無しさん2005/06/15(水) 06:19:55
>>63 形態素解析云々は>>59->>60と矛盾はしないけれども関係なかったですね。
すべてのアプリケーション上での入力はそのアプリケーションで
設定された言語クラス上のインタプリタによってなされるべきだ、という
のが私の主張です。それに対して、excel使っとけ。という切り返しは
鋭いと思います。
0065デフォルトの名無しさん2005/06/15(水) 06:34:42
>>47 LISP1.5ですから古い話ではありますが、>>15 については
どう思われますか。
0066デフォルトの名無しさん2005/06/18(土) 17:33:35
貴方の話には、誰も言っていない前提がポンポン出てくるから、
何をお答えすべきなのかさっぱりです。

Excelとオントロジー・プログラミングっつうと高輪台の某社を思い出しますが、
あなたはあそこの関係者ですか?
0067デフォルトの名無しさん2005/06/18(土) 17:34:58
>>15に関して。
1970年代というと、数式処理
0068デフォルトの名無しさん2005/06/18(土) 17:39:18
>>15に関して。
1970年代というと、国内では「数式処理システムReduce」のバッチ利用での高速化が重視されていて、
対話的プログラミング環境としてのLisp (例: MacLispやInterLisp)がまだまだ軽視されていた、と伺います。
例えば先に無くなられた 後藤先生のHLISPや、国内のLispマシンなどが、国内のその当時の主流だと。

すると、中西先生の言われる「インタプリタで動く言語」という言葉は、
対話的に試行錯誤的にプログラミングをする、というMIT AI Lab Hackerにとって当たり前の概念を
改めて強調したんじゃないか、と思うのですが。
0069デフォルトの名無しさん2005/06/18(土) 22:08:56
「インタプリタで動く系」という記述はこの本の第7章冒頭にありますが、
この章は今日読み返してみてもなかなか面白い。こんな部分もあります。
「LISPシステムは、S表現で書かれたプログラムを読んで二進木リストにすると
これらの機能を呼び出して解釈し、実行するようにつくられている。したがって、
プログラムが実行されていることは解釈機能が動いていることを意味するが、
その最中にプログラムからSUBR関数としてevalやevlisを呼び出すこともできる。
すなわち、プログラムを動かすためのメカニズムを、動いているそのプログラム
自身から呼び出すことができるということである。」

これらの機能とは、evalquote,apply,eval,evlisです。
0070デフォルトの名無しさん2005/06/20(月) 10:16:17
LISPを知るものにとって当たり前の記述でも、>>1の趣旨からすると
掲げておく意味はあると思います。
0071デフォルトの名無しさん2005/06/22(水) 18:47:19
このスレで言ってる「インタプリタ」は、
インタラクティブモードを持ってる言語ってことかね。
裏でコンパイルしてようが対話機能があればインタプリタなわけだ。
■ このスレッドは過去ログ倉庫に格納されています