問題タブ [interpreter]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parsing - 動的 (?) パーサー
実行時に AST/parse ツリーを生成するパーサーはありますか? EBNF文法の文字列または類似のものを受け入れてデータ構造を吐き出すライブラリのようなものですか?
- 私はantlr、jlex、およびそれらの同類を認識しています。彼らはこれを行うことができるソース コードを生成します。(コンパイルステップをスキップしたい)
- 私はBoost::Spiritを知っています.C++構文でいくつかの黒魔術を使用して、実行時にそのようなものを生成します(間違いなく私が望むものにはるかに近いですが、C++に関しては私は困っています.そして、それはまだいくらかです.文法がハードコードされているため、制限されます)
- PythonやRubyについては何も知りませんが、コンパイラコンパイラはそのような言語で非常に効果的かもしれません...
今、私はパーサーコンビネーターを認識しています。(ありがとう、ジョナス) そしていくつかのライブラリ (ありがとう、エリベン)
ついでに、 Parsing Expression Grammarsにも最近気付きました。誰かがそれを実装するとクールに聞こえます (彼らは Perl 6 にはそれがあると言っていますが、Perl は私の理解を回避しています)。
php - Django と RoR で使用される URL パターン インタープリターを PHP で実装する方法
Djangoや RoR に見られるような URL インタープリター/ディスパッチャーを PHP で実装する最良の方法は何ですか?
次のようにクエリ文字列を解釈できる必要があります。
/users/show/4
にマップします- 面積=利用者
- アクション=ショー
- ID = 4
/contents/list/20/10
にマップします- エリア=内容
- アクション=リスト
- 開始= 20
- カウント= 10
/toggle/projects/10/active
にマップします- アクション=トグル
- 面積=プロジェクト
- ID = 10
- フィールド=アクティブ
クエリ文字列は、指定された GET / POST 変数、またはインタープリターに渡される文字列にすることができます。
編集: mod_rewrite を使用しない実装を希望します。
編集: この質問はクリーン URL に関するものではなく、URL の解釈に関するものです。Drupal は mod_rewrite を使用して、 http://host/node/5などのリクエストをhttp://host/?q=node/5にリダイレクトします。次に、$_REQUEST['q'] の値を解釈します。私は通訳の部分に興味があります。
python - Lua と Python の埋め込みが可能な場合、Basic の場所はありますか?
ZX81の Basic でプログラミングを開始し、次にBASICA、GW-BASIC、およびQBasicを使用しました。私はCに移りました(ああ、Turbo C 3.1、私はあなたをほとんど知りませんでした...)
マイクロコントローラを使い始めたとき、私はParallaxのBASIC Stampで後退しました。しかし、BASIC はとてもわかりやすく、間違えにくいので、すごかったです。追加のパワー (速度、容量、リソースなど) が必要だったので、最終的にはアセンブリと C に移りましたが、ハードルがはるかに高い場合、多くの人がマイクロコントローラーのプログラミングに取り組まないことを私は知っています。
独自のオンチップ BASIC インタープリターを作りたくてうずうずしていますが、Lua と Python が簡単に組み込み可能であり、BASIC と同じくらい親しみやすいので、BASIC の必要性があるのではないかと思います。
- BASIC が他の言語より優れている点があるとすれば、それは何ですか?
- なぜそれはまだあるのですか?
- インタプリタ付きの汎用マイコンボードを作ることにした場合、BASIC版を作る理由はありますか?
他の多くの言語は死んだものと見なされていますが、BASIC は存続し続けています。
python - Python シェルにタブ補完を追加するにはどうすればよいですか?
を使用して django アプリケーションを起動するpython manage.py shell
と、InteractiveConsole シェルが表示されます。タブ補完などを使用できます。
を使用して python インタープリターを起動したばかりの場合python
、タブ補完は提供されません。
インタラクティブなコンソールを提供するためにdjangoが何をしているのか、またはdjangoアプリなしでインタラクティブなコンソールを起動するために何をする必要があるのか 教えてもらえますか?
compiler-construction - 新しい動的計画法言語のバックエンドの選択?
私はそれを楽しむためにSmalltalkの亜種を開発してきましたが、バックエンドをターゲットにすることになると、stackoverflowersの仲間の選択肢は何でしょうか。これらは私の現在の考慮事項でした:
.NET、JVM:これら2つのVMは主に静的型付け言語用であり、smalltalkのような動的言語をターゲットにするのは非常に難しいと思います。
Python(ソースコードとして):最も簡単な方法のようです。また、Pythonバイトコードを出力できればより良いでしょうが、他のVMのAFAIKとして十分に文書化されていません(詳細についてはPythonのソースコードを掘り下げる必要があります!)。
自作の通訳:面白くないので問題外です:-)
LLVM、NekoVM、Parrotは、私がチェックしている他のオプションです。これについてどう思いますか?
interpreter - 言語通訳者がターゲット言語で書かれているのはなぜですか?
重複の可能性:
言語のブートストラップ
ターゲット言語 (たとえば、PyPy ) で記述された特定の言語のインタープリターを持つことの重要性は何ですか?
c++ - C /C++でインタプリタを実装するために必要な参照
私は、インタプリタを既存のアプリケーションに整数化するプロジェクトに執着していることに気づきました。解釈される言語は、アプリケーション固有の組み込みを備えたLispの派生語です。個々の「プログラム」は、アプリケーションでバッチスタイルで実行されます。
何年にもわたって、いくつかのコンパイラーといくつかのデータ言語トランスレーター/パーサーを作成してきたことに驚いていますが、実際にインタープリターを作成したことはありません。プロトタイプはかなり進んでおり、C++で構文ツリーウォーカーとして実装されています。私はおそらくプロトタイプを超えてアーキテクチャに影響を与えることができますが、実装言語(C ++)には影響を与えません。したがって、制約:
- 実装はC++で行われます
- 構文解析はおそらくyacc/bison文法で処理されます(現在は)
- NekoVMやLLVMのような完全なVM/インタプリタエコロジーの提案は、おそらくこのプロジェクトでは実用的ではありません。これがNIHのように聞こえても、自己完結型の方が優れています。
私が本当に探しているのは、通訳者の実装の基本に関する資料を読むことです。私はSOと、Lambda the Ultimateとして知られている別のサイトをブラウジングしましたが、それらはプログラミング言語理論をより重視しています。
私がこれまでに集めた一口のいくつか:
クリスチャンQueinnecによる小さな断片のLisp 。それを推奨する人は、「些細なインタプリタからより高度な技術に移行し、バイトコードと「SchemetoC」コンパイラの提示を終了する」と述べました。
NekoVM。上で述べたように、このプロジェクトをサポートするためにVMフレームワーク全体を組み込むことが許可されるとは思えません。
コンピュータプログラムの構造と解釈。もともと私はこれはやり過ぎかもしれないと提案しましたが、健全なチャンクを処理したので、@JBFに同意します。非常に有益で、心を広げます。
ポール・グレアムによるLispについて。私はこれを読みました、そしてそれはLispの原則への有益な紹介ですが、インタプリタの構築をすぐに始めるには十分ではありません。
オウムの実装。これは楽しい読み物のようです。それが私に基本を提供するかどうかはわかりません。
スクラッチからのスキーム。Peter Michauxは、Cで記述された迅速で汚いSchemeインタープリター(後のプロジェクトでブートストラップとして使用するため)からコンパイルされたSchemeコードまで、Schemeのさまざまな実装を攻撃しています。これまでのところ非常に興味深い。
言語実装パターン:独自のドメイン固有および一般的なプログラミング言語を作成します。これは、通訳言語の作成に関する書籍のコメントスレッドで推奨されています。この本には、通訳者の作成の練習に専念する2つの章が含まれているので、私はそれを私の読書キューに追加しています。
- 新しい(そしてまだ古い、すなわち1979年):PJブラウンによるインタラクティブなコンパイラーとインタープリターの作成。これは長い間印刷されていませんが、基本的なインタープリターの実装に関連するさまざまなタスクの概要を提供するのに興味深いものです。これについてはさまざまなレビューを見てきましたが、安いので(注文時に約3.50ドルで使用しています)、試してみます。
では、どうですか?新生児を手に取って、Lispのような言語のためにC / C ++でインタプリタを構築する方法を示す良い本はありますか?構文ツリーウォーカーまたはバイトコードインタープリターを好みますか?
@JBFに答えるには:
現在のプロトタイプはインタプリタであり、任意のコードファイルへのパスを受け入れてアプリケーション環境で実行しているので、私には理にかなっています。ビルトインは、メモリ内のデータ表現に影響を与えるために使用されます。
ひどく遅くてはいけません。現在のツリーウォーカーは許容できるようです。
言語はLispに基づいていますが、Lispではないため、標準への準拠は必要ありません。
- 上記のように、この問題を解決するために完全な外部VM/インタープリタープロジェクトを追加できる可能性はほとんどありません。
他のポスターにも、あなたの引用をチェックします。皆さんありがとう!
scripting - DSLを作成するか、既存の言語を埋め込むか
これはよく起こります。アプリケーションが十分に広範になっているので、アプリケーションにプログラム可能性を追加して柔軟性を持たせるときが来ました。1つの例として、財務アプリケーションがあります。数式エディタを追加して、コードを再コンパイルせずに独自のカスタム数式を作成できるようにします。
選択する必要があります。独自のトークナイザー、パーサー、およびインタープリター/コンパイラーチェーンを作成しますか。これには時間がかかり、正しく行われない可能性がありますか?または、別のスクリプト言語を埋め込んだだけですか。コードが肥大化し、アプリがセキュリティの脆弱性にさらされる可能性があるという問題があります。
トレードオフのバランスをどのように取り、この決定を下しますか?
shell - Haskell インタラクティブ
私は Haskell で少し錆びており、立ち直ろうとしています。私が F# で楽しんでいることの 1 つは、Visual Studio と統合された F# Interactive シェルです。実質的に何でも (関数とクラスの定義を含む) 評価し、F# をシェルとして使用できます。Haskellに同等のものはありますか? を使用するghci
と、関数定義を評価できません。それをどのように回避しますか?
私の現在の好みの設定は、Emacs を haskell-mode で使用し、インタラクティブな ghi インタープリターを開くことです。しかし、ファイルの領域だけを評価する方法はありますか?
algorithm - Brainfuck プログラムで無限ループを検出する
私は、MATLAB スクリプト言語で単純な頭のおかしいインタープリターを作成しました。(遺伝的アルゴリズム プロジェクトの一部として) 実行するランダムな bf プログラムが与えられます。私が直面している問題は、プログラムにかなりの数のケースで無限ループがあることが判明したため、GA がその時点で動かなくなることです。
したがって、無限ループを検出し、そのコードを bf で実行しないようにするメカニズムが必要です。
明らかな(些細な)ケースの1つは、私が持っている場合です
私はこれを検出し、そのプログラムの実行を拒否できます。
自明ではないケースについては、基本的な考え方は、ループの 1 回の反復で現在のセルがどのように変化するかを判断することであることがわかりました。変化が負の場合、最終的に 0 に到達するため、有限ループです。それ以外の場合、変化が負でない場合、それは無限ループです。
これを実装するのは、単一のループの場合は簡単ですが、ネストされたループでは非常に複雑になります。例えば (以下の (1) はセル 1 の内容などを指します )
したがって、コードは何度も実行されます。ただし、セル 1 で行われた + と - の数の単純なチェックでは、- の数が多いと判断されるため、無限ループは検出されません。
bf で任意の数のループが任意にネストされている場合、無限ループを検出するための優れたアルゴリズムを考えられる人はいますか?
編集:停止の問題が一般的に解決できないことは知っていますが、特別なケースの例外が存在しないかどうかはわかりませんでした。同様に、Matlab は bf プログラムの停止を判断できるスーパー チューリング マシンとして機能するかもしれません。私はひどく間違っているかもしれませんが、もしそうなら、その方法と理由を正確に知りたいです.
2 番目の編集: 無限ループ検出器であると主張するものを書きました。おそらくいくつかのエッジケースを見逃しています(または、おそらくチューリング氏のクラッチから逃れる可能性は低いです)が、今のところ私にとってはうまくいくようです。疑似コード形式では、次のようになります。