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