21

SO の多くの皆さんと同じように、私はよく複数の言語で記事を書いています。そして、物事を計画するとき (または、いくつかの SO の質問に答えるとき) は、実際には特定されていないハイブリッド言語で考えたり書いたりします。以前はフロー図や UML に似た図を使用してこれを行うように教えられていましたが、振り返ってみると、「私の」疑似コード言語には、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、コンセプト/アルゴリズムを表現するのに最適なイディオムを無意識に選択しているようです。CPythonJavabashMatlabperlBasic

一般的なイディオムには、Java に似たスコープ用の中かっこ、pythonic リスト内包表記またはインデント、C++ に似た継承、C# スタイルのラムダ、matlab に似たスライス、および行列演算が含まれる場合があります。

私がやろうとしていることを人々が正確に認識するのは実際には非常に簡単であり、人々が知的に他の言語に翻訳するのは非常に簡単であることに気付きました. もちろん、そのステップには、コーナー ケースと、各言語が特異な動作をする瞬間を考慮することが含まれます。

しかし実際には、これらの言語のほとんどは、一般的に同じように動作するキーワードとライブラリ関数のサブセット (数学関数、型名など) を共有していますwhile。明らかに、LispforifAPL 派生物のような多くの「奇妙な」言語を除外する必要がありますが、 ...

だから私の質問は、

  1. テキスト ファイルのプログラミング言語を認識するコードは既に存在しますか? (確かに、これは eclipse の構文ツリーや Google 翻訳の言語推測機能よりも単純なタスクに違いありませんよね?) 実際、SO 構文ハイライターはこのようなことをしますか?

  2. 理論的には、使用している言語イディオムをいつでも認識し、(おそらく「インテリジェントに」) 実行または実行可能な形式に変換する単一のインタープリターまたはコンパイラーを作成することは可能ですか? また、私の構文が動作に関してあいまいなコーナーケースにフラグを立てます。私が目にする当面の困難には、インデント依存モードとブレース依存モードをいつ切り替えるかを知ること、変な演算子 ( *pointervs*kwargsなど) を認識すること、リストと配列のような表現をいつ使用するかを知ることなどがあります。

  3. このような柔軟な通訳をこなせる言語や通訳者は存在するのでしょうか。

  4. これが可能であることに対する明らかな障害を見逃しましたか?

編集

あなたの答えとアイデアをありがとう。私は、意図した意味でコードを「解決」し、実際の Python コードに変換できる可能性のある制約ベースのヒューリスティック トランスレータを作成することを計画しています。多くの一般的な言語のキーワードに気づき、構文の手がかりを使用して、人間の意図を明確にします-スペース、括弧、またはのようなオプションのヘルパーワード、let変数thenが以前にどのように使用されたかのコンテキストなど、さらに一般的な慣習の知識(大文字の名前、反復のためのi、および変数/メソッドの命名に関するいくつかの単純化された限定的な理解(たとえば、単語、、、、、などgetを含むasynchronous)。実際の疑似コードでは、変数の命名は操作自体と同じくらい有益です!countlastpreviousmy

これらの手がかりを使用して、各操作の実装に関する仮定を作成します (0/1 ベースのインデックス作成、例外をキャッチまたは無視する必要がある場合、どの変数を const/global/local にする必要があるか、どこで実行を開始および終了するか、および何を実行するか)。ビットは別のスレッドにある必要があります。数値単位が一致する/変換が必要な場合に注意してください)。それぞれの仮定には一定の確実性があります。プログラムは、実行可能ファイルに書き込んだ内容を誘導するため、各ステートメントに仮定をリストします。

各仮定について、最初の解釈が気に入らない場合は、コードを「明確化」できます。ライブラリの問題は非常に興味深いものです。私のトランスレータは、一部の IDE と同様に、すべてのモジュールから利用可能なすべての定義を読み取り、どのクラス/メソッドがどのコンテキストで最も頻繁に使用されているかについての統計を使用して、推測します! (プログラムにメモを追加して、なぜそのように推測したかを説明します...)すべてを実行しようとし、気に入らないことについて警告する必要があると思います。何でも許可する必要がありますが、あいまいな場合は、いくつかの代替解釈が何であるかを知らせてください。

@Albin Sunnanbo のImportantCustomer例のような異常な例を管理できるようになるには、確かに時間がかかります。しかし、私は私がどのようにうまくいくかをあなたに知らせます!

4

8 に答える 8

4

おもちゃの例と厳密な数学的アルゴリズムを除いて、それはまったく役に立たないと思います。他のすべてのものにとって、言語は単なる言語ではありません。言語の周りには、多くの標準ライブラリと環境全体があります。「実際のコード」を書くのとほぼ同じ数のライブラリ呼び出し行を書いていると思います。

C# には .NET Framework、C++ には STL、Java には Java ライブラリなどがあります。

これらのライブラリの違いは大きすぎて、単なる構文上のニュアンスにはなりません。

<主観的>
異なる言語の言語構造を「統一された構文」に統一する試みがなされてきました。それは4GL言語と呼ばれ、実際に採用されることはありませんでした。
</主観>

補足として、C#、Java、および Java スクリプト コードとして有効なページ長に関するコード例を見てきました。これは、実際に使用されている言語を特定できない例として役立ちます。

編集:

さらに、疑似コードの全体的な目的は、コンパイルする必要がないことです。疑似コードを作成する理由は、「スケッチ」を作成するためです。

foreach c in ImportantCustomers{== OrderValue >=$1M}
    SendMailInviteToSpecialEvent(c)

それが何の言語か教えて、そのためのインタプリタを書いてください。

于 2010-09-13T21:05:31.867 に答える
3
  1. 使用されているプログラミング言語を検出するには:スニペットからプログラミング言語を検出します
  2. 可能だと思います。1.のアプローチは、これを行うために活用できると思います。コードの最初の行/句で使用されている構文を検出し、その検出に基づいて、重要な構文(begin / endラッパーなど)とともに中間形式に「コンパイル」します。次に、次の行/句など。基本的に、各「チャンク」を認識しようとするパーサーを記述します。あいまいさは、同じアルゴリズムによってフラグが立てられる可能性があります。
  3. これが行われたとは思えません...たとえば、Python互換の擬似コードを書くことを学ぶことの認知的負荷は、インタプリタが失敗した場合をデバッグしようとするよりもはるかに簡単なようです。
  4. a。最大の問題は、ほとんどの擬似コードがどの言語でも無効であるということだと思います。たとえば、人間の読者にとってはほとんどの場合簡単に推測できるため、擬似コードのブロックでオブジェクトの初期化を完全にスキップする場合があります。しかし、あなたの場合、それは選択した言語構文では完全に無効である可能性があり、たとえばオブジェクトのクラスを自動的に決定することは不可能かもしれません(それは存在しないかもしれません)。等
    b。あなたが望むことができる最高のものは、あなたの擬似コードに対してのみ「機能する」(4aに従う)インタプリタであり、他の誰もがそうではないと思います。

4a、4bが必ずしもそれを可能にする障害であるとは思わないことに注意してください。実用的な目的には役に立たないと思います。

于 2010-09-13T21:25:50.160 に答える
2

興味深いアプローチは、"type-as-you-go" 疑似コード インタープリターです。つまり、事前に使用する言語を設定しておくと、入力したとおりにリアルタイムで疑似コードを実際のコードに変換しようとします。インタラクティブ機能を使用して、あいまいなものを明確にし、修正できるようにすることができます。メカニズムの一部は、コンバーターが照合しようとしたコードのライブラリである可能性があります。時間の経過とともに、特定のユーザーの習慣に基づいて翻訳を学習し、適応させることができます。

常にプログラミングを行っている人は、ほとんどの場合、その言語を使用することを好むでしょう。ただし、上記は学習者、科学者などの「非プログラマー プログラマー」、およびさまざまな言語やスキル レベルのプログラマーとのブレインストーミング セッションでの使用に大きな恩恵をもたらすことがわかりました。

-ニール

于 2010-09-14T17:08:10.107 に答える
2

プログラムがどの言語で使用されているかを認識することは、実際にはそれほど大したことではありません。スニペットの言語を認識するのはより難しく、明確に区切られていないスニペット (4 行が Python で、次の行が C または Java の場合はどうすればよいでしょうか?) を認識するのは非常に困難です。

適切な言語に割り当てられた行を取得したと仮定すると、どのような種類のコンパイルでも、連携するすべての言語に特化したコンパイラが必要になります。これ自体が大変な作業です。

さらに、疑似コードを書くときは、構文を気にする必要はありません。(そうであれば、それは間違っています。) 不完全であったり、矛盾していたり​​するためにコンパイルできないコードになってしまいます。

そして、これらすべての障害を克服したと仮定すると、疑似コードが自分の考えたとおりに解釈されていることをどの程度確信できますか?

あなたが手にするのは、新しいコンピューター言語であり、正しいプログラムを書かなければなりません。それは無秩序で曖昧な言語であり、適切に扱うのは非常に困難です。使用には細心の注意が必要です。それは、疑似コードで望まないものとほぼ同じです。疑似コードの価値は、詳細を気にすることなく、アルゴリズムをすばやくスケッチできることです。それは完全に失われてしまいます。

書きやすい言語が必要な場合は、言語を学びましょう。Python は良い選択です。コンパイル可能な言語としてではなく、処理がどのように発生するかをスケッチするために疑似コードを使用します。

于 2010-09-13T21:45:16.147 に答える
2

人間の入力を解釈するプログラムには、「わからない」という選択肢を与える必要があります。PL/I 言語は、推測が間違っていた場合に大混乱を引き起こす可能性のあるコンピューター プログラムに似たものを合理的に解釈するように設計されたシステムの有名な例です。http: //horningtales.blogspot.com/2006/10/my- first-pli-program.html

後の言語 C++ では、可能性のあるあいまいさを解決するときに、試行する型強制の範囲を制限し、一意の最適な解釈がない場合はエラーにフラグを立てることに注意してください。

于 2010-09-14T18:27:54.467 に答える
1

2.の答えはNOだと思います。それが誤りであることを証明するために必要なのは、有能なプログラマーが複数の方法で解釈できるコード スニペットだけです。

于 2010-09-13T23:52:27.427 に答える
1

テキスト ファイルのプログラミング言語を認識するコードは既に存在しますか?

はい、Unixfileコマンドです。

(確かに、これは eclipse の構文ツリーや Google 翻訳の言語推測機能よりも単純なタスクに違いありませんよね?) 実際、SO 構文ハイライターはこのようなことをしますか?

私が知る限り、SO には、すべての主要言語のキーワードとコメント構文を組み合わせようとする万能型の構文ハイライターがあります。時々それは間違っています:

def median(seq):
    """Returns the median of a list."""
    seq_sorted = sorted(seq)
    if len(seq) & 1:
        # For an odd-length list, return the middle item
        return seq_sorted[len(seq) // 2]
    else:
        # For an even-length list, return the mean of the 2 middle items
        return (seq_sorted[len(seq) // 2 - 1] + seq_sorted[len(seq) // 2]) / 2

//SO のハイライターはが C++ スタイルのコメントを開始することを前提としていますが、Python では整数の除算演算子であることに注意してください。

複数の言語を 1 つにまとめようとすると、これは大きな問題になります。同じトークンが異なる言語で異なる意味を持つ場合、どうしますか? 同様の状況は次のとおりです。

  • べき乗は^BASIC のようなものですか、それともビットごとの XOR は C のようなものですか?
  • ||論理 OR は C のようですか、それとも文字列連結は SQL のようですか?
  • とは1 + "2"? 数値は文字列に変換されますか ("12" になります)、または文字列は数値に変換されますか (3 になります)?

このような柔軟な通訳に対応できる言語や通訳者は存在するのでしょうか。

別のフォーラムで、構文エラーに関係なく任意のプログラムをコンパイルするコンパイラ (IIRC、FORTRAN の場合) の話を聞きました。あなたがラインを持っていたら

= Y + Z

コンパイラは、変数が欠落していることを認識し、プログラムに が含まれX = Y + Zているかどうかに関係なく、ステートメントを に自動的に変換Xします。

このプログラマーは、次のようにハイフンの行でコメント ブロックを開始する規則を持っていました。

C ----------------------------------------

しかし、ある日、彼らは先頭の を忘れてCしまい、コンパイラーは減算演算子と思われるものの間に何十もの変数を追加しようとして窒息しました。

「柔軟な解析」は必ずしも良いことではありません。

于 2010-09-17T04:15:44.967 に答える