Есть ли язык программирования с удобным интерактивным интерпретатором, даже если он может быть скомпилирован в машинный код?
Скомпилированный интерпретируемый язык
Ответы (16)
Компиляция против «интерпретации» - это, по сути, вопрос реализации, а не самого языка. Например, MRI Ruby 1.8 интерпретируется, а MacRuby компилируется в собственный машинный код. Оба включают интерактивный REPL. Все известные мне языки, у которых есть хотя бы один компилятор машинного кода и хотя бы один REPL:
- Рубин
- Python
- Почти все Лиспы (Лисп был языком, который первым изобрел эту технику, AFAIK)
- OCaml
- Haskell
- Четвертый
Если мы считаем компиляцию как байт-код, так и машинный код, это верно для подавляющего большинства популярных языков, компилирующих байт-код:
- Ява
- Скала
- Groovy
- Erlang
- C#
- F#
- Болтовня
Haskell, используя Glasgow Haskell Compiler, который имеет интерактивную «оболочку» под названием GHCi.
Многие разновидности Lisp предлагают оба варианта, включая Clojure.
На ум приходят два: ocaml и scala (~ = java), но я уверен, что их должно быть намного больше.
А вот еще один, который сожжет ваш дом:
x86 сборка
Ага, для этого тоже есть переводчики.
На данный момент вы действительно находитесь в стране эмулятора, но он соответствует заявленным вами требованиям.
Мне интересно, проще ли назвать скомпилированные языки, для которых кто-то не придумал рабочий интерпретатор. :-)
Lua имеет интерактивный режим для однострочников и экспериментов. Обычно он компилируется в байт-код для своей виртуальной машины для выполнения. LuaJIT - это независимая реализация виртуальной машины Lua, которая также выполняет своевременную компиляцию в 32-разрядную версию x86. Поддержка 64-разрядной версии находится в стадии реализации, и поддержка ARM часто запрашивается.
Компиляция в байт-код часто является разумным компромиссом между чистым интерпретатором и чистым компилятором. ВМ можно настроить в соответствии с потребностями языка, а методы JIT могут анализировать код ВМ по мере его выполнения и концентрироваться на часто выполняемых путях кода и внутренних циклах.
Как уже упоминалось, OCaml.
Если управляемый код (.NET CLI) достаточно близок к машинному коду, кандидатом также будет F #. Вероятно, существуют и другие языки .NET / Mono, которые также соответствуют этому требованию.
Множество языков предлагают реализацию, которая и взаимодействует, и компилирует машинный код, но редко удается сделать и то, и другое одновременно. Стандартный ML Нью-Джерси - это тот, который имеет интерактивный цикл, но не имеет байт-кода: он просто компилируется в машинный код в память, а затем переходит к ней.
Не совсем машинный код, но Java можно скомпилировать, а также использовать через BeanShell.
Я использовал Ruby с интерпретатором, и, похоже, здесь.
Раньше у Icon был компилятор, но он то и дело выходит из строя. Это все еще может работать.
Python можно скомпилировать в исполняемые файлы Windows.
C # можно скомпилировать с помощью SnippetCompiler, может быть, это подействует на вас как интерактивный интерпретатор?
Ваш вопрос немного расплывчатый. Подойдет даже Java:
Под интерактивным интерпретатором я имею в виду среду, подобную оболочке, в которой вы можете работать во время выполнения в интерактивном режиме.
В Java есть это, например на «страницах альбома для вырезок» Eclipse, где вы можете ввести выражения Java и сразу же оценить их. Java, конечно, также является компилируемым языком (и хотя он обычно компилируется в байт-код, существуют различные компиляторы, которые выводят машинный код).
Так что ты ищешь? Может быть, вы могли бы объяснить свою проблему или интерес.
Я немного пробовал использовать mono / .net и обнаружил, что случайные паузы сборки мусора неприятны (по крайней мере, на моем старом твердом ноутбуке). Я рассмотрел с помощью gambit-c реализацию схемы, которая может компилироваться на C, но с ней было трудно работать, потому что документация была несколько ограничена, а пакеты не очень просты в установке и использовании.
Обычно я просто придерживаюсь интерпретируемого языка, такого как python, привязанного к C / C ++, что более болезненно, но, по крайней мере, я знаю, что меня ждет.