Diferencias de Android (Dalvik + Java vs Old School C ++)

8

Desarrollar en Android va a ser diferente para mí, ya que pasé los últimos 10 años codificando juegos en C ++. ¿Cuáles son las principales diferencias / dificultades / cuellos de botella para el desarrollo de Android? Mi gran preocupación es mudarme a Java, ¿qué voy a extrañar más?

Para ser más claro: ¿qué extrañaría si codificara todo en Java en comparación con la forma en que normalmente codifico C ++ para consolas?

Richard Fabian
fuente
El título podría ser un poco mejor. Para que quede claro, se pregunta "¿Cuál es la diferencia entre C ++ y Java en el teléfono Android?
Jesse Dorsey
66
Creo que si usa el NDK ( developer.android.com/sdk/ndk/index.html ), entonces puede escribir la mayor parte de su código en C ++.
Chris Howe

Respuestas:

6

Lo más importante que probablemente extrañaría sería la administración explícita de la memoria. En el lado positivo, Java tiene información de tipo de tiempo de ejecución y genéricos reales. Consulte también: http://developer.android.com/guide/practices/design/performance.html para obtener algunos consejos de Google sobre cómo mantener eficiente su código Java.

Raymond Chen recientemente se ha desahogado sobre la recolección de basura y la administración de memoria en el CLR y sus publicaciones en el blog son excelentes para comprender cómo funciona. (Sé que los siguientes enlaces son para CLR, pero siguen siendo relevantes para el desarrollo de Java). Ver especialmente: http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx y http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10/10 /10048150.aspx

Dicho esto, no hay mucha diferencia entre Java y C ++, y como señaló Chris, puede codificar en C / C ++ en Android usando el NDK.

Brett
fuente
gracias, "puedes codificar en C / C ++ en Android usando el NDK", sí, lo aprecio, pero ¿por qué apegarte a las armas viejas todo el tiempo si algo realmente resulta proyectos mejor / más rápido?
Richard Fabian
2
Oh, ya veo a qué te refieres. Java tiene la ventaja de tener una biblioteca estándar masiva y una biblioteca extremadamente competente para tratar con XML. La plataforma Android extiende la biblioteca estándar con bibliotecas para todos los accesorios de hardware sofisticados y algunas funciones adicionales del lado del usuario. Java también admite la compilación incremental / verificación de errores, por lo que recibirá comentarios sobre los errores tan pronto como los escriba. Honestamente, tampoco deberías temer al rendimiento. No va a ser tan rápido como C en metal desnudo, pero sigue siendo bastante rápido. Yo diría que no hay mucho de qué preocuparse.
brett
4

Chris Pruett de Google habló sobre escribir juegos en tiempo real para Android en Google I / O 2009 y nuevamente en 2010 . Habla sobre el rendimiento de Java en Android, entre otros temas. También creó un juego, Replica Island , en Java y puedes descargar el código fuente para tener una idea de cómo podría ser un juego Android Java. Su blog sobre el juego también tiene varios artículos interesantes.

Las dificultades típicas son similares a las de escribir en otros lenguajes recolectados de basura , se usan grupos de objetos y se asignan las cosas por adelantado para evitar que el GC se ejecute cuando no se desea. Los métodos son virtuales de forma predeterminada en Java y ayuda a marcarlos como finales cuando no es necesario anularlos. El complemento Android Eclipse viene con algunas herramientas ordenadas para ayudarlo a perfilar su aplicación y monitorear las asignaciones de almacenamiento dinámico.

Firas Assaad
fuente
2

Te preocupas demasiado. La API para OpenGL en Android, OpenGL-ES, se mantuvo deliberadamente como C. Vea las especificaciones de OpenGL en http://www.khronos.org/opengles/ para más detalles.

Incluso es posible que no te pierdas mucho de C ++. Muchos desarrolladores, incluso el famoso autor de programación Bruce Eckel ('Pensar en C ++', 'Pensar en Java'), han encontrado que Java es un lenguaje mucho más efectivo para la programación orientada a objetos. En gran parte porque las cosas que 'perdieron' al principio resultaron no ser tan importantes después de todo.

Dicho esto, lo que más extraño es la capacidad de anular operadores, no solo métodos. La sintaxis es realmente más torpe cuando tienes que definir / anular métodos en lugar de operadores.

Considere, por ejemplo, la aritmética de números complejos. Es realmente elegante en C ++. No es así en Java. Pero esto resulta tener un impacto mínimo en la mayoría de los proyectos reales.

Algunas personas se quejan de la incapacidad de hacer herencia múltiple. Pero el tipo más útil de herencia múltiple ES el tipo que Java hace con la 'interfaz', por lo que realmente no se debe perder tanto.

usuario1800
fuente