2022年11月15日火曜日

あるプログラミング言語から別のプログラミング言語へ内容はそのままで変換してくれるツールは何かありますか?

https://jp.quora.com/%E3%81%82%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E3%81%8B%E3%82%89%E5%88%A5%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80-1?__nsrc__=4

石塚 正浩さんのプロフィール写真

並べ替え
 · 
フォロー

github copilotで 概ね変換できます。

Python -> Rustだと

Rustのコードにコメントで(コピペしたらindentが消えましたがコメント文であっても、インデントはきちんといれてください)(誰か私にquoraでindent付きのコードをコピペする方法を教えて下さい。。。)

  1. // def bubbleSort(arr): 
  2. // length = len(arr) 
  3. // isSwaped = False 
  4. // for i in range(length-1): 
  5. // for j in range(0, length-i-1): 
  6. // if arr[j] > arr[j + 1]: 
  7. // isSwaped = True 
  8. // arr[j], arr[j + 1] = arr[j + 1], arr[j] 
  9. // if not isSwaped: 
  10. //  

という感じで全部コメントで入れます。

次にRustで

fn bubble_sort(

くらいまで入力すると

  1. fn bubble_sort(arr: Vec) -> Vec { 
  2. let length = arr.len(); 
  3. let mut is_swaped = false; 
  4. for i in 0..length-1 { 
  5. for j in 0..length-i-1 { 
  6. if arr[j] > arr[j + 1] { 
  7. is_swaped = true; 
  8. arr[j], arr[j + 1] = arr[j + 1], arr[j]; 
  9. } 
  10. } 
  11. if !is_swaped { 
  12. return arr; 
  13. } 
  14. } 
  15. arr 
  16. } 

こんなコードが出てきます。

Vec => Vec<i32>

let mut arr = arr;を足す

  1. arr[j], arr[j + 1] = arr[j + 1], arr[j]; 

この3行直せばコンパイルも通ります。

基本的にコメントで書いた方法と全く同じアルゴリズムで変換してくれます。(アルゴリズムにバグがあればバグも再現してくれます)

ただし長いアルゴリズムは途中で諦められてしまうので、適度に関数を小さく分割してください。。。

また完璧な翻訳はしてくれませんので(有名言語であればあるほどうまく翻訳できますが)、適宜修正をしてください。80点〜90点あたりの翻訳です。

私はこの機能よく使ってます。 SQLのcreate文からstructとか 結構なんでも変換してくれます。

#なんか最近コレと同じような回答書いた気がするようなしないような?

 · 
フォロー

いっぱいあります。コンパイラって言うんですが。機械語もプログラミング言語の一種でしょう。

おそらくこれは知りたい回答じゃないと思いますが、さまざまな言語でC言語に変換することで実装された言語処理系があります。ってのも多分知りたい回答じゃなくて同じレベルくらいの言語に変換するツールってことじゃないかと思います。

FORTRANをCに変換するとかCobolをJavaに変換するとか噂には聞きますが、この手のツールって変換後のコードを人間が保守するのが前提でしょうからその点で使えるものなのかは分かりません。

 · 
フォロー

コンパイラはすでに回答に出てますが、Javaや.NETなどの中間言語方式も変換のうちに入るかと思います。

まあ、そういう回答を期待されてはいないでしょうから真面目に回答すると、同じ言語のバージョン違いの変換、いわゆるマイグレーションツールでも人間が手を入れるのが前提のものが多いので、ましてや文法が違う言語間で使い物になる変換は難しいかと思います。

例えば、同じ.NETフレームワークで動くVB.netとC#でも、VB.NET→C#への変換は不可能ではないにしても、逆は不可能です。それはVB.NETではサポートしていない機能があるため。もちろん、最初から変換することを前提に2つの言語を開発すれば可能かとは思います。

なお「内容そのままで」変換というのは事前事後に手を入れないという解釈での回答になります。

0 コメント:

コメントを投稿