Является ли fsi.exe переводчиком?

Я читал, что fsi.exe (F# Interactive) не является истинным "интерпретатором" в строгом смысле, потому что он на лету компилирует код F# и отображает его вывод.

У меня сложилось впечатление, что слово "интерпретатор" относится к "динамическим" языкам (например, JavaScript) и, следовательно, не относится к F#, поскольку это скомпилированный язык.

Это справедливая оценка? Или скомпилированные языки могут быть "интерпретированы"? Или это просто проблема семантики?

Ценю любую помощь.

5 ответов

Решение

Разница между компиляцией и интерпретацией размыта. Многие языки, воспринимаемые как "интерпретируемые", на самом деле часто компилируются в нативный код (например, JavaScript с v8). Некоторые реализации наиболее динамичной функции динамических языков, eval, являются просто обертками вокруг компиляции (например, в SBCL).

И, конечно, REPL не имеет ничего общего с компиляцией или интерпретацией, REPL может быть построен поверх любой модели исполнения. fsi это просто REPL, и он использует то же ядро ​​компилятора F#, что и fsc,

У меня сложилось впечатление, что слово "интерпретатор" относится к "динамическим" языкам (например, JavaScript) и, следовательно, не относится к F#, поскольку это скомпилированный язык.

Это справедливая оценка?

Нет. Слово "переводчик" относится к способу выполнения программы. Если исходная программа выполняется путем запуска ее через независимую программу, называемую "интерпретатор", которая выполняет ее путем интерпретации значения каждой инструкции в исходной программе, то она интерпретируется.

Термин "динамический язык программирования", по-видимому, не имеет формального определения и просто неофициально часто используется для обозначения либо языка с динамической типизацией (то есть языка, в котором отсутствует система статических типов и, следовательно, откладывает все проверки типов во время выполнения). или язык программирования, реализованный таким образом, что он способен к подвигам во время выполнения, таким как макросы, отражение, REPL и так далее. Это не имеет никакого отношения к тому, интерпретируются ли программы или скомпилированы. Например, Common Lisp рассматривается как динамический язык, а OCaml рассматривается как статический язык (хотя он имеет как макросы, так и REPL), но для Common Lisp и OCaml доступны как интерпретаторы, так и компиляторы.

Или скомпилированные языки могут быть "интерпретированы"?

Опять же, термин "скомпилированный язык" является плохо определенным. Любой язык может быть интерпретирован или скомпилирован. Формально любой исполняемый язык можно интерпретировать, а любой интерпретатор можно превратить в компилятор, частично специализировав его на исходной программе.

Обратите внимание, что в некоторых реализациях языка программирования одновременно используются как компиляция, так и интерпретация, чтобы получить лучшее из обоих миров. Например, OCaml может компилировать программы в байт-код, используя компилятор, написанный на OCaml, и этот байт-код интерпретируется интерпретатором, написанным на C. Это имеет несколько преимуществ:

  • Гораздо быстрее, чем обычный переводчик.
  • Гораздо проще, чем встроенный компилятор кода, предназначенный для машинного кода, такого как x86.
  • Этап компиляции может выполнять оптимизацию (например, семантику большого шага), от которой интерпретатор может выиграть, даже не увидев.
  • Простота делает возможным писать интерпретатор на C, что еще больше повышает производительность.

Или это просто проблема семантики?

Терминология.

Если не принимать во внимание логические аргументы, код, выполняемый FSI, выполняется без заметного снижения производительности по сравнению с кодом, скомпилированным FSC для исполняемого файла. В этом отношении F# выгодно отличается от OCaml - см. Комментарий Харропа об уровне OCaml.

Когда вы говорите, что JavaScript является "динамическим", вы обычно имеете в виду "динамически типизированный", который не имеет ничего общего с тем фактом, что он обычно реализуется как интерпретируемый язык и не компилируется. Противоположностью "динамически типизированного" является "статически типизированный". Обратите внимание, что это свойство отличается от того, которое описывается как "слабо типизированный" и "строго типизированный". Оба свойства не имеют ничего общего с интерпретаторами по сравнению с компиляторами, за исключением тенденции к языкам сценариев, которые почти всегда интерпретируются, для динамической типизации.

Компилятор, очевидно (ну, на самом деле, вопрос именно о компиляторе, который действует как интерпретатор, но давайте рассмотрим это ради аргумента), а не интерпретатор, так что если вы скомпилируете некоторый исходный код в объектный файл и выполнить его, вы думаете, что это, очевидно, не интерпретируется. Но, как оказалось, это не очень четко определенная линия. Если вы считаете, что эмуляторы являются интерпретаторами, то вы можете интерпретировать любой исполняемый файл независимо от того, на каком языке он начинался. Есть также бинарные трансляции и JIT-компиляторы с их байт-кодом, которые запутывают и без того запутанную проблему. Но обратите внимание, что путаница здесь полностью семантическая, решение, вероятно, является просто обновленным набором определений.

И наоборот, вы можете "скомпилировать" любой интерпретируемый язык, записав, какие инструкции выполняет интерпретатор при интерпретации программы и воспроизведя ее как скомпилированную программу. Это не совсем компиляция, и она не будет более эффективной, чем интерпретатор, но дело в том, что интерпретация не является неотъемлемым качеством языка.

Итак, традиционно компилируемые языки могут и иногда реализуются как интерпретируемые языки. Есть даже переводчики для Си. Я считаю, что это отвечает на ваш вопрос. Я думаю, что смысл F# заключается в том, что, хотя он и интерактивный, он не является настоящим интерпретатором в соответствии с самым строгим определением. Это потому, что он компилирует биты кода и затем запускает их. Это не означает, что строгий интерпретатор для F# не мог быть написан из-за некоторого свойства языка.

Глядя на статьюпереводчика Википедии, мы находим:

Интерпретатор может быть программой, которая... переводит исходный код в некое эффективное промежуточное представление (код) и немедленно выполняет его.

... что относится к FSI.

Другие вопросы по тегам