Как запустить программы Фреге на Android?

Меня интересует программирование под Android на функциональных языках, желательно близких к Haskell. Frege кажется хорошим выбором. Я обнаружил, что кто-то уже сделал такое приложение для проверки концепции, но я не смог найти его исходники. или что-то подобное.

Итак, мой вопрос: как запускать программы Frege на Android, насколько это сложно и каковы возможные препятствия?


person Petr    schedule 20.06.2013    source источник
comment
Я предполагаю, что это будет напоминать работу, необходимую для написания приложений для Android на Scala, поскольку оба они компилируются в байт-коды JVM.   -  person CommonsWare    schedule 20.06.2013
comment
Найдите или спросите здесь: groups.google.com/forum/#!forum /frege-язык-программирования   -  person Landei    schedule 21.06.2013
comment
Обратите внимание, что вам нужно будет создать свой собственный компилятор frege, совместимый с JDK6, вот несколько советов: github.com/Frege/frege/wiki/Часто задаваемые вопросы   -  person Ingo    schedule 22.06.2013
comment
Marimuthu предоставил загружаемый jar-файл frege для Java6 здесь: dl.dropboxusercontent.com/u/55737110/ (по состоянию на июнь 2013 г.)   -  person Ingo    schedule 29.06.2013


Ответы (5)


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

Вместо этого класс java, созданный из модуля frege, является просто пространством имен для статических методов и других вещей, которые вы определили.

Следовательно, чтобы сделать более чем тривиальный Android-проект, будет недостаточно вызвать java из frege, что довольно просто, но еще и вызвать frege из java. Другими словами, вам потребуется полная интероперабельность в буквальном смысле.

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

Я еще не делал проект для Android, поэтому я не уверен, сколько нужно связующего кода.

Последнее предупреждение: предыдущая работа Габриэля Рибы была сделана с помощью более ранней версии компилятора. Есть даже ссылка на дистрибутив frege, поддерживающий JDK6 — пожалуйста, не используйте его, он не совместим с более поздними версиями.

Если вы все же готовы взяться за это, вы получите всю возможную поддержку через группу Google, упомянутую выше. Было бы слишком здорово, если бы кто-то сделал и задокументировал какой-то «канонический» способ добиться этого.

person Ingo    schedule 22.06.2013
comment
Этот ответ устарел, см. ingo60.gitbooks.io/frege -quick-reference/content/ - person Janus Troelsen; 17.04.2016

Я не знаком с frege и не пробовал использовать scala или другие языки JVM на Android.

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

  1. Создайте простое приложение типа HelloWorld на основе командной строки в frege, которое можно запускать, например. java -jar HelloWorld.jar HelloWorld

  2. Запустите dx на HelloWorld.jar, а затем попробуйте заставить пример работать на устройстве Android из оболочки adb, используя dalvikvm. то есть dalvikvm -cp blah.dex HelloWorld

  3. Выясните, как ссылаться/использовать классы из android.jar, предоставленного Android sdk в frege.

  4. Создайте простое доказательство концепции класса Activity в frege и вручную создайте из него файл class.dex.

  5. Создайте аналогичное приложение для проверки концепции на Java и используйте существующие инструменты Android для создания apk.

  6. Замените class.dex в apk, откажитесь от apk и посмотрите, работает ли он.

  7. Если вы так много работаете, то оттуда вы можете поработать над лучшей историей сборки для frege, используя aapt для компиляции ресурсов и, в конечном итоге, создать полный apk «с нуля».

person JesusFreke    schedule 20.06.2013
comment
Если вы хотите попробовать Scala на Android, используйте Scala-IDE; у него есть специальная документация по работе со Scala на Android. - person Boyd Stephen Smith Jr.; 27.06.2013

Если вы хотите написать свое приложение полностью во Фреге, это будет сложнее. Вам нужно будет написать оболочку для Android API, поскольку оболочка FregeAndroid кажется отсутствуют некоторые файлы.

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

Мой пример проекта имеет эту функцию во Фреге:

extraText :: String -> String
extraText who = "\nHello, " ++ who ++ "!"

который я затем вызываю из Java:

public class FregeActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView textView = (TextView) findViewById(R.id.txt);
        textView.append(FregeCode.extraText("Android"));
    }
}

который выглядит так

FregeActivity

В моем примере проекта используется Frege 3.23, поэтому для этого вы должны использовать old способ вызова Frege из Java. Я не пробовал использовать Frege 3.24, но если вы хотите попробовать, используйте по-новому.

Единственной действительно сложной частью было получение build.gradle, которое будет строить код Фреге. Я начал с фрагмента, опубликованного Андреасом Лендле. в списке рассылки Frege, а затем преобразовал его в полный build.gradle. Мне не удалось заставить Proguard работать, поэтому получившийся APK содержит все файлы frege.jar. Это немного раздувает приложение и требует включения Multidex. , а в остальном вроде нормально.

Также обратите внимание, что для моего примера проекта требуется API уровня 21 или выше, поскольку Фреге требуется ForkJoinPool, который доступен только для Android. имеет уровень 21 и выше.

person user31708    schedule 09.10.2016

Из всего, что я могу почерпнуть из быстрого веб-поиска, включая несколько обращений из списка рассылки frege — языка программирования, не похоже, что приложение для Android только для Frege возможно.

Вместо этого вам придется взять какой-нибудь другой язык с поддержкой Android и использовать его для вызова вашего кода Фреге. Генерация таких «заглушек», возможно, может выполняться автоматически, но я не видел существующего инструмента для этого.

Есть также проблемы с кодом Java, сгенерированным Frege и компиляторами Java для Android, но, похоже, это относительно легко решить с помощью инструментов ретроперевода.

https://groups.google.com/forum/#!topic/frege-programming-language/Ounzmu-oHJQ https://groups.google.com/forum/#!topic/frege-programming-language/8bkWorojiiY

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

person Boyd Stephen Smith Jr.    schedule 27.06.2013
comment
Просто для справки, Scala имеет как параметрический полиморфизм, так и специальный полиморфизм, доступный сегодня, как и Haskell/Frege, хотя и с несколько менее приятным синтаксисом. - person Erik Kaplun; 22.01.2016
comment
Scala не является ссылочно-прозрачной, + Эрик Аллик. В остальном он соответствует моим критериям, даже с шатким специальным полиморфизмом. (Честно говоря, система классов типов Haskell хороша, но она также немного шаткая.) - person Boyd Stephen Smith Jr.; 27.01.2016
comment
Нет принудительной ссылочной прозрачности, которую вы имеете в виду. И да, я бы хотел, чтобы у меня была в основном семантика классов типов Scala с синтаксисом Haskell, к чему, я думаю, и движется Haskell. - person Erik Kaplun; 27.01.2016
comment
Нет необходимости использовать принудительный квалификатор. Если в языке есть выражения, которые не являются ссылочно прозрачными, язык не имеет ссылочной прозрачности. (Скала, например.) - person Boyd Stephen Smith Jr.; 29.01.2016

Для тех, кто все еще заинтересован, у меня есть запись в блоге об этом здесь. Вы должны настроить свою сборку gradle, чтобы скомпилировать код Frege в java и поместить его в исходный путь java. Затем вам нужно создать подкласс активности и определить некоторые пользовательские оболочки.

data Bundle = native android.os.Bundle

data Context = native android.content.Context

data FregeActivity = native android.app.Activity where
    native getApplicationContext :: MutableIO FregeActivity -> IO (MutableIO Context)
    native setContentView :: MutableIO FregeActivity -> MutableIO TextView -> IO ()

data TextView = native android.widget.TextView where
    native new :: MutableIO Context -> STMutable RealWorld TextView
    native setText :: MutableIO TextView -> String -> IO ()

onCreateF :: MutableIO FregeActivity -> IO ()
onCreateF !this = do
    context <- this.getApplicationContext
    tv <- TextView.new context
    tv.setText "Hello, Android - Love, Frege"
    this.setContentView tv

native module type FregeActivity where {
    @Override
    public void onCreate(android.os.Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final frege.run7.Func.U<Object,Short> res = RunTM.<frege.run7.Func.U<Object,Short>>cast(onCreateF(this)).call();
        frege.prelude.PreludeBase.TST.run(res).call();
    }
}
person Michael Chav    schedule 27.11.2016
comment
Ссылка уже мертва, не могли бы вы проверить? - person Petr; 02.01.2017
comment
Я поставлю его обратно. Вот более свежий и полезный вклад: github.com/mchav/froid - person Michael Chav; 03.01.2017