Lenguaje y Compiladores

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 32

UNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA

VICERRECTORADO ACADÉMICO
COORDINACIÓN GENERAL DE ESTUDIO
INGENIERIA EN INFORMATICA
LENGUAJE Y COMPILADORES

INFORME DE INVESTIGACIÓN

Profesor: Integrantes:
Félix Márquez Marian García
Delguis Ferman
Adrian Moreno
Daniel Porras

Puerto Ordaz, 27 de julio de 2021


Resumen

En el área de desarrollo de software existen diferentes paradigmas que pueden ser


utilizados, un paradigma se refiere a un estilo de programación de software, actualmente
existen muchos como el lógico, funcional y orientado a objetos. Cada uno de ellos posee
una manera distinta de desarrollar: en el caso de la programación lógica, como su nombre
lo especifica, se basan en la teoría lógica de primer orden aunque también incluyen algunos
comportamientos de orden superior, este tipo de lenguaje ofrece herramientas de
programación únicas, que permite desarrollar aplicaciones de inteligencia artificial con
suma facilidad. Prolog es un ejemplo de un lenguaje logico; por otro lado los lenguajes
funcionales, se basa en el desarrollo de funciones que tienen su funcionalidad específicas,
por lo que los programas desarrollados bajo este paradigmas estarán compuestos de
funciones. Una función es una implementación de comportamientos que reciben un
conjunto de datos de entrada y devuelve una salida. Algunos lenguajes funcionales son:
Haskell y Erlang; y por último se encuentran los lenguajes orientados a objetos, donde el
comportamiento de los programas son llevados a cabo por objetos, un objeto es una entidad
que contiene atributos (valor) y comportamientos (métodos). Este enfoque ofrece facilidad
cuando se requiere desarrollar software de grandes y complejos, y además trae consigo
beneficios adicionales como la reutilización de código y la eficiencia del mismo. Algunos
lenguajes orientados a objetos son: Python, Java y C++. Además existen lenguajes script,
un script se refiere a una secuencia de comandos que regularmente no se compilan con
anterioridad a lenguaje de máquina, sino que son ejecutados por un intérprete cuando se
ejecutan. Existen lenguajes de programación que aunque no son para realizar scripting,
permiten la codificación de scripts, por ejemplo Python y Javascript. Existen otros que
fueron creados para el scripting como Perl y Shell.

Palabras Claves: Programación, Paradigma, Lenguaje.


introducción

Los primeros lenguajes de programación de alto nivel se diseñaron durante los años
1950. Desde entonces los lenguajes de programación han sido una fascinante y prolífica
área de estudio para los científicos de la computación y los ingenieros.

El estudio de los lenguajes de programación, es llamado a veces lingüística de la


programación, por analogía con la lingüística de los lenguajes naturales. La analogía se
basa en el hecho en que ambos lenguajes naturales y lenguajes de programación, poseen
sintaxis (forma) y semántica (significado). La analogía no puede tomarse en todo el
contexto, Los lenguajes de programación no pueden ser comparados con los lenguajes
naturales en términos de su rango de expresividad y subjetividad. Por otro lado, un
lenguaje natural no es más ni menos que un grupo de personas que hablan y escriben, así
que la lingüística natural está restringida al análisis de los lenguajes existentes; mientras
que los lenguajes de programación son concienzudamente diseñados y se pueden
implementar en computadoras.

(acomodar)

Explique los diferentes paradigmas de lenguajes de programación, seleccione un


problema y resuelva en un lenguaje por cada paradigma.
Un paradigma de programación es una manera o estilo de programación de software.
Existen diferentes formas de diseñar un lenguaje de programación y varios modos de
trabajar para obtener los resultados que necesitan los programadores. Se trata de un
conjunto de métodos sistemáticos aplicables en todos los niveles del diseño de programas
para resolver problemas computacionales.
Los lenguajes de programación adoptan uno o varios paradigmas en función del tipo de
órdenes que permiten implementar.

1- Lógico

La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de primer


orden, aunque también incorporan algunos comportamientos de orden superior. En este
sentido, destacan los lenguajes funcionales, ya que se basan en el cálculo lambda, que es la
única teoría lógica de orden superior que es demostradamente computable (hasta el
momento).

El cálculo de predicados de primer orden consta de un alfabeto y de dos clases de


expresiones definidas a partir de los símbolos de este alfabeto, los términos y las fórmulas.

La programación lógica ofrece herramientas de programación que, en algunos casos, son


únicas de este paradigma, y que permiten desarrollar aplicaciones de inteligencia artificial
con suma facilidad y elegancia. La manera de pensar en los lenguajes de programación
lógica es bastante diferente a la de los lenguajes de programación tradicionales. Debido a
que la programación lógica nace de la lógica, que desde tiempo inmemorial intenta
capturar el pensamiento humano, por un lado constituye una manera más natural de
organizar nuestro pensamiento que la de los lenguajes tradicionales y, por el otro, requiere
una mayor capacidad de abstracción. En lugar de pensar en términos de bajo nivel, como
bits, bytes, asignaciones y repeticiones; la programación lógica nos permite pensar en
términos de premisas y conclusiones, y representar un dominio de problemas mediante una
serie de axiomas lógicos que serán usados por un demostrador automático para deducir la
solución a un problema particular planteado frente a esa serie de axiomas. La mayoría de
las aplicaciones de inteligencia artificial se desarrollan en este lenguaje por ese motivo.

La programación lógica es una variedad de lo que conocemos con programación


declarativa, un paradigma opuesto a prácticamente todos los lenguajes de programación
populares, desde ensamblador a Python pasando por BASIC, C o Java, a los que
agrupamos en la categoría de la programación imperativa.

En dichos lenguajes, la labor del programador es establecer cómo se resuelve un problema


mediante sentencias. Sin embargo, la programación lógica no gira en torno al cómo, sino al
qué: se trabaja de forma descriptiva, estableciendo relaciones entre entidades, lo que obliga
a los que los lenguaje tengan un alto nivel de abstracción.

Este paradigma se basa en la fórmula "algoritmos = lógica + control" (la llamada Ecuación
Informal de Kowalski), lo que significa que un algoritmo se crea especificando
conocimiento mediante axiomas (lógica) y el problema se resuelve mediante un mecanismo
de inferencia que actúa sobre el mismo (control).

La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de primer


orden, aunque también incorporan algunos comportamientos de orden superior. En este
sentido, destacan los lenguajes funcionales, ya que se basan en el cálculo lambda, que es la
única teoría lógica de orden superior que es demostradamente computable (hasta el
momento).

El cálculo de predicados de primer orden consta de un alfabeto y de dos clases de


expresiones definidas a partir de los símbolos de este alfabeto, los términos y las fórmulas.

Características de la programación lógica

La programación lógica es sustancialmente diferente de las otras estrategias de


programación existentes. En lugar de darle instrucciones a una computadora con el
programa, se establecen relaciones entre los objetos. De esta manera la computadora puede
razonar estas relaciones y así alcanzar soluciones lógicas.

Verdad y deducción lógica

Los programas lógicos se pueden descifrar a través de dos conceptos importantes: verdad y
deducción lógica. La verdad sale si el cálculo en el programa es verdadero o no, bajo la
implementación de los símbolos del programa. La deducción lógica determina si una
cláusula lógica es una consecuencia del programa.

Estas instrucciones siempre se interpretarán como sentencias y cláusulas lógicas, siendo el


resultado de su ejecución una consecuencia lógica de los cálculos que contenga.

Lógica de primer orden

Es una ramificación de la lógica proposicional. Considera si los objetos son verdaderos o


falsos desde una perspectiva parcial del mundo, llamada dominio. La programación lógica
se basa en una generalización de la lógica de primer orden.

Esta lógica está compuesta de sintaxis y semántica. La sintaxis es el lenguaje formal que se
utiliza para expresar conceptos. Por otro lado, la semántica de las fórmulas lógicas de
primer orden indica cómo determinar el valor verdadero de cualquier fórmula.

Esta lógica se fundamenta en un alfabeto y un lenguaje de primer orden, además de un


conjunto de axiomas y reglas de inferencia.

Forma clausal

Es un subconjunto de la lógica de primer orden. Tiene una forma normalizada donde una
sentencia viene definida por un prefijo universal o cadena de cuantificadores universales, y
un conjunto libre de cuantificadores de la cláusula.

Al solicitar una consulta al programa se considerará el cuerpo de la cláusula cuyo


encabezado pueda coincidir. Esto es lo mismo que aplicar en lógica una regla de inferencia.

Como paso de la inferencia se eligen dos cláusulas que tengan como propiedad que una
contenga un disyuntivo X (un literal positivo) y la otra contenga un disyuntivo ¬X (un
literal negativo). Estos disyuntivos se conocen como complementarios.

A partir de estas dos cláusulas iniciales se construye una nueva cláusula resolutiva
utilizando todos los literales, excepto los complementarios.
Inteligencia artificial

La programación lógica es una metodología que es empleada para buscar que las
computadoras deduzcan, porque resulta útil para representar el conocimiento. Se utiliza la
lógica para representar el conocimiento y la inferencia para manejarlo.

La lógica utilizada para representar el conocimiento es la forma clausal. Se utiliza porque


la lógica de primer orden se entiende bien y es capaz de representar todos los problemas
computacionales.

Prolog es un lenguaje de programación que se basa en las ideas de programación lógica. La


idea de Prolog es hacer que la lógica parezca un lenguaje de programación.

2- Funcional.

La programación funcional no es más que un paradigma de programación, es decir, es una


forma en la cual podemos resolver diferentes problemáticas.

Los programas se componen de funciones, es decir, implementaciones de comportamiento


que reciben un conjunto de datos de entrada y devuelven un valor de salida.
Cuando nos encontramos desarrollamos software utilizando este paradigma, estaremos
trabajando principalmente con funciones, evitaremos los datos mutables, así como el hecho
de compartir estados entre funciones.

Con este paradigma las funciones serán tratadas como ciudadanos de primera clase. Las
funciones podrán ser asignadas a variables además podrán ser utilizadas como entrada y
salida de otras funciones.

A las funciones que puedan tomar funciones como parámetros y devolver funciones como
resultado serán conocidas como función de orden superior.

La programación funcional es un paradigma declarativo. Nos enfocaremos en "qué"


estamos haciendo y no en "cómo" se está haciendo que sería el enfoque imperativo. Esto
quiere decir que nosotros expresaremos nuestra lógica sin describir controles de flujo; no
usaremos ciclos o condicionales.

Al trabajar con programación funcional, nos toparemos con conceptos tales cómo:

● Funciones puras: no son más que funciones, las cuales, dando el mismo input,
siempre retornan el mismo output, además de no tener efectos secundarios.

● Composición de funciones: La composición de funciones es el proceso de combinar


dos o más funciones, teniendo como finalidad ejecutar cada una de estas funciones
en secuencia para obtener un resultado en concreto.
● Estados compartidos: El estado compartido es cualquier variable, objeto o espacio
de memoria que exista en un ámbito compartido. Un ámbito compartido puede
incluir el alcance global o ámbitos de cierre. A menudo, en la programación
orientada a objetos, los objetos se comparten entre ámbitos al agregar propiedades a
otros objetos.

● Mutabilidad: Un objeto inmutable es aquel que no puede ser modificado una vez
haya sido creado. Podemos ver a los objeto inmutables como constantes, una vez
nosotros asignamos un valor este no podrá ser modificado.

● Efecto secundario: Un efecto secundario es cualquier cambio de estado en la


aplicación que sea observable fuera de la función llamada.

Actualmente contamos con una gran cantidad de lenguajes en donde podemos hacer uso de
la programación funcional, por ejemplo :

● PHP
● Ruby
● Python
● Elixir
● Kotling
● Haskell
● Erlang

Muchos de estos lenguajes no están cien por ciento enfocados en la programación


funcional, lo cual no es malo, de hecho, estos nos permiten hacer una transición de un
paradigma a otro, comúnmente de la programación orientada a objetos a la programación
funcional.
3- Orientado a objetos

El comportamiento del programa es llevado a cabo por objetos, entidades que representan
elementos del problema a resolver y tienen atributos y comportamiento. La programación
orientada a objetos (Object Oriented Programming, OOP) es un modelo de programación
informática que organiza el diseño de software en torno a datos u objetos, en lugar de
funciones y lógica. Un objeto se puede definir como un campo de datos que tiene atributos
y comportamientos únicos.

La programación orientada a objetos se centra en los objetos que los desarrolladores


quieren manipular en lugar de enfocarse en la lógica necesaria para manipularlos. Este
enfoque de programación es adecuado para programas que son grandes, complejos y se
actualizan o mantienen activamente.

La organización de un programa orientado a objetos también hace que el método sea


beneficioso para el desarrollo colaborativo, donde los proyectos se dividen en grupos.

Los beneficios adicionales de la programación orientada a objetos incluyen la reutilización,


la escalabilidad y la eficiencia del código. Incluso cuando se utilizan microservicios, los
desarrolladores deben seguir aplicando los principios de la programación orientada a
objetos.

El primer paso en OOP es recopilar todos los objetos que un programador desea manipular
e identificar cómo se relacionan entre sí, un ejercicio que a menudo se conoce como
modelado de datos.

Los ejemplos de un objeto pueden variar desde entidades físicas, como un ser humano que
se describe por propiedades como nombre y dirección, hasta pequeños programas
informáticos, como widgets.
Una vez que se conoce un objeto, se etiqueta con una clase de objetos que define el tipo de
datos que contiene y cualquier secuencia lógica que pueda manipularlo. Cada secuencia
lógica distinta se conoce como método. Los objetos pueden comunicarse con interfaces
bien definidas llamadas mensajes.

Principios de OOP

La programación orientada a objetos se basa en los siguientes principios:

Encapsulación. La implementación y el estado de cada objeto se mantienen de forma


privada dentro de un límite definido o clase. Otros objetos no tienen acceso a esta clase o la
autoridad para realizar cambios, pero pueden llamar a una lista de funciones o métodos
públicos. Esta característica de ocultación de datos proporciona una mayor seguridad al
programa y evita la corrupción de datos no intencionada.

Abstracción. Los objetos sólo revelan mecanismos internos que son relevantes para el uso
de otros objetos, ocultando cualquier código de implementación innecesario. Este concepto
ayuda a los desarrolladores a realizar cambios y adiciones más fácilmente a lo largo del
tiempo.

Herencia. Se pueden asignar relaciones y subclases entre objetos, lo que permite a los
desarrolladores reutilizar una lógica común sin dejar de mantener una jerarquía única. Esta
propiedad de OOP obliga a un análisis de datos más completo, reduce el tiempo de
desarrollo y asegura un mayor nivel de precisión.

Polimorfismo. Los objetos pueden adoptar más de una forma según el contexto. El
programa determinará qué significado o uso es necesario para cada ejecución de ese objeto,
reduciendo la necesidad de duplicar código.

Lenguajes de programación orientados a objetos

Si bien Simula se acredita como el primer lenguaje de programación orientado a objetos,


los lenguajes de programación orientada a objetos más populares son:
● Java
● JavaScript
● Python
● C++
● Visual Basic .NET
● Ruby
● Scala
● PHP

OOPSLA es la conferencia anual para aplicaciones, lenguajes y sistemas de programación


orientados a objetos.

La estructura morfológica ( léxica y sintáctica) de los lenguajes shell (bash), perl y


python.

Lenguaje Shell (Bash):

El shell de Unix o también shell, es el término usado en informática para referirse


a un intérprete de comandos. Los comandos que aportan los intérpretes, pueden
usarse a modo de guión si se escriben en ficheros ejecutables denominados shell-
scripts, de este modo, cuando el usuario necesita hacer uso de varios comandos o
combinados de comandos con herramientas, escribe en un fichero de texto
marcado como ejecutable, las operaciones que posteriormente, línea por línea, el
intérprete traducirá al núcleo para que las realice. Sin ser un shell estrictamente
un lenguaje de programación, al proceso de crear scripts de shell se le denomina
programación shell o en inglés, shell programming o shell scripting. Los usuarios
de Unix y similares, pueden elegir entre distintos shells (programa que se debería
ejecutar cuando inician la sesión, bash, ash, csh, zsh, ksh, tcsh).

El término shell también hace referencia a un programa particular, tal como el


Bourne shell, sh. El Bourne shell fue el shell usado en las primeras versiones de
Unix y se convirtió en un estándar; todos los sistemas similares a Unix tienen al
menos un shell compatible con el Bourne shell. El programa Bourne shell se
encuentra dentro de la jerarquía de archivos de Unix en /bin/sh. En algunos
sistemas, tal como BSD, /bin/sh es un Bourne shell o un equivalente, pero en
otros sistemas como muchas distribuciones de Linux, /bin/sh es un enlace
simbólico a un shell compatible con más características (como Bash). POSIX
especifica su shell estándar como un subconjunto estricto del Korn shell.
Con el lenguaje Shell script, se pueden crear comandos propios que se adecuen a
las necesidades de cada usuario, lo que permite automatizar muchas tareas
rutinarias y lograr una mejor inversión del tiempo. Lo bueno es que la
programación del nuevo comando se puede auxiliar directamente de los
comandos que se agregan cuando se instala el SO y de los que han hecho otros
colegas, todo lo cual se logra relativamente fácil y rápido. Los administradores de
sistema pueden automatizar sus labores e intercambiar con otros colegas los
comandos que les han resultado útiles, de forma que se provean de una amplia
gama de herramientas que les ayuden a hacer muchas tareas rutinarias que poco
a poco irán automatizando.

En los Sistemas operativos Unix existen múltiples implementaciones de


shell (en Windows, el equivalente serían los programas "command.com"
o "cmd.exe"). Atendiendo al shell del que proceden y a su similitud
sintáctica (incluyendo sus comandos internos), los shells de Unix
pueden clasificarse en dos grandes familias (existen algunos shell
adicionales, de uso residual y dentro de los shells de una misma familia
también existen diferencias, pero gran parte de su sintaxis es común):

1. sh (Bourne Shell): este shell fue usado desde las primeras


versiones de Unix (Unix Versión 7). Recibe ese nombre por su
desarrollador, Stephen Bourne, de los Laboratorios Bell de AT&T.
A raíz de él han surgido múltiples shells, tales como zsh (Z shell),
ash (almquist shell), bash (Bourne again shell), dash (Debian
almquist shell) o ksh (Korn shell). Por su mayor uso pueden
destacarse:
○ bash: fue desarrollado para ser un superconjunto de la
funcionalidad del Bourne Shell (en la que incluye
funcionalidades de ksh y csh), siendo el intérprete de
comandos asignado por defecto a los usuarios en las
distribuciones de Linux, por lo que es el shell empleado en
la mayoría de las consolas de comandos de Linux. Se
caracteriza por una gran funcionalidad adicional a la del
Bourne Shell. Como ficheros personales de los usuarios
emplea $HOME/.bashrc y .bash_profile.
○ dash (Debian almquist shell), derivado directo de ash, se
caracteriza por ser mucho más ligero (depende de menos
bibliotecas) y rápido que otros shells, tales como bash,
aunque con menos características funcionales. El fichero
personal del usuario es $HOME/.profile.
○ ksh (Korn shell): destaca por sus funciones avanzadas para
manejar archivos, pudiendo competir con lenguajes de
programación especializados tales como awk o perl.
2. Bourne Shell ha llegado a convertirse en un estándar de facto de
tal modo que todos los sistemas Unix tienen, al menos, una
implementación del Bourne Shell (o un shell compatible con él),
ubicada en /bin/sh. En el caso concreto de los S.O.’s UNIX Linux,
no existe ninguna implementación del Bourne Shell, manteniendo
la entrada /bin/sh (así como su manual man sh) como un enlace
simbólico a una implementación de shell compatible. En concreto:
○ En algunos S.O’s Linux se enlaza a /bin/bash.
○ En Debian, desde Debian Lenny "5.0" (en Ubuntu desde la
versión 6.10) se enlaza a /bin/dash: de este modo, estas
distribuciones pretenden hacer uso de:
■ dash: para los shell scripts empleados en el arranque
del sistema (cuyo shebang tradicionalmente siempre
ha sido #!/bin/sh), aprovechando la mayor rapidez de
este intérprete.
■ bash: en las consolas de comandos y scripts de
servicios de los usuarios, de modo que éstos puedan
aprovechar la mayor funcionalidad que éste intérprete
ofrece.
3. csh (C shell): caracterizado por presentar una sintaxis muy
parecida a la del lenguaje de programación C. Como shell
derivados destaca tcsh. Estos shell cuentan con un nivel de uso
muy inferior respecto a los de la familia Bourne Shell.
Para intentar homogeneizar esta diversidad de shells, el IEEE
definió un estándar de "intérprete de comandos" bajo la
especificación POSIX 1003.2 (también recogida como ISO
9945.2). La creación de dicho estándar se basó en la sintaxis que
presentaban múltiples shells de la familia Bourne shell (el propio
Bourne Shell de Unix Versión 7, implementaciones en UNIX
System V y BSD, así como ksh). Esto ha llevado a que la gran
mayoría de los shells derivados del Bourne Shell, tales como bash,
dash o ksh, den soporte a este estándar POSIX (mientras que los
derivados del csh no). En concreto:
○ bash: respeta completamente el estándar POSIX, sobre el
que añade un número considerable de extensiones
(estructura select, arrays, mayor número de operadores,...).
○ dash: conforme al estándar POSIX IEEE 1003.2, sólo
ampliado con algunas extensiones Berkeley. De forma
precisa, tal como indica el manual del intérprete dash de su
sistema (man dash), la línea de desarrollo de dash pretende
que éste satisfaga el estándar POSIX de shells IEEE 1003.2,
propósito casi logrado en la actualidad (sólo presenta
algunas características faltantes, como la variable
$LINENO).
El lenguaje shell es un lenguaje interpretado, en el que se leen líneas de
texto (terminadas en \n), se analizan y se procesan. Las líneas a
interpretar son leídas de:

● La entrada estándar (teclado por defecto). En este caso el shell se


dice que es un shell interactivo.
● Un fichero shell-script.
● Los argumentos, con la opción -c al ejecutar el shell. Ejemplo:
bash –c "ls –l"

Con las líneas leídas, el shell realiza los siguientes pasos (en este
orden):

1. Se dividen las líneas en distintos elementos: palabras y


operadores. Los elementos se separan usando espacios,
tabuladores y operadores. El carácter # sirve para incluir un
comentario, que se elimina del procesamiento.
2. Se distingue entre comandos simples, comandos compuestos y
definiciones de función.
3. Se realizan distintas expansiones y sustituciones (ver más
adelante). Se detecta el comando a ejecutar y los argumentos que
se le van a pasar.
4. Se realizan las redirecciones de entrada/salida y se eliminan los
elementos asociados a las redirecciones de la lista de argumentos.
Las redirecciones de entrada/salida ya se han explicado en un
tema anterior (si desea ampliar información, consulte el anexo).
5. Se ejecuta el elemento ejecutable, que podría ser una función, un
comando interno del shell, un fichero ejecutable o un shell-script,
pasando los argumentos como parámetros posicionales (ver más
adelante).
6. Opcionalmente, se espera a que termine el comando y se guarda
el código de salida.

En su forma más básica, un shell-script puede ser un simple fichero de


texto que contenga uno o varios comandos. Para ayudar a la
identificación del contenido a partir del nombre del archivo, es habitual
que los shell scripts tengan la extensión ".sh".

Como contenido del script pueden utilizarse múltiples elementos


(comandos, variables, funciones, estructuras de control,
comentarios,...) que se analizarán en el siguiente apartado.

El "shebang" permite especificar el intérprete de comandos con el que


deseamos que sea interpretado el resto del script cuando se usa
invocación implícita (ver más adelante). La sintaxis de esta línea es la
secuencia #! seguida del ejecutable del shell deseado, sobre lo que
deben realizarse la siguientes advertencias:

● Es imprescindible que sea la primera línea del script, ya que, en


caso contrario, sería interpretado como un comentario (comienza
con el carácter #).
● Puede haber espacios entre #! y el ejecutable del "shell".
● El shebang no es obligatorio (cuando se usa invocación implícita,
si no se indica se intentará usar el mismo tipo de shell desde el
que se ha invocado el script).

Como en cualquier lenguaje de programación, en el lenguaje shell se


pueden crear y utilizar variables, que aquí se llaman parámetros.
Existen varios tipos de parámetros:

1. Si el nombre es un número se denominan parámetros


posicionales.
2. Si el nombre es un carácter especial se denominan parámetros
especiales.
3. El resto se denominan simplemente variables.

Las variables se inicializan desde el entorno y se les pueden dar nuevos


valores con comandos de asignación de variables. Si una variable se
inicializa desde el entorno, se marcará para exportar inmediatamente;
vea la exportación especial incorporada. Se pueden definir e inicializar
nuevas variables con asignaciones de variables, con las utilidades read o
getopts , con el parámetro name en un bucle for , con $ { name =
word} expansión, o con otros mecanismos proporcionados como
extensiones de implementación.

Parámetros especiales.

A continuación se enumeran los parámetros especiales y los valores a


los que se expandirán. Solo se enumeran los valores de los parámetros
especiales:

@. Se expande a los parámetros posicionales, comenzando desde uno.


Cuando la expansión ocurre entre comillas dobles, y donde se realiza la
división de campos , cada parámetro posicional se expandirá como un
campo separado, con la condición de que la expansión del primer
parámetro aún se unirá con la parte inicial de la palabra original
(asumiendo que el parámetro expandido estaba incrustado dentro de
una palabra), y la expansión del último parámetro aún se unirá con la
última parte de la palabra original. Si no hay parámetros posicionales, la
expansión de '@' generará campos cero, incluso cuando '@' esté entre
comillas dobles.
*. Se expande a los parámetros posicionales, comenzando desde uno.
Cuando la expansión ocurre dentro de una cadena entre comillas
dobles, se expandirá a un solo campo con el valor de cada parámetro
separado por el primer carácter de la variable IFS , o por un <space> si
IFS no está establecido . Si IFS se establece en una cadena nula, esto
no equivale a desarmarlo; su primer carácter no existe, por lo que los
valores de los parámetros están concatenados.

#. Se expande al número decimal de parámetros posicionales. El


nombre del comando (parámetro 0) no se contará en el número dado
por '#' porque es un parámetro especial, no un parámetro posicional.

?. Se expande al estado de salida decimal de la canalización más


reciente.

-(Guión.). Se expande a los indicadores de opción actuales (los nombres


de opciones de una sola letra concatenados en una cadena) como se
especifica en la invocación, por el comando incorporado especial set , o
implícitamente por el shell.

PS. Se expande al ID de proceso decimal del shell invocado. En una


subcapa, '$' se expandirá al mismo valor que el del shell actual.

!. Se expande al ID de proceso decimal del comando en segundo plano


más reciente, ejecutado desde el shell actual. (Por ejemplo, los
comandos en segundo plano ejecutados desde subcapas no afectan el
valor de "$!" En el entorno de shell actual.) Para una canalización, el ID
de proceso es el del último comando en la canalización.

0. (Cero). Se expande al nombre del shell o script de shell.

Las siguientes variables afectarán la ejecución del shell:

● ENV. El procesamiento de la variable de shell ENV será compatible


con todos los sistemas compatibles con XSI o si el sistema admite
la opción User Portability Utilities.Esta variable, cuando y sólo
cuando se invoca un shell interactivo, se someterá a la expansión
de parámetros (ver Expansión de parámetros ) por el shell y el
valor resultante se utilizará como un nombre de ruta de un
archivo que contiene comandos de shell para ejecutar en el
entorno actual. No es necesario que el archivo sea ejecutable. Si
el valor expandido de ENV no es un nombre de ruta absoluto, los
resultados no se especifican. Se ignorará ENV si los ID de usuario
reales y efectivos del usuario o los ID de grupo reales y efectivos
son diferentes.
● HOME. El nombre de ruta del directorio de inicio del usuario. El
contenido de HOME se utiliza en la expansión de tilde (consulte
Expansión de Tilde).
● IFS (Separadores de campo de entrada). Una cadena tratada
como una lista de caracteres que se utiliza para dividir campos y
dividir líneas en campos con el comando de lectura . Si no se
establece IFS , el shell se comportará como si el valor de IFS
fuera <space>, <tab> y <newline>; consulte División de
campos . Las implementaciones pueden ignorar el valor de IFS en
el entorno en el momento en que se invoca el shell, tratando IFS
como si no estuviera configurado.
● LANG. Proporciona un valor predeterminado para las variables de
internacionalización que no están configuradas o son nulas.
● LC_ALL. El valor de esta variable anula las variables LC_ * y
LANG.
● LC_COLLATE. Determine el comportamiento de las expresiones de
rango, las clases de equivalencia y los elementos de clasificación
de varios caracteres dentro de la coincidencia de patrones.
● LC_CTYPE. Determinar la interpretación de secuencias de bytes de
datos de texto como caracteres (por ejemplo, caracteres de un
solo byte en lugar de caracteres de varios bytes), qué caracteres
se definen como letras (clase de caracteres alfa ) y <blank>(clase
de caracteres en blanco ), y el comportamiento de las clases de
caracteres dentro de la coincidencia de patrones. Cambiar el valor
de LC_CTYPE después de que se haya iniciado el shell no afectará
el procesamiento léxico de los comandos del shell en el entorno de
ejecución del shell actual o sus subcapas. La invocación de un
script de shell o la ejecución de ejecuciones someten al nuevo
shell a los cambios en LC_CTYPE.
● LC_MESSAGES. Determine el idioma en el que se deben escribir
los mensajes.
● LINENO. Establecido por el shell en un número decimal que
representa el número de línea secuencial actual (numerado
comenzando con 1) dentro de un script o función antes de
ejecutar cada comando. Si el usuario desarma o reinicia LINENO,
la variable puede perder su significado especial durante la vida del
shell. Si el shell no está ejecutando un script o una función, el
valor de LINENO no está especificado. Este volumen de IEEE Std
1003.1-2001 específica los efectos de la variable solo para
sistemas que admiten la opción User Portability Utilities.
● NLSPATH. Determine la ubicación de los catálogos de mensajes
para el procesamiento de LC_MESSAGES.
● SENDERO. Una cadena formateada que se utiliza para efectuar la
interpretación de comandos.
● PPID. Establecido por el shell en el ID de proceso decimal del
proceso que invoca este shell. Este volumen de IEEE Std 1003.1-
2001 específica los efectos de la variable solo para sistemas que
admiten la opción User Portability Utilities.
● PS1. Cada vez que un shell interactivo está listo para leer un
comando, el valor de esta variable se someterá a expansión de
parámetros y se escribirá con error estándar. El valor
predeterminado será "$" . Para los usuarios que tienen privilegios
específicos adicionales definidos por la implementación, el valor
predeterminado puede ser otro valor definido por la
implementación. El caparazón reemplazará cada instancia del
carácter '!' en PS1 con el número de archivo histórico del próximo
comando que se va a escribir. Escapando del '!' con otro '!' (es
decir, "!!" ) colocará el carácter literal '!'en el mensaje. Este
volumen de IEEE Std 1003.1-2001 específica los efectos de la
variable solo para sistemas que admiten la opción User Portability
Utilities.
● PS2. Cada vez que el usuario ingresa un <newline> antes de
completar una línea de comando en un shell interactivo, el valor
de esta variable se someterá a expansión de parámetros y se
escribirá en error estándar. El valor predeterminado es ">" . Este
volumen de IEEE Std 1003.1-2001 específica los efectos de la
variable solo para sistemas que admiten la opción User Portability
Utilities.
● PS4. Cuando se realiza un seguimiento de ejecución ( conjunto
-x ) en un shell interactivo, antes de cada línea del seguimiento
de ejecución, el valor de esta variable se someterá a expansión de
parámetros y se escribirá en error estándar. El valor
predeterminado es "+" . Este volumen de IEEE Std 1003.1-2001
especifica los efectos de la variable solo para sistemas que
admiten la opción User Portability Utilities.
● PWD. Establecido por el shell para ser un nombre de ruta absoluto
del directorio de trabajo actual, que no contiene componentes de
tipo enlace simbólico, ningún componente que sea punto y ningún
componente que sea punto-punto cuando se inicializa el shell. Si
una aplicación establece o desarma el valor de PWD, los
comportamientos de las utilidades cd y pwd no se especifican.

Lenguaje Perl:

Perl es un lenguaje de programación muy utilizado para construir


aplicaciones CGI para el web. Perl es un acrónimo de Practical
Extracting and Reporting Languaje, que viene a indicar que se trata de
un lenguaje de programación muy práctico para extraer información de
archivos de texto y generar informes a partir del contendido de los
ficheros.
Es un lenguaje libre de uso, eso quiere decir que es gratuito. Antes
estaba muy asociado a la plataforma Uníx, pero en la actualidad está
disponible en otros sistemas operativos como Windows.

Perl es un lenguaje de programación interpretado, al igual que muchos


otros lenguajes de Internet como Javascript o ASP. Esto quiere decir
que el código de los scripts en Perl no se compila sino que cada vez que
se quiere ejecutar se lee el código y se pone en marcha interpretando lo
que hay escrito. Además es extensible a partir de otros lenguajes, ya
que desde Perl podremos hacer llamadas a subprogramas escritos en
otros lenguajes. También desde otros lenguajes podremos ejecutar
código Perl.

Perl está inspirado a partir de lenguajes como C, sh, awk y sed (algunos
provenientes de los sistemas Uníx), pero está enfocado a ser más
práctico y fácil que estos últimos. Es por ello que un programador que
haya trabajado con el lenguaje C y los otros tendrá menos problemas
en entenderlo y utilizarlo rápidamente. Una diferencia fundamental de
Perl con respecto a los otros lenguajes es que no limita el tamaño de los
datos con los que trabaja, el límite lo pone la memoria que en ese
momento se encuentre disponible.
Perl es un lenguaje interpretado, en consecuencia para ejecutar un
script en Perl debemos indicarle al sistema en ese mismo instante el
interprete que vamos a utilizar para ejecutar dicha script en Perl. Esto
se puede realizar de dos formas:

1. Insertando en la primera línea del archivo la instrucción:


#!/usr/local/bin/perl.

Esta sentencia indica al sistema operativo que lo que sigue es


un script de Perl y que perl es el programa con el que debe
ejecutarse. Dicho programa está en /usr/local/bin. Por tanto la
secuencia !# es reconocida por Unix no por Perl.

2. Especificando el intérprete desde la línea de comando: perl


script.pl.

Vemos como directamente se ejecuta el interprete de Perl


pasando como primer paramétro el script a ejecutar. En el
caso de haber más parámetros, éstos se tomarán como
parámetros del programa.

una de las maneras de ejecutar un script de Perl era ejecutando dicho


script como un parámetro de un interprete de Perl determinado. Pues
bien, dicho intérprete posee ciertas opciones que nos proporcionan o
bien información sobre el mismo, o bien ciertas facilidades a la hora de
ejecutar los script como se podrá ver a continuación.

● perl -v : Muestra la versión del intérprete de Perl que estamos


utilizando.
● perl -V : Muestra información sobre la configuración del
intérprete de perl.
● perl -e expresión : Ejecuta la expresión como si ésta fuera un
programa de una línea. Por ejemplo: perl -e "print 'hola a
todos\n';"
● perl -ne expresión : Ejecuta la expresión como si está fuera un
bucle repetitivo. He aquí un ejemplo: perl -ne "print if /M+/;"
usuarios.txt . Este ejemplo extrae todos los usuarios cuyo nombre
empieze por la letra M.
● perl -d script : Ejecuta el script bajo el depurador.
● perl -w script : Da avisos sobre las contrucciones con errores.
● perl -pe expresión : Ejecuta la expresión como si está fuera un
bucle repetitivo y además imprime cada línea. He aquí un
ejemplo: perl -pe "print if /M+/;" usuarios.txt . Observar
diferencia con la opción -ne. La diferencia es que mientras la
primera versión sólo imprimía los nombres que empezaban por M,
la segunda por su parte imprimía todos los nombre una vez salvo
los que empiezan por M que los imprime dos veces.
● perl -x script : Empieza a interpretar el fichero que contiene el
script cuando encuentra la referencia al intérprete, por ejemplo:
#!/usr/bin/perl.
● perl -i archivo : Permite editar archivos. Por ejemplo, si
ejecutamos lo siguiente sobre la línea de comandos: perl -p -i -e
"s/\$seg/\$segundos/g;" tiempo.pl. Esta orden cambiará el
nombre de la variable $seg por $segundos en el script contenido
en el fichero tiempo.pl.

Opciones de línea de comando.

-a: Activa el modo autosplit cuando se utiliza con -n o -p . Se divide en


@F .
-C: comprueba la sintaxis pero no se ejecuta.
-D: ejecuta el script en el depurador. Utilice -de 0 para iniciar el
depurador sin un script
-D NUMBER: establece banderas de depuración.
-e COMMANDLINE: se puede usar para ingresar una sola línea de
escritura. Se pueden dar varios comandos -e para crear un script de
varias líneas .
-F REGEXP: especifica una expresión regular para dividir si -a está en
vigor.
-i EXT: Los archivos procesados por la construcción <> deben editarse
en su lugar.
-I DIR: con -P , le dice al preprocesador de C dónde buscar los archivos
de inclusión. El directorio se antepone a @INC .
-l [ OCTNUM ]: habilita el procesamiento automático de fin de línea.
-norte: asume un bucle de entrada alrededor de su secuencia de
comandos. Las líneas no se imprimen.
-pag: asume un bucle de entrada alrededor de su secuencia de
comandos. Se imprimen líneas.
-PAG: ejecuta el preprocesador de C en el script antes de que Perl lo
compile.
-s: interpreta -xxx en la línea de comando como un conmutador y
establece la variable correspondiente $ xxx en el script.
-S: utiliza la variable de entorno PATH para buscar el script.
-T: fuerza la comprobación de la contaminación.
-u: vuelca el núcleo después de compilar el script. Para ser utilizado con
el programa undump (1) (donde esté disponible).
-U: permite que perl realice operaciones inseguras.
-v: imprime la versión y el nivel de parche de su ejecutable Perl.
-w: imprime advertencias sobre posibles errores ortográficos y otras
construcciones propensas a errores en el script.
-x: [ DIR ] extrae el programa Perl del flujo de entrada. Si se especifica
DIR , cambia a este directorio antes de ejecutar el programa.
-0: VAL (ese es el número cero). Designa un valor inicial para el
separador de registros $ / .

Un script en Perl es una sucesión de instrucciones. Éstas se delimitan


por punto y coma (;). Los comentarios en los scripts deben ir
precedidos por el símbolo #. Los caracteres que siguen a este símbolo y
que está contenidos en la misma línea se consideran comentarios y se
ignoran.

El siguiente script muestra la cadena de caracteres "¡Hola, mundo!".


Este script se llamará hola.pl y contendrá las siguientes líneas.

#!/usr/local/bin/perl
print "¡Hola, mundo!";

Lenguaje Python:

Python es un lenguaje de programación potente y fácil de aprender.


Tiene estructuras de datos de alto nivel eficientes y un simple pero
efectivo sistema de programación orientado a objetos. La elegante
sintaxis de Python y su tipado dinámico, junto a su naturaleza
interpretada lo convierten en un lenguaje ideal para scripting y
desarrollo rápido de aplicaciones en muchas áreas, para la mayoría de
plataformas.
El intérprete de Python es fácilmente extensible con funciones y tipos de
datos implementados en C o C++ (o otros lenguajes que permitan ser
llamados desde C). Python también es apropiado como un lenguaje para
extender aplicaciones modificables.

Python es un lenguaje de programación interpretado cuya filosofía hace


hincapié en la legibilidad de su código. Podríamos decir que es un
lenguaje de programación multiparadigma orientado a objetos,
programación imperativa y programación funcional. Es un lenguaje
interpretado, dinámico y multiplataforma.

Hay dos maneras de trabajar con Python, mediante el modo interactivo


y mediante el modo script. En el primero, se ejecuta la orden en tiempo
real, mientras que con el segundo, se escribe el código en Python y
luego se ejecuta con el intérprete.

En el modo interactivo, se debe activar el intérprete Python escribiendo


python en la línea de comandos. Una vez puesto en marcha, ya se
puede ejecutar órdenes, como la clásica print “Hello, Python!”.

A medida que se empieza a programar empleando el lenguaje Python,


será más práctico emplear un script donde se ha introducido todas las
órdenes a ejecutar. Así, una vez situada la línea de comandos en la
carpeta donde se encuentra el script, lo se ejecuta con la orden python
“nombredelscript”.py.

Los identificadores sirven precisamente para eso, para identificar una


variable, función, clase, módulo u objeto. Suelen empezar con letras, en
mayúscula o minúscula, o con un guión bajo seguido de un cero y varias
letras o números. Hay que tener varias cosas en cuenta, como que
Python diferencia entre mayúsculas y minúsculas o que no admite
caracteres de puntuación como @, $ o %. Los nombres de clase
empiezan con una letra mayúscula. Los demás identificadores empiezan
con minúscula. Si el identificador empieza un guión bajo, significa que
es privado. Si empieza con dos guiones bajos, se trata de un
identificador privado. Si el identificador finaliza con dos guiones bajos,
el identificador es un nombre especial definido por lenguaje.
Hay una serie de palabras que no podemos emplear como constantes o
variables o como nombre identificador. Son todas en minúsculas y han
sido reservadas por el lenguaje Python. En concreto, las palabras
reservadas son: and, assert, break, class, continue, def, del, elif, else,
except, exec, finally, for, from, global, if, imoort, in, is, lambda, not, or,
pass, print, raise, return, try, while, with, yield.

Un programa codificado con lenguaje Python está dividido en varias


líneas lógicas y cada una de ellas finaliza con una nueva línea. Si la línea
está en blanco, es ignorada por el intérprete de Python. Por otra parte,
las órdenes y líneas se agrupan unas dentro de otras mediante
sangrado o espaciado. Y para unir dos o más líneas, se emplea la barra
inclinada hacia la izquierda. Otra posibilidad es que cuando se desea
realizar varias acciones o peticiones en una única línea. Para ello, se
pueden combinar todas las instancias empleando como separador el
símbolo de punto y coma.

En Python, los comentarios empiezan con el carácter hash (#). Los


comentarios pueden incluirse en una línea propia o al lado de una
orden. Siempre que tenga el símbolo indicado, Python lo interpretará
como comentario y no como código válido.

En cuanto a las citas, Python admite las comillas simples o dobles. El


texto incluido dentro de las comillas será el que se mostrará en pantalla
o el que se tendrá en cuenta para la orden programada. Si necesitamos
citar un texto extenso, nos será de utilidad las triples comillas, que
permiten citar textos que ocupan varias líneas.

Además de NEWLINE, INDENT y DEDENT, existen las siguientes


categorías de fichas: identifiers (identificadores), keywords (palabras
clave), literals (literales), operators (operadores) y delimiters
(delimitadores). Los caracteres de espacio en blanco (distintos de los
terminadores de línea, discutidos anteriormente) no son tokens, pero
sirven para delimitarlos. En los casos en que exista ambigüedad, un
token comprende la cadena más larga posible que forma un token legal
cuando se lee de izquierda a derecha.
2.3. Identificadores y palabras clave

Los identificadores (también denominados nombres) se describen


mediante las siguientes definiciones léxicas.

La sintaxis de los identificadores en Python se basa en el anexo


estándar de Unicode UAX-31, con la elaboración y los cambios que se
definen a continuación; ver también PEP 3131 para más detalles.

Dentro del rango ASCII , los caracteres válidos para los identificadores
son los mismos que en Python 2.x: las letras mayúsculas y minúsculas
A hasta Z, el guión bajo _ y los dígitos 0 hasta 9, salvo el primer
carácter.

Python 3.0 introduce caracteres adicionales fuera del rango ASCII . Para
estos caracteres, la clasificación utiliza la versión de la base de datos de
caracteres Unicode incluida en el módulo unicodedata.

Los identificadores son de extensión ilimitada. Las mayúsculas y


minúsculas son significativas. Una restricción sintáctica que no se indica
en estas producciones es que no se permiten espacios en blanco entre
el stringprefix o bytesprefix y el resto del literal. El conjunto de
caracteres fuente está definido por la declaración de codificación; es
UTF-8 si no se da una declaración de codificación en el archivo fuente;
ver la sección Declaración de Codificación.

En lenguaje claro y sencillo: ambos tipos de literales pueden ser


encerrados entre comillas simples (') o dobles ("). También pueden
estar encerrados en grupos de tres comillas simples o dobles (a las que
generalmente se les llama cadenas de tres comillas). El carácter de la
barra inversa (\) se utiliza para escapar de los caracteres que de otra
manera tienen un significado especial, como la línea nueva, la barra
inversa en sí misma, o el carácter de comillas.

Los literales de bytes siempre se prefijan con 'b' o 'B'; producen una
instancia del tipo bytes en lugar del tipo str. Sólo pueden contener
caracteres ASCII; los bytes con un valor numérico de 128 o mayor
deben ser expresados con escapes.

Tanto los literales de cadena como de bytes pueden ser prefijados con
una letra 'r' o 'R'; tales cadenas se llaman raw strings y consideran las
barras inversas como caracteres literales. Como resultado, en las
cadenas literales, los escapes de '\U' y '\u' en las cadenas sin procesar
no son tratados de manera especial. Dado que los literales raw de
unicode de Python 2.x se comportan de manera diferente a los de
Python 3.x, la sintaxis de 'ur' no está soportada.

Nuevo en la versión 3.3: El prefijo 'rb' de literales de bytes raw se ha


añadido como sinónimo de 'br'.

Nuevo en la versión 3.3: Se reintrodujo el soporte para el legado


unicode literal (u'value') para simplificar el mantenimiento de las bases
de código dual Python 2.x y 3.x. Ver PEP 414 para más información.

Un literal de cadena con 'f' o 'F' en su prefijo es un formatted string


literal; ver Literales de cadena formateados. La 'f' puede combinarse
con la 'r', pero no con la 'b' o 'u', por lo que las cadenas raw
formateadas son posibles, pero los literales de bytes formateados no lo
son.

En los literales de triple cita, se permiten (y se retienen) nuevas líneas y


citas no escapadas, excepto cuando tres citas no escapadas seguidas
finalizan el literal. (Una «cita» es el carácter utilizado para abrir el
literal, es decir, ya sea ' o ".)

A menos que un prefijo 'r' o 'R' esté presente, las secuencias de escape
en literales de cadena y bytes se interpretan según reglas similares a
las usadas por C estándar. Las secuencias de escape reconocidas son:

Secuencia de Significado Notas


escape
\newline Barra inversa y línea nueva ignoradas

\\ Barra inversa (\)

\' Comilla simple (')

\" Comilla doble (")

\a ASCII Bell (BEL)

\b ASCII Retroceso (BS)

\f ASCII Formfeed (FF)

\n ASCII Linefeed (LF)

\r ASCII Retorno de carro (CR)

\t ASCII Sangría horizontal (TAB)

\v ASCII Sangría vertical (VT)

\ooo Carácter con valor octal ooo (1,3)

\xhh Carácter con valor hexadecimal hh (2,3)

Ref:

Plantee un problema A el cual requiere de una interfaz hombre máquina donde el
usuario dará órdenes al computador (lenguaje alto nivel), presente una propuesta de
lenguaje de programación que permita interactuar al usuario con la máquina
mediante un programa, en otras palabras, el propósito del lenguaje es permitir al
usuario dar respuesta al problema A. Es necesario que el lenguaje incorpore
estructura de control y bucles.

Partiendo del lenguaje diseñado en la pregunta anterior plantee dos casos problemas
y resuelva cada uno con un programa escrito en el lenguaje planteado.
Conclusión

1- La programación funcional nos permitirá desarrollar software mucho más legible y fácil
de testear, nos concentramos en qué estamos haciendo y no en cómo se esta haciendo.
Referencias

● https://codigofacilito.com/articulos/programacion-funcional
● https://www.lifeder.com/programacion-logica/
● Programación en SHELL ( Bash ) http://index-
of.co.uk/Programming/programacion-shell-bash.pdf
● https://ediciones.ucc.edu.co/index.php/ucc/catalog/download/158/156/868-
1?inline=1
● https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
● https://desarrolloweb.com/articulos/541.php Documento introductorio al
lenguaje Perl. Miguel Angel Alvarez
● Guía de referencia HTMLified Perl 5 de Rex Swain (1996) de
Johan Vromans http://www.rexswain.com/perl5.html
● Perl: la sintaxis:
http://www2.iib.uam.es/bioinfo/curso/perl/tutoriales/cicei/cap2.htm
● Tutorial de Python: https://docs.python.org/es/3/tutorial/
● Sintaxis básica para empezar con Python. escrito por Jose Maria Lopez
(2019): https://blogthinkbig.com/sintaxis-basica-aprender-python

También podría gustarte