Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyでおもちゃのプログラミング言語を構築する

プログラミング言語は素晴らしいが神秘的なツールだと思いますか?彼らのフードの下を覗いて、何が彼らを機能させるのかを理解する機会が与えられたらどうしますか?手を汚してプログラミング言語をゼロから開発することに興味がある場合は、このブログ投稿とこのシリーズの次の投稿が役立ちます。

一連の記事では、非常に単純なインタプリタで動的に型付けされたプログラミング言語を段階的に構築します。ただし、今のところ、これらの用語の正確な意味について少し不確かな場合や、目前のタスクに少し不安を感じている場合でも、心配する必要はありません。素敵なRubyプログラミング言語を使用してインタープリターを実装し、各ステップを明確に説明して、初心者と上級の開発者の両方が従うことができるようにします。この言語は、この名前で呼ばれる素敵な南アフリカのラーテルに敬意を表して「Stoffle」と名付けています。

なぜプログラミング言語を構築するのですか?

StoffleはおそらくPythonやRubyに取って代わることはないでしょう。それで、なぜそれを開発するのをわざわざするのですか?楽しいことに加えて、このシリーズで私が示したいのは、言語を構築することは素晴らしいプログラミング演習であるということです。この経験から複数のメリットを得ることができます:

  • プログラミング言語の謎を解き明かす (およびプロキシによる開発者ツール)そして、これらのツールの消費者としてだけでなく、ニーズや要望に応じて自分自身を考案できる作成者として自分自身を見ることができます。

  • この演習では、一般的でないプログラミングの課題をいくつか紹介します。 私たちのほとんどが日常生活で直面することはありません。

  • また、プログラミング言語の実装の領域外で役立つコンポーネントについても学習します。 。たとえば、上司が作業中のシステムにデータをインポートするための新しいメカニズムとしてサポートする必要があると言っている問題のあるレガシーテキストファイルを処理するために、100万の不可解な正規表現の代わりにパーサーを使用できます。

プログラミング言語はどのように機能しますか?

このプロジェクトで私たちの前にあるものを見る前に、まずズームアウトして、プログラムがコンピューター上でどのように実行されるかを理解しましょう。ご想像のとおり、CPUはRubyのような高級言語を直接サポートしていません。ただし、CPUには、アーキテクチャに応じてサポートする一連の非常に低レベルの命令があります。

興味がある場合は、たとえば、x86アーキテクチャを調べてください。これは、PCまたはMacでこの記事を読んでいる場合に、コンピュータに電力を供給する可能性が非常に高いです。

したがって、プログラミング言語のタスクは、その高水準コードをCPUが理解できるマシンコードに変換することです。このタスクを実行するために、多数の戦略が使用されます。 Stoffleは解釈された言語になります。つまり、プログラムの実行中に、インタプリタがStoffleのソースコードを機械語に翻訳します。

Cなどのコンパイル言語は別の獣です。これらには、ターゲットCPUで実行できるバイナリ(つまり、ソースがマシンコードに変換されたもの)を変換および生成するコンパイルステップがあります。別の戦略は、ソースファイルをすでに存在する別の(多くの場合、高級)言語にコンパイルすることです。この戦略は一般に「トランスパイル」と呼ばれます。

ただし、実際の言語を扱う場合は、物事がそれほど明確ではないことに注意してください。彼らは一般的に、これらすべての(および他の)異なる実装戦略の側面と技術を何らかの形で取り入れています。基本を理解した後、好みの言語がどのような道をたどるかについてさらに調査することをお勧めします。

ストッフルの鳥瞰図

前述のように、Stoffleは、基本的な、解釈された、動的に型付けされたプログラミング言語になります。これは、いくつかの基本的なデータ型、4つの初等算術演算子、比較と等式、論理演算子、if / else、whileループ、関数、およびコンソールへの出力機能のみで構成されます。

雑学クイズ:学習と実験を主な目的とするStoffleに似た言語は、おもちゃの言語と呼ばれることがよくあります。 。

Stoffleのインタープリターは、前述のように、信頼できる最愛のRubyを使用して実装されます。インタプリタを起動すると(stoffle hello_world.sfe )、実行前にソースファイルが通過するコンポーネントとフェーズは次のとおりです。

Rubyでおもちゃのプログラミング言語を構築する

インタプリタの一部と.sfeファイルを実行するとどうなるか。

レクサー

スキャナーとしても知られているレクサーの使命は、文字列の単純な文字列を、一般に「トークン」と呼ばれる適切なグループに変換することです。 my_var.という変数を宣言するとします。 レクサーはこれらの文字を読み取り、Token::VARIABLEを生成します トークン。

パーサー

ソースコードについて考えるとき、そのネストされた性質は否定できません。たとえば、条件式について考えてみます。その真と偽の分岐は、条件の評価の結果に応じてネストされ、実行されます。

パーサーの主な役割は、トークンのフラットシーケンスを、トークン間に存在する関係を表すことができるデータ構造に変換することです。パーサーのもう1つの重要な機能は、構文エラーを報告して混乱したことを通知することです。

通訳者

Stoffleのインタープリターはシンプルで、パーサーによって生成されたデータ構造を直接操作します。インタプリタはこの構造を1つずつ分析し、実行します。

Stoffleプログラミング言語では、インタープリター自体がRubyプログラムになるため、マシンコードへの変換が行われます(したがって、実行時にRubyのインタープリターによって解釈されます!)。

まとめ

今日の記事では、Stoffleに命を吹き込むために実行する手順の大まかな概要を示しました。あなたが私と同じように興奮していて、プログラミング言語の実装は単なる人間には手が届かないものだと最初に思っていた人たちに自信を与えることができたことを願っています。

このシリーズの次のブログ投稿では、Stoffleのレクサーを実装することで手を汚し始めます。つまり、次の投稿の終わりまでに、Stoffleのソースコードを読み取って変換できるRubyプログラムを開発する予定です。当たり障りのない文字のシーケンスを、より構造化された(そして興味深い!)トークンのシーケンスに変換します。

このシリーズの次回の記事でお会いしましょう!


  1. Rubyでの関数型プログラミング(完全ガイド)

    関数型プログラミングについて聞いたばかりで、いくつか質問があるかもしれません。 いいね… 関数型プログラミングとは正確には何ですか? オブジェクト指向プログラミングと比較してどうですか? Rubyで関数型プログラミングを使用する必要がありますか? これらの質問に答えて、これがどのように機能するかをよりよく理解できるようにします。 関数型プログラミングとは これは単なる流行や派手な言葉ではなく、長い間存在していた実際のプログラミングパラダイムですが、最近人気を取り戻しています。 そして、このパラダイムの背後にある基本的な考え方は、あなたが思っているよりも理解しやすいです。 関数型

  2. Rubyネットワークプログラミング

    Rubyでカスタムネットワーククライアントとサーバーを作成しますか?または、それがどのように機能するかを理解しますか? 次に、ソケットを処理する必要があります。 このルビーネットワークプログラミングのツアーに参加してください 基本を学び、Rubyを使用して他のサーバーやクライアントと会話を始めましょう! では、ソケットとは何ですか ? ソケットは通信チャネルのエンドポイントであり、クライアントとサーバーの両方がソケットを使用して通信します。 動作方法は非常にシンプルです : 接続が確立されると、データをソケットに入れることができます。データはもう一方の端に送られ、そこで受信者はソケ