tipos son que programacion mejor mas los lenguajes lenguaje facil ejemplos cuales aprender programming-languages

programming-languages - son - mejor lenguaje de programacion web



¿Cuál es el peor lenguaje de programación con el que alguna vez trabajó? (30)

Si tiene una historia interesante para compartir, publique una respuesta , pero no abuse de esta pregunta por criticar un idioma.

Somos programadores, y nuestra herramienta principal es el lenguaje de programación que utilizamos.

Si bien hay mucha discusión sobre la mejor, me gustaría escuchar sus historias sobre los peores lenguajes de programación con los que haya trabajado alguna vez y me gustaría saber exactamente qué lo molestó.

Me gustaría recopilar estas historias en parte para evitar trampas comunes al diseñar un lenguaje (especialmente un DSL) y en parte para evitar lenguajes estrafalarios en el futuro en general.

Esta pregunta no es subjetiva . Si un idioma solo admite identificadores de un solo carácter (ver mi propia respuesta ), esto es malo de una manera no discutible .

EDITAR

Algunas personas han expresado su preocupación de que esta pregunta atraiga a los trolls. Recorrer todas sus respuestas dejó una cosa clara. La gran mayoría de las respuestas es apropiada, útil y está bien escrita.

ACTUALIZACIÓN 2009-07-01 19:15 GMT

La descripción general del idioma ahora está completa, cubriendo 103 idiomas diferentes de 102 respuestas. Decidí ser poco estricto sobre lo que cuenta como lenguaje de programación e incluí algo razonable. Gracias David por tus comentarios sobre esto.

Aquí están todos los lenguajes de programación cubiertos hasta ahora (orden alfabético, vinculado con la respuesta, nuevas entradas en negrita):

ABAP , todos los idiomas del siglo XX , todos los idiomas de arrastrar y soltar , todos los lenguajes propietarios , APF , APL (1) , AS400 , Authorware , Autohotkey , BancaStar , BASIC , Bourne Shell , Brainfuck , C++ , desarrollador de equipo Centura , Cobol (1) , Cold Fusion , Coldfusion , CRM114 , Crystal Syntax , CSS , Dataflex 2.3 , DB / c DX , dbase II , DCL , Delphi IDE , Doors DXL , DOS por lotes (1) , Excel Macro Language , FileMaker , FOCUS , APL , FORTRAN , FORTRAN 77 , HTML , hoja web Illustra , lenguaje Informix 4th Generation , hoja web Informix Universal Server , INTERCAL , Java , JavaScript (1) , JCL (1) , karol , LabTalk , Labview , Lingo , LISP , Logo , LOLCODE , LotusScript , m4 , Magic II , Makefiles , MapBasic , MaxScript , Meditech Magic , MEL , mIRC Script , MS Access , MUMPS , Oberon , extensiones de objetos para C , Objective-C , OPS5 , Oz , Perl (1) , PHP , PL/SQL , PowerDynamo , PROGRESO 4GL , prova , PS-FOCUS , Python , expresiones regulares , RPG , RPG II , Cobol , FileMaker , m4 , Smalltalk Smalltalk , Smalltalk , SNOBOL , SpeedScript , Sybase PowerBuilder , Symbian C ++ , Sistema RPL , TCL , (1) , El entorno del software visual , Tiny praat , TransCAD , troff , uBasic , VB6 (1) , VBScript (1) , VDF4 , Vimscript , Visual Básico (1) , Visual C ++ , Visual Foxpro , VSE , SpeedScript , XSLT

Las respuestas que cubren el ensamblador 80386, VB6 y VBScript han sido eliminadas.


Solo hay dos tipos de idiomas: aquellos de los que todos se quejan y los que nadie usa.

Bjarne Stroustrup


VSE, el entorno de software visual.

Este es un lenguaje que un profesor mío ( Dr. Henry Ledgard ) intentó vendernos en la escuela de pregrado / posgrado. (No me siento mal por dar su nombre porque, por lo que puedo decir, sigue siendo un gran defensor y agradecería la oportunidad de convencer a algunas personas de que es lo mejor desde el pan rebanado). Cuando lo describo a la gente, mi mejor analogía es que es una especie de hijo bastardo de FORTRAN y COBOL, con algunos errores extra añadidos. De la única carpeta realmente accesible que he encontrado con este material (hay mucho más allí que no voy a vincular específicamente aquí):

VSE se basa en lo que ellos llaman "El Principio de Separación". La idea es que Data and Behavior debe estar completamente segregado. Imagine el requisito de C de que todas las variables / datos se deben declarar al principio de la función, excepto que ahora mueva esa declaración a un archivo separado que otras funciones también puedan usar. Cuando otras funciones lo usan, están usando los mismos datos, no una copia local de datos con el mismo diseño.

¿Por qué hacer las cosas de esta manera? Aprendimos de The Software Survivors que las reglas de alcance variable son difíciles. Incluiría una cita pero, como a la mayoría de los tontos, les toma a estos muchachos por siempre decir algo. Busque en ese PDF "Quagmire Of Scope" y descubrirá algo de verdadera iluminación.

Continúan afirmando que esto de alguna manera lo hace más adecuado para entornos de múltiples procesos porque modela más de cerca la implementación de hardware subyacente. Riiiight.

Otro tema de elección que aparece con frecuencia:

INCREMENT DAY COUNT BY 7 (or DAY COUNT = DAY COUNT + 7) DECREMENT TOTAL LOSS BY GROUND_LOSS ADD 100.3 TO TOTAL LOSS(LINK_POINTER) SET AIRCRAFT STATE TO ON_THE_GROUND PERCENT BUSY = (TOTAL BUSY CALLS * 100)/TOTAL CALLS

A pesar de que no es una sacudida de la tierra, el estilo de la aritmética refleja el uso común, es decir, cualquiera puede leerlo y comprenderlo, sin conocer un lenguaje de programación. De hecho, la aritmética de VisiSoft es virtualmente idéntica a FORTRAN, incluida la aritmética compleja incorporada. Esto pone a los programadores preocupados por su estado profesional y la seguridad laboral correspondiente.

Ummm, no está tan preocupado en absoluto, realmente. Uno de los puntos clave de venta que Bill Cave utiliza para tratar de vender VSE es la democratización de la programación para que los empresarios no tengan que ceñirse a los programadores que usan herramientas alocadas y arcanas con el único propósito de garantizar el empleo. Aprovecha este miedo irracional para vender su herramienta. (Y funciona-- el gobierno federal es su mayor cliente). Conté 17 usos de la frase "seguridad laboral" en el documento. Ejemplos:

  • ... y apto solo para aquellos que desean una seguridad laboral artificial .
  • ¿Más seguridad laboral falsa ?
  • ¿La seguridad laboral depende de garantizar que el otro no pueda descifrar qué se hizo?
  • ¿La seguridad laboral depende del código complejo ...?
  • Una de las fuerzas más fuertes que afectan la aceptación de la nueva tecnología es la percepción de la seguridad laboral .

Él usa esta paranoia para abrir una brecha entre los gerentes que manejan los bolsos y las personas técnicas que tienen el conocimiento para reconocer a VSE por el tumulto que es. Así es como él lo exprime en las empresas: "¡Sus técnicos solo dicen que apesta porque temen que los vuelva obsoletos!"

Algunas citas de opciones adicionales de la documentación general:

Otra consecuencia de este enfoque es que los datos se mapean en la memoria en base a "Lo que ves es lo que obtienes" , y se mantienen en todo momento. Esto permite a los usuarios mover una estructura completa como una cadena de caracteres en una plantilla que describe cada campo individual. Se pueden redefinir varias plantillas para un área de almacenamiento determinada. A diferencia de C y otros lenguajes, las subestructuras pueden moverse sin problemas de desalineación debido a los estándares de alineación de límites de palabras.

Ahora, no sé ustedes, pero sé que un enfoque WYSIWYG para el diseño de la memoria está en la parte superior de mi lista de prioridades en lo que respecta a la elección del idioma. Básicamente, ignoran los problemas de alineación porque solo los idiomas antiguos que se diseñaron en los años 60 y 70 se preocupan por la alineación de palabras. O algo así.El razonamiento es falso. Tenía tan poco sentido para mí que procedí a olvidarlo casi de inmediato.

No hay tipos definidos por el usuario en VSE. Esta es una decisión de gran alcance que simplifica enormemente el lenguaje. La ganancia desde un punto de vista práctico también es excelente. VSE permite que el diseñador y el programador organicen un programa en la misma línea que un sistema físico modelado. VSE permite construir estructuras en una jerarquía de atributos lógicos fácil de leer.

¡Increíble!Los tipos definidos por el usuario son cojos. ¿Por qué querría algo así como un InputMessageobjeto cuando puedo tener:

LINKS_IN_USE INTEGER INPUT_MESSAGE 1 ORIGIN INTEGER 1 DESTINATION INTEGER 1 MESSAGE 2 MESSAGE_HEADER CHAR 10 2 MESSAGE_BODY CHAR 24 2 MESSAGE_TRAILER CHAR 10 1 ARRIVAL_TIME INTEGER 1 DURATION INTEGER 1 TYPE CHAR 5 OUTPUT_MESSAGE CHARACTER 50

Podrías mirar eso y pensar: "Oh, eso está muy bien formateado, aunque sea un poco en la vieja escuela". La vieja escuela tiene razón. El espacio en blanco es significativo, muy significativo. ¡Y redundante! El 1debe estar en la columna 3. El 1indica que está en el primer nivel de la jerarquía. El nombre del Símbolo debe estar en la columna 5. Las jerarquías están limitadas a una profundidad de 9.

Bueno, está bien, ¿pero es eso tan horrible? Solo espera:

Es bien sabido que para leer texto, el uso de mayúsculas / minúsculas convencionales es más legible. VSE utiliza todas las mayúsculas (a excepción de los comentarios). ¿Por qué?La literatura en psicología se basa en la prosa. Los programas, simplemente, no son prosa. Los programas son más como matemáticas, contabilidad, tablas. Las fuentes de programa (generalmente Courier) son casi universalmente fijas -toma, y ​​por una buena razón- alineación vertical entre líneas de código relacionadas. Los programas en mayúsculas son muy fáciles de leer y, después de un tiempo, mucho mejor en nuestra opinión

¡Nada como aplicar tu opinión en el nivel del idioma! Así es, no puedes usar ninguna minúscula en VSE a menos que esté en un comentario. Solo mantén activado CAPSLOCK, estará atascado allí por un tiempo.

Los subprocedimientos de VSE se llaman procesos. Este ejemplo de código contiene tres procesos:

PROCESS_MUSIC EXECUTE INITIALIZE_THE_SCENE EXECUTE PROCESS_PANEL_WIDGET INITIALIZE_THE_SCENE SET TEST_BUTTON PANEL_BUTTON_STATUS TO ON MOVE '' '' TO TEST_INPUT PANEL_INPUT_TEXT DISPLAY PANEL PANEL_MUSIC PROCESS_PANEL_WIDGET ACCEPT PANEL PANEL_MUSIC *** CHECK FOR BUTTON CLICK IF RTG_PANEL_WIDGET_NAME IS EQUAL TO ''TEST_BUTTON'' MOVE ''I LIKE THE BEATLES!'' TO TEST_INPUT PANEL_INPUT_TEXT. DISPLAY PANEL PANEL_MUSIC

Todo en mayúsculas como se esperaba. Después de todo, eso es más fácil de leer. Tenga en cuenta el espacio en blanco. Es significativo de nuevo. Todos los nombres de procesos deben comenzar en la columna 0. El nivel inicial de instrucciones debe comenzar en la columna 4. Los niveles más profundos deben sangrarse exactamente 3 espacios. Esto no es un gran problema, sin embargo, porque no se te permite hacer cosas como condicionales de nido. ¿Quieres un condicional anidado? Bueno, solo haz otro proceso y llámalo. ¡Y tenga en cuenta la deliciosa sintaxis COBOL-esque!

¿Quieres bucles? Fácil:

EXECUTE NEXT_CALL EXECUTE NEXT_CALL 5 TIMES EXECUTE NEXT_CALL TOTAL CALL TIMES EXECUTE NEXT_CALL UNTIL NO LINES ARE AVAILABLE EXECUTE NEXT_CALL UNTIL CALLS_ANSWERED ARE EQUAL TO CALLS_WAITING EXECUTE READ_MESSAGE UNTIL LEAD_CHARACTER IS A DELIMITER

Ugh.


¿Aún no tienes respuesta sobre Cobol? : O


BÁSICOS Old-skool con números de línea sería mi elección. Cuando no tenías espacio entre los números de línea para agregar nuevas líneas, tenías que ejecutar una utilidad de renumeración, lo que provocaba que perdieras cualquier anclaje mental que tenías hasta dónde estaba.

Como resultado, terminaste exprimiendo demasiadas afirmaciones en una sola línea (separadas por dos puntos), o hiciste un goto o un gosub en otro lugar para hacer el trabajo que no podías hacer.


Bueno, ya que esta pregunta se niega a morir y dado que el OP me instó a responder ...

Humildemente propongo para su consideración Authorware (AW) como el peor lenguaje que es posible crear. (nb Me estoy retirando de la memoria aquí, han pasado ~ 6 años desde que utilicé AW, lo que por supuesto significa que hay una serie de cosas horribles que ni siquiera puedo recordar)

el horror, el horror http://img.brothersoft.com/screenshots/softimage/a/adobe_authorware-67096-1.jpeg

Comencemos con el hecho de que es un producto de Macromedia (-10 puntos), un lenguaje propietario (-50 más) destinado principalmente a la creación de software de e-learning y, además, software que podría ser creado por programadores y programadores no iguales implementados como un ícono idioma Y un lenguaje de texto (-100).

Ahora bien, si esa última afirmación no te asustó, entonces no has tenido que corregir el código generado WYSIWYG antes (¡hola desarrolladores de Dreamweaver y Frontpage!), Pero el punto sobresaliente es que AW tenía una biblioteca de aproximadamente 12 elementos que podrían ser arrastrado en un flujo. Como elementos de "Página", Animaciones, IFELSE y GOTO (-100). Por supuesto, la eliminación de objetos del flujo creó cualquier cantidad de conexiones y artefactos rotos con los que el IDE tuvo que lidiar con niveles variables de éxito. Naturalmente, los asistentes incorporados (-10) fueron una fuente importante de estos.

Afortunadamente, siempre puedes acceder a una vista de código y, con el tiempo, deberías hacerlo porque, con un conjunto limitado de elementos icónicos, algunas cosas simplemente no eran posibles. El lenguaje en sí estaba basado en TUTOR (-50) - un candidato para el peor lenguaje en sí mismo si solo tuviera la ambición y el alcance para alcanzar las profundidades que AW trataría de alcanzar - sobre lo cual wikipedia dice:

... el lenguaje TUTOR no fue fácil de aprender. De hecho, incluso se sugirió que se necesitarían varios años de experiencia con el lenguaje antes de que los programadores pudieran crear programas que valieran la pena conservar.

Una excelente base, que fue construida en los años previos al surgimiento de Internet sin nada. Absolutamente ninguna forma de estructura de datos más allá de una matriz (-100), ciertamente no hay azúcar (¿los hombres de verdad no usan declaraciones de interruptor?) (-10), y una gran salpicadura de vinagre sintáctico ("-" era el indicador de comentario tan no hay operador de decremento para usted!) (-10). La documentación de referencia del idioma se proporcionó en papel o en formato de archivo comprimido (-100), pero al menos contó con el respaldo del desarrollador y usó grupo de usuarios y pudo establecer rápidamente que la solución a su problema era utilizar las funciones de importación DLL o SWF de AW para habilitar usted para hacer la codificación real en un lenguaje real.

AW fue conducido por un flujo (con los comandos PAUSE necesarios) y por lo tanto tiene todos los problemas asociados de un sistema lineal en lugar de basado en eventos (-50), ya pesar de las mentiras directas de comercialización de la documentación, no estaba orientado a objetos (-50) ya sea. Toda la reutilización del código se logró a través de GOTO. Sin alcance, muchos globales (-50).

No es la culpa del idioma directamente, pero obviamente no fue posible la integración de control de fuente , y ciertamente no hay TDD, generación de documentación o cualquier otra herramienta adicional que te pueda gustar.

Por supuesto, Macromedia enfrentó el desafío de Internet con una obstinada negativa a participar durante años, produciendo eventualmente la pesadilla de seguridad, difícil de usar y con errores, que es Shockwave (-100) para serializar esencialmente versiones de escritorio del software a través de un plugin requerido. (-10) A medida que HTML aumentaba, AW también se estancaba, aún persistiendo con su entrega de onda de choque incluso ante los estándares de Javascript de IEEE SCORM.

En última instancia, después de años de mendicidad y promesas, Macromedia anunció una nueva versión radical de AW en el desarrollo para abordar estos problemas, y unos años más tarde deslocalizó el desarrollo y luego canceló el proyecto. Aunque, por supuesto, Macromedia todavía lo está vendiendo (BONO MALO -500).

Si hay algo más que decir, este es el lenguaje que permite espacios en nombres de variables (-10000).

Si alguna vez desea experimentar un verdadero dolor, intente leer la notación húngara no comentada de otra persona en un idioma que no distinga entre mayúsculas y minúsculas y que permita espacios de nombres variables.

Puntaje Arbitrario Total de Annakata (AAS): -11300
Ajustado para la experiencia personal: OutOfRangeException

(disculpas por la longitud, pero fue catártico)


DOS archivos por lotes. No estoy seguro de si esto califica como lenguaje de programación. No es que no puedas resolver tus problemas, pero si estás acostumbrado a bash ...

Solo mis dos centavos.


El peor lenguaje que he visto proviene de la herramienta praat, que es una buena herramienta de análisis de audio. Hace un trabajo bastante bueno hasta que usa el lenguaje de script. suspirar malos recuerdos.

Tiny praat script tutorial para principiantes

  • Llamada de función

    Hemos enumerado al menos 3 sintaxis de llamada de función diferente:
    • El regular

      string = selected("Strings")

      Nada especial aquí, le asigna a la cadena variable el resultado de la función seleccionada. No es realmente aterrador ... todavía.

    • "Invoco un comando de GUI con parámetros"

      Create Strings as file list... liste ''path$''/''type$''

      Como puede ver, el nombre de la función comienza en "Crear" y termina con "...". El comando "Crear cadenas como lista de archivos" es el texto que se muestra en un botón o en un menú (tengo miedo de comprobarlo) en la pantalla. Este comando toma 2 parámetros liste y una expresión. Voy a mirar más profundamente en la expresión ''path$''/''type$''

      Hmm. Sí. No hay espacios. Si se introdujeron espacios, serían argumentos separados. Como se puede imaginar, los paréntesis no funcionan. En este punto de la descripción, me gustaría señalar el sufijo de los nombres de las variables. No lo desarrollaré en este párrafo, solo estoy bromeando.

    • El "Oh, pero quiero obtener el resultado del comando GUI en mi variable"

      noliftt = Get number of strings
      Sí, podemos ver un patrón aquí, nombre de función largo y extraño, debe ser una llamada GUI. Pero no hay ''...'' así que no hay parámetros. No quiero ver cómo se ve el analizador.
  • El increíble sistema de tipos

    (AKA Haskell y OCaml, praat viene a ti)
    • Tipos nativos simples

      windowname$ = left$(line$,length(line$)-4)

      Entonces, ¿qué está pasando allí? Ahora es el momento de mirar la convención y los tipos de expresión, así que aquí tenemos:

      • left $ :: (String, Int) -> String
      • longitud :: (Cadena) -> Int.
      • nombre de ventana $ :: String
      • línea $ :: Cadena
      Como puede ver, los nombres de variables y nombres de funciones tienen el sufijo correspondiente con su tipo o tipo de retorno. Si su sufijo es ''$'', devuelve una cadena o es una cadena. Si no hay nada, es un número. Puedo ver el punto de anteponer el tipo a una variable para facilitar la implementación, pero al sufijo, no lo siento, no puedo
    • Tipo de matriz

      Para mostrar el tipo de matriz, permítanme introducir un ''pequeño'' bucle:

      for i from 1 to 4     Select... time time     bandwidth''i''$ = Get bandwidth... i     forhertz''i''$ = Get formant... i endfor

      Tenemos i que es un número y ... (no, no es una función)
      bandwidth''i''$
      Lo que hace es crear variables de cadena: bandwidth1$ , bandwidth2$ , bandwidth3$ , bandwidth4$ y darles valores. Como puede esperar, no puede crear una matriz bidimensional de esta manera, debe hacer algo como eso: band2D__''i''__''j''$

      http://img214.imageshack.us/img214/3008/scaredkittylolqa2.jpg
    • La invocación de cadena especial

      outline$ = "''time''@F''i'':''forhertznum''Hz,''bandnum''Hz, ''spec''''newline$''" outline$ >> ''outfile$''

      Las cadenas se manejan de forma extraña (al menos) en el idioma. el '''' se usa para llamar el valor de una variable dentro de la cadena global "". Esto es extraño . Va en contra de todas las convenciones integradas en muchos idiomas, desde bash a PHP pasando por el powershell. Y mira, incluso recibió una redirección. No te dejes engañar, no funciona como en tu querido caparazón. No, tienes que obtener el valor de la variable con el ''''

    • Modelo de ejecución de Da Wonderderderfulful

      Voy a darle el toque final a esta maravillosa presentación al hablar con usted sobre el modelo de ejecución. Entonces, como en todos los lenguajes de procedimiento, la instrucción se ejecuta de arriba a abajo, están las variables y la GUI de praat. Es decir, usted codifica todo en la guía praat, invoca comandos escritos en el menú / botones.

      La ventana principal de praat contiene una lista de elementos que pueden ser:

      • archivos
      • lista de archivos (creada por una función con un nombre largo y maravilloso)
      • Spectrogramm
      • Cadenas (no preguntar)
      Por lo tanto, si desea realizar una operación en un archivo determinado, debe seleccionar el archivo en la lista mediante programación y luego presionar los diferentes botones para realizar algunas acciones. Si desea pasar parámetros a una acción de la GUI, debe seguir el diseño de la GUI del formulario para sus argumentos, por ejemplo " To Spectrogram... 0.005 5000 0.002 20 Gaussian " es así porque sigue este diseño:

      http://img7.imageshack.us/img7/5534/tospectrogramm.png

    No hace falta decir que mis pesadillas están llenas de guiones de praat bailando a mi alrededor y gritando "DEBUG MEEEE !!".

    Más información en el sitio de praat , bajo la sección bien nombrada "lenguaje de scripts programable fácil"


  • En serio: Perl. Es un dolor de cabeza programar con principiantes e incluso con semiprofesionales que trabajan con Perl diariamente. Puedo ver constantemente a mis colegas luchar con el lenguaje, construyendo los peores guiones, como 2000 líneas sin tener en cuenta ningún estándar de codificación bien aceptado. Es el peor desastre que he visto en la programación. Ahora, siempre se puede decir que esas personas son malas en la codificación (a pesar del hecho de que algunas de ellas han usado Perl durante muchos años, ahora), pero el lenguaje simplemente alienta toda esa maldita mierda que me hace gritar cuando tengo para leer un guion de otro chico.


    MS Access Visual Basic para Aplicaciones (VBA) también fue bastante malo. El acceso fue malo, ya que te obligó a bajar un paradigma débil y fue engañosamente simple para empezar, pero una pesadilla para terminar.


    No estoy seguro de si es un lenguaje verdadero, pero odio los Makefiles.

    Los archivos Makefile tienen diferencias significativas entre espacio y TAB, por lo que incluso si dos líneas parecen idénticas, no se ejecutan igual.

    También se basa en un complejo conjunto de reglas implícitas para muchos idiomas, que son difíciles de aprender, pero que a menudo son anuladas por el archivo make.

    Un sistema Makefile generalmente se extiende en muchos, muchos archivos, en muchos directorios. Con prácticamente ningún alcance o abstracción, un cambio en un archivo de hacer varios directorios de distancia puede evitar que mi fuente se construya. Sin embargo, el mensaje de error es invariablemente un error de compilación, no un error significativo sobre make o los makefiles.

    Cualquier entorno en el que haya trabajado que utilice archivos make con éxito tiene un experto en Make a tiempo completo. Y todo esto para afeitarse unos minutos de compilación?


    PHP (sin ningún orden en particular)

    • Nombres de funciones y órdenes de argumento incoherentes
      • Porque hay un trillón de funciones, cada una de las cuales parece usar una convención de nomenclatura y orden de argumento diferentes. "Veamos ... ¿es foo_bar o foobar o fooBar ... y es aguja, pajar o pajar, aguja ?" Las funciones de cadena de PHP son un ejemplo perfecto de esto. La mitad usa str_foo y la otra mitad utiliza strfoo .
    • Caracteres de formato de fecha no estándar
      • Tome j por ejemplo
        • En UNIX (que, por cierto, es lo que todos los demás usan como una guía para los formatos de cadena de fecha) %j devuelve el día del año con ceros a la izquierda.
        • En la función de date de PHP, j devuelve el día del mes sin ceros a la izquierda.
    • Todavía no hay soporte para Apache 2.0 MPM
      • No es recomendado
      • ¿Por qué no es esto compatible? "Cuando haces que el marco subyacente sea más complejo al no tener hilos de ejecución completamente separados, segmentos de memoria completamente separados y un fuerte espacio de pruebas para cada solicitud para jugar, se introducen pies de arcilla en el sistema de PHP". Link Entonces ... no es compatible porque hace las cosas más difíciles? Porque solo las cosas que son fáciles valen la pena hacerlo ¿no? (Para ser justos, como señaló Emil H , esto generalmente se atribuye a que las libs de terceros no son seguras para subprocesos, mientras que el núcleo de PHP sí lo está).
    • Sin compatibilidad nativa con Unicode
      • El soporte nativo de Unicode está programado para PHP6
      • Estoy seguro de que no hemos vivido en un entorno global en el que podríamos necesitar hablar con personas de otros idiomas en el pasado, oh 18 años . Oh espera. (Para ser justos, el hecho de que todo no use Unicode en este día y edad realmente me molesta. Mi punto es que no debería tener que hacer ningún trabajo adicional para que ocurra Unicode. Esto no es solo un problema de PHP. )

    Tengo otros beefs con el lenguaje. Estos son solo algunos. Jeff Atwood tiene una publicación anterior sobre por qué PHP apesta. Él también dice que no importa. No estoy de acuerdo, pero ahí estamos.


    XSLT.

    • XSLT es desconcertante, para empezar. La metáfora es completamente diferente de cualquier otra cosa que sé.
    • La cosa fue diseñada por un comité tan profundo en paréntesis angulares que sale como un extraño Frankenstein.
    • Los hechizos extraños requeridos para especificar el formato de salida.
    • Las reglas incorporadas e invisibles.
    • Las cosas raras, como los guiones.
    • La dependencia de XPath.
    • El soporte de herramientas ha sido bastante reducido, hasta hace poco. La depuración de XSLT en los primeros días fue un ejercicio de navegación en completa oscuridad. Las herramientas cambian eso pero, aún XSLT encabeza mi lista.

    XSLT es lo suficientemente extraño como para que la mayoría de la gente simplemente lo ignore. Si debe usarlo, necesita un chamán XSLT para darle los encantamientos mágicos para que todo funcione.


    MUMPS

    Trabajé en él durante un par de años, pero he realizado un trabajo completo desde entonces. Todo lo que realmente recuerdo es que no había documentación (en mi ubicación) y comandos crípticos.

    Fue horrible. ¡Horrible! ¡¡¡HORRIBLE!!!


    Expresiones regulares

    Es un lenguaje de solo escritura, y es difícil verificar si funciona correctamente para las entradas correctas.


    Aquí está la contribución a mi propia pregunta:

    Origin LabTalk

    Mi favorito de todos los tiempos en este sentido es Origin LabTalk . En LabTalk, la longitud máxima de un identificador de variable de cadena es un carácter. Es decir, solo hay 26 variables de cadena en absoluto. Peor aún, algunos de ellos son utilizados por Origin en sí, y no está claro cuáles.

    Del manual:

    LabTalk usa la notación% para definir una variable de cadena. Un nombre de variable de cadena legal debe ser un carácter% seguido de un solo carácter alfabético (una letra de la A a la Z). Los nombres de las variables String son caseinsensitive. De todas las 26 variables de cadena que existen, Origin usa 14.

    Puertas DXL

    Para mí, el segundo peor en mi opinión es Doors DXL . Los lenguajes de programación se pueden dividir en dos grupos: aquellos con gestión de memoria manual (por ejemplo, eliminar, libre) y aquellos con un recolector de basura. Algunos idiomas ofrecen ambos, pero DXL es probablemente el único idioma en el mundo que no admite ninguno. De acuerdo, para ser honesto, esto solo es cierto para las cadenas, pero bueno, las cadenas no son exactamente el tipo de datos más raramente utilizado en el software de ingeniería de requisitos.

    La consecuencia es que la memoria utilizada por una cadena nunca puede recuperarse y DOORS DXL pierde como un tamiz.

    Hay muchas otras peculiaridades en DXL, solo por nombrar algunas:


    C objetivo.

    Las anotaciones son confusas, usar paréntesis para llamar a métodos aún no se computa en mi cerebro, y lo que es peor es que todas las funciones de la biblioteca de C se llaman usando los operadores estándar en C, -> y., Y parece que el La única compañía que maneja este idioma es Apple.

    Admito que solo utilicé el lenguaje cuando programé para el iPhone (y busqué programación para OS X), pero se siente como si C ++ fuera meramente bifurcado, añadiendo anotaciones y forzando la implementación y los archivos de cabecera para separarlos harían mucho mas sentido.


    Fusión fría

    Supongo que es bueno para los diseñadores, pero como programador siempre sentí que tenía una mano atada a la espalda.


    No puedo creer que nadie haya dicho esto:

    LotusScript

    Creo que es mucho peor que php al menos.

    No se trata del lenguaje en sí mismo que sigue una sintaxis similar a Visual Basic, es el hecho de que parece tener muchas funciones para cosas extremadamente inútiles que nunca (o uno en un millón de veces) usará, pero que carecen de soporte para las cosas usarás todos los días.

    No recuerdo ningún ejemplo concreto pero fueron como:

    "Ok, tengo un evento para verificar si el puntero del mouse está en la esquina superior del formulario y no tengo un evento de doble clic para el Formulario ?? WTF ??"


    Visual Foxpro


    Dos veces tuve que trabajar en ''idiomas'' donde arrastraba y soltaba módulos en la página y los vinculaba con líneas para mostrar el flujo de datos. (Uno afirmó ser un RDBM, y el otro un lenguaje de adquisición de datos de uso general y de procesamiento de números).

    Solo de pensar en eso me da algo para estrangular a alguien. O vómito. O ambos.

    Peor aún, ninguno de los dos expuso un lenguaje de texto que podría piratear directamente.


    El lenguaje de scripting de archivos .bat en DOS / Windows. Dios solo sabe cuán poco poderoso es este, especialmente si lo comparas con los lenguajes de shell de Unix (que tampoco son tan poderosos, pero mucho mejores).

    Solo intenta concatenar dos cadenas o crear un ciclo for. Nah.


    El peor lenguaje? BancStar, sin duda.

    3.000 variables predefinidas, todas numeradas, todas globales. Sin declaración de variable, sin inicialización. La mitad de ellos, diseminados en el rango, reservados para el uso del sistema, pero puede usarlos bajo su propio riesgo. Cien más o menos se completan automáticamente como resultado de varias operaciones, y no hay ninguna lista de cuáles son. Todos caben en 38k bytes, y no hay protección alguna para el desbordamiento del búfer. El sistema dejará alegremente que los usuarios pongan 20 bytes en un campo de diez bytes si declara incorrectamente la longitud de un campo de entrada. Los efectos son impredecibles, por decir lo menos.

    Este es un lenguaje que le permitirá declarar un gosub o goto calculado; debido a sus limitaciones, esto es frecuentemente necesario. Los estados condicionales se pueden declarar hacia adelante o hacia atrás. Imagine una instrucción "If" que finaliza 20 líneas antes de que comience.

    La pila de devolución es muy superficial, (20 Gosubs más o menos) y dado que la pulsación de una tecla de función por parte de un usuario inicia una subrutina diferente, puede sobrepasar fácilmente la pila. Los diseñadores pensaron cuidadosamente incluir un comando "Borrar Gosubs" para destruir completamente la pila con el fin de solucionar ese problema y asegurarse de que nunca se sabría exactamente qué haría el programa a continuación.

    Hay mucho más Decenas de miles de líneas de este horror Lovecraftian.


    En más de 25 años de programación de computadoras, de lejos, lo peor que he experimentado es un derivado de MUMPS llamado Meditech Magic. Es mucho más malvado de lo que PHP podría llegar a ser.

    ¡Ni siquiera usa ''='' para la asignación! 100 ^ b asigna un valor de 100 a b y se lee como "100 va a b". Básicamente, este lenguaje inventó su propia sintaxis de arriba a abajo. Así que no importa cuántos lenguajes de programación conozcas, Magic será un completo misterio para ti.

    Aquí hay 100 botellas de cerveza en la pared escritas en esta abominación de un idioma:

    BEERv1.1, 100^b,T("")^#,DO{b''<1 NN(b,"bottle"_IF{b=1 " ";"s "}_"of beer on the wall")^#, N(b,"bottle"_IF{b=1 " ";"s "}_"of beer!")^#, N("You take one down, pass it around,")^#,b-1^b, N(b,"bottle"_IF{b=1 " ";"s "}_"of beer on the wall!")^#}, END;


    Los dos peores idiomas con los que he trabajado fueron APL, que es relativamente bien conocido para idiomas de su edad, y TECO, el idioma en el que se escribió el Emacs original. Ambos son notables por su sintaxis escueta e inescrutable.

    APL es un lenguaje de procesamiento de matriz; es extremadamente poderoso, pero casi imposible de leer, ya que cada personaje es un operador, y muchos no aparecen en los teclados estándar.

    TECO tenía un aspecto similar, y por una razón similar. La mayoría de los personajes son operadores, y este lenguaje de propósito especial se dedicó a editar archivos de texto. Fue un poco mejor, ya que usaba el juego de caracteres estándar. Y sí tenía la capacidad de definir funciones, que era lo que daba vida a emacs: las personas escribían macros y solo las invocaban después de un tiempo. Pero averiguar qué hizo un programa o escribir uno nuevo fue todo un desafío.


    Me parece que evito tener que usar VBScript / Visual Basic 6 al máximo.

    Uso principalmente C ++, javascript, Java para la mayoría de las tareas y me meto en ruby, scala, erlang, python, assembler, perl cuando es necesario.

    Yo, como la mayoría de los otros políglotas / programadores con una mentalidad razonable, creo firmemente que debes usar la herramienta adecuada para el trabajo; esto requiere que comprendas tu dominio y entiendas tus herramientas.

    Mi problema con VBscript y VB6 es cuando los utilizo para script windows o aplicaciones de oficina (el dominio correcto para ellos) - me encuentro luchando con el idioma (no alcanzan para ser la herramienta correcta).

    La falta de VBScript de estructuras de datos nativas fáciles de usar (como contenedores / mapas asociativos) y otras peculiaridades (como la asignación de objetos) es una molestia innecesaria y frustrante, especialmente para un lenguaje de scripting. Contraste con Javascript (que ahora uso para programar wscript / cscript windows y hacer scripts de automatización ActiveX) que es mucho más expresivo. Si bien hay ciertas cosas que funcionan mejor con vbscript (como pasar arreglos hacia adelante y hacia atrás desde objetos COM es un poco más fácil, aunque es más fácil pasar manejadores de eventos a los componentes COM con jscript), todavía estoy sorprendido por la cantidad de codificadores que Todavía uso vbscript para script windows - Apuesto a que si escribieran el mismo programa en ambos idiomas, encontrarían que jscript trabaja mucho más que vbscript, debido a jscript ''s tipos de datos hash nativos y cierres.

    Vb6 / VBA, aunque un poco mejor que vbscript en general, todavía tiene muchos problemas similares donde (para su dominio) requieren mucho más placa de caldera para hacer tareas simples de lo que me gustaría y he visto en otros lenguajes de scripting.


    No estoy seguro de si quisiste incluir lenguajes de scripting, pero he visto TCL (que también es molesto), pero ... el lenguaje de scripts mIRC me molesta muchísimo.

    Debido a un poco de supervisión en el análisis sintáctico, el espacio en blanco es significativo cuando se supone que no es así. Las sentencias condicionales algunas veces se ejecutarán cuando se supone que deben omitirse debido a esto. No se puede abrir una instrucción de bloque en una línea separada, etc.

    Aparte de eso, está lleno de sintaxis desordenada e inconsistente que probablemente fue diseñada de esa manera para facilitar las cosas básicas, pero al mismo tiempo hace que algo un poco más complejo sea apenas legible.

    Perdí la mayoría de mis scripts de mIRC, o probablemente podría haber encontrado algunos buenos ejemplos de lo horrible que te obliga a crear :(


    PROGRESS 4GL (aparentemente ahora conocido como " OpenEdge Advanced Business Language ").

    PROGRESS es tanto un lenguaje como un sistema de base de datos. Todo el lenguaje está diseñado para facilitar la creación de pantallas de entrada de datos en pantalla verde. (Así que empiece por imaginar qué tan bien esto se traduce en Windows.) Cualquier cosa más elegante que eso, ya sean pantallas bonitas, lógica de programa o procesamiento por lotes ... no tanto.

    Últimamente utilicé la versión 7, a fines de los ''90, por lo que es vagamente posible que algo de esto esté desactualizado, pero no apostaría a ello.

    • Originalmente fue diseñado para pantallas de entrada de datos en modo texto, por lo que en Windows, todas las coordenadas de pantalla están en unidades de "caracteres", que son un número extraño de píxeles de ancho y un número diferente de píxeles de altura. Pero, por supuesto, tienen una fuente proporcional predeterminada , por lo que el número de "unidades de caracteres" no se corresponde con la cantidad real de caracteres que cabrán en un espacio determinado.
    • Sin clases u objetos.
    • No admite idiomas para matrices o asignación de memoria dinámica. Si desea algo parecido a una matriz, cree una tabla temporal en la base de datos en memoria, defina su esquema y luego coloque un cursor sobre ella. (Vi un poco de código de una versión posterior, donde realmente construyeron y enviaron un sistema primitivo orientado a objetos en la parte superior de estas tablas en memoria.
    • El acceso a la base de datos ISAM está integrado. (Pero no SQL. ¿Quién lo necesita?) Si desea incrementar el Countercampo en el registro actual de la Statetabla, simplemente diga State.Counter = State.Counter + 1. Lo cual no está tan mal, excepto ...
    • Cuando utiliza una tabla directamente en el código, detrás de las escenas, crean algo parecido a una variable local mágica invisible para mantener la posición actual del cursor en esa tabla. Se adivina en el que el bloque que contiene este cursor será como alcance. Si no tiene cuidado, el cursor desaparecerá cuando salga de un bloque y se reiniciará más tarde, sin previo aviso. O bien, comenzará a trabajar con una tabla y descubrirá que no está comenzando en el primer registro, porque está reutilizando el cursor desde otro bloque (o incluso el suyo propio, porque su alcance se amplió cuando no esperaba eso).
    • Las transacciones operan en estos ámbitos de conjeturas salvajes. ¿Estamos teniendo diversión aún?
    • Todo puede ser abreviado. Para algunas de las palabras claves ofensivamente largas, esto podría no parecer tan malo al principio. Pero si tiene una variable nombrada Index, puede referirse a ella como tal Indexo como Indo incluso como I. (Typos puede tener resultados muy interesantes.) Y si quiere acceder a un campo de base de datos, no solo puede abreviar el nombre del campo, sino que ni siquiera tiene que calificarlo con el nombre de la tabla; ellos también adivinarán la mesa. Para obtener resultados verdaderamente aterradores, combine esto con:
    • A menos que se especifique lo contrario, suponen que todo es un acceso a la base de datos. Si accede a una variable que aún no ha declarado (o, más probablemente, si escribe incorrectamente el nombre de la variable), no hay error de compilación: en su lugar, busca un campo de base de datos con ese nombre ... o un campo que abrevia a ese nombre.

    La adivinación es lo peor. Entre las abreviaturas y el campo por defecto, podría obtener algunas cosas desagradables si no tuviera cuidado. (¿Olvidó declarar Icomo una variable local antes de usarlo como una variable de ciclo? No hay problema, simplemente seleccionaremos aleatoriamente una tabla, tomaremos su registro actual y destruiremos por completo un campo elegido arbitrariamente cuyo nombre comienza con I!)

    A continuación, agregue el hecho de que un acceso accidental por campo accidental podría cambiar el alcance que adivinó para sus tablas, rompiendo así un fragmento de código completamente no relacionado. Diversión, ¿sí?

    También tienen un sistema de informes integrado en el lenguaje, pero aparentemente he reprimido todos los recuerdos.

    Cuando conseguí otro trabajo trabajando con Netscape LiveWire (un intento malogrado en JavaScript del lado del servidor) y ASP clásico (VBScript), estaba en el cielo.


    TCL. Solo compila el código justo antes de que se ejecute, por lo que es posible que si su código nunca descendió por la rama A mientras está probando, y un día, en el campo, baja por la rama A, podría tener un ERROR DE SINTAXIS.


    Todavía no he trabajado con muchos idiomas y trato principalmente con lenguajes de scripting; de estos VBScript es el que menos me gusta. Aunque tiene algunas funciones útiles, algunas cosas realmente me cabrean:

    • Las asignaciones de objetos se realizan con la Setpalabra clave:

      Set foo = Nothing

      Omitir Setes una de las causas más comunes de errores de tiempo de ejecución.

    • No existe el manejo estructurado de excepciones. La comprobación de errores es así:

      On Error Resume Next '' Do something If Err.Number <> 0 '' Handle error Err.Clear End If '' And so on

    • Encerrar los parámetros de llamada de procedimiento entre paréntesis requiere el uso de la Callpalabra clave:

      Call Foo (a, b)

    • Su sintaxis similar al inglés es demasiado detallada. (Soy fanático de las llaves)

    • Los operadores lógicos son de circuito largo. Si necesita probar una condición compuesta donde la condición posterior depende del éxito de la anterior, debe poner las condiciones en Ifdeclaraciones separadas .

    • La falta de constructores de clases parametrizadas.

    • Para envolver una declaración en varias líneas, debe usar un guión bajo:

      str = "Hello, " & _ "world!"

    • La falta de comentarios de líneas múltiples.

    Editar: encontró este artículo: The Flangy Guide to Hating VBScript . El autor resume sus quejas como "VBS no es Python" :)


    HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE

    En serio, el peor lenguaje de programación es el de Makefiles. Totalmente incomprensibles, las pestañas tienen un significado sintáctico y ni siquiera un depurador para descubrir lo que está sucediendo.