Скомпилированный интерпретированный язык - PullRequest
3 голосов
/ 07 июля 2010

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

Ответы [ 16 ]

14 голосов
/ 07 июля 2010

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

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

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

  • Java
  • Скала
  • Groovy
  • Erlang
  • C #
  • F #
  • Smalltalk
12 голосов
/ 07 июля 2010

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

5 голосов
/ 07 июля 2010

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

3 голосов
/ 07 июля 2010

А вот еще один способ сжечь ваш дом:

x86 Assembly

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

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

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

3 голосов
/ 07 июля 2010

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

2 голосов
/ 07 июля 2010

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

2 голосов
/ 07 июля 2010

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

C и C ++.

Почему?

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

2 голосов
/ 07 июля 2010

Как уже упоминали другие, OCaml.

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

2 голосов
/ 07 июля 2010

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

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

1 голос
/ 07 июля 2010

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

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

...