Участник:Alexsmail/Программирование 2020/новый черновик: различия между версиями
Содержимое удалено Содержимое добавлено
Alexsmail (обсуждение | вклад) дополнение |
Alexsmail (обсуждение | вклад) м →REPL: дополнение |
||
Строка 169:
=== REPL ===
REPL является сокращением от read-eval-print loop
▲REPL является сокращением от read-eval-print loop — цикл "чтение — вычисление — вывод". REPL является форма организации простой интерактивной среды программирования в рамках средств интерфейса командной строки (CLI). В такой среде пользователь может вводить выражения, которые среда тут же будет вычислять, а результат вычисления отображать пользователю. Названия элементов ''цикла'' обозначают:
• функция read() читает одно выражение и преобразует его в соответствующую структуру данных в памяти;
Строка 179 ⟶ 178 :
'''TODO:'''
Далее, мы должны скомпилировать этот код
'''Замечание''': Байткод является общим для всех языков, которые используют JVM таких как Java, Scala, Kotlin, Ceylon. Исторически, оно было изобретено для Java, однако другие языки
'''Замечание * (Advanced)''': Для Kotlin существует и другие способы компиляции/исполнение, такие как компиляция в JS (JavaScript) или Kotlin Native
'''Замечание * (Advanced)''': Когда вы пишите программу на C\C++ вы её пишите под конкретную операционную систему и конкретное железо (hardware). Компилятор преобразует вашу программу в ''инструкции'' для конкретного процессора. Обычно, если вы хотите, чтобы ваша программа работала с другим железом, вам надо её перекомпилировать. Более того, если вы хотите, к примеру, работать с файловой системой, ваш код на C\C++ будет ''другой'' в зависимости от операционной системе. Java Virtual Machine позволяет ''абстрагироваться'' от этого. К примеру, если вам надо обратится к файловой системе, вы не обращаетесь к ней напрямую. Ваша программа бежит в виртуальной машине, она помещена некоторую виртуальную среду. Она вам представляется стандартный способ работать с файлами,
Переходим в директорию с сохранённым файлом.
Строка 205:
где
kotlinc
HelloWorld'''.kt'''
-d
MyFirstProgam.jar
таким образом '-d MyFirstProgam.jar' обозначает сохранить результат компиляции в jar-е.
'''Замечание:''' Формат Jar основан формате Zip. Таким образом, для его распаковки можно использовать любую архиватор, который умеет работать Zip. Для создания архива, однако, я бы советовал использовать стандартную утилиту jar (см. ниже).
Строка 220:
где
kotlin
classpath
MyFirstProgam.jar
HelloWorld'''Kt'''
Ещё раз, kotlin
Для того, чтобы разобраться с этим, давайте откроем jar и посмотрим, что там есть. Я советую создать пустую директорию и скопировать туда наш jar-файл, прежде чем продолжить:
Строка 244:
где
jar
xvf
x - сокращение от eXtract - распаковать файлы;
v - сокращение от verbouse output - распечатать дополнительную инофрмацию на экран во время распаковки;
f - сокращение от file - указание jar-архива (используется почти всегда)
MyFirstProgam.jar
На экране (благодаря 'v') будет написано
<syntaxhighlight lang="cmd">
Строка 259:
</syntaxhighlight>
Итак, что мы видим? Наш исходный файл HelloWorld.'''kt''' скомилировался в HelloWorld'''Kt'''.class. Точную причину добавление постфикса '''Kt''' к имени откомпилированного файла мы рассмотрим в другом разделе, здесь же я скажу, так как ''main()'' была определена как top-level функция и никаких специальных
<syntaxhighlight lang="cmd">
Строка 271:
Итак, HelloWorldKt.class содержит наш весь исходный код (кроме top-level main function у нас ничего не было). Что же находится в других файлах в директории META-INF?
main.kotlin_module
MANIFEST.MF
Как я говорил, JVM умеет работать хоть с Kotlin, хоть с Java. Мы можем после компиляции запустить JVM другим (стандартным для неё) способом и тогда информация в этом файле будет использована для поиска точки входа в программу (файл main.kotlin_module будет просто проигнорирован в этом случае). Я не привожу этот способ, чтобы ещё больше не запутывать читателя.
Строка 285:
Первая строчка говорит о том, что формат манифест-файла 1.0.
Последнее поле самое интересное. Там написано, что искать функцию main() нужно в HelloWorldKt.class. О чём я и говорил выше.
|