3

eval()最近、いくつかの場所 (いくつかの D および JavaScript コード) で関数に出くわしました。この経験は、私が の有無にかかわらず言語の違いを理解していなかったことに気付かせてくれましたeval()

実際、私はそれを使用せずに生き残ることができました (ただし、時々魅力的です:))。

eval()言語を実装する言語とそれを実装しない言語 (コンパイル時であっても)の根本的な違いから知っていますか? 根本的な違いがなければ、表現力の違いはあるのでしょうか?

によって提供される追加の計算能力/表現力について説明している論文または参考文献を知っていますeval()か? これは、eval()それなしでは実装できない (またはより高いコストで) 実装できるものは何ですか?

4

1 に答える 1

4

ある言語とない言語の機能に違いはありませんevaleval一部の言語(Lisp)では簡単で、他の言語(C)では難しいですが、それがない言語でいつでも自分自身を実装できます。これが、言語に新しい機能が追加されていないことを私たちが知っている理由です。

Evalは、一般的に「強力ですが、本番コードでは危険で不要」と見なされます。ソースコードをレビューして、それがevalを使用している場合は、を使用しないように言われる人々に慣れる必要がありますeval。通常、を使用する場合eval、同じタスクを実行するためのより簡単で安全な方法があります。

セキュリティの脆弱性

このeval機能は、Webアプリケーションなどのセキュリティの脆弱性につながることがよくあります。たとえば、Pythonでは次のようになります。

i = input('Enter a number> ')

input3.xより前のPythonの関数はユーザー入力を評価し、セキュリティ上の問題を引き起こします。

数値を入力> __import__('os')。system('rm -rf $ HOME')#これは試さないでください

これは、JavaScript、Lua、CLIなどの完全にサンドボックス化されたランタイムでは回避できます。ただし、サンドボックス化されていないコードでは、eval安全に使用するのが非常に困難です。

REPL

の輝かしい使用法の1つevalは、ソフトウェア開発に役立つツールであるREPLです。Google Chromeでは、を押すことでREPLを今Ctrl+Shift+Iすぐ起動できます。表示されるボックスにJavaScriptを入力し始めるだけです。FirefoxとSafariの両方にREPLもあります。

含めてみませんevalか?

このeval機能は通常、非常に複雑です。これを標準ライブラリに含めるということは、ライブラリまたはランタイムに、その言語の完全なコンパイラまたはインタプリタを含める必要があることを意味します。これは、大量のコードです。そのため、通常evalはインタプリタまたはJITされる言語で表示されます。Lisp、Python、およびJavaScriptランタイムには通常、完全なコンパイラがすでに含まれているためeval、余分な手荷物はありません。

for Cの実装evalは本物の獣であるため、オプションであり、ライブラリに押し込まれます。

于 2012-11-10T10:03:57.887 に答える