「解釈された」言語と「コンパイルされた」言語の境界線は、最近では非常にあいまいです。たとえば、Python がソース コードを認識したときに最初に行うことは、Java がクラス ファイルをコンパイルするときに行うことと本質的に同じで、ソース コードをバイトコード表現にコンパイルすることです。これは *.pyc ファイルに含まれるものです。次に、Python ランタイムは元のソースを参照せずにバイトコードを実行します。従来、純粋に解釈された言語は、プログラムの実行時にソース コードを継続的に参照していました。
言語を構築するときは、より高いレベルの機能を実装できる強固な基盤を構築することをお勧めします。堅牢で高速な文字列処理システムがあれば、言語設計者は基本ランタイムの外側で stripslashes() のようなものを実装できます (実装する必要があります)。これは、少なくともいくつかの理由で行われます。
- 言語設計者は、言語がその種のタスクを処理するのに十分柔軟であることを示すことができます。
- 言語設計者は実際にその言語で実際のコードを作成します。これにはテストがあり、したがって基盤がしっかりしていることを示しています。
- 他の人は、言語コアを構築したり理解したりする必要なく、より高いレベルの機能をより簡単に読んだり、借りたり、変更したりすることができます。
Python のような言語がバイトコードにコンパイルされて実行されるからといって、それが遅いというわけではありません。パフォーマンスをさらに向上させるために、Java や .NET が既に行っていることに従って、Python 用の Just-In-Time (JIT) コンパイラを作成できない理由はありません。実際、IronPython は Python を .NET バイトコードに直接コンパイルし、JIT を含む .NET システムを使用して実行します。
あなたの質問に直接答えるために、言語設計者がランタイムの背後にある言語 (たとえば、Python の場合は C) で関数を実装するのは、その関数のパフォーマンスを最大化するときだけです。これが、正規表現パーサーなどのモジュールがネイティブの Python ではなく C で記述されている理由です。一方、getopt.py のようなモジュールはすべて純粋な Python で実装され、対応する C ライブラリを使用するメリットがないためです。