2009-07-31 2 views
0

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

EDIT Я не говорю о сборке мусора. Мне просто было интересно узнать о языках, которые автоматически сохраняли бы память free(), и до сих пор компилируются до машинного кода.

+7

«Управляемый»! = «Сбор мусора» –

+3

«Управляемый» == «Продано Microsoft», правильно? –

+0

Javascript компилируется в собственный код. Объясните, чего вы на самом деле пытаетесь достичь. – jrockway

ответ

8

Вы, кажется, запутываете «управляемые» и «сбор мусора», в то время как часто управляемые языки (например, C# и Java) имеют автоматическую сборку мусора, «управляемый» на самом деле ссылается на то, что существует «виртуальная машина», который выполняет ваш код (см. http://en.wikipedia.org/wiki/Managed_code).

Так, например, CLR (среда общего исполнения) - это виртуальная машина, исполняющая код .Net, а виртуальная машина Java (виртуальная машина Java) - это виртуальная машина, исполняющая Java-код.

Вы можете на самом деле есть сбор мусора для неуправляемых языков (например C++), и наоборот умудрились языки без сборки мусора (EDIT: Я завожусь, но я не могу показаться, чтобы найти какой-либо, если Objective C подсчетов, Я не уверен, что имеет смысл создать управляемый язык без сбора мусора в любом случае)

Оба Java и C# могут быть скомпилированы непосредственно в машинный код, поэтому они выполняются напрямую и не используются виртуальная машина - для .Net кода это делается с использованием NGEN (на самом деле CLR компилирует сборки .Net в машинный код при его выполнении, так называемую компиляцию «Just in time»)

EDIT: В качестве обновления к обновлению вашего вопроса на самом деле существует ряд альтернатив сбору мусора в спектре между экстремально полным ручным управлением памятью и сборкой мусора и множеством языков, которые скомпилированы для машинный код включает в себя различные формы управления памятью, которые не требуют от вас явно освобождать память.

Могу ли я спросить - это вопрос «из интереса», или вы пытаетесь выбрать язык для проекта? Если последнее, то почему вы так заинтересованы в том, чтобы ваш langauge скомпилировался до машинного кода? Разумеется, в случае с .Net, когда ваш код JIT скомпилирован, имеет ряд преимуществ в производительности (в большинстве случаев), также NGENing ваш код не удаляет зависимость от .Net framework.

+1

Я бы рассмотрел «управляемый» любой язык, на котором есть значительный код, который работает вокруг вашего кода, проверяя любые нарушения доступа, обвисший указатель, границы массива и т. Д., Обычно выполняемые с помощью VM, но компиляция охранников по-прежнему будет соответствовать. – Javier

+0

Вы не можете иметь сборку мусора на C++ любым разумным способом. По словам Страуструпа, «язык враждебен по отношению к ГК» – EFraim

+1

Я бы согласился с этим, все-таки «Управляемый» является своего рода субъективным термином. Ваше определение включает языки сценариев, и если бы я согласился с тем, что я никогда не слышал, чтобы люди ссылались на JavaScript как «управляемый» до :-) – Justin

4

Конечно, есть. Java, например. (gcj)

Однако сам термин «управляемый» подразумевает, что вы должны нести какое-то время.

+1

Java-виртуальные машины также используют то, что они называют JIT, что означает, что код компилируется по мере его выполнения и, таким образом, быстрее запускается при вызове. Но это, вероятно, не то, что хочет Лука. – Stroboskop

+0

@Stroboskop: gcj может скомпилировать исполняемый файл без JIT. – Zifre

8

лоты:

LISP (и варианты), Erlang, C# (под Mono), Haskell, Java (с GCJ)

1

Аналого ответ Efraims, любой программы .NET будет компилировать в машинный код, как хорошо, обычно в 2 этапа (JIT), но есть инструмент NGEN для предварительной компиляции MSIL в native.

3

Несколько более, в более широком смысле «удалось» означает безопасный (с помощью проверки типов во время выполнения или исчерпывающего статического анализа) и/или сборки мусора:

  • OCaml
  • D
  • Ада
  • Пролог
  • Чистый
  • Eiffel
1

Существует выбор полу-GC: GLIB.

Gilb использовать счетчик ссылок для управления продолжительностью жизни объекта. Когда число refrence встречается с 0, объект очищается.

Это гораздо более неудобно, чем .NET или Java или Python, но когда вам нужно использовать C, это лучше, чем ничего.