Скомпилированный интерпретируемый язык

Есть ли язык программирования с удобным интерактивным интерпретатором, даже если он может быть скомпилирован в машинный код?


person Community    schedule 06.07.2010    source источник
comment
Что вы имеете в виду под удобным интерактивным интерпретатором? Большинство интерпретируемых языков фактически переведены.   -  person staticsan    schedule 07.07.2010
comment
@staticsan под интерактивным интерпретатором, я имею в виду среду, подобную оболочке, в которой вы можете работать во время выполнения в интерактивном режиме. под машинным кодом я не имею в виду байт-код. (извините, если моя терминология не самая точная)   -  person mykhal    schedule 07.07.2010
comment
Вам нужен термин REPL (Read-Eval-Print-Loop).   -  person Artelius    schedule 07.07.2010
comment
Через Futamura интерпретаторы и компиляторы глубоко связаны и могут быть созданы друг из друга посредством частичной оценки. См. en.wikipedia.org/wiki/Partial_evaluation#Futamura_projection.   -  person Don Stewart    schedule 07.07.2010
comment
@ Дон: Я почему-то прочитал это как Футурама.   -  person Artelius    schedule 07.07.2010
comment
@Artelius, продолжением ANTLR будет BENDR ...   -  person Phil Perry    schedule 26.02.2014


Ответы (16)


Компиляция против «интерпретации» - это, по сути, вопрос реализации, а не самого языка. Например, MRI Ruby 1.8 интерпретируется, а MacRuby компилируется в собственный машинный код. Оба включают интерактивный REPL. Все известные мне языки, у которых есть хотя бы один компилятор машинного кода и хотя бы один REPL:

  • Рубин
  • Python
  • Почти все Лиспы (Лисп был языком, который первым изобрел эту технику, AFAIK)
  • OCaml
  • Haskell
  • Четвертый

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

  • Ява
  • Скала
  • Groovy
  • Erlang
  • C#
  • F#
  • Болтовня
person Community    schedule 06.07.2010
comment
Вот почему Smalltalk находится в списке языков, компилируемых с помощью байт-кода с REPL. - person Chuck; 07.07.2010

Haskell, используя Glasgow Haskell Compiler, который имеет интерактивную «оболочку» под названием GHCi.

person Community    schedule 06.07.2010
comment
На самом деле то же самое с QuickBasic, но он производит 16-битный машинный код, так что это примечание для исторического интереса. - person Artelius; 07.07.2010
comment
я не могу вспомнить интерактивную оболочку qbasic :) - person mykhal; 07.07.2010
comment
@mykhal: Это называется Немедленное окно. Но обратите внимание, что QBasic не может компилироваться (может только QuickBasic). - person Artelius; 07.07.2010
comment
Ну хорошо, разве Хаскелл не самый популярный парень сегодня в квадроцикле? :-) - person Owen S.; 07.07.2010

Многие разновидности Lisp предлагают оба варианта, включая Clojure.

person G__    schedule 06.07.2010
comment
Clojure компилируется в байт-код, а не в машинный код (если вы не учитываете джиттер в некоторых реализациях Java). Но верно для других языков. - person Chuck; 07.07.2010
comment
@Chuck Да, он не добавил комментарий, исключающий байт-код, когда я писал исходный ответ ... - person G__; 07.07.2010

На ум приходят два: ocaml и scala (~ = java), но я уверен, что их должно быть намного больше.

person Shautieh    schedule 06.07.2010
comment
Кстати: команда для компиляции ocaml в собственный код - ocamlopt (ocamlc будет компилироваться в байт-код). Что касается scala, я не уверен, может ли gcj скомпилировать свой java-совместимый байт-код или еще нет, поэтому, если у кого-то есть дополнительная информация ..? - person Shautieh; 07.07.2010

А вот еще один, который сожжет ваш дом:

x86 сборка

Ага, для этого тоже есть переводчики.

На данный момент вы действительно находитесь в стране эмулятора, но он соответствует заявленным вами требованиям.

Мне интересно, проще ли назвать скомпилированные языки, для которых кто-то не придумал рабочий интерпретатор. :-)

person Community    schedule 07.07.2010

Lua имеет интерактивный режим для однострочников и экспериментов. Обычно он компилируется в байт-код для своей виртуальной машины для выполнения. LuaJIT - это независимая реализация виртуальной машины Lua, которая также выполняет своевременную компиляцию в 32-разрядную версию x86. Поддержка 64-разрядной версии находится в стадии реализации, и поддержка ARM часто запрашивается.

Компиляция в байт-код часто является разумным компромиссом между чистым интерпретатором и чистым компилятором. ВМ можно настроить в соответствии с потребностями языка, а методы JIT могут анализировать код ВМ по мере его выполнения и концентрироваться на часто выполняемых путях кода и внутренних циклах.

person Community    schedule 07.07.2010

Как уже упоминалось, OCaml.

Если управляемый код (.NET CLI) достаточно близок к машинному коду, кандидатом также будет F #. Вероятно, существуют и другие языки .NET / Mono, которые также соответствуют этому требованию.

person Community    schedule 07.07.2010

Вы можете пожалеть, что спросили:

C и C ++.

Почему?

и, вероятно, есть и другие.

person Community    schedule 07.07.2010

Множество языков предлагают реализацию, которая и взаимодействует, и компилирует машинный код, но редко удается сделать и то, и другое одновременно. Стандартный ML Нью-Джерси - это тот, который имеет интерактивный цикл, но не имеет байт-кода: он просто компилируется в машинный код в память, а затем переходит к ней.

person Community    schedule 07.07.2010

Не совсем машинный код, но Java можно скомпилировать, а также использовать через BeanShell.

person Bill Karwin    schedule 06.07.2010
comment
В Symantec Java IDE (забыл свое название) раньше был компилятор Java. - person Vitor Py; 07.07.2010

Я использовал Ruby с интерпретатором, и, похоже, здесь.

person Charlie Salts    schedule 06.07.2010
comment
Я почти уверен, что на самом деле это просто инструмент, который связывает ваш рубиновый код с интерпретатором, на самом деле он не компилируется до машинного кода. Называть это компилятором неверно и вводить в заблуждение. - person Benson; 07.07.2010
comment
Я просто читаю сайт так, как его рекламируют. Тем не менее, хороший момент, поскольку большинство людей не заметят разницы, если не углубятся в детали реализации. - person Charlie Salts; 07.07.2010

Раньше у Icon был компилятор, но он то и дело выходит из строя. Это все еще может работать.

person staticsan    schedule 06.07.2010

Python можно скомпилировать в исполняемые файлы Windows.

person Pavel Strakhov    schedule 06.07.2010
comment
Как и в случае с RubyScript2Exe, инструмент, о котором вы говорите, на самом деле просто связывает код Python с интерпретатором Python. Это не компиляция; называть это компилятором - это неправильное употребление этого термина. Однако это невероятно полезно, поэтому с практической точки зрения это может не иметь значения. :-) - person Benson; 07.07.2010

C # можно скомпилировать с помощью SnippetCompiler, может быть, это подействует на вас как интерактивный интерпретатор?

person Community    schedule 06.07.2010

Ваш вопрос немного расплывчатый. Подойдет даже Java:

Под интерактивным интерпретатором я имею в виду среду, подобную оболочке, в которой вы можете работать во время выполнения в интерактивном режиме.

В Java есть это, например на «страницах альбома для вырезок» Eclipse, где вы можете ввести выражения Java и сразу же оценить их. Java, конечно, также является компилируемым языком (и хотя он обычно компилируется в байт-код, существуют различные компиляторы, которые выводят машинный код).

Так что ты ищешь? Может быть, вы могли бы объяснить свою проблему или интерес.

person Community    schedule 07.07.2010
comment
Я ожидаю большого количества ответов, в которых будут упоминаться языки, которые могут быть скомпилированы в исполняемый файл и имеют полноценный интерактивный интерпретатор. - person mykhal; 07.07.2010

Я немного пробовал использовать mono / .net и обнаружил, что случайные паузы сборки мусора неприятны (по крайней мере, на моем старом твердом ноутбуке). Я рассмотрел с помощью gambit-c реализацию схемы, которая может компилироваться на C, но с ней было трудно работать, потому что документация была несколько ограничена, а пакеты не очень просты в установке и использовании.

Обычно я просто придерживаюсь интерпретируемого языка, такого как python, привязанного к C / C ++, что более болезненно, но, по крайней мере, я знаю, что меня ждет.

person Community    schedule 07.07.2010