プログラミング言語を設計して実装するにはどうすればよいですか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/4014267

質問

この質問は以下に関連しています

ここ数年、私は自分が使用する言語について好きなことと嫌いなことについて考えてきました。私はいつも自分の言語を書きたいと思っていましたが、実際にはそうすることができませんでした。

私もレゴ RCX と NXT の両方を所有していますが、ビジュアル プログラミング環境が制限されているため、ロボットに実際に何かをさせることはほとんどありません。

私は、NXT 用にプログラミング言語を設計しようと考えています。汎用言語はすでに大量に存在しており、NXT は具体的な問題と目標を提供し、できれば良いサンドボックスを提供してくれるからです。

それで?どこから始めればよいでしょうか?何を知っておく必要がありますか?

可能であれば、Python または Clojure でコンパイラーを作成します。があります NXT用SDK, 、だけでなく、 アセンブリ言語. 。最良/最も簡単なルートは何でしょうか?

Lego NXT は小さな画面、USB と Bluetooth を備え、デジタルとアナログの両方の 4 つのセンサー ポート、3 つの出力ポート、2 つの ARM プロセッサ、1 つのメイン プロセッサと 1 つのコプロセッサを備えています。 http://mindstormsnxt.blogspot.com/2006/08/whats-inside-nxt-brick.html

NXT のプログラミングでは、データとイベントの処理がすべてとなるため、ある種のモノアイコン データフロー/リアクティブ スタイルが適切であると思われます。並列タスクもうまく処理できるはずなので、機能的であると考えています。私は現在スタックベースも考えています。

頭の中ではすでにこれらの概念を統一してサンプルコードを考えています。私はスタックではなく、機能ブランチを並行して実行できるツリーを考えています。例:

# implicit main stack
5 5 +
# 10

# quoted branch or list
[1 -]
# 10 [1 -]

# eval list and recur until false
loop
# [9 8 7 6 5 4 3 2 1 0]

# define stack as a function
[1 = [1 8 motor] [1 0 motor] if] fn
# [9 8 7 6 5 4 3 2 1 0] <function>

# define function as a symbol
"handle-press" def
# [9 8 7 6 5 4 3 2 1 0]

# reactively loop over infinite lazy stack returned by sensor
# in a parallel branch
|4 sensor handle-press for|
# [9 8 7 6 5 4 3 2 1 0] [8 nil nil nil 8 ...]

この背後にある推論には明らかにまだ大きな穴がありますが、とにかく役立つ回答と議論を引き起こすためにこの大まかなスケッチを投稿します。

役に立ちましたか?

解決

それで?どこから始めればよいでしょうか?何を知っておく必要がありますか?

まずはより多くのプログラミング言語を学ぶことから始めましょう。

いくつかの言語を学習したら、コンパイラに関する本を購入します。沢山あります。Google がお手伝いします。どちらを購入しても問題ありません。いくつか必要になります。本をたくさん読んでも大丈夫です。

言語を学習し、コンパイラについて読んだら、次のことを実行してください。

  1. 必要なランタイム ライブラリを構築します。C や Python などの適切な言語で実装します。

  2. 実際に動作するランタイム ライブラリを作成したら。 本当に 完全に仕事です。完全に。構文と字句のスキャンとコンパイルについて考えることができます。これらは難しい問題ですが、ランタイム ライブラリを動作させることの半分も難しくありません。

構文 (つまり、ドメイン固有言語) をいじることは、魅力的な迷惑です。多くの人が構文を「改良」しましたが、使用可能なランタイム ライブラリがありません。つまり、彼らの「言語」は不完全です。 する 何でも。

まず言語を使って何かをさせましょう。

他のヒント

オブジェクト コードではなく、既存の言語にコンパイルするコンパイラを作成することを恐れないでください。たとえば、Lightweight C++ は C++ です -> C コンパイラは次の考えに基づいています (ただし、C++ もどこかで同じ仕事をします)。 http://linux.wareseeker.com/Programming/lightweight-c-1.3.2.zip/331414

プログラミングを改善する方法について、小さいながらも賢明なアイデアがある場合、それはすぐに成功する方法です。

検索エンジンでも同様の状況があります。もし私が Google よりもうまくできると言ったら、Google の結果セットを再編成する Google マッシュアップを使えばそれができるかもしれません。結果の数は 10 ~ 15 です。(残念ながら、ランキングやクロールのアイデアが異なる場合は機能しません。)

おそらく、Twitter がより良い例かもしれません。Twitter API を使用して独自の Twitter を作成します。(もちろん、あなたのアイデアが Twitter の基本モデルに適合する場合に限ります。)

私たちは現在、データフロー エンジンの開発に取り組んでいます (Wikipedia を参照してください:フローベース プログラミング、データフロー プログラミング)。私たちは、3 つの命令タイプ (コンポーネントの作成、パラメーター設定、メッセージ宣言) と 2 つのブロック タイプ (コンポーネントの宣言と実装) を備えた、非常に軽量な新しい言語を開発しました。C++ コードにコンパイルされるため、コンパイラはシンプルで、最適な結果が高速に得られます。また、言語スクリプトが設定から生成される場合や、より洗練された方法でメタプログラミングをサポートする場合もいくつかあります。

1 ステップ (ソース→実行可能) と 0 ステップ (ソース スクリプトが実行可能) のコンパイル言語を廃止する必要があります。レベル 3 ~ 4 は概要を把握するのが簡単ですが、正しく行えば、開発をより効果的に行うことができます。

最も簡単なルートは、 連結型プログラミング言語, 、 のように 前方へ, 要素, 、または独自のデザインのもの。

Forth インタープリターは実装が非常に簡単で、数 KB 以上を占有する必要はありません。レゴデバイスにとって重要です。Forth インタープリターがどのように機能するかを理解する必要があります。これについては、たとえば次のように説明されています。 第9章出発.

読む 楽しい 言語デザインに関する本!

Clojure の著者は、Christian Queinnec の著書「lisp in small Pieces」に従うことを推奨しました。の Clojure の読書リスト Clojure 言語の設計に影響を与えた多くの書籍をカバーしています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top