Какие языки высшего уровня можно скомпилировать? - PullRequest
0 голосов
/ 22 июня 2010

Какие языки высшего уровня можно скомпилировать в исполняемые файлы? Когда я говорю «скомпилировано в исполняемый файл», я имею в виду не байт-код, а собственный код сборки, как в смысле C, C ++.

РЕДАКТИРОВАТЬ: Одна проблема, с которой я сталкиваюсь, заключается в том, что клиенты имеют доступ по ssh к моему серверу с ограниченным доступом. Им нужно запустить некоторые из моих скриптов, но я не хочу, чтобы они видели исходный код. Сценарий Python (или любой другой сценарий) не может быть выполнен без разрешения на чтение, в отличие от нативно скомпилированной программы, которая требует только прав на выполнение.

Ответы [ 4 ]

2 голосов
/ 22 июня 2010

Любой язык может потенциально быть скомпилированным. .net содержит генератор собственного кода (NGEN), который переводит байт-код в собственный код и потенциально может использоваться для создания собственных двоичных файлов. И действительно, любой язык, который компилируется в байт-код, может иметь такую ​​же возможность.

Это становится сложно, когда вы переходите на языки сценариев (Python, PHP, Perl и т. Д.). В таких случаях обычно проще связать скрипт с интерпретатором в один исполняемый файл. Но ничто не мешает кому-то писать PHP или Perl-компилятор, за исключением того, что функции eval обоих языков в значительной степени требуют возможности разбирать и выполнять текст - это означает, что в итоге вы получите интерпретатор, по крайней мере связанный с программой в любом случае.

Большой вопрос: «На каком уровне он перестает быть компилируемым?». На это я отвечу «когда вы запускаете код, который должен иметь возможность интерпретировать сам себя». IE: я бы не стал пытаться скомпилировать любой язык с оператором / функцией eval, если бы мне не разрешили удалить оператор / функцию.

1 голос
/ 08 июля 2010

Многие диалекты Lisp имеют компиляторы собственного кода, как это делают Haskell, OCaml и Standard ML.

1 голос
/ 22 июня 2010

Мой голос будет за Java + GCJ. Более подробную информацию о GCJ можно найти по адресу:

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

Может пропускать байт-код и компилироваться непосредственно в машинный код.

0 голосов
/ 22 июня 2010

Вы в замешательстве.Смысл языков программирования в том, что они могут выполняться автоматически, и в конечном итоге это всегда означает компиляцию в машинные инструкции.Поэтому по определению программы на любом языке в принципе могут быть превращены в исполняемые файлы.Некоторые на самом деле не предпринимают этого шага и довольствуются интерпретируемым байтовым кодом, но большинство языков имеют трансляторы для нативного кода (даже в Java, например, есть JIT-компиляторы, которые создают специфические для процессора коды операций вместо байтового кода).

Единственное отличие состоит в том, что для более высоких языков требуется немного больше инфраструктуры компилятора для включения в исполняемые файлы;ни один компилятор не может избавиться от механизма сборки мусора или информации о типах во время выполнения, иначе это не будет той же самой программой.Но язык компьютерного программирования, который не может быть автоматически переведен на что-либо работоспособное, был бы довольно бессмысленным.

Помимо намеренно дисфункциональных языков, таких как Malbolge или курс, где написание "Hello world" было многолетним усилием...

...