Necesito conciliar estos 2 hechos:
- No me siento cómodo trabajando en Linux;
- Necesito desarrollar software para Linux.
Algunos antecedentes: tengo más de 10 años de experiencia en programación en Windows (casi exclusivamente C / C ++, pero también algunos .NET), fui usuario de FreeBSD en mi hogar durante aproximadamente 3 años (luego tuve que volver a Windows), y nunca he tenido mucha suerte con Linux. Y ahora tengo que desarrollar software para Linux. Necesito un plan
En Windows, puede salirse con solo conocer un lenguaje de programación, una API con la que está codificando, su IDE (VisualStudio) y algunas herramientas muy básicas para la resolución de problemas (depende, ProcessExplorer, DebugView, WinDbg). Todo lo demás viene naturalmente.
En Linux, es una historia muy diferente. ¿Cómo demonios sabría qué DLL (perdón, Objeto compartido) se cargaría si lo vinculo desde el complemento de Firefox? ¿Cuál es el equivalente de Linux de insertar __asm int 3 / DebugBreak () en la fuente y ejecutar el programa, y luego dejar que el sistema operativo llame a un depurador? ¿Por qué demonios las versiones de lanzamiento usan algo llamado appLoader, mientras que las versiones de depuración funcionan de alguna manera diferente? Lo peor de todo: ¿cómo aprovisionar el entorno de desarrollo de Linux?
Entonces, teniendo en cuenta que el odio generalmente se asocia con no saber lo suficiente, ¿qué recomendarías? Estoy bien con Emacs y GCC. Necesito educarme como administrador / usuario de Linux, y necesito aprender las herramientas adecuadas de solución de problemas (strace is cool, por cierto), equivalentes a las que mencioné anteriormente.
¿Necesito hacer Linux desde cero? ¿O necesito leer algunos libros (he leído "Entorno de programación UNIX" de Kernighan y "Programación avanzada ..." de Stevens, pero necesito aprender algo más práctico)? ¿O necesito tener alguna distribución de Linux en la computadora de mi casa?
man
es tu amigo. Lo haríaman nm
yman ld
como punto de partida.Respuestas:
Puede encontrar interesante el artículo Enlace dinámico en Linux y Windows que explica cómo cada sistema operativo realiza enlaces dinámicos. El artículo Rutas de búsqueda de biblioteca compartida explica cómo se encuentran las bibliotecas. También las bibliotecas de Linux estáticas, compartidas, dinámicas y cargables son muy buenas. Lo bueno de las bibliotecas de Linux es que tienen un mejor soporte para el control de versiones y tienen varias versiones de una biblioteca que Windows (AFAIK, no hago Windows). Para obtener más información , consulte Versiones de la interfaz de la biblioteca en Solaris y Linux . Estos artículos realmente deberían cubrirlo con bibliotecas.
El GDB es muy poderoso, una buena introducción es probablemente el Tutorial gdb de RMS . Es posible que desee leer sobre puntos de interrupción condicionales. Para
__asm(int 3)
ver los equivalentes, vea la pregunta Establecer punto de interrupción en código C o C ++ mediante programación para gdb en Linux .El libro Advanced Unix Programming de Marc Rochkind es una lectura obligada, en mi humilde opinión. Tiene muchos ejemplos y cubre todos los temas de POSIX / SUS de una manera muy bien explicada. Es el mejor libro sobre este tema que he leído hasta ahora.
Pero para hacerte la vida más fácil, en realidad recomiendo usar una API de alto nivel que abstraiga cosas para ti, como Qt. También hace que la escritura multiplataforma sea mucho más fácil.
Hacer Linux From Scratch te ayuda a comprender cómo está compuesto un sistema Linux, pero creo que no mejora mucho tu conocimiento sobre él desde el punto de vista de los desarrolladores. Sin embargo, te hace sentir más cómodo con Linux, ya que aprendes qué partes hay en un entorno Linux (y en parte también por qué ). Un Linux no será una gran caja negra para ti después de trabajar con Linux From Scratch.
fuente
Si lo desea
strace
, no lo olvideltrace
: el equivalente para las llamadas a la biblioteca.Además, sí, recomiendo Linux From Scratch . Es un buen ejercicio para resolver los elementos centrales del sistema operativo y cómo encajan entre sí.
Para un tratamiento de referencia de programación del sistema moderno y completo, recomendaría elegir la interfaz de programación de Linux .
fuente
El Mac OS X es como un Mercedes; Es el más bonito y limpio, pero cuesta mucho. Windows es como un Toyota; te llevará de ida y vuelta.
Linux es como un hot rod; Es para que la gente profundice y desarme y vuelva a armar. Linux no es para alguien que solo quiere usar la computadora; Es para las personas que aman las computadoras. Las personas que no aman las computadoras deben mantenerse alejadas.
Lo que aprendiste en Windows no se traducirá muy bien, no. Pero puedes ver las partes internas y ver el motor en marcha.
Trate de tomar Linux como un juguete nuevo, con el que pueda jugar y gatear y ver qué está pasando. Las cosas que son fáciles en Windows son más difíciles en Linux; Las cosas que son imposibles en Windows son posibles en Linux.
Si amas las computadoras, puedes amar Linux; si no te gustan las computadoras, ¿por qué estás programando?
fuente
¿Qué tal si te desarrollas en Mono con Monodevelop? Esto lo ayudaría a comenzar fácilmente reutilizando su experiencia en .NET.
fuente
Es desalentador cuando lo miras desde el principio (al igual que si fueras un desarrollador de Linux encargado de desarrollar Windows). Yo abordaría este problema a la vez.
Lo más importante, deje todas sus opiniones subjetivas en la puerta. Y no, no es necesario ser un gurú para desarrollar en Linux, sé lo suficiente para moverse, y no todo, pero me siento cómodo con eso ...
fuente
The success or failure of many thing in life comes down to our attitude, looking for positives and keeping your mind focused on the positives will do more to adide you as you start down this new interesting adventure.
¿Cuánto tiempo le llevó dominar el trabajo en un entorno Windows? Se podría decir que fue fácil que recién comenzaste. Pero tuviste algunos años trabajando con Windows antes de eso. ¿Cuánto tiempo había estado usando Windows antes de escribir su primer programa? Fueron 8 años para mí, aunque he estado usando Linux casi exclusivamente durante 5 años. Ahora soy más competente en Linux que en Windows. Debe darse al menos tanto tiempo para familiarizarse con un nuevo sistema.
Comience con la lista de aplicaciones con las que no puede vivir en Windows y busque alternativas en el mundo * nix. http://alternativeto.net/ y las secciones de lectura adicional de Wikipedia pueden ser útiles aquí.
Aquí hay una lista de software alternativo que podría resultar muy útil. Aquí hay algunas alternativas a las cosas que mencionaste.
Otros recursos útiles para pasar de un sistema a otro
Para convertirse en un mejor usuario avanzado o usuario administrador, eche un vistazo a estos recursos
También parece que ha pasado un tiempo desde que has mirado el mundo * nix. Recomendaría algunas de las nuevas versiones de distribución de fedora , suse , debian o mi estación de trabajo preferida Ubuntu .
Probablemente ahora pueda salirse con la suya sin conocer los aspectos internos del sistema y solo los conceptos básicos como en Windows. No solo trataría de escaparme con el mínimo. Si ve a Linux como una herramienta que realmente lo ayuda en su desarrollo y no merly un sistema operativo en el que desarrolla, sería útil.
Linux From Scratch será mucho más importante si está desarrollando específicamente para Linux es un sentido muy específico y técnico. IE que desea desarrollar para el núcleo, o el puerto que programa en una supercomputadora con Linux. Sería muy útil, sin embargo. Creo que probablemente podrías dejar eso durante unos meses mientras intentas ponerte en marcha en Ubuntu. Ubuntu estará tan cerca de las cosas como funciona el mundo de Mac y Windows.
fuente
Creo que respondiste tu pregunta en la pregunta:
"En Windows, puede salirse con solo conocer un lenguaje de programación, una API contra la que está codificando, su IDE (VisualStudio) y algunas herramientas muy básicas para la resolución de problemas (depende, ProcessExplorer, DebugView, WinDbg). Todo lo demás es algo natural. "
Adivina qué, en Linux puedes salirte con solo conocer un lenguaje de programación, una API (o un par), tu IDE (Eclipse o NetBeans, incluso Geany, Emacs o vim, si lo deseas) y algunas herramientas básicas para la resolución de problemas ( gdb, herramientas de rastreo, pelusa, htop, ps).
Tienes mucho conocimiento invertido en el ecosistema de programación de Windows. Gran parte de eso es (con suerte) conocimiento abstracto (¿qué es un compilador, un depurador, una biblioteca compartida, un proceso, un hilo? ¿Qué hacen?) Que se traducirá fácilmente, una vez que se ponga al día con las diferentes herramientas. Algunos son específicos del dominio (¿Qué DLL está vinculado cuando agrego X a un proyecto?), Pero incluso pasar de una clase de lenguaje a otra dentro de Windows requeriría un nuevo aprendizaje.
Instale Ubuntu o Fedora en una máquina virtual, lea algunos tutoriales de C ++ Hello World en Eclipse o NetBeans, y algunas depuraciones en los tutoriales de Eclipse / NetBeans, y deje que la capacidad natural de adaptación de su cerebro se haga cargo. Traducirá ideas para usted si se relaja y simplemente lo pone a trabajar.
fuente
Aprendí Unix en general leyendo las páginas de manual. Al menos deberías echarles un vistazo. Sí, me refiero a todos ellos. El método lo uso para cd en los directorios de la página man, y atacarlos una sección a la vez.
Yo uso esto:
... reemplazando el .1 con el número de la sección que está leyendo, .2, .3, etc. Presione ctrl-Z ctrl-C para salir del ciclo. Su kilometraje puede variar si su distribución de Linux almacena cosas de manera diferente, es decir, no como cmdname.1.gz.
Solo revisa las descripciones y más si es algo interesante. Las secciones 1, 2 y 3 son las más importantes para un programador. 1 cubre los comandos generales del usuario, que incluyen sus herramientas de compilación y varias utilidades forenses. 2 son llamadas al sistema y 3 son llamadas a la biblioteca.
fuente
xman
como una interfaz más "amigable". Seleccione una sección, haga clic en la página de manual, léala. Enjuague, repita.No te obligues a hacer algo que no te gusta. Use Windows como su entorno de desarrollo, escriba un código portátil, compílelo para Linux y solo pruébelo ocasionalmente en una máquina virtual.
fuente
No estoy seguro de que funcione para plataformas, pero para los lenguajes de programación, me ha resultado útil pensar en cómo me familiaricé y me sentí cómodo con los que soy bueno e intenté reproducir esas experiencias y actividades para lo que yo '' Estoy tratando de aprender.
Tal vez algo en esas líneas?
En términos generales, sin embargo, mi interés y confianza con GNU / Linux ha resultado ser mucho más manipulable (y requiere ajustes en los primeros días) que Windows. Necesitaba meterme con muchas cosas para que las cosas funcionaran y eso me ayudó a aprender muchas cosas. Las cosas están mucho mejor ahora, pero todas esas horas ayudaron.
fuente
Fui uno de los dos encargados de algo similar, pero diferente. Trabajo en un distrito escolar K-12, y el sistema de negocios (recursos humanos, finanzas, etc.) está migrando de una base de datos HP3000 / TurboImage a una plataforma Linux / MS SQL. Me siento cómodo con el lado de MS SQL. Pero no del lado de Linux. Los dos estamos del lado del administrador, no del lado de la programación. La programación se realiza fuera: aplicación comercial de terceros para organizaciones K-12.
Tomé una clase de introducción de 5 fin de semana a Linux (Redhat) los fines de semana, se realizó principalmente en modo de línea de comandos, y valió la pena el tiempo como un inicio rápido en la forma de hacer las cosas en Linux. Obviamente YMMV dependiendo de la clase / maestro.
Usted mencionó 'Lo peor de todo: ¿cómo aprovisionar el entorno de desarrollo de Linux?' Como ya está muy familiarizado con Windows, le sugiero que obtenga una copia de vmWare Workstation. Con eso, puede mantener Windows como su estación de trabajo e instalar Linux como sistemas invitados: elimine, enjuague y repita según sea necesario. Cuando obtienes una buena configuración, creo que puedes tomar una instantánea, pero no puedo decir con certeza qué versiones son capaces del aspecto de la instantánea. Y si va en la ruta de vmWare Workstation para habilitar múltiples configuraciones de desarrollo, aumente la memoria, definitivamente.
Tampoco me importa recomendar el uso de CentOS como sistema operativo Linux para los invitados. Por lo que entiendo, es como RedHat sin la marca y / o el argumento de venta y / o los costos de soporte. No estoy familiarizado con los otros sabores de Linux, por lo que no puedo dar información sobre ellos.
Greg
fuente
Me gustan ambas plataformas y, a pesar de todas las diferencias en la interfaz de usuario y el ecosistema de desarrollo, las encuentro más parecidas que diferentes. De hecho, para la mayoría de los conceptos de Windows, puede encontrar otros equivalentes de Linux simplemente buscando en Internet.
Dicho esto, sugiero encarecidamente aprender a hacer las cosas al "estilo Unix". Use la línea de comandos en lugar de los front-end de la GUI con errores (estoy hablando principalmente de gdb aquí); no busque un IDE y aprenda a utilizar un conjunto de herramientas especializadas. Elige un buen editor (apuntando a vim) y aprende bien. Lea cómo
make
funciona incluso si no planea convertirse en un experto. Tal vez incluso te guste Linux. Es geek-friendly y divertido para jugar.fuente
Considere esto: una vez no sabía nada sobre Windows, pero lo aprendió y con el tiempo se sintió cómodo con él.
Luego, MS cambió el sistema de programación con el que se sentía cómodo a .NET y ya no sabía nada sobre DLLS, COM y lo que fuera, tenía que aprender cosas como ensamblados, GAC, dominios de aplicaciones. Los aprendiste bien.
Entonces, ¿por qué te preocupa hacer lo mismo con Linux?
Hay montones de tutoriales de "introducción" en la web para todo tipo de entornos de programación. Ahora dices GCC, así que voy a asumir el desarrollo de C ++. Obtenga Eclipse, instale el CDT (herramientas de desarrollo c) en la parte superior de su plataforma Eclipse (Eclipse es un IDE multipropósito, puede usarlo para C ++, PHP, Java, lo que sea, pero necesita instalar las herramientas para su idioma ya que realmente no querrás que todo esté preinstalado como VS y que tarde 3 días en instalarse :))
Hay tutoriales fáciles de usar en toda la web. IBM tiene uno aquí que es bastante completo.
Herramientas de depuración ... eclipse lo tiene incrustado ( tutorial ), pero puede encontrar muchas herramientas como las que mencionó, solo busque en la web y encontrará muchas opciones. Le tomará un poco de tiempo descubrir cómo leer un volcado de memoria (a diferencia de una descarga de usuario de Windows, por ejemplo), pero llegará allí.
También puede valer la pena comenzar un blog con sus experiencias, no solo le permitirá recordar lo que ha hecho (por ejemplo, configurar eclipse como le guste, se olvidará cuando necesite volver a hacerlo en un tiempo del año) pero ayudará a otros en su situación.
fuente
No creo que necesites hacer Linux desde cero. Si yo fuera tú, iría por Ubuntu. Es más cómodo y, al estar basado en Debian, hay mucho material técnico disponible.
Si quieres sumergirte de cabeza en Linux, Gentoo es una buena opción. Requiere que lea bastante sobre la configuración y los núcleos, pero también le brinda un sistema bastante funcional para trabajar en una
fuente
Busca en Google "El arte de la programación de Unix" y léelo. En mi opinión, su principal dificultad es la filosofía diferente, y ese libro es una excelente lectura para esto.
También le presenta algunas diferencias no obvias pero técnicamente muy importantes entre los sistemas * n * x y Windows, que son clave para comprender por qué hacer las cosas de otra manera tiene sentido en Linux.
fuente
La primera pregunta que haría es qué es lo que quieres desarrollar. Si se trata de una aplicación basada en GUI, puede ser diferente de tener que escribir algo como una extensión del núcleo.
En el caso de una aplicación gui, creo que el método más fácil es usar Qt, que tiene su propio entorno de desarrollo (Qt-Creator) y ser multiplataforma, le permite aprender solo una API que se puede usar para Windows / Linux / OSX e incluso desarrollo móvil. Al igual que Visual Studio en Windows, o XCode en OSX, puede crear y diseñar ventanas y elementos desde un editor gráfico y la API es muy fácil de aprender con un montón de aplicaciones de muestra.
Si necesita obtener un nivel más bajo, una vez que conozca Linux en la línea de comandos, sepa cómo atravesar directorios, manipular archivos, comprender permisos, etc., o bien comience a leer cómo compilar un programa simple con gcc, cómo vincular archivos y ejecutar el ejecutable y luego cómo depurar con gdb.
Alternativamente, si eso parece un poco desalentador, puede descargar Eclipse u otro IDE, pero probablemente se sentirá mucho más cómodo con Linux a largo plazo, si primero pone el tiempo y el esfuerzo en la línea de comando.
fuente