your programming own make language how for compiler syntax language-features language-design

syntax - programming - ¿Cuál es tu lenguaje "hangups"?



how to make a compiler for your own language (30)

A veces me irrita la forma en que las personas esperan que haya un solo idioma para todos los trabajos. Dependiendo de la tarea que esté haciendo, cada idioma tiene sus ventajas y desventajas. Me gustan los lenguajes de sintaxis basados ​​en C porque es a lo que estoy más acostumbrado y me gusta la flexibilidad que tienden a otorgar al desarrollador. Por supuesto, con gran poder viene una gran responsabilidad, y tener el poder de escribir 150 líneas de declaraciones LINQ no significa que debas hacerlo.

Me encanta el XML en línea en la última versión de VB.NET aunque no me gusta trabajar con VB principalmente porque el IDE es menos útil que el IDE para C #.

He leído algunas de las preguntas más recientes sobre el lenguaje frente al lenguaje con interés ... Perl vs. Python , Python vs. Java , ¿Puede un idioma ser mejor que otro?

Una cosa que noté es que muchos de nosotros tenemos razones muy superficiales para desagradar los idiomas. Notamos estas cosas a primera vista y nos desconectan. Rechazamos lo que probablemente sean idiomas perfectamente buenos como resultado de las características que probablemente aprenderíamos a amar o ignorar en 2 segundos si nos molestamos.

Bueno, soy tan culpable como el próximo tipo, si no más. Aquí va:

  • Ruby: Todo el código de ejemplo de Ruby que veo usa el comando puts , y ese es un término anatómico yiddish infantil. Entonces, como resultado, no puedo tomar en serio el código de Ruby, aunque debería hacerlo.
  • Python: La primera vez que lo vi, sonreí con satisfacción por todo el espacio significativo en blanco. Lo evité por los próximos años. Ahora apenas uso nada más.
  • Java: no me gustan los identificadores que se parecen a esto. No estoy seguro de por qué exactamente.
  • Lisp: Tengo problemas con todos los paréntesis. Las cosas de diferente importancia y propósito (declaraciones de funciones, asignaciones de variables, etc.) no están diferenciadas sintácticamente y soy demasiado perezoso para aprender qué es qué.
  • Fortran: mayúscula, todo me duele los ojos. Sé que el código moderno no tiene que escribirse así, pero la mayoría del código de ejemplo es ...
  • Visual Basic: me molesta que Dim se use para declarar variables, ya que recuerdo los buenos viejos tiempos de GW-BASIC cuando solo se usaba para dimensionar matrices.

¿Qué idiomas me parecieron correctos a primera vista? Perl, C, QBasic, JavaScript, ensamblador, BASH shell, FORTH.

De acuerdo, ahora que he aireado mi ropa sucia ... quiero escuchar la tuya. ¿Cuáles son tus problemas de lenguaje? ¿Qué características superficiales te molestan? ¿Cómo los has superado?


Aunque soy principalmente un desarrollador de PHP, no me gustan los idiomas que no me permiten hacer suficientes cosas en línea. P.ej:

$x = returnsArray(); $x[1];

en lugar de

returnsArray()[1];

o

function sort($a, $b) { return $a < $b; } usort($array, ''sort'');

en lugar de

usort($array, function($a, $b) { return $a < $b; });


Descubrí que el uso que Perl hace de los valores "definidos" y "indefinidos" es tan útil que me resulta difícil utilizar los lenguajes de scripting sin él.

Perl:

($lastname, $firstname, $rest) = split('' '', $fullname);

Esta declaración tiene un buen rendimiento sin importar cuántas palabras tenga en $ fullname. Pruébalo en Python, y explota si $ fullname no contiene exactamente tres palabras.


En C / C ++, me molesta cómo hay diferentes formas de escribir el mismo código.

p.ej

if (condition) { callSomeConditionalMethod(); } callSomeOtherMethod();

vs.

if (condition) callSomeConditionalMethod(); callSomeOtherMethod();

equivale a lo mismo, pero diferentes personas tienen diferentes estilos. Me gustaría que el estándar original fuera más estricto al tomar una decisión al respecto, por lo que no tendríamos esta ambigüedad. ¡Conduce a discusiones y desacuerdos en las revisiones de código!


Incoherencias de estilo de codificación en proyectos de equipo.

Estoy trabajando en un gran proyecto de equipo en el que algunos colaboradores han usado 4 espacios en lugar del carácter de tabulación. Trabajar con su código puede ser muy molesto: me gusta mantener mi código limpio y con un estilo uniforme.

Ya es bastante malo usar diferentes estándares para diferentes idiomas, pero en un proyecto web con HTML, CSS, Javascript, PHP y MySQL, eso es 5 idiomas, 5 estilos diferentes y multiplicado por el número de personas que trabajan en el proyecto.

Me encantaría volver a formatear el código de mis compañeros de trabajo cuando necesite arreglar algo, pero luego el repositorio pensaría que cambié cada línea de su código.


Incongruencias del nombre de función de PHP.

// common parameters back-to-front in_array(needle, haystack); strpos(haystack, needle); // _ to separate words, or not? filesize(); file_exists; // super globals prefix? $GLOBALS; $_POST;


Java y sus excepciones marcadas. Salí de Java por un tiempo, viví en el mundo de .NET, y luego regresé recientemente.

Parece que, a veces, mi cláusula throws es más voluminosa que el contenido de mi método.


La sintaxis de C y C ++ es un poco peculiar. Reutilizan operadores para diferentes cosas. Probablemente estés tan acostumbrado que no pienses en ello (ni yo tampoco), pero considera cuántos significados tiene el paréntesis:

int main() // function declaration / definition printf("hello") // function call (int)x // type cast 2*(7+8) // override precedence int (*)(int) // function pointer int x(3) // initializer if (condition) // special part of syntax of if, while, for, switch

Y si en C ++ viste

foo<bar>(baz(),baaz)

no podrías conocer el significado sin la definición de foo y bar .

  • el <y> podría ser una instanciación de plantilla, o podría ser menor que y mayor que (inusual pero legal)
  • the () podría ser una llamada de función, o podría estar rodeando al operador de coma (es decir, realizar baz () para efectos de tamaño, luego devolver baaz).

¡Lo tonto es que otros idiomas han copiado algunas de estas características!


No hay nada en el mundo que odio más que php.

  1. Variables con $, ese es un caracter impar adicional para cada variable.
  2. Se accede a los miembros con -> sin razón aparente, con un carácter adicional por cada acceso de miembro.
  3. Un monstruo de lenguaje realmente.
  4. Sin espacios de nombres
  5. Las cadenas se concatenan con ..
  6. Una especie de espectáculo de lenguaje.

Nunca me gustaron las palabras clave deletreadas al revés en algunas conchas de scripting

if-then- fi es suficientemente malo, pero caso-en- esac es simplemente hacerse tonto


Odio las partes de Odio "Finalizar Función" y "Fin IF" y "Si ... Entonces" de VB. Preferiría ver un corchete en su lugar.


Paquetes de Java. Los encuentro complejos, más aún porque no soy una corporación. Yo prefiero los espacios de nombres. Voy a superarlo, por supuesto, estoy jugando con el SDK de Android, y Eclipse elimina mucho del dolor. Nunca antes había tenido una máquina que pudiera funcionar de forma interactiva, y ahora sí, estoy muy impresionado.


Pascal''s Begin y End . Demasiado detallado, no está sujeto a la coincidencia de corchetes, y lo que es peor, no hay un Begin para cada End , por ejemplo.

Type foo = Record // ... end;


SQL, dicen que no deberías usar cursores y cuando lo haces, realmente entiendes por qué ...
es tan pesado!

DECLARE mycurse CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT field1, field2, fieldN FROM atable OPEN mycurse FETCH NEXT FROM mycurse INTO @Var1, @Var2, @VarN WHILE @@fetch_status = 0 BEGIN -- do something really clever... FETCH NEXT FROM mycurse INTO @Var1, @Var2, @VarN END CLOSE mycurse DEALLOCATE mycurse


Sensibilidad a mayúsculas

¿Qué clase de resaca necesitas para pensar que diferenciar dos identificadores solo por caSE es una gran idea?


Si Microsoft tuvo que inventar otro lenguaje tipo C ++ en C #, ¿por qué no corrigieron el error de Java e implementaron soporte para RAII?


Solo pensé en otra ... Odio las URL en su mayoría sin sentido utilizadas en XML para definir espacios de nombres, por ejemplo, xmlns="http://purl.org/rss/1.0/"


Sintaxis de if-then-else Prolog.

x -> y ; z

El problema es que " ; " es el operador " or ", por lo que lo anterior parece " x implica y o z ".


Aunque programo principalmente en python, me fastidia infinitamente que las expresiones del cuerpo lambda sean.

Todavía estoy envolviendo mi cerebro con JavaScript, y como un todo, es principalmente aceptable. ¿Por qué es tan difícil crear un espacio de nombres? En TCL son simplemente feos, pero en JavaScript, en realidad es un juego de rollos y completamente ilegible.

En SQL, ¿por qué todo es solo una, gran declaración SELECT de freekin?


Me gusta el estilo orientado a objetos. Por lo tanto, me molesta Python ver len (str) para obtener la longitud de una cadena, o dividir cadenas como split (str, "|") en otro idioma. Eso está bien en C; no tiene objetos. Pero Python, D, etc. tienen objetos y usan obj.method () otros lugares. (Todavía creo que Python es un gran lenguaje).

La inconsistencia es otra gran cosa para mí. No me gustan los nombres inconsistentes en la misma biblioteca: length (), size (), getLength (), getlength (), toUTFindex () (¿por qué no toUtfIndex?), Constante, CONSTANTE, etc.

Los nombres largos en .NET me molestan a veces. ¿No pueden acortar DataGridViewCellContextMenuStripNeededEventArgs de alguna manera? ¿Qué pasa con ListViewVirtualItemsSelectionRangeChangedEventArgs?

Y odio los árboles de directorios profundos. Si una biblioteca / proyecto tiene un árbol de directorios de 5 niveles, voy a tener problemas con él.


Odio sementeras. Encuentro que agregan mucho ruido y rara vez necesitas poner dos frases en una línea. Prefiero el estilo de Python y otros idiomas ... fin de línea es el final de una declaración.


Cualquier lenguaje que no puede decidir completamente si los arrays / índices de caracteres de bucle / cadena están basados ​​en cero o basados ​​en uno.

Personalmente, prefiero la base cero, pero cualquier lenguaje que mezcle los dos, o le permite "configurar" lo que se usa, puede volverse loco. ( Velocidad de Apache - ¡Estoy mirando en tu dirección!)

recortar de la referencia de VTL (el valor predeterminado es 1, pero puede establecerlo en 0):

# Default starting value of the loop # counter variable reference. directive.foreach.counter.initial.value = 1

(Intente fusionar 2 proyectos que utilizaron diferentes esquemas de contador - ¡uf!)


Todos los [] sy @ en el Objetivo C. Su uso es tan diferente de la sintaxis nativa de C subyacente que la primera vez que los vi dio la impresión de que toda la orientación del objeto se había atornillado torpemente como una ocurrencia tardía.


En la mayoría de los idiomas, el acceso de archivos. VB.NET es la única lengua hasta el momento en que el acceso a archivos hace ningún sentido para mí. No entiendo por qué si quiero comprobar si existe un archivo, debería utilizar File.Exists ( "") o algo similar en lugar de crear un objeto de archivo (en realidad FileInfo en VB.NET) y preguntar si existe. Y luego si quiero abrirlo, lo pido para abrir: (suponiendo un objeto FileInfo llamada fi) fi.OpenRead, por ejemplo. Devuelve una secuencia. Bonito.Exactamente lo que quería. Si quiero mover un archivo, fi.MoveTo. También puedo hacer fi.CopyTo. ¿Cuál es esa tontería de no hacer archivos de objetos de pleno derecho en la mayoría de idiomas? Además, si quiero iterar a través de los archivos de un directorio, sólo puede crear el objeto de directorio y llame .GetFiles. O que pueda hacer .GetDirectories, y obtener un nuevo conjunto de DirectoryInfo objetos para jugar.

Es cierto, Java tiene algunas de estas cosas archivo, pero este absurdo de tener que tener un objeto entero a decirle cómo hacer una lista de archivos es simplemente tonto.

Además, no me gusta ::, ->, => y todos los demás operadores de varios caracteres excepto <= y> = (y tal vez - y ++).


Aborrezco la verbosidad de la placa de la caldera de Java .

  • escribir getters y setters para propiedades
  • comprobado el manejo de excepciones y toda la verborrea que implica
  • largas listas de importaciones

Aquellos, en conexión con la convención de Java de usar veryLongVariableNames , a veces me hacen pensar que estoy de vuelta en los 80, escribiendo IDENTIFICATION DIVISION. en la parte superior de mis programas.

Sugerencia: Si puede automatizar la generación de parte de su código en su IDE, esa es una buena pista de que está produciendo un código repetitivo. Con las herramientas automatizadas, no es un problema escribir, pero es un obstáculo cada vez que alguien tiene que leer ese código, que es más frecuente.

Si bien creo que va un poco por la borda en la burocracia de tipo, Scala ha abordado con éxito algunas de estas preocupaciones.


En Ruby, no me gusta mucho cómo los métodos no requieren de self. ser llamado en la instancia actual, pero las propiedades sí (de lo contrario, chocarán con los locales); es decir:

def foo() 123 end def foo=(x) end def bar() x = foo() # okay, same as self.foo() x = foo # not okay, reads unassigned local variable foo foo = 123 # not okay, assigns local variable foo end

En mi opinión, es muy inconsistente. Prefiero preferir siempre requerirme self. en todos los casos, o tener un sigilo para los locales.


[Descargo de responsabilidad: yo sólo tienen una familiaridad con VB, así que tome mis comentarios con un grano de sal]

No me gusta cómo cada palabra clave en VB se capitaliza como esto. Vi una entrada de blog la otra semana (meses?) Acerca de alguien que intentó escribir código VB sin ningún tipo de letras mayúsculas (que hicieron algo a un compilador que les permitiría compilar código VB por el estilo), y el idioma parecía mucho mejor!


Sin ningún orden en particular ...

OCaml

  • Las definiciones Tuples usan * para separar elementos en lugar de,. Entonces, ("Juliet", 23, true) tiene el tipo (string * int * bool) .

  • Por ser un lenguaje tan impresionante, la documentación tiene este inquietante comentario sobre los hilos : " La biblioteca de hilos se implementa mediante el uso compartido del tiempo en un solo procesador. No aprovechará las máquinas multiprocesador. El uso de esta biblioteca nunca hará que los programas corre más rápido. "JoCaml no soluciona este problema .

  • ^^^ He oído que los chicos de Jane Street estaban trabajando para agregar GC simultáneos y subprocesos de múltiples núcleos a OCaml, pero no sé qué tan exitosos han sido. No puedo imaginar un idioma sin hilos de múltiples núcleos y GC sobreviviendo por mucho tiempo.

  • No es una forma fácil de explorar módulos en el toplevel. Claro, puedes escribir el module q = List;; y el toplevel felizmente imprimirá la definición del módulo, pero eso simplemente parece hacky.

DO#

  • Pésima tipo de inferencia Más allá de las expresiones más triviales, tengo que dar tipos a las funciones genéricas.

  • Todo el código LINQ que he leído utiliza la sintaxis del método, x.Where(item => ...).OrderBy(item => ...) . Nadie usa nunca la sintaxis de expresión, from item in x where ... orderby ... select . Entre tú y yo, creo que la sintaxis de la expresión es tonta, aunque solo sea porque parece "extraña" en el contexto de todos los demás códigos C # y VB.NET.

LINQ

Todos los demás idiomas utilizan los nombres estándar de la industria: Mapa, Plegado / Reducción / Inyección y Filtro. LINQ tiene que ser diferente y usa Seleccionar, Agregar y Dónde.

Programación Funcional

Las mónadas son desconcertantes . Después de haber visto la mónada Parser, quizás Mónada, Estado y Lista de mónadas, puedo entender perfectamente cómo funciona el código; sin embargo, como patrón de diseño general, parece que no puedo ver los problemas y decir "hey, apuesto a que una mónada encajaría perfecta aquí".

Rubí

GRRRRAAAAAAAH !!!!! Es enserio.

VB

Module Hangups Dim _juliet as String = "Too Wordy!" Public Property Juliet() as String Get Return _juliet End Get Set (ByVal value as String) _juliet = value End Set End Property End Module

Y las declaraciones setter son la perdición de mi existencia. Bien, entonces cambio el tipo de datos de mi propiedad. ¿Ahora también necesito cambiar el tipo de datos en mi setter? ¿Por qué VB no toma prestado de C # y simplemente incorpora una variable implícita llamada valor?

.NET Framework

Personalmente me gusta la convención de la carcasa de Java: las clases son PascalCase, los métodos y las propiedades son camelCase.


Mi gran hangup es la sintaxis de MATLAB. Lo uso, y hay cosas que me gustan de ella, pero tiene tantas peculiaridades molestos. Veamos.

  • Las matrices se indexan con paréntesis. Así que si ves algo así como la imagen (350.260), usted no tiene idea de que si estamos consiguiendo un elemento de la matriz de la imagen, o si estamos llamando a una función llamada Imagen y pasar argumentos a ella.
  • Alcance es una locura. Me parece recordar que para el bucle variables índice permanecen en su alcance después de que termine el bucle.
  • Si se olvida de pegarse un punto y coma después de una asignación, el valor se vuelca en la salida estándar.
  • Es posible que tenga una función por archivo. Esto demuestra ser muy molesto para organizar el trabajo de uno.

Estoy seguro de que podría llegar a más si pensaba en ella.


Java

  • Los genéricos (versión de Java de las plantillas) son limitados. No puedo llamar a los métodos de la clase y no puedo crear instancias de la clase. Los genéricos son utilizados por contenedores, pero puedo usar contenedores de instancias de Object.
  • Sin herencia múltiple Si un uso de herencia múltiple no conduce a un problema de diamantes, debería permitirse. Debería permitir escribir una implementación predeterminada de métodos de interfaz, un ejemplo de problema: la interfaz MouseListener tiene 5 métodos, uno para cada evento. Si quiero manejar solo uno de ellos, tengo que implementar los otros 4 métodos como un método vacío.
  • No permite elegir administrar manualmente la memoria de algunos objetos.
  • La API de Java usa una combinación compleja de clases para realizar tareas simples. Ejemplo, si quiero leer de un archivo, tengo que usar muchas clases (FileReader, FileInputStream).

Pitón

  • La sangría es parte de la sintaxis, prefiero usar la palabra "fin" para indicar el final del bloque y la palabra "pase" no sería necesaria.
  • En las clases, la palabra "self" no debería ser necesaria como argumento de funciones.

C ++

  • Los encabezados son el peor problema. Tengo que enumerar las funciones en un archivo de cabecera e implementarlas en un archivo cpp. No puede ocultar dependencias de una clase. Si una clase A usa la clase B en privado como un campo, si incluyo el encabezado de A, también se incluirá el encabezado de B.
  • Las cadenas y matrices provienen de C, no proporcionan un campo de longitud. Es difícil de controlar si std :: string y std :: vector usarán stack o heap. Tengo que usar punteros con std :: string std :: vector y si quiero usar la asignación, pasar como argumento a una función o devolverlo, porque su operador "=" copiará estructura entera.
  • No puedo controlar el constructor y el destructor. Es difícil crear una matriz de objetos sin un constructor por defecto o elegir qué constructor para su uso con if y switch.