Существует ли скомпилированный * язык программирования с динамической, возможно даже слабой типизацией?


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

Представьте себе скомпилированный язык, где:

  • переменные не нужно объявлять
  • переменные могут быть созданы во время выполнения
  • функции могут возвращать значения различных типы

Вопросы:

  • существует ли такой язык программирования?
  • (Почему бы и нет?

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

9 34

9 ответов:

Я считаю, что Lisp подходит под это описание.

Http://en.wikipedia.org/wiki/Common_Lisp

Objective-C может иметь некоторые из свойств, которые вы ищете. Классы могут быть открыты и изменены во время выполнения, и вы можете отправить любое сообщение объекту, независимо от того, отвечает он на него или нет. Таким образом, вы можете реализовать duck typing, как и в Ruby. Тип id, грубо эквивалентный void*, может быть наделен интерфейсами, которые определяют контракт, к которому будет придерживаться (в противном случае неизвестный) тип.

C# 4.0 обладает многими, если не всеми из этих характеристик. Если вам действительно нужен машинный код, вы можетескомпилировать байт-код до машинного кода с помощью утилиты.

В частности, использование ключевого слова dynamic позволяет динамически связывать объекты и их члены во время выполнения.

Посмотрите видео Андерса Хейльсберга, будущее C#, для праймера:

Http://channel9.msdn.com/pdc2008/TL16/

Objective-C обладает многими из упомянутых вами функций: он компилируется в машинный код и эффективно динамически типизируется по отношению к экземплярам объектов. Тип id может хранить любой экземпляр класса, А Objective-C использует передачу сообщений вместо вызовов функций-членов. Методы могут быть созданы / добавлены во время выполнения. Среда выполнения Objective-C также может синтезировать переменные экземпляра класса во время выполнения, но локальные переменные все равно должны быть объявлены (как и в C).

C# 4.0 имеет много из них функции, за исключением того, что он компилируется в IL (байт-код) и интерпретируется с помощью виртуальной машины (CLR). Однако это поднимает интересный вопрос: если байт-код скомпилирован в машинный код точно во времени, это считается? Если так, то это открывает двери не только любой из .Net языках, но на языке Python (см. Он и Unladed проглотить и установить IronPython) и Ruby (см. MacRuby выступает и IronRuby) и многих других языках программирования с динамической типизацией, не говоря уже о многих Лисп варианты.

Да, это возможно. Смотрите Джулия. Это динамический язык (вы можете писать программы без типов), но он никогда не работает на виртуальной машине. Он компилирует программу в машинный код во время выполнения (JIT-компиляция).

Аналогично Lisp, существует Factor, конкатенативный* язык с без переменных по умолчанию, динамическая типизация и гибкая объектная система. Код фактора может быть запущен в интерактивном интерпретаторе или скомпилирован в собственный исполняемый файл с помощью его функции deploy.

* функциональный стек без точек

VB 6 имеет большую часть этого

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

  • D имеет вывод типов, сборку мусора и мощные средства метапрограммирования, но компилируется в эффективный машинный код. Однако он не имеет динамической типизации.
  • C# может быть скомпилирован непосредственно в машинный код через проект mono. C# имеет аналогичный набор функций для D, но опять же без динамической типизации.

Python to C, вероятно, нуждается в этих критериях.

  1. Пишите на Python.

  2. Скомпилируйте Python в исполняемый файл. Смотрите раздел процесс преобразования простого скрипта Python в исполняемый файл Windows. Также смотрите написание переводчика кода с Python на C?