Использование в качестве примера, где Lua соответствует намного лучше, чем [закрытый] C/C++

FWIW: У меня была эта проблема, и оказалось, что я пытался запустить симулятор не в той ОС.

Я пытался использовать iOS8.x, а UITesting работает только в iOS9 +.

Переключите версию симулятора, и появится кнопка записи.

14
задан navigaid 13 February 2017 в 12:18
поделиться

7 ответов

Языки сценариев сокращают усилия, необходимые для создания сложных графических интерфейсов, которые в противном случае требуют большого количества склейки инфраструктуры и повторения кода. Несколько наборов инструментов GUI доступны с привязками Lua, в том числе wxWidgets и набор инструментов IUP .

В обеих этих привязках значения функций первого класса и полное закрытие упрощают кодирование обратных вызовов событий и проста в использовании.

Большое приложение, использующее Lua в своем ядре (например, Adobe Photoshop Lightroom), имеет внешнюю программу C / C ++, в которой размещается интерпретатор Lua и обеспечивает доступ к его основным функциям путем регистрации функций C в этом интерпретаторе. Обычно он реализует основные функции, требующие интенсивных вычислений, в функциях C, но оставляет общий поток, работу и даже структуру графического интерфейса для сценариев Lua.

  • Небольшой, но достаточно мощный API C.
  • Хорошая документация , с открытым исходным кодом в качестве резервного.
  • Хорошая поддержка пользователей через список рассылки и ] wiki .
  • Мощные модули, такие как парсер PEG , доступны от авторов и сообщества .
  • Один из моих любимых примеров - это тест jig я создал для встроенной системы, которая требовала около 1000 строк Lua и 1000 строк C, работала под lua.exe и использовала IUP для представления полного графического интерфейса Windows. Первая версия была запущена примерно через сутки. В C ++ с MFC это потребовало бы как минимум недели работы и многих тысяч строк кода.

  • Хорошая поддержка пользователей через список рассылки и вики .
  • Мощные модули, такие как парсер PEG , доступные от авторов и community .
  • Один из моих любимых примеров - это тестовый стенд, который я построил для встроенной системы, которая требовала около 1000 строк Lua и 1000 строк C, работала под lua.exe и использовала IUP чтобы представить полный графический интерфейс Windows. Первая версия была запущена примерно через сутки. В C ++ с MFC это потребовало бы как минимум недели работы и многих тысяч строк кода.

  • Хорошая поддержка пользователей через список рассылки и вики .
  • Мощные модули, такие как парсер PEG , доступные от авторов и community .
  • Один из моих любимых примеров - это тестовый стенд, который я построил для встроенной системы, которая требовала около 1000 строк Lua и 1000 строк C, работала под lua.exe и использовала IUP чтобы представить полный графический интерфейс Windows. Первая версия была запущена примерно через сутки. В C ++ с MFC это потребовало бы как минимум недели работы и многих тысяч строк кода.

    Один из моих любимых примеров - это тестовый стенд, который я построил для встраиваемой системы, которая требовала около 1000 строк Lua и 1000 строк C, работала под lua.exe и использовала IUP для представления полного графического интерфейса Windows. Первая версия была запущена примерно через сутки. В C ++ с MFC это потребовало бы как минимум недели работы и многих тысяч строк кода.

    Один из моих любимых примеров - это тестовый стенд, который я построил для встраиваемой системы, которая требовала около 1000 строк Lua и 1000 строк C, работала под lua.exe и использовала IUP для представления полного графического интерфейса Windows. Первая версия была запущена примерно через сутки. В C ++ с MFC это потребовало бы как минимум недели работы и многих тысяч строк кода.

    4
    ответ дан 1 December 2019 в 09:33
    поделиться

    Попробуйте реализовать таблицу Lua на C / C ++, вы сразу увидите силу Lua.

    В Lua:

    a["index"] = "value"
    

    В C начните с чтения о связанном списке ...

    C ++ STL может помочь, но он будет намного более подробным, чем Lua.

    Также Lua отлично подходит для использования. Это так просто (IMHO) взаимодействовать с C.

    3
    ответ дан 1 December 2019 в 09:33
    поделиться

    Не знаю, заставлю ли я "щелкнуть" для вас, но я попробую.

    Одно из преимуществ встраивания Lua в том, что вы можете не только использовать его как конфигурационный файл, но на самом деле предлагает ваши C / C ++ - интерфейсы для lua и 'script' их использование через язык сценариев Lua.

    Если вы хотите изменить поведение / логику своего приложения, вам просто нужно изменить код в Lua-скрипт без необходимости перекомпилировать все приложение.

    Основные области применения - игровые логики, такие как ИИ или конечные автоматы, где для разработки игры важно быстрое время перехода от изменения к игре.

    Конечно, тогда основная логика должна присутствовать в Lua-скрипте, а не в C / C ++ - коде, чтобы его можно было эффективно использовать.

    3
    ответ дан 1 December 2019 в 09:33
    поделиться

    Программирование только на C может быть очень утомительной и избыточной задачей, это определенно применимо по сравнению с более абстрактными языками высокого уровня.

    В этом смысле вы можете начать и закончить работу намного быстрее, чем делать все непосредственно в C, потому что многие вещи, которые необходимо настроить, выполнить и очистить явно и вручную в C, часто неявно и автоматически обрабатывается языком сценариев, таким как Lua (например, представьте себе управление памятью).

    Точно так же гораздо больше абстрактных структур данных и алгоритмов часто напрямую предоставляются такими языками высокого уровня, поэтому вам не нужно заново изобретать колесо и заново реализовывать его, если все, что вам нужно, это стандартный контейнер (подумайте связанный список, дерево, карта и т. д.)

    Итак,

    2
    ответ дан 1 December 2019 в 09:33
    поделиться

    В качестве примера того, где Lua подходит лучше, чем C ++, посмотрите на распространение скриптов. Mush Client предлагает Lua в качестве языка сценариев. Как показано по ссылке выше, вы можете многое сделать с Lua для расширения программы. В отличие от C ++, Lua не нужно компилировать и его можно ограничить. Например, вы можете изолировать Lua, чтобы он не мог получить доступ к файловой системе. Это означает, что если вы получите сценарий от кого-то еще, он не сможет уничтожить ваши данные, поскольку не может записывать на диск.

    1
    ответ дан 1 December 2019 в 09:33
    поделиться

    Использование языка сценариев, такого как Lua, имеет много других преимуществ.

    Пара преимуществ Lua по сравнению с C ++:

    • Часто это короче с точки зрения времени разработки из-за высокой -уровневая природа, как в вашем примере.
    • Не требуется перекомпиляция для изменения поведения.
    • Поведение можно изменить на машинах, не предназначенных для разработки.
    • Прототипирование выполняется очень быстро и легко, так как вы можете просто настроить логика во время выполнения.
    11
    ответ дан 1 December 2019 в 09:33
    поделиться

    Основные преимущества Lua как языка программирования (помимо возможности встраивания):

    • Мощная и эффективная хеш-таблица в качестве основной структуры данных
    • Библиотека обработки строк с отличным балансом сложности и выразительной мощности
    • Первоклассные функции и общий цикл for
    • Автоматически управление памятью !!

    Трудно найти короткий пример, иллюстрирующий все это. В моем каталоге ~ / bin находится 191 скрипт Lua; вот тот, который берет вывод pstotext и объединяет строки, заканчивающиеся дефисом:

    local function  printf(...) return io.stdout:write(string.format(...)) end
    local function eprintf(...) return io.stderr:write(string.format(...)) end
    
    local strfind, strlen = string.find, string.len
    
    function joined_lines(f)
      return coroutine.wrap(function()
                              local s = ''
                              for l in f:lines() do
                                s = s .. l
                                local n = strlen(s)
                                if strfind(s, '[%-\173]$', n-1) then
                                  s = string.sub(s, 1, n-1)
                                else
                                  coroutine.yield(s)
                                  s = ''
                                end
                              end
                            end)
    end
    
    -- printf('hyphen is %q; index is %d\n', '­', string.byte('­'))
    
    for _, f in ipairs(arg) do
      for l in joined_lines(io.popen('pstotext ' .. f, 'r')) do
        printf('%s\n', l)
      end
    end
    

    В этом примере показано несколько функций, но ничего интересного с таблицами нет.

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

    local function showpos(word, pos, lw, start)
      -- word is the key word in which the search string occurs
      -- pos is its position in the document
      -- lw is the width of the context around the word
      -- start is the position of the search string within the word
      local shift = (start or 1) - 1  -- number of cols to shift word to align keys
      lw = lw - shift -- 'left width'
      local rw = cols - 20 - 3 - lw - string.len(words[pos])  -- right width
      local data = assert(map:lookup(pos)[1], "no map info for position")
         -- data == source of this word
      local function range(lo, hi)
        -- return words in the range lo..hi, but only in the current section
        if lo < data.lo then lo = data.lo end
        if hi > data.hi then hi = data.hi end
        local t = { }
        for i = lo, hi-1 do table.insert(t, words[i]) end
        return table.concat(t, ' ')
      end
      -- grab words on left and right, 
      -- then format and print as many as we have room for
      local left  = range(pos-width, pos)
      local right = range(pos+1, pos+1+width)
      local fmt = string.format('[%%-18.18s] %%%d.%ds %%s %%-%d.%ds\n', 
                                lw, lw, rw, rw)
      printf(fmt, data.title, string.sub(left, -lw), word, right)
    end
    
    1
    ответ дан 1 December 2019 в 09:33
    поделиться