# data[].attributes.body
Aplicaciones Científicas

Aplicaciones Empresariales

Inteligencia Artificial

Software de Sistemas

Software de Web

# data[].attributes.headline
Orientada a Procedimientos o Programación Funcional.

# data[].attributes.subject
Orientada a Procedimientos o Programación Funcional.

# data[].attributes.body
En este paradigma las instrucciones se usan para crear unidades o módulos que se conocen como procedimientos o subrutinas. que son un número muy bajo de expresiones repetidas, englobadas todas en un procedimiento o función y es llamada cada vez que se la necesite.

# data[].attributes.body
En este paradigma la estructura y la ejecución de los programas van determinados por los sucesos o acciones que ocurren en el sistema, definidos por el usuario o por el propio sistema. utilizando generalmente interfaces gráficas en las que se insertan componentes, controles en los cuales ocurren eventos. Dichos eventos permiten al usuario realizar una serie de acciones lógicas para un determinado programa.

# data[].attributes.body
Se trata de un tipo de programación declarativa, es decir, no se indica cómo se hacen las cosas, sino qué cosas hacer.Utilizando una lógica de primer orden, que se basa en proposiciones y reglas de la lógica.

# data[].attributes.body
Se basa en el concepto de crear un modelo del problema de destino en sus programas. proporcionando conceptos y herramientas con las cuales se modela y representa el mundo real a partir de objetos.

# data[].attributes.body
Propuesta tecnológica adoptada por una comunidad de programadores que explica la forma en la que deben estructurarse los métodos y organizar las ideas para llevar a cabo cálculos

# data[].attributes.headline
Características de los Lenguajes de Programación

# data[].attributes.subject
Características de los Lenguajes de Programación

# data[].attributes.body
Los lenguajes de programación manejan diferentes conceptos de acuerdo a su finalidad, sintaxis, paradigmas, etc. Sin embargo, muchos tienen características en común que permite agruparlos en grandes grupos, entre las cuales podemos destacar:
Compilado:  código fuente de alto nivel es traducido por un compilador a archivos ejecutables.
Interpretado: código fuente de alto nivel es traducido por un interprete instrucción por instrucción.
Tipado estático: las comprobaciones son realizadas en tiempo de compilación.
Tipado dinámico: las comprobaciones son realizadas en tiempo de ejecución.
Fuertemente tipado: se refiere a que un dato no puede ser utilizado como otro tipo de dato.
Débilmente tipado: se refiere a que un dato puede ser utilizado como si fuera otro tipo de dato.
Closures y Lambdas: referencias a funciones que pueden reverenciar variables en ciertos contextos definidos. Referencias a funciones anónimas.
Tuplas: se pueden conformar estructuras de datos que están hechas por diferentes tipos de estructuras.

# data[].attributes.attachment_link.readable_text
Hay numerosos y diferentes lenguajes de programación pero solo una docena tienen una cuota de uso significativa. Muchos comparten características y algunos lenguajes las van incorporando a medida que se demuestra que sus beneficios son mayores que la complejidad que pueden añadir. Veamos algunas de sus propiedades.

Hay cantidad de lenguajes de programación, algunas diferencias entre ellos se encuentran su propósito (general o específico para cierto tipo de tareas), en la sintaxis, el sistema de tipos, por los paradigmas de programación que soporta ( POO, imperativo, funcional, ...), otras diferencias están en la librerías disponibles, frameworks o comunidad, sin embargo, la mayoría comparten algunas características por las que se pueden catalogar los lenguajes. En este artículo comentaré algunas de estas características por las que podemos catalogar y agrupar los lenguajes de programación.

Describiré brevemente cada una de las características ya que están muy bien explicadas en cada una de sus páginas de la wikipedia.

Compilado

En un lenguaje compilado el código fuente fuente antes de ser ejecutado es convertido a lenguaje máquina (C, C++) aunque también puede ser convertido a representación intermedia que posteriormente es interpretada y convertida a lenguaje máquina JIT (Java, C#). El compilador puede detectar una gran cantidad de errores que en un lenguaje interpretado o de tipado dinámico se descubrirían en tiempo de ejecución. Wikipedia.

Interpretado

En un lenguaje interpretado el código fuente es compilado a código máquina en el momento de su ejecución ( Python, Ruby, PHP, JavaScript). Wikipedia.

Orientado a objetos

Parte del éxito de los lenguajes orientado a objetos se debe a conceptos como la herencia que es una forma de reutilizar el código de la clase de la que se hereda, el polimorfismo con la que un mismo método puede estar implementado de diferente forma en función de la clase que lo implementa en la jerarquía de clases construida con la herencia, la sobrecarga usar un mismo método con diferentes parámetros y también igual o más importante la encapsulación con la que se ocultan los detalles internos del funcionamiento de la clase siendo únicamente posible manejar la clase a través de la interfaz (métodos) que ofrece.

Tipado estático

En un lenguaje de tipado estático las comprobaciones de tipos se realizan en tiempo de compilación (C, C++, Java). Los tipos pueden ser declarados de forma explícita o de forma inferida según el análisis del código fuente que realiza el compilador. Wikipedia.
Static versus Dynamic typing
Tipado dinámico

Por el contrario el tipado dinámico comprueba los tipos en el momento de ejecución del programa (PHP, Python, Groovy, JavaScript). A esos lenguajes se les conoce como lenguajes dinámicos. Wikipedia.
The Inconvenient Truth About Dynamic vs. Static Typing
Fuertemente y débilmente tipado

En un lenguaje fuertemente tipado un dato con un tipo no puede ser usado como si fuese de otro. Aunque algunos lenguajes como Java se dicen que son fuertemente tipado tienen algunas laxitudes. Por ejemplo, en Java un float puede usarse como si fuese un double y en otros lenguajes con menor grado de tipificación como PHP un string puede ser usado como un dato numérico. Wikipedia
Lenguajes fuertemente, débilmente, estáticamente y dinámicamente tipados
Otras características que se suelen mencionar al hablar de lenguajes de programación.

Inferencia de tipos

En base al análisis del código fuente se puede inferir el tipo de las variables evitando que el programador los declare explícitamente continuamente. Wkipedia.

Closures y Lambdas

Un closure es una referencia a una función que puede referenciar las variables del contexto en el que está definida. Una lambda es simplemente una referencia a una función anónima. En Java las lambdas puede referenciar variables declaradas como final, esto es, sean constantes. Wikipedia.

Defaults methods y Traits

Un trait define una colección de métodos posiblemente incluyendo también su implementación, además, pueden definir propiedades. Los defaults methods de Java pueden definir implementaciones en algunos métodos de interfaces. Wikipedia.

High Order Functions

Las funciones de orden superior son funciones que toman como argumentos una o más funciones o devuelven como resultado otra función. Wikipedia.

Currying

La currificación consiste en transformar una función con al menos dos argumentos en una función con al menos un argumento menos. Wikpedia.

Duck typing

Este concepto es usado en los lenguajes de tipado dinámico tratando a las variables no por su tipo o herencia sino en base a las propiedades y métodos que soporta (Python, PHP, Groovy, JavaScript). Wikipedia.

Intersection types y Union types

Ceylon tiene un sistema de tipos más avanzado (y complejo) que Java, una expresión es asignable a un intersection types X & Y si esa expresión es asignable a X e Y individualmente. Una expresión es asignable a un union type X | Y si es asignable a X o Y.
Union, intersection, and enumerated types
Named arguments

Cuando invocamos un método con argumentos, los argumentos se asignan a los parámetros de la función según el orden en que son declarados. Los named arguments permiten asignar los argumentos a los parámetros de la función por sus nombres. Wikipedia.

Destructuring assignment

La asignación desestructurada permite extraer datos de arrays y objetos usando una sintaxis réplica de la construcción de arrays y literales de objetos. MDN.

Tuples

Las tuplas son una estructura de datos formada por varios tipos, en Java 8 puede usarse la librería vavr que añade esto y otras funcionalidades interesantes. En algunos lenguajes puede combinarse con la asignación desestructurada. Ceylon Tuples.

# data[].attributes.attachment_link.title
Características de los lenguajes de programación

# data[].attributes.attachment_link.description
Hay cantidad de lenguajes de programación, algunas diferencias entre ellos se encuentran su propósito (general o específico para cierto tipo de tareas), en la sintaxis, el sistema de tipos, por los paradigmas de programación que soporta (POO, imperativo, funcional, ...), otras diferencias están en la librerías disponibles, frameworks o comunidad, sin embargo, la mayoría comparten algunas características por las que se pueden catalogar los lenguajes.

# data[].attributes.body
Con este criterio, nos aseguramos que el programa pueda ser ejecutado en las diferentes plataformas que existen hoy en día, todo eso permite que dicho programa pueda llegar a más usuarios

# data[].attributes.attachment_link.title
Lenguajes de programación y procesadores

# data[].attributes.attachment_link.description
Este libro ofrece una respuesta a un nuevo enfoque de unificación de las asignaturas de Lenguajes de Programación y Procesadores de Lenguajes, que han adoptado algunos grados relacionados con las Tecnologías de la Información, combinando contenidos de teoría de los lenguajes de programación, procesadores de lenguajes, paradigmas de los lenguajes de programación, aspectos pragmáticos de los lenguajes de programación y lenguajes de marcado.

# data[].attributes.body
Este criterio hace referencia al uso de recursos que realiza un lenguaje al momento de ejecutar el código. Con esto podemos considerar que lenguaje es óptimo de utilizar de acuerdo a las características que tenga nuestro equipo.

# data[].attributes.attachment_link.title
Lenguajes de programación y procesadores

# data[].attributes.attachment_link.description
Este libro ofrece una respuesta a un nuevo enfoque de unificación de las asignaturas de Lenguajes de Programación y Procesadores de Lenguajes, que han adoptado algunos grados relacionados con las Tecnologías de la Información, combinando contenidos de teoría de los lenguajes de programación, procesadores de lenguajes, paradigmas de los lenguajes de programación, aspectos pragmáticos de los lenguajes de programación y lenguajes de marcado.

# data[].attributes.body
Un criterio que va de la mano con la legibilidad, debido a que este nos indica que debemos considerar un lenguaje que posea instrucciones fáciles de escribir y entender para el programador, con la finalidad de poder realizar un código más fácil de escribir y de recordar en futuro

# data[].attributes.body
Indica que la codificación del lenguaje posee una sintaxis que es fácil de seguir y entender, posee instrucciones que se entienden de manera rápida, de manera que esto optimiza el tiempo a colaboradores que ingresen a un proyecto y para poder realizar u

# data[].attributes.attachment_link.readable_text
(Adapted from Randy Odendahl's CSC344 notes: http://www.cs.oswego.edu/~odendahl/coursework/csc344/notes/01-e-criteria.html, significantly influenced by [RS] - Sebesta, Robert. Concepts of Programming Languages 8e.)

Robert Sebesta's Language Evaluation Criteria

Readability
- program logic should be "easy" to follow.
- Among the elements that aid readability are: abstraction, info hiding, manifest interface, orthogonality.

Writability

Reliability

Others would add items such as maintainability to this list.

Maintainability
- programs should be easy to maintain.
- Maintenance includes bug fixes, enhancements to functionality, enhancements to speed or memory requirements, etc.
- The issues of readability, info hiding, manifest interface. generality, and regularity all figure heavily in maintainability.

Attributes of High-Level Programming Languages

[RS] also creates a table showing how each of several characteristics (or attributes) contributes to each of the criteria.

The following list of characteristics is not exhaustive; not all languages have each of these attributes; in some cases these attributes may be detrimental.

You should examine each as to its: definition, possible benefit and/or hindrance.

Discuss each of the attributes as to how it applies to any language you know or we study. [E.g., a typical CS student at Oswego should initially be able to surmise about a "feature" and its presence or absence and its utility within the Java programming language. Later he/she would be able to "extrapolate" how it might apply to other languages as they are studied.]

Attributes which were mentioned in the [RS] have an RS appended.

Simplicity [RS] - Simplicity of syntax, and few ways to do the same thing reduces errors. RS cites example of several ways to increment a counter (in Java). What is wrong with the following?
Orthogonality - PLs should have a small set of independent primitive constructs, controlled by independent mechanisms. These functions should interact, if at all, only in a clear, well-defined manner; and if they do interact, these interactions should be deterministic and expected. Language inconsistencies make programming harder. Consider in C: a function may return a structure, but not an array. A structure may contain an array, and that structure may be returned.

Using special tokens/characters/delimiters and a form which reflects meaning can improve the users ability to read and write reliable code.
An example, from [www.csl.sri.com/neumann/illustrative.html], tells about a Project Mercury incident:

In FORTRAN, variables are automatically declared. And, presumably orthogonally, ALL white space is ignored. [Note: It should also be orthogonal as to what marks the end of a loop.]

Thus, if the programmer intended to write

[Note: DO is an iterative construct comparable to Pascal:

or C/Java:

]But, if instead, the programmer wrote

The compiler would automatically declare a REAL variable

and generate the code to assign 1.100 to DO20I.

- No loop would be created but the code would be legal.
- No error would be flagged.

The above also highlights the impossibility of absolute black-box testing to prove code is correct. testing can be used to show the presence of bugs, but never to show their absence. -Dijkstra

The overall lesson is that, to date, programmers must rely heavily on structure to ensure program correctness.

There must be an adequate number of facilities for defining datatypes in the language. Consider something as mundane as java.awt.Point, without which, it would be cumbersome to perform many geometric operations.

Compare Java's break statement to C's. (This is also apropos to the control structures criterion.)

[Aside: see Dijkstra, Edgar " Go To Statement Considered Harmful", CACM 11(3) March, 1968]

The ability to express problem solutions independently of the underlying hardware and system software environment. Equally important is for a language to function at levels of abstraction beyond the elements of the language itself.For example, a linked list may be made to function transparently by using different levels of abstraction.[Aside: see Dijkstra, Edgar "Go To Statement Considered Harmful", CACM 11(3) March, 1968]
In many ways this is the most important attribute of HLL in general. Abstraction has connections to the idea of generality (below), an important concept throughout science and design.

A good example are the features of Perl's regular expressions. Because they are so expressive, Perl is semi-jokingly referred to as a write-only language.

Aliasing is using the same name for multiple entities in a program. These constructs can be limited, or allowed to various degrees.

Automation

compile-time and run-time (and even extra-program) mechanisms which may perform tasks on behalf of the programmer/maintainer. Tasks may be done automatically include

compile time: storage requirements, address calculation. maintenance algorithms.

run time: initialization of variables, execution of constructor code [note importance of constructors in OOP languages]

Generality

describing the solution to a problem as an instance of a solution to a more general problem.This applies equally to system design, OOD, etc. A more generic definition of the principle of generality would be:

A system is general when it has several parameters which, when grounded appropriately, completely specify an instance of that system.

Information Hiding

variables, procedures, etc., can be hidden from view and possible corruption. In Java, packages partially aid in information hiding. But, public, private, protected and package scope are more important. As is the concept of blocks of scope in most programming languages.

Things can be referred to by name, not just memory locations.This can be as simple as being able to use symbolic names for variables, to as complicated as network connection mechanisms.

Manifest Interface

access to procedures, data, etc., is "well-defined".The Java API is good example of the concept of manifest interface.

Portability

code written for one machine can be recompiled and run on any other.

Regularity

a languages syntax, semantics and other aspects can be concisely catalogued.Regular syntax and semantics may obviate the need for special rules that the programmer must memorize; e.g., register names, addressing modes.

programs can be checked for adherence to the rules of the language.

the syntax and semantics of the language impose a structure on a program.

Syntactic Consistency

similar constructs should perform similar functions.

# data[].attributes.attachment_link.title
Language Evaluation Criteria - Daniel R. Schlegel

# data[].attributes.attachment_link.description
(Adapted from Randy Odendahl's CSC344 notes: http://www.cs.oswego.edu/~odendahl/coursework/csc344/notes/01-e-criteria.html, significantly influenced by [RS] - Sebesta, Robert. Concepts of Programming Languages 8e.) Robert Sebesta's Language Evaluation Criteria Readability - program logic should be "easy" to follow. - Among the elements that aid readability are: abstraction, info hiding, manifest interface, orthogonality.

# data[].attributes.body
Criterio que facilita la realización de cambios en el futuro, con la menor cantidad de cambios en la sintaxis del programa, muchos lenguajes ofrecen reglas simples para realizar cambios con cierta complejidad

# data[].attributes.attachment_link.readable_text
(Adapted from Randy Odendahl's CSC344 notes: http://www.cs.oswego.edu/~odendahl/coursework/csc344/notes/01-e-criteria.html, significantly influenced by [RS] - Sebesta, Robert. Concepts of Programming Languages 8e.)

Robert Sebesta's Language Evaluation Criteria

Readability
- program logic should be "easy" to follow.
- Among the elements that aid readability are: abstraction, info hiding, manifest interface, orthogonality.

Writability

Reliability

Others would add items such as maintainability to this list.

Maintainability
- programs should be easy to maintain.
- Maintenance includes bug fixes, enhancements to functionality, enhancements to speed or memory requirements, etc.
- The issues of readability, info hiding, manifest interface. generality, and regularity all figure heavily in maintainability.

Attributes of High-Level Programming Languages

[RS] also creates a table showing how each of several characteristics (or attributes) contributes to each of the criteria.

The following list of characteristics is not exhaustive; not all languages have each of these attributes; in some cases these attributes may be detrimental.

You should examine each as to its: definition, possible benefit and/or hindrance.

Discuss each of the attributes as to how it applies to any language you know or we study. [E.g., a typical CS student at Oswego should initially be able to surmise about a "feature" and its presence or absence and its utility within the Java programming language. Later he/she would be able to "extrapolate" how it might apply to other languages as they are studied.]

Attributes which were mentioned in the [RS] have an RS appended.

Simplicity [RS] - Simplicity of syntax, and few ways to do the same thing reduces errors. RS cites example of several ways to increment a counter (in Java). What is wrong with the following?
Orthogonality - PLs should have a small set of independent primitive constructs, controlled by independent mechanisms. These functions should interact, if at all, only in a clear, well-defined manner; and if they do interact, these interactions should be deterministic and expected. Language inconsistencies make programming harder. Consider in C: a function may return a structure, but not an array. A structure may contain an array, and that structure may be returned.

Using special tokens/characters/delimiters and a form which reflects meaning can improve the users ability to read and write reliable code.
An example, from [www.csl.sri.com/neumann/illustrative.html], tells about a Project Mercury incident:

In FORTRAN, variables are automatically declared. And, presumably orthogonally, ALL white space is ignored. [Note: It should also be orthogonal as to what marks the end of a loop.]

Thus, if the programmer intended to write

[Note: DO is an iterative construct comparable to Pascal:

or C/Java:

]But, if instead, the programmer wrote

The compiler would automatically declare a REAL variable

and generate the code to assign 1.100 to DO20I.

- No loop would be created but the code would be legal.
- No error would be flagged.

The above also highlights the impossibility of absolute black-box testing to prove code is correct. testing can be used to show the presence of bugs, but never to show their absence. -Dijkstra

The overall lesson is that, to date, programmers must rely heavily on structure to ensure program correctness.

There must be an adequate number of facilities for defining datatypes in the language. Consider something as mundane as java.awt.Point, without which, it would be cumbersome to perform many geometric operations.

Compare Java's break statement to C's. (This is also apropos to the control structures criterion.)

[Aside: see Dijkstra, Edgar " Go To Statement Considered Harmful", CACM 11(3) March, 1968]

The ability to express problem solutions independently of the underlying hardware and system software environment. Equally important is for a language to function at levels of abstraction beyond the elements of the language itself.For example, a linked list may be made to function transparently by using different levels of abstraction.[Aside: see Dijkstra, Edgar "Go To Statement Considered Harmful", CACM 11(3) March, 1968]
In many ways this is the most important attribute of HLL in general. Abstraction has connections to the idea of generality (below), an important concept throughout science and design.

A good example are the features of Perl's regular expressions. Because they are so expressive, Perl is semi-jokingly referred to as a write-only language.

Aliasing is using the same name for multiple entities in a program. These constructs can be limited, or allowed to various degrees.

Automation

compile-time and run-time (and even extra-program) mechanisms which may perform tasks on behalf of the programmer/maintainer. Tasks may be done automatically include

compile time: storage requirements, address calculation. maintenance algorithms.

run time: initialization of variables, execution of constructor code [note importance of constructors in OOP languages]

Generality

describing the solution to a problem as an instance of a solution to a more general problem.This applies equally to system design, OOD, etc. A more generic definition of the principle of generality would be:

A system is general when it has several parameters which, when grounded appropriately, completely specify an instance of that system.

Information Hiding

variables, procedures, etc., can be hidden from view and possible corruption. In Java, packages partially aid in information hiding. But, public, private, protected and package scope are more important. As is the concept of blocks of scope in most programming languages.

Things can be referred to by name, not just memory locations.This can be as simple as being able to use symbolic names for variables, to as complicated as network connection mechanisms.

Manifest Interface

access to procedures, data, etc., is "well-defined".The Java API is good example of the concept of manifest interface.

Portability

code written for one machine can be recompiled and run on any other.

Regularity

a languages syntax, semantics and other aspects can be concisely catalogued.Regular syntax and semantics may obviate the need for special rules that the programmer must memorize; e.g., register names, addressing modes.

programs can be checked for adherence to the rules of the language.

the syntax and semantics of the language impose a structure on a program.

Syntactic Consistency

similar constructs should perform similar functions.

# data[].attributes.attachment_link.title
Language Evaluation Criteria - Daniel R. Schlegel

# data[].attributes.attachment_link.description
(Adapted from Randy Odendahl's CSC344 notes: http://www.cs.oswego.edu/~odendahl/coursework/csc344/notes/01-e-criteria.html, significantly influenced by [RS] - Sebesta, Robert. Concepts of Programming Languages 8e.) Robert Sebesta's Language Evaluation Criteria Readability - program logic should be "easy" to follow. - Among the elements that aid readability are: abstraction, info hiding, manifest interface, orthogonality.

# data[].attributes.body
Es uno de los principales aspecto que debemos considerar, sobre todo para usuarios que no se encuentran tan familiarizados en el tema. Este criterio se refiere a que el lenguaje maneja conceptos simples y fáciles de entender. Con esto se puede obtener un código sencillo de entender para todos

# data[].attributes.attachment_link.title
CSE 341 -- Evaluating Programming Languages

# data[].attributes.attachment_link.description
Programmers are more expensive than machines, so they'd better be able to make fast progress. (We should consider both the language and its environment in making this evaluaiton.)

# data[].attributes.headline
Criterios para evaluar un Lenguaje de Programación

# data[].attributes.subject
Criterios para evaluar un Lenguaje de Programación

# data[].attributes.body
Actualmente los lenguajes de programación son utilizados para una diversidad de actividades; ante ellos, debemos tener claro que algunos pueden ofrecer mayores beneficios que otros al momento de resolver un problema, por aquello, existen diferentes criterios que debemos considerar al momento de querer utilizar un lenguaje.

# data[].attributes.attachment_link.readable_text
So, if you ever get into an argument about programming languages, what should you say?

Criteria for Evaluation

Reasonable people know that all languages have their pros and cons. But why are some things pros and other things cons?

Technical Criteria

Let's see.... Is the language:

Easy to read? Because:

Over 90% of programmer time is reading and modifying existing code

Labor costs dwarf hardware costs

If someone can't understand existing code, it will get thrown away

Easy to write? Because:
If the learning curve is too high, who would bother to use it?

Highly Expressive? That would help reading and writing. Does the language have:

Operators like A = B + C which adds whole arrays in Fortran 90?

Abstract data types (with encapsulation)?

Module and package structures to aid programming-in-the-large?

A rich operator set, as in languages like APL and Perl?

Rich type/object structures supporting inheritance, composition and aggregation?

Polymorphism, overloading, aliasing?

Higher order functions?

Pattern matching?

Built-in control flow (e.g. unification, backtracking)?

Facilities for symbolic computation?

Support for asynchronous, concurrent, and distributed programming?

Designed to make it impossible to making (some) stupid mistakes? Some languages do! For example you might see:

Designed to allow quick and incremental compilation? Because breaking a programmer's flow by constantly hitting that compile button or having to run linkers, or such things get annoying.

If compilation is as fast as you can type, development time and cost can be greatly reduced.

If compilation can be incremental, there's no need to recompile after making small changes.

If compilation can be quick, some compilation can be done at runtime to adapt to changing conditions.

Amenable to efficient target code generation?

Languages with static scope and type checking keep the runtime system free from tons of work, e.g. no runtime variable lookup: all variable references have already been resolved to machine addresses.

Languages with no first-class functions allow for stack-allocation of frames.

Some languages are strongly influenced by hardware.

Genuinely portable? Yes, we want our creations to spread!
Many languages have too many implementation dependencies.

Also see Wikipedia's Programming Language Comparison article.

Non-Technical Criteria

Good and successful are not the same! Success comes from:

Being the only language suitable for a specific problem

Personal preference (no accounting for taste)

Good development environments

Fast compilers (not necessarily a language issue!)

A massive ecosystem (like NPM or Maven or Pip or Gems)

Patronage (support from a government or big company)

"Everyone else is using it"

"The boss made me use it"

Economics and Inertia - "we already invested too much in this to change"

Laziness - "I'm too tired to learn a new language"

Exercise: What else can you think of that makes people want to use a particular language?

Popularity

There are countless numbers of ways to measure popularity! You really can't make popularity statements without stating your measure. Then people will argue whether your measure is even valid.... Nevertheless, it's fun to look at this stuff from time to time.

RedMonk has a language ranking scheme that combines pull requests on GitHub and questions on StackOverflow. (One could argue that this measures how confusing a language is too...maybe all those StackOverflow questions are all about wtfs.) Here is the ranking from June 2017:

RedMonk gives these rankings:

   1 JavaScript
   2 Java
   3 Python
   4 PHP
   5 C#
   6 C++
   7 CSS
   8 Ruby
   9 C
  10 Objective-C
  11 Swift
  12 Shell
  12 Scala
  14 R
  15 Go
  15 Perl
  17 TypeScript
  18 PowerShell
  19 Haskell
  20 CoffeeScript
  20 Lua
  20 Matlab

Another ranking system, by Tiobe, ends up with a radically different top 20. They say: "The ratings are based on the number of skilled engineers world-wide, courses and third party vendors. Popular search engines such as Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube and Baidu are used to calculate the ratings."

Here is TIOBE's top-20. Pretty different than RedMonk's, right?

   1 Java
   2 C
   3 C++
   4 Python
   5 C#
   6 VB.NET
   7 JavaScript
   8 PHP
   9 Perl
  10 Assembly Language
  11 Ruby
  12 Swift
  13 Delphi/Object Pascal
  14 R
  15 Go
  16 Visual Basic
  17 MATLAB
  18 Objective C
  19 Scratch
  20 PL/SQL

But what makes a language popular? MPJ tells us:

Understanding Evaluation Tradeoffs

You can't have everything, it seems:

The expressive power of dynamic typing, polymorphic type systems, functions as first-class values, higher-order functions, and closures can sometimes impact performance.

Automatic garbage collection saves billions of dollars in programmer time, but isn't always a good idea in embedded, life-critical, real-time systems.

A language may be wonderful and amazing and increase developer productivity, but if no talented people are out there that know the language, how will you hire the best team?

Languages that are intentionally designed to be horrible (Brainfuck, Java2K, Malbolge, etc.) have some intellectual and educational value (and offer amusement).

Exercise: Think up some other tradeoffs.

# data[].attributes.attachment_link.description
So, if you ever get into an argument about programming languages, what should you say? Reasonable people know that all languages have their pros and cons. But why are some things pros and other things cons? Let's see.... Is the language: Easy to read?

# data[].attributes.body
Capacidad de la computadora

Aplicaciones

Métodos de programación

Métodos de implementación

Estudios Teóricos

Estandarización

# data[].attributes.body
Lenguaje Máquina (1940)

Lenguaje Ensamblador (1950)

Fortran (1957)

Lips (1958)

Cobol (1959)

Basic (1964)

Pascal (1970)

C (1972)

Ada (1980)

C++, Objetive C (1983)

Perl (1987)

Phyton (1991)

Ruby (1993)

Java, JavaScript, PHP (1995)

# data[].attributes.attachment_link.title
Evolución De Los Lenguajes De Programacion Timeline | Preceden

# data[].attributes.attachment_link.description
Primer lenguaje de programación. Primera generacion. Desarrolo del lenguaje ensamblador. Segunda generacion. Fortran. Lips. Cobol. Tercera generacion. Basic....

# data[].attributes.body
Espinoza Delgado Joel
Gómez Pesantes Leonardo
Medina López Jordy

# data[].attributes.body
Todo inicia por el lenguaje de máquina y su complicación en el manejo grandes números de errores junto a una tarea de depuración  que exigía bastante tiempo, lo que impulso a la creación de una notación simbólica, después se lo adapto al pensamiento humano

# data[].attributes.headline
Fundamentos de un Lenguaje de Programación

# data[].attributes.subject
Fundamentos de un Lenguaje de Programación

# data[].attributes.body
Comando de Asignación: Proceso de sobre escritura de datos.
Valores L y valores R:  También conocido como "pares de carga-actualización"
Definiciones:  La relación entre un nombre y su valor L no puede ser alterada por la asignación, y es este hecho el que hace que el valor L sea importante.
Nombre:Ser claro al respecto es vital, debido a que se puede causar confusión la cual  puede ser causada por los diferentes usos de los términos
Númerales: Cada numeral distinguible tiene un valor R apropiado asociado con él