12

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

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

私はレゴ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 ...]

この背後にある推論には明らかにまだギャップのある穴がありますが、とにかくこのラフスケッチを投稿して、いくつかの役立つ回答と議論を引き起こします。

4

4 に答える 4

22

それで?どこから始めればいいですか?何を知る必要がありますか?

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

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

言語を学び、コンパイラについて読んだら、次のようにします。

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

  2. 実際に機能するランタイムライブラリができたら。 本当に完全に動作します。完全に。構文と語彙のスキャンとコンパイルについて考えることができます。これらは難しい問題ですが、ランタイムライブラリを機能させるのに比べて半分ほど難しい問題ではありません。

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

あなたの言語に最初に何かをさせる。

于 2010-10-25T12:07:35.573 に答える
5

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

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

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

たぶん、Twitterはより良い例です。TwitterAPIを使用して独自のTwitterを作成します。(もちろん、あなたのアイデアがTwitterの基本モデルに適合する場合に限ります。)

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

1ステップ(ソース->実行可能)と0ステップ(ソーススクリプトは実行可能)のコンパイル言語を分割する必要があります。3-4レベルはまだ概要を説明するのは簡単です、そして-私たちがそれを正しく行えば-それは開発をより効果的にすることができます。

于 2010-11-01T22:42:22.433 に答える
4

最も簡単な方法は、 ForthFactorなどの連結プログラミング言語、または独自の設計言語を使用することです。

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

于 2010-10-25T15:34:36.000 に答える
4

言語デザインについての楽しい本を読んでください!

Clojureの作者は、ChristianQueinnecによる「lispinsmallPieces」という本に従うことを推奨しました。Clojureリーディングリストには、Clojure言語のデザインに影響を与えた多くの本が含まれています。

于 2010-10-26T18:42:15.393 に答える