whitehead teoria significado segun russell referencia paradoja pacifismo nucleares guerra filosofia cuadros caracteristicas bibliografia armas analitica android haskell dalvik frege

teoria - ¿Cómo ejecutar programas de Frege en Android?



teoria de russell (5)

Me interesa la programación para Android en lenguajes funcionales, preferiblemente cerca de Haskell. Frege parece ser una buena opción. Descubrí que alguien ya había hecho una aplicación de prueba de concepto , pero no pude encontrar sus fuentes ni nada similar.

Así que mi pregunta es, ¿cómo ejecutar los programas Frege en Android, qué tan difícil es y cuáles son los obstáculos eventuales?


De todo lo que puedo extraer de una búsqueda rápida en la web, incluidos algunos resultados de la lista de correo de frege - lenguaje de programación, no parece que sea posible una aplicación de Android solo para Frege.

En su lugar, deberás tomar otro idioma habilitado para Android y usarlo para llamar a tu código Frege. La generación de tales "talones" podría hacerse automáticamente, pero no vi una herramienta existente para hacerlo.

También hay problemas con el código Java generado por Frege y los compiladores de Java para Android, pero parece ser algo que es relativamente fácil de solucionar utilizando herramientas de retrotranslación.

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

También me gustaría que hubiera un lenguaje referencialmente transparente y fuertemente tipado con polimorfismo paramétrico y polimorfismo ad hoc disponible para el desarrollo de Android. Mientras que falta, recomiendo Scala para hacer el desarrollo de Android.


El principal obstáculo que veo es que actualmente no es posible compilar una fuente frege en una clase java que implemente alguna interfaz o extienda otra clase.

En su lugar, la clase java generada desde un módulo frege es solo un espacio de nombres para métodos estáticos y otras cosas que definió.

Por lo tanto, para hacer un proyecto de Android más que trivial, no será suficiente llamar a java desde frege, que es bastante fácil, sino también llamar a frege desde java. En otras palabras, necesitará una operatividad inter * completa en el sentido literal.

Por supuesto, es posible hacerlo, pero hay que decir que la generación de código no fue diseñada exactamente para un fácil uso desde Java.

Todavía no he hecho un proyecto de Android, por lo tanto no estoy seguro de cuánto código de pegamento se necesitaría.

Una advertencia final: el trabajo anterior de Gabriel Riba se realizó con una versión anterior del compilador. Incluso hay un enlace a una distribución de Frege que admite JDK6. Por favor, no la use, no es compatible con las versiones más recientes.

Sin embargo, si está dispuesto a asumirlo, obtendrá todos los apoyos posibles a través del grupo de Google mencionado anteriormente. Sería demasiado bueno si alguien creara y documentara alguna forma "canónica" de lograrlo.


No estoy familiarizado con frege, y no he intentado usar scala u otros lenguajes JVM en Android.

Dicho esto, si intentara algo así, estos son los pasos que probablemente tomaría para intentar averiguar cómo hacer que funcione.

  1. Cree una aplicación de tipo HelloWorld basada en la línea de comandos simple en frege, que se pueda ejecutar con, por ejemplo, java -jar HelloWorld.jar HelloWorld

  2. Ejecute dx en HelloWorld.jar y luego intente que el ejemplo funcione en un dispositivo Android desde adb shell, usando dalvikvm. es decir, dalvikvm -cp blah.dex HelloWorld

  3. Averigüe cómo hacer referencia / usar clases desde el android.jar proporcionado por el Android sdk en frege

  4. Cree una prueba simple de concepto de clase de actividad en frege, y construya manualmente un archivo classes.dex a partir de ella

  5. Cree una aplicación de prueba de concepto similar en java y use las herramientas de Android existentes para crear una aplicación apk

  6. Reemplace classes.dex en el apk, renuncie al apk y vea si funciona

  7. Si trabajas mucho, entonces, desde allí, puedes trabajar en una mejor historia de compilación para frege, usando aapt para compilar recursos y, finalmente, construir una apk completa "desde cero".


Para cualquier persona que todavía esté interesada, tengo una publicación en el blog sobre esto here . Debe configurar su compilación de gradle para compilar el código de Frege en java y colocarlo en la ruta de origen de java. Luego tienes que subclasificar la actividad y definir algunos envoltorios personalizados.

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(); } }


Si quieres escribir tu aplicación completamente en Frege, será más complicado. Deberá escribir envoltorios para la API de Android, ya que parece que a la envoltura FregeAndroid le faltan algunos archivos .

Sin embargo, si desea escribir su UI en Java y llamar a Frege para la lógica de su aplicación, tengo un proyecto de ejemplo que muestra cómo hacerlo.

Mi proyecto de ejemplo tiene esta función en Frege:

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

que luego llamo desde 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")); } }

que se parece a esto

Mi proyecto de ejemplo utiliza Frege 3.23, por lo que usaría la forma antigua de llamar a Frege desde Java . No he intentado usar Frege 3.24, pero si quieres intentarlo, usarías la nueva forma .

La única parte realmente difícil fue obtener un build.gradle que compilara el código Frege. Comencé con un fragmento publicado por Andreas Ländle en la lista de correo de Frege, y luego lo convertí en un completo build.gradle . No pude hacer que Proguard funcione, por lo que el APK resultante contiene todo el frege.jar . Eso infla la aplicación un poco, y requiere la Multidex de Multidex , pero por lo demás parece estar bien.

Además, tenga en cuenta que mi proyecto de muestra requiere un nivel de API 21 o superior, porque Frege necesita ForkJoinPool , que Android solo tiene en el nivel 21 y superior.