ある言語とない言語の機能に違いはありませんeval
。eval
一部の言語(Lisp)では簡単で、他の言語(C)では難しいですが、それがない言語でいつでも自分自身を実装できます。これが、言語に新しい機能が追加されていないことを私たちが知っている理由です。
Evalは、一般的に「強力ですが、本番コードでは危険で不要」と見なされます。ソースコードをレビューして、それがeval
を使用している場合は、を使用しないように言われる人々に慣れる必要がありますeval
。通常、を使用する場合eval
、同じタスクを実行するためのより簡単で安全な方法があります。
セキュリティの脆弱性
このeval
機能は、Webアプリケーションなどのセキュリティの脆弱性につながることがよくあります。たとえば、Pythonでは次のようになります。
i = input('Enter a number> ')
input
3.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
は本物の獣であるため、オプションであり、ライブラリに押し込まれます。