Подтвердить что ты не робот

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

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

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

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

Вопросы:

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

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

4b9b3361

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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