Ver Mensaje Individual
  #5 (permalink)  
Antiguo 19/03/2014, 09:24
enrib72
 
Fecha de Ingreso: septiembre-2012
Ubicación: Sevilla
Mensajes: 7
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: ¿Qué lenguaje debería estudiar?

Cita:
Iniciado por Malenko Ver Mensaje
Varios puntos a comentar:
- .NET no es un lenguaje de programación sino un framework que usan varios lenguajes, entre ellos C#, Visual Basic.NET, C++/CLR, etc.

- Porque en ".NET" hay ofuscar el código? En que te basas? Cualquiera puede leer el código de un programa en .NET? En cambio un programa que no están en ILASM sino en código máquina es meno legible? Bajo que premisas haces esa afirmación?

- Con .NET (o con Java, C++, ...) puedes crear un programa en versión "shareware" y con herramientas como NSIS crear instaladores independientemente de con que lenguaje se programó.

- Un programa en .NET es tan facil de descompilar como un programa "antiguo" nativo o en VB6.



Creo que las premisas que usas para la elección del lenguaje no son las apropiadas. Tienes que basarte en la curva de aprendizaje, cosas que te permitirá hacer, etc. En tu caso, viniendo de Visual Basic 6 lo más fácil sería empezar con Visual Basic. NET. Ojo, lo más fácil, pero no lo mejor. Yo personalmente optaría por .NET o por Java pero depende de a que sistemas operativos quieras acceder, etc.

Gracias por responder:
- Totalmente de acuerdo, disculpa por no haberme expresado bien, cuando me referí a .NET quise decir "lenguaje Visual Basic .NET".

- Nuevamente disculpas por mi ignorancia si en algo me equivoco: estudié algo, poca cosa de VB.Net hace años, como primera opción para saltar de VB6.0, y lo que tengo entendido es que MSIL (MicroSoft Intermediate Languaje) es el lenguaje interno de .NET Framework, cercano al código máquina.
Y todos los lenguajes compatibles .NET (da igual su sintaxis) se compilan a este MSIL que es un pseudo-código propio solo entendible por la máquina virtual o framework .NET, que a su vez hace de intermediario con el microprocesador que solo entiende código máquina, ensamblador, assembler, código nativo, binario o como queramos llamarlo.
Y que la plataforma (framework) .NET, cada vez que ejecuta un .EXE de .Net, lo que ejecuta es ese pseudo-código, INTERPRETÁNDOLO cada vez al código máquina x86.

Cita:
Por qué en ".NET" hay ofuscar el código? En que te basas? Cualquiera
puede leer el código de un programa en .NET?
Obviamente para "intentar" que no me lo pirateen, al menos dificultarlo en lo posible.

Cita:
"Cualquiera puede leer el código de un programa en .NET?"
Hombre, mi abuela no, pero aunque suene duro, la respuesta es SÍ: Cualquiera, cualquier estudiante o aficionado a la programación que acaba de instalar Visual Studio (como yo novato en .Net), tendrá el Desensamblador de IL (IL DASM) en Microsoft Windows SDK Tools, del menú MS VS2010. Lo demuestro y como ej. si le arrastro un .EXE de VB6.0 me da error "exe no valid" como era previsible. En cambio si le meto un .EXE generado con VB.NET en VS2010, me da lo siguiente:

Código:
// Source File 'C:\Users\Enrique\documents\visual studio 2010\Projects\TablaMultiplicar\TablaMultiplicar\Module1.vb' 
//000003:     Sub Main()
    IL_0000:  nop
//000004:         Dim tabla As Integer
//000005:         Dim n As Integer
//000006:         Dim resultado As Integer
//000007: 
//000008:         Console.Write("Escriba la tabla de multiplicar que quiere calcular: ")
    IL_0001:  ldstr      "Escriba la tabla de multiplicar que quiere calcula"
    + "r: "
    IL_0006:  call       void [mscorlib]System.Console::Write(string)
    IL_000b:  nop
//000009:         tabla = Console.ReadLine()
    IL_000c:  call       string [mscorlib]System.Console::ReadLine()
    IL_0011:  call       int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToInteger(string)
    IL_0016:  stloc.2
//000010:         Console.WriteLine("")
    IL_0017:  ldstr      ""
    IL_001c:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_0021:  nop
//000011:         'Bucle de la tabla de multiplicar
//000012:         For n = 0 To 10
    IL_0022:  ldc.i4.0
    IL_0023:  stloc.0
//000013:             resultado = tabla * n
    IL_0024:  ldloc.2
    IL_0025:  ldloc.0
    IL_0026:  mul.ovf
    IL_0027:  stloc.1
//000014:             'Impresión en pantalla
//000015:             Console.WriteLine(" {0} x {1} = {2}", tabla, n, resultado)
    IL_0028:  ldstr      " {0} x {1} = {2}"
    IL_002d:  ldloc.2
    IL_002e:  box        [mscorlib]System.Int32
    IL_0033:  ldloc.0
    IL_0034:  box        [mscorlib]System.Int32
    IL_0039:  ldloc.1
    IL_003a:  box        [mscorlib]System.Int32
    IL_003f:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                  object,
                                                                  object,
                                                                  object)
    IL_0044:  nop
//000016:         Next
    IL_0045:  nop
    IL_0046:  ldloc.0
    IL_0047:  ldc.i4.1
    IL_0048:  add.ovf
    IL_0049:  stloc.0
//000017: 
//000018:         Call salir()
//000019:     End Sub
//000020: 
//000021:     Sub salir()
//000022:         Console.WriteLine("")
//000023:         Console.WriteLine("Pulsa intro para salir...")
//000024:         Console.ReadLine()
//000025:     End Sub
//000026: 
//000027: End Module
IL_004a:  ldloc.0
    IL_004b:  ldc.i4.s   10
    IL_004d:  stloc.3
    IL_004e:  ldloc.3
    IL_004f:  ble.s      IL_0024

//000018:         Call salir()
    IL_0051:  call       void TablaMultiplicar.Module1::salir()
    IL_0056:  nop
//000019:     End Sub
    IL_0057:  nop
    IL_0058:  ret
  } // end of method Module1::Main

  .method public static void  salir() cil managed
  {
    // Code size       31 (0x1f)
    .maxstack  8
//000020: 
//000021:     Sub salir()
    IL_0000:  nop
//000022:         Console.WriteLine("")
    IL_0001:  ldstr      ""
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
//000023:         Console.WriteLine("Pulsa intro para salir...")
    IL_000c:  ldstr      "Pulsa intro para salir..."
    IL_0011:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_0016:  nop
//000024:         Console.ReadLine()
    IL_0017:  call       string [mscorlib]System.Console::ReadLine()
    IL_001c:  pop
//000025:     End Sub
    IL_001d:  nop
    IL_001e:  ret
  } // end of method Module1::salir

} // end of class TablaMultiplicar.Module1
Como se ve es una mezcla de instrucciones código máquina MSIL con sus instrucciones equivalentes, variables originales... hasta los comentarios que hice en VB.NET y a continuación el listado original de dicho código fuente. Es un sencillo ejercicio que en consola muestra la tabla de multiplicar elegida por el usuario:

Código:
Module Module1

    Sub Main()
        Dim tabla As Integer
        Dim n As Integer
        Dim resultado As Integer

        Console.Write("Escriba la tabla de multiplicar que quiere calcular: ")
        tabla = Console.ReadLine()
        Console.WriteLine("")

          'Bucle de la tabla de multiplicar
          For n = 0 To 10
            resultado = tabla * n
            
            'Impresión en pantalla
            Console.WriteLine(" {0} x {1} = {2}", tabla, n, resultado)

          Next

        Call salir()
    End Sub

    Sub salir()
        Console.WriteLine("")
        Console.WriteLine("Pulsa intro para salir...")
        Console.ReadLine()
    End Sub

End Module
En Visual Basic 6.0 tienes 2 opciones a la hora de compilar: a P-Code (Pseudo-Código más lento y creo que sí podrías recuperar el código fuente desensamblando aunque jamás usé esta opción) o a Código Nativo (Código Máquina x86, rápido, sin posibilidad de código fuente) aunque en honor a la verdad, jamás he intentado desensamblar.

Cita:
- Un programa en .NET es tan facil de descompilar como un programa
"antiguo" nativo o en VB6.
OK, de acuerdo, pero una cosa es descompilar a código máquina, que no lo entiendo ni yo a pesar de que hace ya mucho estudié y trabajé el Zilog Z80, y otra muy diferente descompilar a MSIL con el código fuente VB.NET al lado o entremezclado.

No obstante, si conoces o alquien más, alguna forma de evitar esto, alguna opción que evite el código fuente visible dentro del ejecutable distribuible, quizás en nuevas versiones de Visual Studio, yo las desconozco, bienvenidas sean. Como bien dices, un tema importante es la curva de aprendizaje y VB.NET me interesaría por eso, pero lo descarté por lo ya expuesto.

Saludos