Является ли fsi.exe переводчиком? - PullRequest
3 голосов
/ 30 декабря 2011

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 30 декабря 2011

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

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

2 голосов
/ 01 января 2012

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

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

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

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

Или можно ли «интерпретировать» скомпилированные языки?

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

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

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

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

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

2 голосов
/ 31 декабря 2011

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

1 голос
/ 30 декабря 2011

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

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

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

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

1 голос
/ 30 декабря 2011

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

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

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

...