SO の多くの皆さんと同じように、私はよく複数の言語で記事を書いています。そして、物事を計画するとき (または、いくつかの SO の質問に答えるとき) は、実際には特定されていないハイブリッド言語で考えたり書いたりします。以前はフロー図や UML に似た図を使用してこれを行うように教えられていましたが、振り返ってみると、「私の」疑似コード言語には、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、コンセプト/アルゴリズムを表現するのに最適なイディオムを無意識に選択しているようです。C
Python
Java
bash
Matlab
perl
Basic
一般的なイディオムには、Java に似たスコープ用の中かっこ、pythonic リスト内包表記またはインデント、C++ に似た継承、C# スタイルのラムダ、matlab に似たスライス、および行列演算が含まれる場合があります。
私がやろうとしていることを人々が正確に認識するのは実際には非常に簡単であり、人々が知的に他の言語に翻訳するのは非常に簡単であることに気付きました. もちろん、そのステップには、コーナー ケースと、各言語が特異な動作をする瞬間を考慮することが含まれます。
しかし実際には、これらの言語のほとんどは、一般的に同じように動作するキーワードとライブラリ関数のサブセット (数学関数、型名など) を共有していますwhile
。明らかに、Lispfor
やif
APL 派生物のような多くの「奇妙な」言語を除外する必要がありますが、 ...
だから私の質問は、
テキスト ファイルのプログラミング言語を認識するコードは既に存在しますか? (確かに、これは eclipse の構文ツリーや Google 翻訳の言語推測機能よりも単純なタスクに違いありませんよね?) 実際、SO 構文ハイライターはこのようなことをしますか?
理論的には、使用している言語イディオムをいつでも認識し、(おそらく「インテリジェントに」) 実行または実行可能な形式に変換する単一のインタープリターまたはコンパイラーを作成することは可能ですか? また、私の構文が動作に関してあいまいなコーナーケースにフラグを立てます。私が目にする当面の困難には、インデント依存モードとブレース依存モードをいつ切り替えるかを知ること、変な演算子 (
*pointer
vs*kwargs
など) を認識すること、リストと配列のような表現をいつ使用するかを知ることなどがあります。このような柔軟な通訳をこなせる言語や通訳者は存在するのでしょうか。
これが可能であることに対する明らかな障害を見逃しましたか?
編集
あなたの答えとアイデアをありがとう。私は、意図した意味でコードを「解決」し、実際の Python コードに変換できる可能性のある制約ベースのヒューリスティック トランスレータを作成することを計画しています。多くの一般的な言語のキーワードに気づき、構文の手がかりを使用して、人間の意図を明確にします-スペース、括弧、またはのようなオプションのヘルパーワード、let
変数then
が以前にどのように使用されたかのコンテキストなど、さらに一般的な慣習の知識(大文字の名前、反復のためのi、および変数/メソッドの命名に関するいくつかの単純化された限定的な理解(たとえば、単語、、、、、などget
を含むasynchronous
)。実際の疑似コードでは、変数の命名は操作自体と同じくらい有益です!count
last
previous
my
これらの手がかりを使用して、各操作の実装に関する仮定を作成します (0/1 ベースのインデックス作成、例外をキャッチまたは無視する必要がある場合、どの変数を const/global/local にする必要があるか、どこで実行を開始および終了するか、および何を実行するか)。ビットは別のスレッドにある必要があります。数値単位が一致する/変換が必要な場合に注意してください)。それぞれの仮定には一定の確実性があります。プログラムは、実行可能ファイルに書き込んだ内容を誘導するため、各ステートメントに仮定をリストします。
各仮定について、最初の解釈が気に入らない場合は、コードを「明確化」できます。ライブラリの問題は非常に興味深いものです。私のトランスレータは、一部の IDE と同様に、すべてのモジュールから利用可能なすべての定義を読み取り、どのクラス/メソッドがどのコンテキストで最も頻繁に使用されているかについての統計を使用して、推測します! (プログラムにメモを追加して、なぜそのように推測したかを説明します...)すべてを実行しようとし、気に入らないことについて警告する必要があると思います。何でも許可する必要がありますが、あいまいな場合は、いくつかの代替解釈が何であるかを知らせてください。
@Albin Sunnanbo のImportantCustomer
例のような異常な例を管理できるようになるには、確かに時間がかかります。しかし、私は私がどのようにうまくいくかをあなたに知らせます!