2013-05-14 4 views
1

В чем разница между временем компиляции и временем выполнения в SML?Разница между временем компиляции и временем выполнения

После написания кода SML мы нажимаем enter. Но я не понимаю, действительно ли мы собираем или запускаем его? Например

- fun len [] = 0 | len (x::xs) = 1 + len xs;  /* hit enter*/ 
val len = fn : 'a list -> int 

после удара войти, мы получаем val len = fn : 'a list -> int как результат. Является ли это результатом выполнения или сложным результатом времени?

Я действительно не понимаю, что происходит за сценой.

ответ

1

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

Надеюсь, вы понимаете

3

В вашем примере вы, кажется, пользоваться услугами переводчика, то разница между время компиляции и время запуска может быть не столь очевидным. В принципе, это:

  • Вкомпилировать Время: Фаза, где исходный код компилируется в более команд низкого уровня (например, машинный код). На этом этапе также выполняются такие вещи, как проверки типа и синтаксиса. Все ошибки, которые гарантированно будут обнаружены на этом этапе (например, ошибки для стандартного ML) никогда не могут возникать во время времени выполнения, что очень приятно, поскольку вы знаете, что после успешной компиляции некоторые виды ошибок никогда не могут происходят. (время компиляции также при оптимизации компилятора будет применяться.)
  • Run Time: Это когда ваша программа выполняется (будь то в качестве машинного кода или некоторое другое представление): входы приведены в программа и результаты вычисляются.

Для вашего явного примера: Во время компиляции это проверяется только, что ваш вход синтаксически правильный и тип len выводится. Во время времени выполнения выполняется программа, представленная вашим входом, но поскольку в этой программе нет вычислений (она просто определяет новую функцию len, не называя ее), ничего не нужно делать.

0

Большинство реализаций ML имеют «инкрементный компилятор» как часть цикла чтения-eval-печати. Поэтому, когда вы вводите новое объявление верхнего уровня, оно сначала компилируется (включая статическую проверку типов и генерирование кода), а затем запускается исходный код.

Система, которая может компилироваться во время выполнения, может выглядеть странно для людей, которые используются для компиляции в режиме пакетного режима в виде C или C++. Даже Java более статична в этом отношении, чем необходимо, но цикл Scala read-eval-print демонстрирует, что это можно сделать не только в ML. Обратите внимание, что это может выглядеть как интерпретатор, но на самом деле является компилятором, производящим код во время выполнения.

Общая идея довольно старая, исходящая из древних LISP раз, но LISP не имел компилятора изначально и часто просто интерпретировался без компиляции.