A 回答 (12件中1~10件)
- 最新から表示
- 回答順に表示
No.12
- 回答日時:
理論的に可能だが、実用的ではない、というところでしょう。
コンピュータが実行する以上、最終的には機械語に変換されます。
C言語のように直接機械語に翻訳したり、Perlのように機械語で作られた実行環境を利用したり、とやり方に違いはありますが。
CPUの基本動作は簡単です。
メモリの特定のアドレス(これをプログラムカウンタという変数で記憶しています)から必要なワード数読み出して、その値によって実行する計算を決めます。
Perlで書けばこんな感じ
$command = $memory[$pc] ;
if ( $command == 0x01 ) {
# 0x01はaレジスタをデクリメントするコマンドとする
$a -- ;
# 計算結果が0になったらZフラグを立てる
if( $a == 0 ) {
$flag_Z = 1 ;
} else {
$flag_Z = 0 ;
}
# 計算結果が負になったらCフラグを立てる
# 溢れた桁は無視される
if( $a < 0 ) {
$flag_C = 1
$a = $a & 0xffffffff ;;
} else {
$flag_C = 0 ;
}
} elsif ( $command ==0x02) {
...以下同様
これが、実用的な速度で動くものでは無い、というのはご理解いただけると思います。
逆コンパイルについて。
JavaはJavaVM用にコンパイルされます。プログラムの最適化は、実行時に行う部分が多く、コンパイル時にはあまり最適化されません。
そのため、元のソースが予想できるので、逆コンパイラの精度は高いです。
Cはコンパイル時に最適化を行います。
s=0;for(i=0;i<100;i++){s++;}
を、「sは100回インクリメントされる。他では使われない」ということから
s=100;
と最適化する、等ということが行われます。(オプションで抑制できますが)
s=100;から元のforにするのは無理です。
No.11
- 回答日時:
話を簡単にするためにPerl⇔Cに絞って考えてみましょう。
Cで8ビットマイコンAVRのプログラムを書いたとします。
RAMのサイズは2Kバイト程度です。
さて、このマイコンでPerlのプログラムを動作させるにはどうすればいいでしょうか?
別の例を考えてみましょう。
非機能要件として1m秒以内に完了させなければならない処理をCで苦心して実装したとします。
これをPerlに変換する(もちろん非機能要件を満たす形で)にはどうすればいいでしょうか?
これらを考えただけでも不可能なことがわかるはずです。
もちろん、ぬるい状況で簡単なプログラムを変換するぐらいならできる可能性はあります。
No.10
- 回答日時:
例えば、ある言語では
Dim testBuf(10) AS TYPE_A
Dim i As Integer
と変数を宣言しただけの状態で
別の言語に相互変換かけたら
TYPE_A testBuf[11];
for ( int UniqueArg00124 = 0; UniqueArg00124 < 11; UniqueArg00124 ++ )
{
testBuf[UniqueArg00124].ID= 0;
testBuf[UniqueArg00124].NAME = "";
testBuf[UniqueArg00124].Address = "";
testBuf[UniqueArg00124].Value = 0.0;
}
int i;
i = 0;
と生成されたらどう思います?
それだけで、相互変換ソフトなんて使いたく無いとおもいますよ
(あくまでたとえです、そこは memset 使えよとかは無しでお願いします。)
No.9
- 回答日時:
プログラム言語の仕様には用途に応じた特徴があり、相互変換しても冗長的になるだけで特性を生かせないからでしょう。
大昔の話ですが、BASIC言語と機械語が主流だった時代には、BASICから機械語へのコンパイラ言語、アセンブラから機械語へのアセンブル言語、機械語からアセンブラへの逆アセンブラ、機械語からBASICへの逆コンパイラというのがありました。
低級言語に比べ、高級言語になるほど相互変換が難しいのは、変換対象となる命令語が多くて最適化が難しいからでしょう。
BASIC言語をアセンブラ言語に変換するだけでも、対応する命令語の組み合わせが数多くあり、最適化が難しいのが現実です。変数をレジスタにするか、メモリー上のポインタにするかで、大きく違う為、結局はアセンブラで記述した方が処理が高速になる事が多かったです。
現在のC++言語でも同じで、他言語に変換する時点で元の言語に復元出来ないのではないでしょうか。言語変換しても効率が落ちるばかりで、処理の向上に繋がらないのではないでしょうか。
BASIC言語の時代でも解決が尽かなかったわけですから、現在のプログラム言語でも解決が尽かないのは当然かもしれません。人工知能で最適化出来る言語が出来ない限り、この問題の解決は難しいでしょう。
実の話、プログラムを人間が書いている時代が、今も続いているのが不思議です。プログラム言語を考えていると、最初に大雑把に変数処理を重視したプログラムに変換してから、それを変数よりもレジスタに置き換えた方が処理が速くなるプログラムに変換して行けば良いのは、誰でも気がつくのですが、実際に、それをやろうとすると、プログラムの処理系を変えても互換性が保てるように変換しなければならず、非常に複雑になります。
結局は、ある程度までしか最適化出来ないわけで、コンピュータがプログラムを最適化するよりも、人間が直接書いた方が無駄が少ない結果になるわけです。
プログラム言語の相互変換は、思考実験では簡単に思えても、実際にやるのは大変だということでしょう。
No.8
- 回答日時:
もしかして文法上似たような言語しか触ったことがないのでは?
>当方perlしか分かりませんが、他の言語を見ると結構共通している部分がありCなども簡単な修正は勉強しなくても出来ます。
perlはCやawk, sedを参考に作られてるので似てるところがあるのは当然です。
LISP, FORTH, Prologなど系統の異なる言語は触ってみたことありますか?
また逆コンパイラの紹介がありますが機械語になったものは逆コンパイラで元に戻すことは不可能です(いちおうソースはできますが元のものとは全く異なるものにしかなりません)。当然他の言語に変換などできるわけがありません。
No.7
- 回答日時:
システム開発を行う上で言語の選定は重要なファクターになります。
で、「その言語にしかない強み」というのが言語選定上のポイントになったりします。例えばPHPなら正規表現でしょうし、C言語ならポインタでしょうし。そういった所の互換性が無い以上、ツールを作成するコストは無駄に終わる可能性が高いわけで。
高級言語同士を変換するトランスレータはCOBOLからJava等いくつかありますが、スクリプト言語間はあるんでしょうかねー。特許を取ってたりしますしねー。
http://www.gp.hitachi.co.jp/service/migration/so …
http://www.ekouhou.net/%E8%A8%80%E8%AA%9E%E5%A4% …
No.6
- 回答日時:
>人が使う言葉ほどはややこしくありませんし、現状どの辺りが難しく相互変換(例えば、perl⇔php⇔ruby⇔C)が出来ないのでしょうか?
C言語ではポインタを使えますが、その他の言語ではポインタをどのように表現できますか?
C言語でクラスはどのように実装しますか?
そもそもスクリプト言語とコンパイルしなくてはならないC言語を相互変換できることにどのようなニーズがあるのでしょうか?
たぶん、苦労のわりにニーズが無い->誰も作らない
だと思います。
>また、機械語に翻訳された物であれば、それを逆に辿って好きな言語で表示させるなど素人考えでは出来そうな気がするのですが、どの辺りが難しいのでしょうか?
リバースコンパイラで調べてください。
No.5
- 回答日時:
>>当方perlしか分かりませんが、他の言語を見ると結構共通している部分がありCなども簡単な修正は勉強しなくても出来ます。
言っていることが矛盾していますね。いろいろな言語を経験して使いこなせるなら「結構共通している部分があり」っていう主張もわかるけど、「当方perlしか分かりませんが」では、「当方自転車に折れて運転できます。同じ運転なのでバスやトラックも運転っていう意味では似ているので、乗ってもいいですよね?」って放言しているようなものです。
No.4
- 回答日時:
「結構共通している部分がある」ということは、「共通してない部分がそれなりにある」ということになります。
そして、相互変換するということは、その、「共通してない部分」を含めて、対応しなければならないので、難しいのです。
また、それ以上に、「パラダイム」と呼ばれる言語の背景にあるものが、相互変換の障害になります。
たとえば、スクリプト言語だと、多くの場合、「型の制約がない」というのが特徴です。
一方で、CやC++は、「型の制約を強くすることで、コンパイル時にエラーを検出する」という思想です。
こういうものを始め、思想の異なる部分がそれなりにあって、機械的に変換するのは難しいです。
これは、ただ単に相互変換が難しいというだけではなくて、「異なる言語で作られたライブラリを相互に(直接)呼び出すのが難しい」ということにも通じます。
そして、これに対して、新しい枠組みを提供しようとするのが、.NET Framework の基盤になっている、共通言語基盤(CLI)という枠組みです。
おおよそ、どのような言語でも、対応できるような、オブジェクト言語を提供しようということで、考えられたものです。
実は、「機械語に翻訳」といっても、元のプログラム言語の(さらにはコンパイラ)特有の癖がありますから、それを、元の言語に逆コンパイルするのはともかくとして、別の言語に戻すのは、この「癖」が邪魔して、簡単なものではありません。
これも、共通言語基盤という枠組みであれば、このオブジェクト言語を経由して、相互変換できるかもしれません。
結局、プログラム言語で、「判断や繰り返しがある」とか、「代入ができる」とかいう見かけの共通点よりも、「どの範囲のものが代入できるのか」とか、「サブルーチンの呼び出しは、(バインディングなども含めて)どのような機構で行われるのか」とか、そういう点で、「かなり違いがある」ということになります。
また、世の中には、代入という考え方がなかったり、(直接には)ループが表現できなかったりという言語も存在しています。こういうものだと、さらに大変かもしれません。
と、ここまで書いていて、前言を翻すようですが、言語の相互変換というのは、「それ用のライブラリ」というものを介在させることで、対応できることもあります。
たとえば、ruby の文のひとつひとつに対応した、Cの関数を作っておいて、全部対応するCの関数呼び出しで実現するという方法などもあります。
こういうのだと、(美しくはないですが)一方向への変換はできることもあります。
No.3
- 回答日時:
#2です。
失礼、ちょっと先走りました。「逆コンパイル」というのは一応あります。
http://ja.wikipedia.org/wiki/%E9%80%86%E3%82%B3% …
ただし、何でも自由自在ということでは当然ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) HTMLを組み込むことができない言語 3 2022/05/21 10:05
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- オープンソース IT用語、ソースとオブジェクト、改変と翻訳と翻案の違いなど どのようにりかいすればよいのですか 1 2022/09/09 10:02
- 大学受験 英単語帳について質問です。 たくさんの回答お待ちしております。 現在高3、産近甲龍志望です。 現在タ 5 2023/08/21 11:50
- 認知障害・認知症 病院に行く勇気がありません。 4 2023/05/12 18:55
- 英語 ソシュール言語観による品詞、単語、辞書理解の誤り 4 2022/11/24 12:27
- 英語 会社で英語を使うことになっての英語の勉強方法 5 2022/07/03 11:49
- 日本語 日本語はどのくらい難しいですか? 日本育ちの日本人です。 漢字検定の勉強をしてるのですが、同じ言葉で 3 2022/07/12 13:09
- 仕事術・業務効率化 (初体験)中日英通訳の悩み 2 2023/08/09 09:07
- Excel(エクセル) Excelヘルプの原文を表示する最速の方法(手順)には? 1 2023/08/11 11:30
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
COBOLでのNOT = の AND条件
-
C言語、C+、C++、C#の違い
-
vbaとc言語の関連性について
-
COBOLで文字タイプを数字...
-
プログラムに書かれる"%"記号の...
-
TO_CHARで小数点以下がある場合...
-
プログラミング言語の制作方法...
-
.Net Framework APIがあればMFC...
-
VBSとWSHは読み方が違うだけで...
-
パスカルケースの由来。
-
Excel VBAで文字化けする (英語...
-
UNITY Float型の接尾辞fって
-
Excelの開発言語ってなんですか?
-
adobe のillustrator とかphoto...
-
QT(C++)の学習方法について
-
プログラムははぜ小文字大文字...
-
C for Linuxでの設定ファイル読...
-
プログラミング言語「C#」の難...
-
現在、大学の応用化学科に所属...
-
UWSCはどのプログラミング言語?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語、C+、C++、C#の違い
-
COBOLでのNOT = の AND条件
-
UNITY Float型の接尾辞fって
-
プログラムに書かれる"%"記号の...
-
vbaとc言語の関連性について
-
C言語とhtmlの違いを どな...
-
C++における継続行
-
プログラムからアイコンファイ...
-
TO_CHARで小数点以下がある場合...
-
COBOLで文字タイプを数字...
-
パスカルケースの由来。
-
VBSでDim、Private、Publicの違い
-
Excel VBAで文字化けする (英語...
-
VBSとWSHは読み方が違うだけで...
-
VBScriptで引数を省略したい場合
-
Solve()とは、なんですか?
-
プログラムははぜ小文字大文字...
-
今、コンピューター言語で、COB...
-
C++ ってなんて読む?
-
HTMLとC++で、どんなホームペー...
おすすめ情報