質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

279閲覧

プログラム変換(JavaScript->C)

tokuo0

総合スコア12

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2018/08/31 21:20

編集2018/08/31 21:21

人手でJavaScriptのプログラムをCに変換してみました。
人が見れば、Cにおいて、evenが指すのは_multipleOfであることがわかるので、_notは_multipleOfの結果を論理否定すれば良いことがわかるのですが、プログラム変換によって実現出来そうでしょうか?

JavaScript

1importPackage(java.lang) 2print=function(x){System.out.print(x+' ')} 3 4multipleOf=function(n) 5{ 6 return function(m) 7 { 8 if(m%n===0) 9 { 10 return true 11 } 12 else 13 { 14 return false 15 } 16 } 17} 18 19not=function(predicate) 20{ 21 return function(arg) 22 { 23 return!predicate(arg) 24 } 25} 26 27even=multipleOf(2) 28odd=not(even) 29 30print(odd(2)) 31print(odd(3))

C

1#include<stdio.h> 2 3#define FALSE 0 4#define TRUE !FALSE 5 6void print(int x){printf("%d ",x);} 7 8int _n; 9int _multipleOf(int m) 10{ 11 if(m%_n==0) 12 { 13 return TRUE; 14 } 15 else 16 { 17 return FALSE; 18 } 19} 20 21int(*multipleOf(int n))() 22{ 23 _n=n; 24 return _multipleOf; 25} 26 27int _not(int m) 28{ 29return !_multipleOf(m); 30} 31 32int(*not(int(*f)()))() 33{ 34 return (int(*)())_not; 35} 36 37int main() 38{ 39 int(*even)(),(*odd)(); 40 41 even=multipleOf(2); 42 odd=not(even); 43 44 print(odd(2)); 45 print(odd(3)); 46}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/08/31 22:21

元のコードがJavaとJavaScriptのちゃんぽんになっていて、意味が通らなさそうなのですが…
y_waiwai

2018/09/01 01:07

質問の意味がよーわかりませんが、プログラム変換とはなんかのツールを使うんでしょうか
tokuo0

2018/09/01 04:12

(1)JavaScript側は表示にJavaのライブラリを使用しています。本題との関係は無く、また、然るべき環境では正常に動作しております。
tokuo0

2018/09/01 04:24

(2)この様な変換を行うツールを作る事が可能かという質問です。なお、この例では問題にはなっていませんが、クロージャの処理は別途必要と思います。
tokuo0

2018/09/01 04:46 編集

JavaScriptの例は、先頭から2行を以下と置き換えれば、Windows上で動作します。 print=function(x){WScript.echo(x)} テキストファイルにコピペし、拡張子を .js に変えて、そのファイルをダブルクリックして下さい。
tokuo0

2018/09/01 20:43 編集

書く場所を間違えましたので、「回答へのコメント」に転記致しました。
guest

回答1

0

ベストアンサー

この様な変換を行うツールを作る事が可能かという質問です。

Cコンパイラで動けばいいというのであれば、可能だと思います。たとえばLLVMのような基盤を介して、JavaScript→LLVM→C言語のようにすれば、Cコンパイラで実行することは可能となるかと思います(ただし、人間が読解できるようなコードにはなりません)。

C言語としてのセマンティクスをもたせるようにとなれば、それは困難かと思います。というのも、以前に回答したように、C言語では動的に関数を生成することができないので、not以前にmultipleOf(2)の時点で、独自の枠組みを用意しなければいけなくなります。

「定数値だけなのだから展開して欲しい」という考えなのかもしれませんが、定数値しか処理できないものを作っても、汎用的に使えないので需要はほぼないでしょう。

投稿2018/09/01 06:33

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokuo0

2018/09/01 20:40 編集

御教授ありがとうございます。 ところで、恐れ入りますが、 「C言語では動的に関数を生成することができない」にもかかわらず「JavaScript→LLVM→C言語」と変換できる理由がわかりませんので、この件も教えて頂きたくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問