LUA — ZeroBrane IDE: функция компиляции

#lua #compilation #zerobrane

#lua #Сборник #zerobrane

Вопрос:

в ZeroBrane Studio, если я использую «Project — complile (F7)» — что именно произойдет?
Будет ли создан автономный .exe из моего кода Lua?
И если да, то в каком каталоге? Я использую Windows 10. (Не удалось найти никакой информации в документации)

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

1. Если вы выполните поиск по каждому подкаталогу проекта в проводнике, что вы найдете? Чем отличается «чистый» проект от того, который вы создали (используя «Project — compile»)?

2. Я не уверен, есть ли у меня подкаталоги проекта…. у меня есть отдельный файл LUA: … ZeroBraneStudio myprogramstest1.lua, и если я скомпилирую его, он скажет: Компиляция прошла успешно; вероятность успеха 100% (1/1). Итак, компиляция прошла успешно, но где результат?

Ответ №1:

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

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

https://github.com/pkulchenko/ZeroBraneStudio/blob/5daf55d79449431ca9794f6b8a65476dc203b780/src/editor

 function CompileProgram(editor, params)
  local params = {
    jumponerror = (params or {}).jumponerror ~= false,
    reportstats = (params or {}).reportstats ~= false,
    keepoutput = (params or {}).keepoutput,
  }
  local doc = ide:GetDocument(editor)
  local filePath = doc:GetFilePath() or doc:GetFileName()
  local loadstring = loadstring or load
  local func, err = loadstring(StripShebang(editor:GetTextDyn()), '@'..filePath)
  local line = not func and tonumber(err:match(":(%d )%s*:")) or nil

  if not params.keepoutput then ClearOutput() end

  compileTotal = compileTotal   1
  if func then
    compileOk = compileOk   1
    if params.reportstats then
      ide:Print(TR("Compilation successful; %.0f%% success rate (%d/%d).")
        :format(compileOk/compileTotal*100, compileOk, compileTotal))
    end
  else
    ide:GetOutput():Activate()
    ide:Print(TR("Compilation error").." "..TR("on line %d"):format(line)..":")
    ide:Print((err:gsub("n$", "")))
    -- check for escapes invalid in LuaJIT/Lua 5.2 that are allowed in Lua 5.1
    if err:find('invalid escape sequence') then
      local s = editor:GetLineDyn(line-1)
      local cleaned = s
        :gsub('\[abfnrtv\"']', '  ')
        :gsub('(\x[0-9a-fA-F][0-9a-fA-F])', function(s) return string.rep(' ', #s) end)
        :gsub('(\%d%d?%d?)', function(s) return string.rep(' ', #s) end)
        :gsub('(\z%s*)', function(s) return string.rep(' ', #s) end)
      local invalid = cleaned:find("\")
      if invalid then
        ide:Print(TR("Consider removing backslash from escape sequence '%s'.")
          :format(s:sub(invalid,invalid 1)))
      end
    end
    if line and params.jumponerror and line-1 ~= editor:GetCurrentLine() then
      editor:GotoLine(line-1)
    end
  end

  return func ~= nil -- return true if it compiled ok
end
  

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

1. Это правильно; компиляция просто подтверждает, что она проходит проверку синтаксиса с помощью того же интерпретатора Lua, что и тот, на котором запущена сама IDE (Lua 5.1-совместима с несколькими расширениями для Lua 5.2). Существует запрос, предлагающий запустить внешние компиляторы luac (зависящие от версии), но он еще не реализован.