Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Какие языки программирования компилируются в исполняемый файл?

#компиляция #любой_язык


А именно чтобы эти языки были для Windows (exe) и Linux (elf).
Плюс чтобы была работа с базовыми функциями (Сокеты, cmd(Windows), ...)
Кроме c++
    


Ответы

Ответ 1



Компиляция или интерпретация — не свойство самого языка. К практически любому языку можно построить компилятор, генерирующий нативный для данной операционки файл. Исключение составляют, пожалуй, лишь языки, в которых исходный текст ссылается на себя во время выполнения (например, если язык содержит goto на номер строки, вычисляемой во время выполнения — и то в этом случае можно построить таблицу переходов). Другое дело, что для поддержки сложных фич (dynamic в C#, eval) вам может понадобиться доступность компилятора в системе во время выполнения. Большой список можно посмотреть, например, тут. (Не все они поддерживают, например, работу с сокетами без внешних библиотек. Ну так C++ тоже работает с ними лишь через библиотеки операционной системы.)

Ответ 2



Технически, требование одного исполняемого файла очень слабое и под него подходит целая куча языков. Вы не наложили никаких ограничений на то, что в этот исполняемый файл будет входить. А туда можно засандалить столько, что запустить можно будет программу на любом языке. К тому же, надо разделять язык от реализации языка. Для любого языка можно, теоретически, сделать реализацию, подходящую для любой из групп ниже. Разделение между группами, кстати, довольно размытое. Увидите. Я перечислю несколько ярких примеров. Хорошие случаи Языки, которые изначально разрабатывались для компиляции в нативный код. Исходный код в результате обработки типичным тулчейном языка превращается в исполняемый файл, хотя, для любых нетривиальных задач, с зависимостями от ОС и/или динамической линковки с чем-нибудь. С: "почти С++" (на самом деле нет), но всё-таки другой язык. Подходит по очевидным причинам. Rust: достаточно новый язык в одной нише с С, в семантику и компилятор которого встроен хороший кусок статического анализа на предмет ошибок, которые в большинстве языков себя проявят только во время работы программы. Haskell: радикально отличающийся от вышеперечисленных язык с упором в функциональный стиль. Монады, вывод типов, иммутабельность "и много других страшных слов". Необычные случаи Языки, у которых существенная часть бинарника не относится к скомпилированному коду, а служит исключительно поддержкой для языка. Но это, как ни крути, часть бинарника! Go: то, что программы на нём компилируются в одиночные бинарники (и крупные!), часто подаётся, как одна из основных особенностей. Может сбить с толку то, что он использует сборщик мусора, но этот сборщик вкомпиливается в исполняемый файл, так что технически... подходит. Haxe: исходный код на этом языке можно скомпилировать в целый ряд языков (это основная особенность) и запустить родным для каждого из них способом. В контексте вопроса из этого ряда интересует только C++, для него этот способ: сборка в один исполняемый файл. Тут та же история, сборщик мусора вкомпилирован в исполняемый файл и не требует рантайма. Crystal: язык, во многом основанный на семантике и синтаксисе Ruby, но претерпевший ряд модификаций с целью поддержать статическую типизацию (вывод типов всё-таки не всегда спасает) и компилируемость вообще. Тоже со сборщиком мусора, который тоже вкомпиливается в бинарник. Scheme (Gambit): транспилятор Scheme (это лисп такой) в C с набором поддерживающих функций. Тяжёлые случаи Языки, код на которых в бинарнике представлен не нативным кодом и выполняется на рантайме, который, технически, может размещаться в том же исполняемом файле. Lua: наверное, первый по популярности встраиваемый язык. Есть даже LuaJIT, который уже во время выполнения делает из Lua нативный код. Ruby: у него много реализаций, но mruby приспособлен для встраивания. Чтобы минимизировать требования к платформе, сделана возможность его разделить на компилятор в байт-код и исполнитель байт-кода. Python: можно запаковать интерпретатор вместе с кодом программы (PyInstaller'ом, например). Фактически получается, что код исполняемого файла не содержит пользовательского кода, а распаковывает его и запускает.

Ответ 3



В современности, если выкинуть всякую эзотерику, вроде компиляции питона в бинарник при помощи швабры и такой-то матери, остаются: С++ С Pascal Fortran (на кластерах он еще жив). Дальше - выжимка из ответов на комментарии, читать исключительно ради лулзов: Также имеются два популярных языка - хипстерский Go, у которого на эмблеме странное животное, страдающее протрузией верхих резцов и экзофтальмом (пучеглазостью). Таскает за собой огромный рантайм, и требует плясок для взаимодействия с GUI. Но компилируется, и иногда даже работает. И C#. Это корпоративный монстр, который не работает без своего любимого рантайма, не работает, если у вас не та версия рантайма, и иногда работает, если все звезды сошлись и память не кончилась раньше. Ну, есть еще какой-то там Rust, но пока что на рынке недостаточно зануд, желающих делать на нем не-helloworldы. А ассемблер. Ассемблер - не компилируется, ассемблер - ассемблируется. Компиляция, это что - это сборка из готовых кусков. А в ассемблере нету готовых кусков, там однозначное соответствие - инструкция - опкод.

Комментариев нет:

Отправить комментарий