¿Por qué es imposible crear un lenguaje de programación que satisfaga todas las necesidades? ¿Cuál es la barrera que impide que esto suceda?

♫ Ahora esta es una historia, todo sobre cómo

Tu lenguaje de programación se volcó

Y me gustaría tomarme un minuto

Solo siéntate allí

Te diré cómo tu idioma se volvió obsoleto y desnudo. ♪

Ahora que saqué ese trozo de queso, necesitamos hablar sobre por qué se crean nuevos idiomas en primer lugar y por qué los viejos pierden su popularidad. Y para llegar allí, debemos hacernos la siguiente pregunta:

¿Por qué alguien no hace un idioma llamado Skittles y hace que incluya un arco iris de los mejores sabores de cualquier otro idioma?

Bueno, las personas realmente tienen la intención de hacer eso cuando hacen un idioma. Por ejemplo, mira este breve video de 5 minutos con Bjarne Stroustrup, el creador de C ++.

Por qué creé C ++ | Gran pensamiento

[Tomé prestada la imagen del apuesto Sr. Stroustrup de ‘Necesitamos un mejor equilibrio entre la teoría y la práctica’, Bjarne Stroustrup, padre de C ++]

“Construyeron FORTRAN para ingenieros y científicos y construyeron COBOL para hombres de negocios “. Entonces, como se explica en el video, se creó un nuevo lenguaje para cubrir todo el álgebra y el espectro comercial cubierto en FORTRAN y COBOL, respectivamente; este lenguaje se llamaba Simula (Simula I y Simula 67) y fue diseñado por Ole-Johan Dahl y Kristen Nygaard. [1]

Entonces, ¡mira a Simula! Aquí es donde nació el principio de clase en la programación, junto con las propiedades de las clases y, finalmente, la ideología que es la programación orientada a objetos.

Entonces, aquí tenías algunas nuevas tecnologías bastante sorprendentes a través de la abstracción, entonces, ¿por qué no nos detuvimos allí? Bueno, Simula no tenía la robustez (en el sentido probado y verdadero) y la aplicación de bajo nivel que algunos otros lenguajes tenían, como C (lenguaje de programación) . Por el contrario, C carecía de la diversidad y la poderosa abstracción que tenía Simula.

Y así, C ++ nació para que usted “pudiera hacer abstracción de alto nivel pero lo suficientemente eficiente y lo suficientemente cerca del hardware para tareas informáticas realmente exigentes . C ++ tiene clases como Simula pero se ejecutan tan rápido como el código C, por lo que la combinación se vuelve muy útil “.

¡OK, está bien! ¡Parece que ahora tenemos un lenguaje que lo hace todo !

[Imagen prestada de aquí]

Excepto que C ++ no “lo hace todo”.

Todos aplauden por el lenguaje de programación llamado Oak . Vaya, quiero decir verde . ¡Oh, mierda! Lo siento, me refería a Java ! (Sí, Java tenía algunos nombres agradables de una sílaba antes de obtener el nombre de dos sílabas que todos conocemos y amamos) Desarrollado por James Gosling, Java es sintácticamente similar a C ++ pero tiene diferentes características que son pros y contras con quien habla . Por ejemplo, debido a que Java abandonó la aritmética del puntero de C ++, al recolector de basura le resulta más fácil lidiar con la tipificación de datos y la referencia de objetos.

Excepto que Java tampoco lo “hace todo”, ya que acabo de escribir que si bien obtiene una ventaja en la recolección de basura, adopta una desventaja en la mala adaptación de bajo nivel.

Entonces, en este punto, deberías preguntarte: “Bien, entonces ¿por qué alguien simplemente no hace un lenguaje que haga todo ?”

Bueno, te acabo de decir la razón principal por qué. Java tuvo que perder una característica ( en nivel bajo l) para obtener una ventaja (en la recolección de basura ) . No puedes nadar con delfines mientras caminas con leones: un animal NECESITA el agua y el otro NECESITA la tierra (además, es más probable que el león te coma, lo que me pondría triste: [). Además, mencionamos los delfines, así que creo que este es un momento apropiado para inyectar una imagen de un delfín.

[Imagen tomada de PBS.]

Como diría mi sobrino de 2 años, Kayson, “¡Ay, qué lindo! ^ _ ^”

Otra razón en la que puedo pensar es: reescribir un compilador apesta . A veces es más fácil comenzar desde cero (como cuando no hiciste un diseño para tu proyecto de codificación y el programa terminó siendo tan malo, lo reescribiste por completo. Está bien, todos hemos estado allí) o, a veces es más fácil adaptar un lenguaje existente para hacer un preprocesador que termine convirtiéndose en el compilador para su, en este momento, un lenguaje completamente nuevo. Los cambios que ha realizado hasta ahora altera la naturaleza del lenguaje de manera tan drástica, que sería una fiesta llamarle el mismo nombre del idioma en el que lo basó; entonces, le das un nombre completamente nuevo que a su vez aumenta tu ego en un 100% (¿bromeas? ¿Un programador con un ego? Psh, no existe … ¿verdad?). Por cierto, quiero que vayas a la página de Wikipedia de tu idioma favorito y mires a la derecha, debajo de “Influenciado por”. Esto debería reforzar aún más el hecho de que los nuevos idiomas están hechos para mejorar o proporcionar herramientas alternativas de las que se ofrecen en los idiomas existentes. A continuación se muestra un fragmento de la página de Wikipedia para Ruby (lenguaje de programación) .

Para concluir esto, recapitulemos:

  • al agregar una función altamente específica a un nuevo idioma, generalmente tiene que perder una función en el proceso. Entonces surge la idea de hacer un lenguaje que “haga todo “.
  • Cuando se crea o se descubre una nueva tecnología, como la programación orientada a objetos, debe crear o mejorar los lenguajes existentes para utilizar las nuevas instalaciones.
  • Pero, al agregar una característica altamente específica a un nuevo idioma, …… [vea el primer boletín más arriba]

Quiero ser explícito en eso cuando escribo “perder una característica”, no necesariamente quiero decir que siempre perderás una característica completa de ese lenguaje; pero tal vez la simplicidad disminuye o la gestión de la memoria es más difícil, etc.

Lo más interesante y divertido para pensar con respecto a esta pregunta son las computadoras cuánticas y, por lo tanto, la programación cuántica.

Las computadoras cuánticas no funcionan de la manera que su programador típico espera, por lo que en realidad necesitamos un lenguaje que utilice la tecnología detrás de las computadoras cuánticas. Las computadoras cuánticas están construidas sobre las máquinas “clásicas” existentes, por lo que, si bien podemos usar la teoría y estructura gramatical de programación “clásica”, necesitamos nuevas herramientas en nuestros lenguajes “clásicos” para manipular los datos cuánticos.

En esencia, necesitamos nuevas ideas de programación y tal vez incluso paradigmas para lidiar con nuevas tecnologías . Parece que vamos a necesitar otro idioma …:]

De hecho, es posible crear un lenguaje de programación que satisfaga todas las necesidades. Se llama lenguaje ensamblador . Está lo más cerca posible del hardware de la computadora, sin recurrir al lenguaje de máquina (código binario). Finalmente, todos los programas se reducen a la ejecución a nivel de ensamblador o lenguaje de máquina.

La verdadera pregunta que se hace es si existe un lenguaje que, cualitativa y técnicamente, pueda satisfacer todas las necesidades, es decir, un lenguaje que:

  • permite el acceso de hardware (a la memoria y los registros) – C
  • tiene una sintaxis simple que facilita el aprendizaje – Smalltalk
  • admite múltiples paradigmas de programación – Scala
  • tiene soporte para una concurrencia eficiente – Go
  • tiene la máxima velocidad de ejecución de código nativo – C ++
  • elimina la administración manual de memoria mediante el uso de, digamos, recolección de basura – Java
  • y así.

El problema es que algunas de estas necesidades entran en conflicto entre sí. Por ejemplo, un lenguaje que admite múltiples paradigmas puede requerir características adicionales que complican la sintaxis, lo que dificulta el aprendizaje. Por supuesto, se puede lograr un equilibrio o una compensación de ingeniería que compromete algunos de estos objetivos. Este es el aspecto cualitativo del diseño del lenguaje.

¿Puede un lenguaje recolectado de basura, que generalmente está basado en VM, ejecutarse con el máximo rendimiento? ¿Es seguro y confiable usar un lenguaje que tiene acceso al hardware?

También hay limitaciones políticas que impiden que se cree dicho lenguaje. JavaScript es el único idioma nativo del navegador web. El desarrollo web no es posible sin al menos algo de JavaScript, por lo que ningún lenguaje que cree puede reemplazarlo por completo. Si pudiéramos lograr que todos los principales proveedores de navegadores adopten, por ejemplo, Smalltalk, eso nos facilitaría mucho la vida al resto de nosotros. La política apesta.

Para escribir programas rápidos, uno necesita optimizar, eso solo se puede hacer cuando se escribe ensamblaje o cerca del ensamblaje (C). Escribir servicios web requiere bibliotecas y abstracciones, esa es la razón por la que se utiliza Java (OOP con muchas bibliotecas). Necesita ser tan diferente, no será posible ser el mejor en todo (por ejemplo, no es posible hacer una grúa que funcione tan rápido como un Ferrari). Sin embargo, si está buscando un lenguaje que se ajuste a ambos con compromisos menores, puedo sugerirle uno.
La filosofía de D (Home – D Programming Language) es crear un lenguaje que sea el centroide de todas las ventajas posibles de los diferentes lenguajes de programación. Es rápido (no el más rápido), expresivo (no el más expresivo), multi-paradigma, GC opcional, no es muy difícil de aprender y cosas así.
Uno puede escribir tanto un controlador de dispositivo como aplicaciones web en D.
Todavía es un lenguaje pequeño, pero ha mostrado cierta promesa

Es una cuestión de abstracción. Los lenguajes de programación se pueden colocar en una “línea de abstracción” que depende de la aplicación que esté desarrollando. Podríamos decir que el lenguaje más concreto (es decir, menos abstracto) es el código de máquina. Eso está en el nivel de abstracción más bajo de todas las líneas de abstracción, requiere el máximo esfuerzo de codificación y puede usarse para cualquier aplicación posible.
En la parte superior de la línea de abstracción tiene el lenguaje más abstracto: tiene una sola declaración que realiza exactamente su aplicación completa; esto requiere el menor esfuerzo de codificación y solo puede ser usado por esa aplicación exacta.
Todos los otros idiomas se encuentran en el medio. Cuanto más se vuelve abstracto el lenguaje, menos general es. Piense en SQL: es bastante abstracto, pero no puede usarse para desarrollar nada más que DB.
A medida que los lenguajes ganan abstracción, pierden generalidad: en otras palabras, hay cada vez menos aplicaciones que podrían aprovecharlos.
Mientras que los lenguajes de bajo nivel manejan solo conceptos muy generales (variables, funciones, bucles), los lenguajes de nivel superior manejan conceptos específicos de dominio (tablas de nombres SQL, filas, consultas). Al ir más arriba en la línea de abstracción, los idiomas comenzarían a hablar el vocabulario de la aplicación. Suelen denominarse DSL (lenguajes específicos de dominio) y requieren su propio compilador personalizado. La mayoría de las veces, estos lenguajes de alto nivel no funcionan como un lenguaje de programación habitual como C o Java, pero manejan un subconjunto de los conceptos de aplicación que generan código intermedio en un lenguaje generalista como C o Java que simplemente se compila y vincula al resto de la aplicación (hay un claro ejemplo de lo que quiero decir en el artículo Cómo exportar un archivo binario a .CSV).
Por eso es imposible crear un lenguaje que satisfaga todas las necesidades.

Las lenguas son mecanismos definitorios. Permiten a un programador definir un problema del mundo real de una manera que una máquina pueda entender. Entonces, dependiendo de su problema del mundo real, puede parecer que hay un lenguaje “Mejor” para la definición. Tomemos los idiomas del mundo real, por ejemplo, los inuit tienen muchas palabras para describir la nieve, ¿por qué? porque la nieve es una gran parte de su vida y es extremadamente importante para ellos y es muy preciso describirla con precisión. Algunos idiomas no tienen ninguna palabra para nieve, sino que tendrían que describir la nieve con otras palabras para transmitir el significado. Si tratas de encontrar un lenguaje universal, perderías al intentar usarlo en la situación inuit o, si incluyes las palabras inuit, correrás el riesgo de confusión cuando no se necesite la complejidad.

En realidad, aunque lo que está viendo muchas veces no es que un lenguaje es adecuado o no para una necesidad particular, puede escribir un servidor web en C o Fortran o prácticamente cualquier idioma que no lo excluya específicamente de IO . Es más que las bibliotecas y estructuras construidas alrededor del lenguaje son más adecuadas para un trabajo en particular. Y eso se acumula con el tiempo y puede no tener nada que ver con para qué fue “diseñado” el lenguaje. C ya no se usa para construir sitios web porque hay un mayor nivel de abstracción acumulado sobre C que permite mejores definiciones. (Java, ASP.NET, etc.)

Java nunca ha hecho bien para lo que fue diseñado. Se suponía que Java era un lenguaje de interfaz de usuario cliente / escritorio que permitiría una escritura una vez ejecutada en cualquier lugar para el desarrollo. Nunca despegó realmente, la instalación fue difícil, la interfaz de usuario fue difícil de hacer lo suficientemente abstracto como para escribir una vez, manteniendo los beneficios de cada sistema operativo (¿botón único mac frente a botones de Windows 2/3?). Por lo tanto, Sun hizo un esfuerzo concertado para mover Java al dominio del servidor y eso resultó en Apache y Tomcat, que es la verdadera razón por la que las personas usan Java para crear sitios web. Java puro sería una forma horrible de construir un sitio web desde cero, y es un testimonio de la determinación de Sun y otras personas de código abierto de que Java eventualmente llegó al punto donde gran parte, si no la mayor parte, del desarrollo web está en Java. Pero no es porque el propio Java tenga muchas características especiales que lo hacen bueno para el desarrollo web. C ++ tendría la mayoría de las mismas características de lenguaje que Java y tendría un aumento de rendimiento porque habría sido un lenguaje verdaderamente compilado (esta diferencia ha desaparecido ahora ya que la mayoría de Java se compila en tiempo de ejecución), pero C ++ no tenía el respaldo que tenía Java, y tenía una dificultad / característica evidente con la administración de memoria.

Un último punto. Las necesidades cambian y, a medida que las necesidades cambian, los idiomas para definir esas necesidades son necesarios o los idiomas existentes deben cambiar. Cambiar un idioma existente es extremadamente difícil (intente convencer a los inuit de que no necesitan todas esas palabras para la nieve), por lo que se pueden desarrollar nuevos idiomas para manejar las nuevas necesidades.

Para mí, esta pregunta es similar a preguntar por qué es imposible crear un idioma que hable toda la población mundial. Personalmente, creo que es realmente bueno que todos en el mundo hablen el mismo idioma. Es tan bueno como todas las computadoras usan el mismo lenguaje de programación. Es posible, en teoría, pero es prácticamente casi imposible. ¿Podemos imaginar que todos los chinos hablen inglés? Incluso ellos quieren, pero no pueden, histórica, política y técnicamente. ¿Podemos pedirle a todos los estadounidenses que hablen chino? Ni siquiera quieren intentarlo, histórica, política y técnicamente. Lo mismo es para C / C ++ y Java. Aun así, el mundo está bien. No necesita un solo lenguaje universal.

Hay alrededor de 6.500 idiomas hablados hoy en día en todo el mundo. El mundo está bien.

Crédito de la foto: Minna Sundberg

Ahora considere los lenguajes de programación, en realidad hay más lenguajes de computadora que lenguajes humanos. Se informa que hay más de 8,500 lenguajes de programación. Apuesto a que debería haber mucho más que eso si contamos los lenguajes de las máquinas, los lenguajes ensambladores, los lenguajes de alto nivel de todo tipo, los lenguajes específicos de dominio y muchos lenguajes de programación internos que nunca están abiertos al público. El número es muy grande y sigue creciendo.

Foto de Computer Yearbook for 1969

Mire el árbol informático anterior desde ENIAC hasta 1969. Imagine cómo debería ser el árbol hoy. Se verá como un desastre aún mayor. No creo que la situación vaya a cambiar en el futuro previsible. Pero de todos modos, el mundo de las computadoras está bien. No necesita un solo lenguaje de programación para todo uso.

Un lenguaje de programación no es un lenguaje en el mismo sentido y francés o esperanto o incluso lenguaje de señas. Casi siempre es inglés. Pero es un subconjunto restringido de inglés que ha sido diseñado para ser inequívoco.

Los arquitectos no confían en una vista fotorrealista de un edificio como especificación, sino que dibujan planos para eliminar cualquier ambigüedad. Los ingenieros electrónicos no entregan un dibujo en perspectiva de un circuito, sino que dibujan un esquema por la misma razón. Los lenguajes de programación son así.

Pero un plano de un dispositivo mecánico usa un tipo de plano diferente al que haría un arquitecto, porque no hay cables ni tuberías, pero hay piezas giratorias y ajustes de deslizamiento que son críticos. Y una especificación para un controlador electrónico es un diagrama de escalera en lugar de un diagrama esquemático; es mucho más explicativo.

El mismo tipo de variaciones es válido para la programación. La variedad de lenguajes de programación puede disminuir en el futuro, aunque todavía no hemos visto signos de que esto suceda, pero todavía habrá lenguajes para el trabajo del sistema, otros para aplicaciones y otros para sitios web. Esperemos que la sintaxis continúe convergiendo.

Esa es una pregunta realmente genial. Aquí hay algunas respuestas buenas y bastante largas, así que permítanme dar una respuesta muy breve, ojalá que esté bien:

Es porque hay una compensación entre rendimiento y abstracción .

Escribes juegos y controladores de hardware en C porque es un lenguaje de alto rendimiento / baja abstracción . Le da acceso al metal desnudo y, a cambio, debe cuidar bien todo ese metal complicado.

Escribe sistemas distribuidos y servidores web complejos en Java porque es un lenguaje de rendimiento medio / abstracción media . Está en un punto óptimo en el que no tiene que preocuparse tanto por la administración de la memoria, pero sí tiene que lidiar con tipos estáticos y jerarquías complejas de objetos y serialización y redes, al menos en cierta medida. Como tal, él y otros lenguajes JVM como Scala y Clojure, han visto una implementación muy amplia.

Escribe aplicaciones web y aplicaciones moderadamente complejas en lenguajes dinámicos como JavaScript y Python, que son lenguajes de bajo rendimiento / alta abstracción . No te preocupas por los tipos, obtienes colecciones integradas, etc. Puedes ser increíblemente productivo, pero pierdes algo de control y algo de capacidad para ajustar realmente el rendimiento.

Creo que incluso más profundo que la dirección de “la herramienta adecuada para el trabajo” que toman la mayoría de estas respuestas, es la idea de que muchas características deseables de un lenguaje son inherentemente excluyentes. Para un ejemplo extremo, tome el rendimiento máximo versus la simplicidad máxima del lenguaje.

Para tener el máximo rendimiento, un lenguaje tiene que darle las herramientas para aprovechar al máximo las características del hardware en una plataforma de destino (SIMD, aceleración de GPU, SMP, etc.). Incluso si el lenguaje (+ biblioteca / marco estándar) no te hace llamar directamente a ellos, todavía tiene que presentar un modelo de programación lo suficientemente sofisticado que pueda saber cómo traducir tu código para aprovechar esas características. Es exactamente esa sofisticación la que contradice directamente el impulso hacia la simplicidad.

Esto no es solo una interacción específica entre estas dos características. Hay muchas dimensiones de “necesidades” para un lenguaje de programación que NO son independientes de otros. Esta dependencia significa, en un nivel de abstracción casi termodinámico, que es imposible tener un lenguaje que satisfaga las necesidades de todos.

Antes de poder crear un lenguaje de programación que satisfaga todas las necesidades, primero debe crear un paradigma de programación que satisfaga todas las necesidades. Actualmente, los diferentes paradigmas se ajustan mejor a áreas problemáticas específicas y para un mejor ajuste requieren un lenguaje de programación que se ajuste a ese paradigma y se construya sobre un conjunto de paradigmas compatibles. Hay lenguajes de paradigma mixto, claro, pero estos hacen un lío o terminan no siendo un lenguaje de programación único. Considere C ++. C ++ es GRANDE y permite usar múltiples paradigmas. Es un lenguaje imperativo si no utiliza plantillas, y si realiza la mayor parte de su programación en bibliotecas de plantillas, se convierte en un lenguaje de programación funcional. Tener eso disponible es increíble si estás dispuesto a escribir todo desde cero, pero si no quieres eso y quieres usar bibliotecas, entonces las cosas se complican. Por un lado, tiene grandes bibliotecas de clases como Qt que son desordenadas pero vienen con muchas características importantes. Por otro lado, tiene bibliotecas de plantillas modernas y limpias que carecen de la funcionalidad importante que esperaría en un entorno de programación de propósito general. Como resultado, probablemente necesite usar ambos en el mismo proyecto y el proyecto se convertirá en un desagradable desastre de pesadillas entre paradigmas. Personalmente, diría que C ++ no es un lenguaje de programación. C ++ combinado con un documento de guía de codificación es un lenguaje, combinado con otro documento de guía de codificación es un lenguaje completamente diferente. La combinación de bibliotecas para las pautas de codificación C ++ A con las pautas de codificación C ++ B y / o C termina siendo un desastre. Creo que esto se convertiría en la fe inevitable de CUALQUIER lenguaje que intente ser completamente multi-paradigmático como lo hace C ++. Java ha mantenido una gran parte de su popularidad exactamente por el hecho de que siendo un lenguaje de paradigma único de nicho limitado ha permitido que surja un ecosistema de paradigma único. El enfoque de OO como paradigma único muestra hoy grietas importantes y cada vez más lenguajes imperativos parecen moverse hacia la inclusión de al menos algunas construcciones funcionales en el lenguaje, mientras que en el otro lado de las cosas, una forma realmente más estricta de OO ”. La disciplina de la capacidad del objeto está ganando tracción que combina aspectos del modelo de cómputo del actor con una adhesión muy estricta a un subconjunto OO. Entonces, tal vez en el futuro uno de estos dos paradigmas demostrará ser un tamaño único para todos, pero incluso hay otros locos que romper en el ámbito de los paradigmas de programación. O eso, o necesitamos encontrar una forma más elegante para que los paradigmas coexistan en un solo idioma. Una forma que permite y estimula a las bibliotecas para que sean multipardemadas por sí mismas. Algo así como una versión de capacidades de objeto del lenguaje Rust que incluye soporte para la programación funcional de plantillas. No, solo de pensarlo un minuto más y me doy cuenta de que probablemente también terminaría como C ++ ahora. Un gran lenguaje multi-paradigmático que carece de un ecosistema multi-paradigmático de bibliotecas y marcos.

Usando la condición física como ejemplo, un velocista necesita músculo para ir rápido. Un corredor de maratón necesita correr durante mucho tiempo para que todo ese músculo lo dificulte. C o ensamblaje son de bajo nivel, pero difíciles de escribir. Java tiene un nivel bastante alto, por lo que la legibilidad es buena, pero es más lenta.

No hay lenguajes de programación perfectos, solo el lenguaje correcto para el trabajo correcto. Al igual que no hay un cuerpo perfecto, solo el cuerpo adecuado para la tarea correcta.

Esta pregunta se puede generalizar a muchas otras cosas …

p.ej. Lenguajes Humanos, Culturas de Alimentos, Ropa, Especies

y tiene algo que ver con la evolución.

Los idiomas humanos evolucionaron durante el período de tiempo y para satisfacer la necesidad de “entonces” las normas sociales, actividades diarias, culturas disponibles.

Del mismo modo, el propósito de los lenguajes informáticos es hablar con el hardware y los programadores subyacentes y hacer que ambos se sientan cómodos en su trabajo respectivo,

El concepto de lenguajes de programación existe incluso antes de la existencia formal de las computadoras. En ese momento era más un modelo matemático.

Por lo tanto, los lenguajes de programación también están evolucionando y se han dividido en muchas generaciones (algunos lo aceptan poco).

Sí, definitivamente, las personas intentan adaptar una para todas las soluciones cuando tienen la intención de diseñar, pero luego durante el período del dominio de “todos” los cambios.

En realidad, no creo que deba ser imposible en absoluto. ¿Has echado un vistazo a The Julia Language?

Solo creo que tomará mucha más codicia (Por qué creamos a Julia) y mucho más pensamiento innovador (Abstracción en informática técnica) sin tener en cuenta el status quo, los paradigmas actuales o los dogmas percibidos.

En mi humilde opinión, Julia ya está yendo en la dirección correcta para convertirse en un lenguaje dinámico y más general, pero aún con un lenguaje muy eficaz, gracias a su diseño elegante (que todavía está en desarrollo, por lo que todavía queda mucho por hacer).

Creo que se convertirá en el lenguaje de programación más avanzado tecnológicamente hasta ahora.

Si crees que eso no es suficiente o escuchas que un desarrollador de Julia dice que Julia no pretende ser tan general, tal vez sea solo porque necesitan más avaricia, ¡así que comparte el tuyo!

La respuesta se ha explicado más o menos, pero para una dosis de diversión, esta es la verdadera razón:

Src: xkcd.com

Esta línea no tiene ningún valor real, pero es necesaria porque Quora bot es exigente. Debe entender que menos es más, y antes de que establezcan un límite total de caracteres, eso no es lo que se debe hacer. No hay nada menos productivo que obligar a las personas a escribir. Así que solo estoy dando cosas al azar que se me pasan por la cabeza en este momento.

Vaya a chrome: // flags y active el diseño del material. Todavía es experimental, pero se ve un poco mejor.

Aprende a usar el teclado, como en serio, es muy útil.

Estudie algunos javascript básicos y jquery. Nunca se sabe cuándo puede ser útil.

Inspirado en la última publicación de xkcd (/ 1625 /) hice una extensión para cambiar las instancias de algunas palabras específicas a otras. Es bastante divertido en las páginas de noticias de hecho.

Tal vez este maldito bot de Quora esté satisfecho, porque me estoy quedando sin pensamientos.

Caballos de carreras. ¿Desea un vehículo de uso general para todas las necesidades, desde desplazamientos a través de cargas pesadas hasta terrenos difíciles? Aunque el hardware subyacente puede ser el mismo, los trabajos que se realizan difieren mucho. Los idiomas se ajustan a la tarea, no al hardware. La variedad de idiomas muestra la variedad de tareas que realizan las computadoras y es algo bueno, no malo. Aprender un nuevo idioma no es tan difícil, y si el idioma está optimizado para su dominio problemático, es mucho más fácil que tratar de forzar a un idioma optimizado para un dominio diferente a hacer un trabajo para el que no está adaptado.

No existe tal barrera y, de hecho, todos los ingenieros de software con algunos años de experiencia tienen la necesidad de probar. Es por eso que hay tantos lenguajes de programación, actuales y olvidados. Desde una perspectiva puramente pragmática, si un lenguaje de programación es Turing completo, entonces el resto es azúcar sintáctico.

Desafortunadamente, la mayoría de los diseñadores de idiomas modernos simplemente roban conceptos al por mayor entre sí, por lo que hay muy poca diferencia práctica entre la mayoría de los lenguajes de programación modernos.

La única opción real que tiene que hacer al diseñar un nuevo lenguaje de programación es qué hacer con los dos puntos. Primera ley de Larry: todos quieren el colon.

La forma más simple que puedo decir es esta: ¿por qué querrías hacer esto? Terminarías con un lenguaje de navaja suiza ultra omega. Claro, puede haber una herramienta para todo, pero ¿qué pasa si su trabajo requiere solo un abrelatas y un sacacorchos, pero tiene que configurar todas sus herramientas cada vez que quiera tomar vino y una lata de frijoles horneados?

La fuerza, si lo desea, de un idioma dado es qué tan bien funciona para completar una tarea específica. ¿Quieres hacer un prototipo rápido? Hay idiomas que funcionan bien para eso porque hay menos código de “placa de caldera”, menos trabajo por debajo del capó, etc.

No hay barrera, tales idiomas existen.

Puedes usar C para lo que quieras, puedes escribir un SO con él o puedes hacer un sitio web con él (lo tengo), no hay nada que te impida usar C para absolutamente todo.

Sin embargo, probablemente le resulte un poco arduo escribir un sitio web con C, y le resultará más fácil PHP o Ruby, pero ¿eso significa que deberíamos incorporar características de PHP a C? Yo diría que no, porque sería extremadamente difícil hacer una combinación sensata de los dos, por ejemplo, en cosas de C necesito malloc / free, pero en cosas de PHP no. Eww.

C satisface todas sus necesidades y más, pero probablemente le resulte más fácil usar una herramienta diferente más diseñada para el trabajo.

Ninguna herramienta es adecuada para todos los trabajos. Es solo un hecho de la vida. Además, si existiera dicha herramienta, a algunos les podría gustar y algunos usuarios no se basarían en sus preferencias personales. Considero que Java es demasiado verbos y, aunque es un lenguaje poderoso, evito usarlo. Tengo muchas ganas de hablarle a mi computadora de la misma manera que le hablo a un humano en lenguaje natural y a la computadora que escribe su propio código. Es por eso que sigo de cerca el progreso del proyecto Watson y bluemix de IBM. Si está pensando en el futuro, le sugiero que investigue la informática cognitiva.

¿Por qué es imposible crear una herramienta que satisfaga todas las necesidades? Quiero decir, martillos, destornilladores, alicates, taladros y … ¿No sería posible crear una herramienta que satisfaga todas esas necesidades? ¿Cuál es la barrera que impide que eso suceda?

Esto es esencialmente (si es un poco exagerado para el efecto) lo que está preguntando. Diferentes dominios tienen diferentes necesidades en la elección de herramientas. Y si intenta hacer algo que funcione en todos los dominios, tendrá algo en lo que probablemente tampoco funcionará muy bien. Jack de todos los oficios, maestro de nada.