dc (desk calculator) es una calculadora en notación polaca inversa que soporta aritmética de precisión arbitraria.[1] Fue programada por Robert Morris cuando se encontraba trabajando en los Bell Labs,[2] es una de las utilidades de Unix más antiguas, precediendo incluso a la invención del lenguaje de programación C. Igual que otros programas de la época tiene un potente conjunto de características, pero una sintaxis muy escueta. En las versiones antiguas bc utilizaba las librerías de dc, aunque las implementaciones más modernas funcionan de manera opuesta, dc utiliza las librerías aritméticas de bc.
Este artículo provee algunos ejemplos en un intento de dar una idea original del lenguaje; para una lista completa de sus comandos así como de la sintaxis debe consultarse la página man de la implementación específica.
dc es el lenguaje sobreviviente más antiguo en Unix. Cuando los Laboratorios Bell (Bell Labs) recibieron una computadora PDP-11, dc--escrito en el lenguaje de programación B--fue el primer lenguaje que corrió en esa computadora, aún antes que el ensamblador.[3] Ken Thompson ha opinado que dc fue el primer programa escrito en la computadora.
Para multiplicar 4 y 5 en dc (nótese que la mayoría del espacio en blanco es opcional):
dc <<EOT
4 5 *
p
EOT
20
Puede obtenerse el mismo resultado con los comandos:
echo "4 5 * p" | dc
20
Lo anterior se traduce en "empujar 4 y 5 a la pila, a continuación utilizando el operador de multiplicación, extraer dos elementos de la pila, multipicarlos y empujar el resultado de vuelta en la pila, a continuación usar el comando p para imprimir en la pantalla el elemento tope en la pila.
3 24 * p
Realiza una multiplicación y con p se muestra el resultado
24 _6 2 ^ + 13 / v 21 - p
Realiza esta operación:
16i2o DEADBEEFp
resultado: 11011110101011011011111011101111.
Realiza una conversión de hexadecimal a decimal
Para conocer a fondo la funcionalidad, hay que mirar la página man correspondiente.
El siguiente código calcula factorial de un número, en este caso 5:
dc -e '[Calculando factorial de: ]n5p[d1-d1<F*]dsFxp'
Veámoslo explicado:
dc -e '
# calcular de factorial
[Calculando factorial de: ]
n # imprimir etiqueta
5 # empujar a la pila el numero al que se calculara factorial
p # imprimir numero despues de etiqueta
[ # inicio de cadena con macro
d # duplicar el tope de la pila
1 # empujar 1 a la pila
- # sacar 2 valores de la pila, restarlos, empujar resultado a la pila
d # duplicar tope de la pila
1 # empujar 1 a la pila
<F # sacar 2 valores de la pila, numero 1 y el resultado de la resta
# si 1 es menor que el resultado, llamar a la macro de nuevo
* # de lo contrario sacar 2 valores de la pila, multiplicarlos, empujar resultado a la pila
] # fin de cadena, empujarla a la pila
d # duplicar tope de la pila (cadena que contiene macro),
# 1 valor para asignarlo al registro F, otra copia que sera invocada
sF # asignar al registro F
x # ejecutar tope de la pila
p # imprimir tope de la pila que contiene resultado
'