web-dev-qa-db-ja.com

基本言語の基本機能? DSLの提案?

私はついにインタプリタとコンパイラの作成の背後にある複雑さを理解し始めました。この時点に至る前に、TinyBasic、1964(Dartmouth)Basicのいくつかのバージョンと、これらの言語での独自の拡張を構築しました。最新のプロジェクトは、私がオープンソースベーシックと呼んでいるプロジェクトです...人々が興味を持つ言語の他の機能は考えられなかったからです。言語のソースを開き、複雑な処理がどのように行われるか(スキャン、解析、解釈、およびコンパイルがどのように行われるか)を理解できるようにするため

オープンソースベーシックは、最初にスタックベースの言語に解釈されます。そのスタックベースの言語は、すぐに解釈および実行されるか、CLR実行可能ファイルに変換されます。

私の質問はすべてこれに要約されます:

  • 基本ベースの言語の基本的な機能/構成は何ですか?私はすでにこれらの基本的な構成を持っています:割り当て、式、変数、いくつかの関数(ランダム、ToUpper、ToLower)、ループ(forおよびdo- while/until)、If(ブロックおよび単一行)その他の決定、コンソールベースの入力(入力)および出力(印刷)、およびサブルーチン(パラメーターはまだありません)。
  • 基本的な構成を自分の言語に追加する「完了」したら、どのように分岐する必要がありますか?どのドメインに?言い換えれば、すべての一般的な構成要素が機能するようになったら、オープンソースの基本言語はどの方向に進むべきですか?

お時間をいただきありがとうございます、

ドミニク

9
Dominick

確かに高貴な努力ですが、あなたは優先順位を逆転させたと思います。

あなたの最初の関心事はあなたの言語が取り組むことを目標としている「ドメイン」問題であるべきです。そもそも「ドメイン固有言語」と呼ばれているのはそのためです。 DSLは、小さくて単純で、非常に狭い範囲で焦点を絞って、バターを介したナイフなどの特定の問題を解決する場合にのみ許容されます。

ドメインとそのドメインでの言語の動作を特定したら、特定の構成または機能を配置できます。

最後に、 内部DSLまたは外部DSL が必要かどうかを検討すると役立つ場合があります。

1
Angelo

コモドール[Vic-20、C-64]での初期のBASICに関する私の経験は、行番号がBASICの中核的な「機能」であるという印象を与えました。それは現代の実装ではもはや使用されていないようですが、BASICの私の主な見方は他の何かへの出発点となる学習言語であるので、私にとってそれは何か害を及ぼします。

1
MarkHu

すでに存在する場合は追加または拡張できる機能がいくつかありますが...

...基本的なプログラミング言語は、スクリプト言語と非常によく似ており、多くの人が見逃したり、後で含めたりした機能は、名前空間またはモジュールでした。

C、C++、PHP、Visual Basicは、モジュール/名前空間なしで開始され、後で追加されました。

次は、サブルーチン(値を返さないプロシージャまたは関数)と関数(特別な値を返すサブルーチン)です。

0
umlcat

私はCAE/FEAアプリケーション用のスクリプト言語を開発しており、エンドユーザーに役立つと思われる機能は次のとおりです。ローカル変数とグローバル変数動的割り当てと拡張を備えた行列引数を使用し、参照によって構造(ユーザー定義型)を渡すあなたがあなたが言及した機能は、最初から非常に強力な言語にする必要があります。次に、ユーザーの要求に応じて開発します。

0
Gus

複雑な処理がどのように行われるかを理解する(スキャン、解析、解釈、およびコンパイルがどのように行われるか)

コンパイラーを理解するためのリソースのスタックオーバーフローサイトに いい質問 があります。私の コンパイラクラスページ もご覧ください。

基本的な構成を自分の言語に追加する「完了」したら、どのように分岐する必要がありますか?

すでに構築した機能を踏まえて、int、string、booleanの3つのデータ型を追加することをお勧めします。 3つのことを行う必要がありますが、それぞれが以前よりも少し難しくなります。

  1. これらのキーワードを解析できるように文法を変更します。テスト。
  2. 変数名やその他のプロパティとともにデータ型を含めることができるように、シンボルテーブルを作成(または既存のものに追加)します。次に、デバッグスイッチを作成して、これをテストし、シンボルテーブルを確認できるようにします。
  3. MsILへのコード生成の前または解釈中に、互換性のある型を確認してください。すべてのタイプの各実行モードでエラーと非エラーの両方のケースをテストします。

それがうまくいけば、スコープに取り組むことをお勧めします(サブルーチン内のローカルとグローバル)。アドバイスが必要な場合はお知らせください。

幸運を。そしてお楽しみください!

0
Alan