Существует ли скомпилированный * язык программирования с динамической, возможно даже слабой типизацией?
Я задался вопросом, существует ли язык программирования, который компилируется в машинный код / двоичный (не байт-код, который затем выполняется виртуальной машиной, это что-то совершенно другое, когда речь идет о типизации), который имеет динамический и / или слабый тип, например:
Представьте себе скомпилированный язык, где:
- переменные не нужно объявлять
- переменные могут быть созданы во время выполнения
- функции могут возвращать значения различных типы
Вопросы:
- существует ли такой язык программирования?
- (Почему бы и нет?
Я думаю, что динамический, но сильный типизированный, компилируемый язык действительно имел бы смысл, но возможно ли это?
9 ответов:
Objective-C может иметь некоторые из свойств, которые вы ищете. Классы могут быть открыты и изменены во время выполнения, и вы можете отправить любое сообщение объекту, независимо от того, отвечает он на него или нет. Таким образом, вы можете реализовать duck typing, как и в Ruby. Тип
id
, грубо эквивалентныйvoid*
, может быть наделен интерфейсами, которые определяют контракт, к которому будет придерживаться (в противном случае неизвестный) тип.
C# 4.0 обладает многими, если не всеми из этих характеристик. Если вам действительно нужен машинный код, вы можетескомпилировать байт-код до машинного кода с помощью утилиты.
В частности, использование ключевого словаdynamic
позволяет динамически связывать объекты и их члены во время выполнения.Посмотрите видео Андерса Хейльсберга, будущее C#, для праймера:
Objective-C обладает многими из упомянутых вами функций: он компилируется в машинный код и эффективно динамически типизируется по отношению к экземплярам объектов. Тип
id
может хранить любой экземпляр класса, А Objective-C использует передачу сообщений вместо вызовов функций-членов. Методы могут быть созданы / добавлены во время выполнения. Среда выполнения Objective-C также может синтезировать переменные экземпляра класса во время выполнения, но локальные переменные все равно должны быть объявлены (как и в C).C# 4.0 имеет много из них функции, за исключением того, что он компилируется в IL (байт-код) и интерпретируется с помощью виртуальной машины (CLR). Однако это поднимает интересный вопрос: если байт-код скомпилирован в машинный код точно во времени, это считается? Если так, то это открывает двери не только любой из .Net языках, но на языке Python (см. Он и Unladed проглотить и установить IronPython) и Ruby (см. MacRuby выступает и IronRuby) и многих других языках программирования с динамической типизацией, не говоря уже о многих Лисп варианты.
Да, это возможно. Смотрите Джулия. Это динамический язык (вы можете писать программы без типов), но он никогда не работает на виртуальной машине. Он компилирует программу в машинный код во время выполнения (JIT-компиляция).
Аналогично Lisp, существует Factor, конкатенативный* язык с без переменных по умолчанию, динамическая типизация и гибкая объектная система. Код фактора может быть запущен в интерактивном интерпретаторе или скомпилирован в собственный исполняемый файл с помощью его функции
deploy
.* функциональный стек без точек
Я не знаю ни одного языка, который обладал бы именно такими возможностями. Я могу думать о двух, которые имеют значительное подмножество, хотя:
- D имеет вывод типов, сборку мусора и мощные средства метапрограммирования, но компилируется в эффективный машинный код. Однако он не имеет динамической типизации.
- C# может быть скомпилирован непосредственно в машинный код через проект mono. C# имеет аналогичный набор функций для D, но опять же без динамической типизации.
Python to C, вероятно, нуждается в этих критериях.
Пишите на Python.
Скомпилируйте Python в исполняемый файл. Смотрите раздел процесс преобразования простого скрипта Python в исполняемый файл Windows. Также смотрите написание переводчика кода с Python на C?