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

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

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

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

Вопросы:

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

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

Ответы [ 9 ]

31 голосов
/ 31 марта 2010

Полагаю, Лисп соответствует этому описанию.

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

6 голосов
/ 31 марта 2010

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

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

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

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

6 голосов
/ 31 марта 2010

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

4 голосов
/ 09 марта 2016

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

4 голосов
/ 31 марта 2010

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

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

3 голосов
/ 31 октября 2013

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

* Бессмысленная функциональная основанная на стеке

2 голосов
/ 31 марта 2010

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

1 голос
/ 31 марта 2010

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

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

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

  1. Запись на Python.

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

...