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