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

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

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

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

Вопросы:

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

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

36
задан goji 31 October 2013 в 04:41
поделиться

7 ответов

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

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

32
ответ дан 27 November 2019 в 05:58
поделиться

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

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

Посмотрите видео Андерса Хейлсберга, The Future of C #, для учебника:

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

6
ответ дан 27 November 2019 в 05:58
поделиться

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

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

4
ответ дан 27 November 2019 в 05:58
поделиться

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

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

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

2
ответ дан 27 November 2019 в 05:58
поделиться

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

6
ответ дан 27 November 2019 в 05:58
поделиться

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

  1. Писать на Python.

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

0
ответ дан 27 November 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: