Cuarto (lenguaje de programación)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 29 de septiembre de 2020; las comprobaciones requieren 18 ediciones .
Adelante
Semántica imperativo
clase de idioma lenguaje de programación, lenguaje de programación interpretado y lenguaje de programación compilado
tipo de ejecución intérprete/compilador
Apareció en 1971
Autor charles h moore
sistema de tipos sin escribir
Implementaciones principales gAdelante , pAdelante, kAdelante, SP-Adelante [1] , win32adelante [2]
Dialectos FORTH-79, FORTH-83, ANSI FORTH 1994, ColorForth , RetroForth . Cuarta Norma 2012
sido influenciado APL , ceceo
influenciado PostScript , Factor y otros lenguajes concatenados
 Archivos multimedia en Wikimedia Commons

Forth ( ing.  Forth ) es uno de los primeros lenguajes de programación concatenativos , en los que los programas se escriben como una secuencia de lexemas ("palabras" en la terminología del lenguaje Forth). Las expresiones matemáticas se representan mediante notación de sufijo cuando se utiliza la notación de pila . Soporta mecanismos de meta-extensión de la semántica y sintaxis del lenguaje para adaptarse al área temática deseada. La sintaxis de nivel base en Forth es simple y consta de una sola regla: "todas las definiciones están separadas por espacios". Las definiciones de Forth pueden tener cualquier combinación de caracteres.

Una serie de propiedades, a saber, la interactividad , la flexibilidad y la facilidad de desarrollo, hacen de Forth un lenguaje eficaz para la investigación aplicada y la creación de herramientas. Los sistemas de control integrados son áreas obvias de aplicación para este lenguaje . Debido a su simplicidad , el compilador , ya menudo el compilador Forth , se implementa fácilmente para la gran mayoría de los microcontroladores y también se utiliza como una herramienta de programación cruzada . También se usa cuando se programan computadoras que ejecutan varios sistemas operativos o como un entorno operativo independiente.

Historia

Creación

El idioma Forth fue creado por Charles X. Moore a fines de la década de 1960 y principios de la de 1970. Moore llamó a su lenguaje Cuarto , creyendo que sería el lenguaje informático de cuarta generación .  Pero como estaba trabajando en una máquina IBM 1130 , que permitía nombres compuestos de no más de cinco letras mayúsculas, el nombre se convirtió en FORTH ( ing. adelante  - adelante). Sin embargo, los primeros experimentos de Moore sobre la creación de un intérprete simple que facilita la escritura de programas para controlar equipos astronómicos se remontan a finales de la década de 1950. [3] 

Desde 1971, Moore trabajó en el Observatorio Nacional de Radioastronomía , participando en el desarrollo de programas para recolectar y procesar los datos recibidos por el radiotelescopio . Fue entonces cuando apareció la primera implementación del lenguaje Forth. En este trabajo también participó la colaboradora de Moore, Elizabeth Rather , quien puede ser considerada la segunda programadora fuerte del mundo . 

El lenguaje recién creado fue aceptado como el principal lenguaje de programación por la Sociedad Astronómica Estadounidense . Más tarde, en 1973, Charles Moore y Elizabeth Rather fundaron FORTH, Inc [4] , durante la cual el lenguaje fue portado a muchas plataformas durante la siguiente década.

A fines de la década de 1970, los programadores interesados ​​​​en desarrollar el lenguaje formaron el FORTH Interest Group (FIG). Este grupo desarrolló el concepto de FIG Forth Model, un sistema de Forth disponible públicamente que se puede trasladar fácilmente a arquitecturas informáticas populares. Este sistema de referencia de Forth, FIG-FORTH, a menudo se considera el estándar del idioma original.

Estandarización

La idea de la estandarización oficial de Forth se originó originalmente dentro de la Asociación Internacional de Astrónomos ( English  Astronomical Sciences, AST ). En mayo de 1977, en una reunión en el Observatorio Nacional de Kitt Peak ( EE . UU .), se elaboró ​​un glosario del idioma Forth, designado como AST.01.

En febrero de 1978, se adoptó el estándar FORTH-77 en Utrecht , destinado a la implementación de microcomputadoras .

En octubre de 1979 finalizó una reunión en la isla de Santa Catalina ( California ) con el desarrollo del estándar FORTH-79, que se aplica a todo tipo de computadoras.

En el otoño de 1983, se llevó a cabo una reunión para desarrollar el siguiente estándar, aprobado en 1984 como FORTH-83. El estándar Fort-83 difiere del estándar Fort-79 en algunos detalles, pero no en sustancia.

En 1988, el grupo SIGFORTH [5] se organizó como parte de la ACM ; también había un grupo ACM ruso correspondiente (presidente - Prof. S. N. Baranov ( San Petersburgo , SPIIRAS )). SIGFORTH ahora existe como parte del SIGPLAN general

En 1994, después de una larga negociación en la que participaron muchas empresas interesadas, se adoptó el estándar de lenguaje ANSI Forth. [6]

El estándar de idioma Forth actual se adoptó en 2012. [7]

Más desarrollo y casos de uso

Un ejemplo bien conocido del éxito de Fort es su uso en el software de un vehículo de descenso en aguas profundas, durante la búsqueda del Titanic en 1985 . Fort también se utilizó en el software del espectrógrafo en el transbordador , en micromódulos para controlar satélites terrestres artificiales, para el sistema de control en el aeropuerto de Riyadh , sistemas de visión por computadora , automatización de análisis de sangre y control cardiológico, traductores de bolsillo.

El dialecto Forth se utiliza en OpenBoot  , el software informático subyacente basado en los procesadores SPARC y PowerPC .

A principios de la década de 1980, John Warnock y Chuck Geschke de Adobe Systems crearon el lenguaje PostScript [8] . A pesar de las similitudes de los idiomas, John Warnock señaló [9] que Forth no influyó en la creación de PostScript.

Hay procesadores y controladores que soportan el modelo computacional del lenguaje a nivel de hardware. Se han creado muchas implementaciones de código abierto de Forth para varias plataformas de hardware. Firmas separadas (entre las que cabe señalar, en primer lugar, FORTH, Inc. fundada por Charles Moore y la empresa británica MicroProcessor Engineering Ltd. [10] ) suministran versiones comerciales del lenguaje con diferentes capacidades.

Dos juegos de computadora para el hogar de Electronic Arts creados en la década de 1980 se escribieron en Forth: Worms? (1983) [11] y Starflight (1986). [12] Canon Cat (1987) utilizó Forth como lenguaje de programación del sistema .

Las conferencias EuroForth se llevan a cabo anualmente, incluso en Rusia, Inglaterra, Austria, Alemania, España, la República Checa (anteriormente en Checoslovaquia). [13]

Conceptos básicos del sistema Forth clásico

La parte principal del sistema Forth es una lista enlazada de palabras , o diccionario , desde la cual se llama a una palabra por su nombre para realizar funciones específicas. La cuarta programación consiste en definir nuevas palabras a partir de las palabras previamente definidas en el diccionario. Una vez que las palabras nuevas se compilan en un diccionario, no difieren en forma de las palabras que ya están en el diccionario. La descripción de una palabra en un diccionario se llama entrada .

La estructura de una entrada de diccionario Forth "típica" es:

Convencionalmente, los artículos de Forth se pueden dividir en dos categorías: artículos de bajo nivel y artículos de Forth . Los artículos del primer tipo contienen en el campo de código un puntero a un procedimiento en los códigos del procesador de destino que realiza directamente la semántica de la palabra. El campo de parámetros de tales artículos contiene los parámetros pasados ​​al procedimiento, o su propio código. Los artículos cuartos contienen punteros a otros artículos en el campo de parámetro, y el campo de código apunta a un procedimiento especial llamado intérprete de enlace . En la práctica, la estructura del artículo depende de la implementación, pero, por regla general, es similar a la discutida anteriormente. El principio utilizado dentro del campo de parámetros de un cuarto artículo se denomina código de subprocesos , y el intérprete de enlace se denomina  máquina virtual .

Gramaticalmente, el texto procesado por el traductor Forth es una secuencia de tokens ( eng.  token ), separados por espacios y caracteres de final de línea. El traductor de cadenas de entrada selecciona el siguiente token y lo busca en el diccionario actual, y la búsqueda se lleva a cabo de las palabras más nuevas a las más antiguas. Si no se encuentra la palabra, se intenta interpretar la ficha como una entrada numérica que, si tiene éxito, se coloca en la parte superior de la pila. Si el token coincide con la palabra Forth, se analiza el estado actual del indicador de compilación del sistema Forth . Si se borra la bandera, se ejecuta la palabra: el control se transfiere de acuerdo con el puntero del campo de código del artículo encontrado. Si se establece la bandera, la palabra se compila , es decir, se agrega un puntero a su campo de código al artículo creado actualmente. Si se ha traducido un número, se saca de la pila y se compila en un código literal , cuya ejecución dentro de una entrada de diccionario empuja el número a la parte superior de la pila. Además, las palabras pueden contener una bandera inmediata , en cuyo caso siempre se ejecutan.

Mecanismo para pasar parámetros entre palabras:

El lenguaje proporciona una forma de trabajar con la memoria del sistema como una región lineal.

Un componente obligatorio del sistema es también la pila de retorno. Disponible programáticamente para cambiar el flujo de control del programa.

Todo lo anterior se aplica al concepto de Fuerte solo en una primera aproximación. Forth no es exactamente un lenguaje de programación; más bien, se superpone a la noción de un lenguaje de programación. Forth es más una máquina virtual y un sistema operativo ForthOS. [catorce]

La sintaxis y la semántica de Forth se pueden extender a cualquier otro lenguaje de programación justo en el momento de la interpretación (compilación) de un programa de Forth. Usar Forth como metalenguaje es conveniente debido a la disponibilidad de herramientas de Forth que admiten aquellos idiomas que ya están en el sistema Forth. Todos los recursos del sistema Forth están disponibles para el usuario y se presentan en forma de entradas de diccionario. Como regla general, las entradas de diccionario definidas por el usuario tienen exactamente la misma representación en el sistema Forth que todas las demás entradas de diccionario que componen todo el sistema Forth.

Cuartos tipos de código

Se utiliza algún tipo de código enhebrado como una representación de máquina de un programa compilado .

Al utilizar código de subrutinas , se obtiene código máquina, en el que, en comparación con el código generado por el compilador de un lenguaje de programación convencional, donde tanto las variables como las direcciones de retorno de las subrutinas se colocan en una sola pila, no hay operaciones de “arrastrar”. y soltar” de los parámetros de la subrutina. La pila principal del procesador se utiliza como pila de retorno, la pila de datos está organizada por software.

Cuando se usa un código enhebrado que no sea un código de subrutina, las definiciones de Forth que consisten solo en código de máquina se denominan primitivas . En un código de subprocesos de este tipo, a menudo intentan usar la pila del procesador principal como una pila de datos y acceder a los datos que se encuentran en ella en forma de instrucciones de máquina popy archivos push.

Una de las ventajas no tan obvias de usar código subproceso indirecto es que todo el código nativo, es decir, primitivas, llamadas de intérprete de código y variables, se pueden colocar en un segmento de código que no se podrá modificar. El resto del código Forth reside en el segmento de datos. Puede haber muchos de estos segmentos, y es más fácil trabajar con un solo número de segmento que con dos.

Los sistemas Forth también pueden usar bytecode como una conclusión lógica para el desarrollo de código de subprocesos indirectos y código de subprocesos plegados con una tabla de direcciones. En este caso, el código del programa (Forth) es una secuencia de bytes, o el código de algún procesador virtual inventado. Para ejecutar este código, debe haber una tabla de 256 direcciones (2 bytes, 4 bytes u 8 bytes) en las que se ubican las primitivas Forth o definiciones complejas.

Esta opción es muy diferente a otros tipos de código y merece especial atención.

Ejemplos de programas

.( Hola Mundo)

Un ejemplo de una definición de palabra .SIGN que imprime la frase apropiada según el signo del número en la parte superior de la pila:

\ Imprimir el signo de un número : .SIGN ( n -- ) ?DUP 0=SI ." CERO" MÁS 0>SI ." NÚMERO POSITIVO" MÁS . "NUMERO NEGATIVO" ENTONCES DESPUÉS ;

Un ejemplo de código real que crea una constante de cadena en la forma aceptada en Forth (con un contador):

\ Crear una "constante" a partir de una cadena : S-CONSTANT ( c-addr u "<espacios>nombre" -- ) CREAR DUP , 0?DO DUP C@ C,CHAR+ CAÍDA DE BUCLE 0 C, HACE> DUP CÉLULA+ INTERCAMBIO @ ;

Este ejemplo crea una definición de palabra nameusando la palabra CREATE. Cuando se ejecuta el nombre de la palabra, la dirección del puntero al área de memoria que estaba en el momento de compilar la palabra se colocará en la pila. Para que pueda usarse de alguna manera, se escribe una cadena allí ("compilada"). Cuando se ejecuta una palabra, se ejecutan las palabras especificadas después de la palabra DOES>.

Así, en este ejemplo, se ha creado una nueva construcción sintáctica. Rara vez se proporcionan características similares en otros lenguajes de programación.

Además de crear nuevas construcciones sintácticas, una de las funciones más potentes de Forth es la capacidad de interferir en el proceso de compilación con palabras de ejecución inmediata (immediate words).

Ejemplos de tales palabras estándar:

[ - Cambiar temporalmente al modo de ejecución (de hecho, a menudo solo escribe 0 en la variable STATE).

] — Vuelve al modo de compilación.

LITERAL - Compile el número actualmente en la parte superior de la pila como una constante. También es una palabra de ejecución inmediata.

Código de ejemplo donde se usan estas palabras:

\ Cierto tamaño de datos en kilobytes 16 tamaño CONSTANTE \ Imprimir un informe sobre la conversión de kilobytes a bytes :reporte(-) Talla . ." kilobytes equivalen a " [ tamaño 1024 * ] LITERAL . . "bytes" ;

Características de la lengua Forth

Uno de los temas recurrentes de la controversia de Forth es su lugar entre los lenguajes imperativos "clásicos". Los programas de Forth tienen un aspecto extremadamente inusual:

  • El programa consta de una secuencia inusual de palabras, entre las cuales no hay las llamadas palabras "clave" que se reconocen y procesan en otros lenguajes de programación de una manera especial.
    Con el estreno de la serie de películas Star Wars , apareció un chiste sobre esto, que ahora se ha convertido en un clásico, que ilustra bien esta característica del Fuerte:

El secreto del habla del maestro Yoda revelado:
el programador de Old Fort era solo él.

Texto original  (inglés)[ mostrarocultar]

El misterio del discurso de Yoda descubierto es:
Yoda era solo un viejo programador de Forth. [quince]

  • El ejemplo anterior al mismo tiempo señala la característica única de Forth: la ausencia de una lista de parámetros entre paréntesis y la capacidad de programar en su idioma nativo. El uso de estructuras de vocabulario del idioma nativo hace posible que el programa sea comprensible, lo que aumenta su confiabilidad. .
  • " Notación polaca inversa " de expresiones aritméticas y que tiene múltiples pilas.
  • La naturaleza dual del compilador Forth. Es imposible decir inequívocamente si Forth es un compilador o un intérprete. Casi siempre se puede usar en dos modos, con la excepción de casos raros como "compilación de destino" (traducción a código máquina de un programa para un sistema con una arquitectura diferente).
  • Sin sistema de tipos . Al igual que los lenguajes ensambladores , Forth no tiene un sistema de tipos incorporado. No hay forma de saber si la parte superior de la pila es un número con signo, un número sin signo, un puntero a una cadena, un carácter o dos números tratados como un número largo. El control de tipos es responsabilidad del programador. En este caso, se usan conjuntos especiales de palabras (por ejemplo, escribir y leer celdas de memoria se realiza con palabras !y @, y caracteres - con palabras C!y C@), algunas entidades se colocan en pilas especiales (por ejemplo, una pila de números de coma flotante , según el estándar ANSI FORTH 94; se puede, se puede o no implementar utilizando el main stack).

Estas características determinan las ventajas y desventajas del lenguaje Forth:

  • Un programador experimentado que esté familiarizado con el conjunto de instrucciones y la arquitectura del procesador puede escribir el "núcleo" de un sistema Forth en unos pocos días.
  • La libertad otorgada al programador requiere un fuerte autocontrol. El umbral de entrada para la programación en Forth es más bajo que el de los lenguajes de programación clásicos, pero requiere acostumbrarse y comprender no solo las capacidades y características de la sintaxis de Forth, sino también la comprensión de la filosofía subyacente.
  • Forth no admite ningún paradigma de programación y los admite todos al mismo tiempo. Escribir un conjunto de palabras para organizar OOP en un programa Forth (y puede haber varias al mismo tiempo y se llevarán bien juntas) es mucho más fácil que decidir qué características se requieren de este conjunto de palabras.
  • Dividir el programa en muchas palabras pequeñas le permite comprobarlas de forma individual rápida y fácilmente, pasándoles los conjuntos necesarios de parámetros de entrada y controlando lo que queda en la pila. De hecho, esto significa que para probar algún componente del programa, no necesita descargar todos los componentes dependientes como un todo.
  • La mayoría de las implementaciones de Forth le permiten descompilar el programa. El texto resultante difiere poco del original.
  • Forth te permite implementar cualquier tecnología de programación disponible en otros lenguajes y sistemas. También permite técnicas que están prohibidas en otros lenguajes (por ejemplo, la automodificación de código). También se le confía al programador eliminar las consecuencias negativas de estas técnicas mediante la creación del vocabulario correcto que estimule una técnica competente para usarlas.
  • El tamaño del código Forth para sistemas de 16 bits, cuando el programa está escrito correctamente, a veces es de 10 a 20 veces más pequeño que el código compilado del programa C. Para los sistemas de 32 bits, esta brecha es aún mayor. En los sistemas operativos, la ganancia total puede ser cientos o incluso miles de veces. La razón es muy simple: una tarea terminada en Forth tiene un tamaño de varios bytes, todas las rutinas auxiliares se implementan como definiciones disponibles para todos. El sistema Forth encajará en el procesador, en el que otros sistemas, en principio, no pueden encajar.
  • La sincronización de procesos y subprocesos en sistemas multitarea, cambio de contexto, implementación de acceso a recursos limitados son los problemas más difíciles al escribir un sistema operativo. Para respaldar estas funciones, incluso se crean instrucciones especiales en microprocesadores. Para el intérprete esto no supone ningún problema, ya que emula cualquier procesador y cualquier instrucción necesaria.

Quizás lo que realmente obstaculiza el desarrollo del Fuerte es el "legado pesado" que vino de las máquinas de baja capacidad para las que se creó originalmente. El estándar ANSI FORTH 94 tiene, por ejemplo, las siguientes características:

  • Un programa portátil debe asumir que se puede implementar una pila de números de punto flotante utilizando la pila subyacente. Afortunadamente, este no es el caso de la mayoría de los compiladores modernos. Pero el hecho mismo de la presencia de tal cláusula en la norma crea ciertos inconvenientes. Cuando se programa con uso activo de aritmética de punto flotante, esta norma del estándar se ignora tradicionalmente.
  • Existe una regla similar con respecto a la pila de flujo de control. Aquí no todo es tan simple, ya que a menudo esto es exactamente lo que es: durante el proceso de compilación, el compilador usa la pila. En la gran mayoría de los casos, esto no tiene ningún efecto en el programa, pero debe recordarse la función en sí. Por ejemplo, si desea calcular algún número durante la compilación, fuera del comienzo de la definición, y luego insertarlo en una palabra como una constante, tendrá que usar algún tipo de solución.
  • Las definiciones de muchas palabras en el estándar son de un nivel demasiado bajo. Por ejemplo, word 2*no multiplica por dos, como su nombre lo indica, sino que "desplaza el bit número uno al dígito binario más significativo, llenando el bit menos significativo con cero". Por supuesto, en la mayoría de las máquinas modernas, esto es lo mismo, pero el hecho mismo de usar las características de una arquitectura en particular es alarmante. (También hay palabras de desplazamiento de bits estándar más obvias, LSHIFTy RSHIFT.)

Muchas de estas características se deben al hecho de que en el momento en que se adoptó el estándar, había muchos sistemas Forth poco compatibles que se basaban en dos estándares parcialmente diferentes de 1979 y 1983.

Véase también

Dialectos Aplicaciones

Notas

  1. Proyecto SP-Forth en SourceForge.net
  2. Grupo de proyecto Win32Forth . Consultado el 18 de agosto de 2006. Archivado desde el original el 13 de agosto de 2006.
  3. CH Moore, ED Más bien, DR Colburn. La Evolución del Adelante . Avisos ACM SIGPLAN, Tomo 28, No. 3. marzo de 1993 / Conferencia de Historia de los Lenguajes de Programación (abril de 1993). Consultado el 19 de febrero de 2010. Archivado desde el original el 22 de agosto de 2011.
  4. Herramientas de programación y desarrollo de sistemas integrados de FORTH, Inc. Consultado el 19 de febrero de 2010. Archivado desde el original el 4 de enero de 2010.
  5. 22.ª Conferencia EuroForth . Fecha de acceso: 19 de febrero de 2010. Archivado desde el original el 5 de diciembre de 2008.
  6. DPANS'94 . Fecha de acceso: 22 de julio de 2007. Archivado desde el original el 30 de junio de 2007.
  7. Cuarto . adelante-estándar.org . Consultado el 2 de mayo de 2022. Archivado desde el original el 11 de mayo de 2022.
  8. Adobe PostScript 3 - Recursos . Consultado el 2 de diciembre de 2006. Archivado desde el original el 3 de enero de 2007.
  9. Federico Biancuzzi, Shane Warden. Pioneros de la programación. Conversaciones con los creadores de los principales lenguajes de programación = Masterminds of Programming: Conversaciones con los creadores de los principales lenguajes de programación. - Símbolo-Plus, 2011. - S. 502. - 608 p. — ISBN 9785932861707 .
  10. ^ MPE-MicroProcessor Engineering Limited . Consultado el 19 de febrero de 2010. Archivado desde el original el 5 de enero de 2010.
  11. Maynard, David S. David Maynard: artista de software . Consultado el 27 de junio de 2021. Archivado desde el original el 15 de junio de 2021.
  12. Maher, Jimmy Starflight . The Digital Antiquarian (28 de octubre de 2014). Consultado el 23 de mayo de 2017. Archivado desde el original el 25 de abril de 2017.
  13. EuroForth: Conferencia Europea de la Cuarta . Fecha de acceso: 24 de enero de 2010. Archivado desde el original el 16 de junio de 2010.
  14. ForthWiki-ForthOS . Consultado el 1 de febrero de 2006. Archivado desde el original el 30 de agosto de 2005.
  15. Origen del usuario de Aquatix . Consultado el 12 de agosto de 2012. Archivado desde el original el 9 de febrero de 2014.

Literatura

  • Baranov S. N., Kolodin M. Yu. Fort Phenomenon // Informática del sistema. - Novosibirsk: VO "Nauka". Compañía editorial siberiana, 1995. - Número. 4 . - S. 193-291 . — ISBN 5-02-030678-9 .
  • Baranov S. N., Nozdrunov N. R. El lenguaje Forth y sus implementaciones. - L . : Mashinostroenie, 1988. - 157 p. - (computadora en producción). — 100.000 copias.  — ISBN 5-217-00324-3 .
  • Leo Brody. Pensando en Adelante . — ISBN 0-9764587-0-5 . Archivado el 16 de diciembre de 2005 en Wayback Machine .
  • Brody L. Curso de Programación Comenzando Hacia Adelante = Comenzando Hacia Adelante. Una introducción al lenguaje y sistema operativo Forth para principiantes y profesionales / Per. De inglés; prefacio I. V. Romanovsky. - M. : Finanzas y estadísticas, 1990. - 352 p. - 40.000 copias.  - ISBN 5-279-00252-6 .
  • Brody L. Manera de pensar - Fort .
  • Burago A. Yu., Kirillin V. A., Romanovsky I. V. Fort es un lenguaje para microprocesadores. - Sociedad "Conocimiento", organización de Leningrado, 1989. - 36 p. - (Para ayudar al disertante). - 26.000 copias.
  • Dyakonov V.P. Forth-sistemas de programación de computadoras personales. - M. : Nauka, 1992. - 352 p. — ISBN 5-02-014460-6 .
  • Kelly M., Spies N. Lenguaje de programación Fort / Per. De inglés. - M. : Radio y comunicación, 1993. - 320 p. — ISBN 5-256-00438-7 .
  • Semyonov Yu. A. Programación en el cuarto idioma. - M. : Radio y comunicación. — 240 s. — 50.000 copias.  — ISBN 5-256-00547-2 .
  • Townsend K., Foght D. Diseño e implementación de software de sistemas expertos en computadoras personales / Per. De inglés. V. A. Kondratenko, S. V. Trubitsyna. - M. : Finanzas y estadísticas, 1990. - 320 p. - ISBN 5-279-00255-0 (URSS) ISBN 0-8306-2692-1 (EE. UU.).
Publicaciones de revistas

Enlaces

Estándar Recursos en ruso Colecciones de enlaces a otros recursos.