Mostrando entradas con la etiqueta estándares. Mostrar todas las entradas
Mostrando entradas con la etiqueta estándares. Mostrar todas las entradas

domingo, 11 de noviembre de 2012

Standards and Patents (Educating colleagues)

Usually, I do not write twice about the same thing. And usually I am not very disciplined about blogging.

However, after my last blog entry, I have had multiple twitter interaction with a twitter user (@DrPantera). And finally I have decided that I have to post something that should serve as general standards education.

I want reproduce every interaction (which, by the way are in Spanish) but just give some general ideas. During our twitter discussion this user said:

  • Only Microsoft can implement ISO/IEC 29500.
  • It is nonsense standardizing a tool that only one company can implement.
I think both assertions are false. Firstly, I will explain why.

ISO/IEC 29500 defines a set of standard files format. So, it is not appropriate to speak about implementing the ISO/IEC 29500. What somebody can implement is a tool to produce, read, process, render (or whatever) files in such a format.

Anyway, the real argument was that as some parts of the format are protected by patents, only the patent holder (Microsoft in this case) can implement it. I argued, that another company could license the patent. The counterargument is that only licensed companies would implement. That's right, that is how business work.

As the discussion was going on. I thought that instead of speculating the right thing was to go the right source: ISO.

Reading this page about Standards and Patents in the ISO Website was crystal clear:

First: ISO, IEC and ITU have a common patent policy. I am not a lawyer, read it yourself to be sure. However what I interpret in short is that if a deliverable contains provisions depending on a patent there are 3 options: either the patent holder agrees to negotiate licenses free of charge or the patent holder agrees to negotiate licenses with charge or the provisions are removed from the deliverable. In all cases license negotiations need to be on a nondiscriminatory basis on reasonable terms and conditions.

Second: What model applies to ISO/IEC 29500? Well in the same page there is en Excel file with all the current standards and associated patent holders. OK. What doest it says about 29500? There are patent notes at the name of Microsoft and the entry is marked with an "F".

What does the "F" means. Literally: <"F" = Prepared to grant a license free of charge>.

By the way, according to the same sources:
  • ISO/IEC 14496-14 (MP4) is related to a patent from Apple (US Patent numbers 6,134,243,6,453,355).
  • ISO/IEC 15444-3 (JPEG) is related to a patent from Apple (6,134,243).
  • ISO/IEC 32000-1 (PDF) is related to a patent from Adobe Sytems Incorporated 
  • ISO/IEC 11172 series (MP3) is related to patents from very long list of companies.
  • ISO/IEC 14496-10 (MP4) is related to patents from another long lsit of companies.
Most of those patentes do not have the "F", so you need to negotiate a patent licensing and eventually pay for it.

There is an important point on all this. There are some things that we have been forgetting for a long time in Higher Education of Computer Professionals.

FIRST: An engineer must always be as agonostic as possible. This means that if possible he/she must go to the right sources to get the right information. Moreover, making claims only based on available date is included both in IEEE and ACM code of Ethics.

SECOND: Understanding of standards is essential to any Computer or Software Engineer these days. It is important to understand the technical issues in the standards. But as I have shown this is not enough. It is important also to understand which is are the rules of standards bodies, how different stakeholders are represented (or sometimes underrepresented) in standardization, which are the standardization procedures.

THIRD: A basic knowledge of law is also very important. I have shown here that sometimes national laws may enforce the use of a standard. It is also very important that we as engineers are able to understand the implications of intellectual property and the role of patents (where applicable).

And coming back to our code of ethics, I feel that this post is writteng according to item 10 of IEEE Code of Ethics (to assist colleagues and co-workers in their professional development and to support them in following this code of ethics), and similar provisions in the ACM code of ethics and in the ACM Software Engineering Code of Ethics.

IMPORTANTE NOTICE: If you find that anythin of this post is not true or has any inacurracy, please, contact me and I will correct it inmediately.


domingo, 4 de noviembre de 2012

Standards and Open Standards

When I write something about standards, usually is about C++. This post is not the case, so if you were reading this looking for C++ info, stop now.

A few hours ago, a good friend of mine (@jmdodero) wrote this tweet:

El MAP dice que docx es abierto! Standards for ES Public Administrations http://www.boe.es/boe/dias/2012/10/31/pdfs/BOE-A-2012-13501.pdf …

In English: "The Spanish Public Administration ministry says that docx is open! Standards for ES (Spanish) Public Adminstrations". The link points to an official document from the Spanish Government approving the Technical Standard of Standards Catalogue Interoperability. In essence this document establishes a list of standards to be used for the Spanish Public Administration.

I'll save you the legal details. However one of the items in the list is:


  • Category: File formats - Image and/or Text.
  • Common Name: Strict Open XML
  • Formal Name: ISO/IEC 29500-1:2012 Information technology -- Document description and Processing languages -- Office Open XML File Formats -- Part 1: Fundamentals and Markup Language Reference - Strict
  • Type: Open
  • Version (minimum accepted): 2012
  • Extension: docx, xlsx, pptx
A few minutes later. I answered:

ISO/IEC 29500-1:2012 y ECMA-376. Las dos públicamente disponibles = estándar abierto. ¿Cuál es el problema?

In English:

IOS/IEC 29500-1:2012 and ECMA-376. Both publicly available = open standards ¿What is the problem?

I should not be a typical suspect. I mean, I run a Linux laptop and 2 android devices. Many know that I think that the best editor is vi (vim is ok, too) and a really like LaTeX. However in a few minutes I got the following answers:

  • @jdgarciauc3m when you save a document in MS Office 2010 […] you are not saving them in the advertised OpenXML format This document will hence NOT be properly readable by other software http://t.co/AeohSarn
  • @jdgarciauc3m que no existe ninguna implementación del standard, ni siquiera MS Office lo soporta
    • There exists no implementation of the standard, even MS Office does not support it.
Well, I thought that it was time to clarify what a I think. I'll try to do so:

Question 1: Is ISO/IEC 29500-1:2012 an open standard?

Well, this is the easiest question. By definition any ISO/IEC standard is an International Standard. I could explain this in more detail, but for now let's agree on this.

The definition of "Open Standard" is "a standard that is publicly available". As any other ISO standard, ISO/IEC 29500-1:2012 is available from www.iso.org.

Question 2: Does MS Office 2010 fulfill the ISO/IEC 29500-1:2012?

I hope not.

Surprised?

It is almost impossible that a product shipped in 2010 fulfills a standard that has been approved in 2012. The only possibility I see is that people at Microsoft had a time machine. And, I do not think they have (otherwise sometimes they would have made different business decissions), but, paraphrasing Michael Ende, that is a different story and must be told in a different time.

Question 3: If there is no existing implementation of the standadrd does it make sens to put it in the catalogue?

Yes. Let me explain why.

First. No one implements a file format. What one can implement is a tool for processing files (generate them, render them, ...) in such a format. However it may be true (I do not know and I do not mind), that no existing tool correctly processes the format.

What the Spanish official document is saying is that if a public agency wants to receive text documents from another public agency or a citizen, it must say which formats is willing to accept. By the way, ODT (ISO/IEC 26300:2006) , PDF (ISO/IEC 32000-1:2008) and PDF/A(ISO/IEC 19005-1:2005 and ISO/IEC 19005-2:2011) are also in the same list.

So, the point is. We have a format in the list and when some tools are available it is possible that an agency includes in the list that format.

I still do not see the problem.



martes, 20 de septiembre de 2011

Noticias desde la normalización de lenguajes de programación

Hoy ha terminado la asamblea plenaria anual del subcomité ISO/IEC JTC1/SC22. Los se. En el mundo de la normalización se utilizan acrónimos insoportables. Probablemente resultará más inteligible si lo reformulo: Hoy a terminado la asamblea plenaria anual de subcomité de normalización de lenguajes de programación, sus entornos e interfaces de sistema.

Hay una larga lista de resoluciones tomadas por el subcomité. Algunas son meramente burocráticas y me las saltaré. Vayamos a la que pueden tener cierrto interés.

  • Se va a iniciar el estudio de una posible propuesta para normalizar la firma digital de código fuente.
  • Se ha disuelto el grupo de trabajo WG11 (binding techniques). Este grupo ha sido responsable de trabajos en especificación de aritmética independiente del lenguaje. No obstante, el interés directo de la industria en las actividades del grupo parece bajo y no se consigue tener una masa crítica en el grupo de trabajo. Este grupo de trabajo no desaparecerá realmente, sino que sus actividades se transfieren a otro subcomité (gestión e intercambio de datos / metadatos).
  • Se ha disuelto el grupo de trabajo WG16 (lenguaje Lisp). Este grupo ha dejado de tener actividad y no parece que haya sufiente interés industrial en el lenguaje.
  • Se ha aprobado la posibilidad de que la especificación del lenguaje ECMAScript (norma ISO/IEC 16262:2011) se pueda obtener gratuitamente a través de ISO. Esta norma ya se puede obtener de forma gratuita a través de ECMA.
  • Se ha confirmado la confirmación de las siguientes normas:
    • ISO/IEC/IEEE 9945:2009 Portable Operating Systems Interface (POSIX) Issue 7.
    • ISO/IEC/IEEE 11404:2007 General Purpose Datatypes.
    • ISO/IEC TR 19768:2007 Technical Report on C++ Library Extensions.
    • ISO/IEC 24716:2007 Native COBOL Syntax for XML support.
    • ISO/IEC 24731:2007 Extensions to the C Library - Part 1: Bounds checking interfaces.
  • Se ha decidido pasar a estado estabilizado (lo que hace hace que las normas dejen de estar activas) las siguientes normas:
    • ISO/IEC 13568:2002 Z formal specification notation - Syntax, type system and semantics.
    • ISO/IEC 15145:1997 Programming Languages - FORTH.
    • ISO/IEC 20970:2002 JEFF File Format.
Además, se ha revisado el estado en el que se encuentra la normalización del lenguaje Ruby que ya es una norma nacional en Japón y que previsiblemente se convertirá pronto en una norma internacional.

Tras esto, merece la pena fijarse en cual es el panorama en la normalización de lenguajes de programación en los distintos foros internacionales.

La estructura de grupos de trabajo de normalización dentro del ISO/IEC JTC1/SC22 queda de la siguiente forma:
  • WG4: COBOL.
  • WG5: Fortran.
  • WG9: Ada.
  • WG14: C.
  • WG17: Prolog.
  • WG19: Lenguajes de especificación formal.
  • WG23: Vulnerabilidades de los lenguajes de programación.
Otra organización internacional que trabaja en la normalización de lenguajes de programación es ECMA que mantiene los siguientes grupos de trabajo:
  • TC49-TG2: C#.
  • TC49-TG3: CLI.
  • TC49-TG4: Eiffel.
  • TC49-TG5: C++ para CLI.
  • TC39: ECMAScript.
Por último, en Japón, IPA mantiene la normalización del estándar sobre el lenguaje Ruby.

Tanto Ruby, como las normas desarrolladas por ECMA pueden pasar por un proceso especial para convertirse en normas ISO. De hecho esto constituye una práctica habitual de la que Ruby y ECMAScript son dos ejemplos actuales.

Y ¿adonde nos lleva esto? Pues a una lista bastante pequeña de lenguajes. Es lo que yo llamaría los lenguajes portables de interés. ¿Qué quiero decir con esto?

Veamos para estar en mi lista un lenguaje de programación debe tener una especificación mediante una norma internacional, porque esto garantiza que:
  1. Existe un interés por parte de varios actores de la industria del software en que exista una norma internacional sobre el lenguaje.
  2. Existe una norma internacional que especifica claramente el lenguaje y su entorno de forma que distintos fabricantes compitan ofreciendo productos que cumplen con la norma.
  3. El software desarrollado usando un lenguaje normalizado puede portarse con cierta facilidad de una plataforma a otra.
Como veréis mi lista no es muy larga. Por orden alfabético: Ada, C, C++, C#, COBOL, ECMAScript, Eiffel, Fortran, Prolog. A esta lista podremos añadir en breve Ruby.

De todas formas, debemos tener cuidado con las interpretaciones de mi lista. Esto no quiere decir que estos lenguajes sean los mejores, ni los más usados, ni nada por el estilo. No trato de generar una versión n+1 de la gran batalla de los lenguajes de programación.

Si un lenguaje está fuera de mi lista es porque:
a) No hay suficiente interés en la industria en el uso del lenguaje o en la existencia de una norma independiente.
b) El lenguaje está sujeto a algún tipo de propiedad intelectual que impide la competición entre distintos fabricantes o la existencia del mismo en determinado tipo de plataformas.
Sin embargo no me gustaría que este post empiece a generar comentarios masivos de fanáticos de ningún lenguaje.

lunes, 12 de septiembre de 2011

decltype: ¿De qué tipo es esa expresión?

En mi anterior post sobre C++11 vimos que el uso de auto permite deducir el tipo de una variable, siempre que ésta se vaya a iniciar en el momento en que se define. Esto cubre un cierto número de casos, pero no todos.

hora obten_hora_actual() ;
coordenada obten_posicion_actual() ;

std::map<hora , coordenada> m;
m[obten_hora_actual()] = obten_posicion_actual();
//...

Bien. Parece que no habrá problemas. Bueno, realmente no habrá problemas mientras no se modifique el tipo de retorno de las funciones obten_hora_actual() y obten_fecha_actual. Lo que realmente me gustaría expresar es que m es un mapa que usa como tipo para la clave el tipo de retorno de la primera función y como tipo para el valor el tipo de retorno de la segunda función.

Aquí aparece en nuestra ayuda el operador decltype. Este operador, permite obtener el tipo de una expresión y se puede usar en cualquier contexto en el que se pueda usar un tipo.

hora obten_hora_actual();
coordenada obten_posicion_actual();

std::map<decltype(obten_hora_actual()),
 decltype(obten_posicion_actual())> m;
m[obten_hora_actual()] = obten_posicion_actual();
//...

Originalmente, algunos fabricantes habían implementado una extensión con un operador parecido: typeof. Sin embargo, la semántica de este operador era distinta, y el comité de ISO C++ decidió optar por una palabra reservada distinta. La elección de decltype puede parecerte poco afortunada, pero era la opción que menos afectaba al código ya existente.

Reglas para la evaluación de decltype

La expresión decltype(expr) se puede utilizar en cualquier tipo donde se pueda usar un especificador de tipo. De esta manera, se puede escribir el siguiente código:

int x;
long y;
decltype(x+y) z; // z es long

En este caso la expresión decltype(x+z) equivale al tipo long, puesto que el resultado de sumar un int y un long es un long.

En el caso de que la expresión pasada a decltype sea una variable, la regla es ligeramente distinta y el resultado es el tipo con el que se declaró la variable:

int x;
int & rx = x;
decltype(x) y = x; // int y
decltype(rx) ry = x; // int & y

Esta regla, hace que en este caso la deducción de tipos no funcione exactamente igual con auto que con decltype:

int x;
int & rx = x;
auto y1 = rx; // int y1. y1 es una copia de x
decltype(rx) y2 = rx; // int & y2 = rx. y2 es una referencia a x

Esto también es aplicable a los parámetros de una función:


template <typename T> class X { /*...*/};
void f(int x1, int & x2, const int & x3) {
  X<decltype(x1)> z1; // X<int> z1;
  X<decltype(x2)> z2; // X<int&> z2;
  X<decltype font="" int&>="" x>
  /*...*/
}


También se puede utilizar decltype sobre una invocación a una llamada a función. Es importante tener en cuenta que una invocación a función dentro de decltype no realiza una llamada a la función. Su único objetivo es determinar el tipo de retorno de la función.

string obten_valor(const string & clave, int indice);
void imprime() {
  list<decltype(obten_valor("usuario",0))> l;
  for (int i=0;i
    l.push_back(obten_valor("usuario",i));
  }
}

Una diferencia bastante relevante ocurre en el caso de que decltype se aplique a una variable que se encuentre entre paréntesis. En este caso el tipo determinado por decltype es siempre una referencia.

int x;
decltype((x)) y = x; // int & y = x

De forma general, esto ocurre con cualquier expresión que no sea exactamente un nombre de variable y que pueda actuar como un l-valor.

template <class C>
void f(C & c) {
  decltype(c[0]) t; // Error t es referencia sin iniciador
  // ...
}
//...
vector<string> v = { "uno", "dos", "res" };
f(v);

En este caso, el tipo de t se obtiene evaluando la expresión decltype(v.operator[](int)) que es un l-valor (en este caso una referencia a string). Por tanto el tipo de t acaba siendo string& y la primera línea de la función f() genera un error de compilación porque se estaría declarando una variable de tipo referencia sin darle un valor inicial.

Ahora bien, la mayoría de los ejemplos empleados hasta ahora (aunque no todos) pueden parecer artificiosos y poco útiles. Probablemente, sea cierto. Sin embargo, hay contextos en los que declttype manifiesta su verdadera utilidad como la deducción automática del tipo de retorno de una función o la especificación de excepciones mediante la nueva palabra reservada noexcept.

lunes, 5 de septiembre de 2011

Una nueva vida para auto en C++11


Introducción

En C++11, la palabra reservada auto ha resucitado con un nuevo significado. C++ heredó esta palabra reservada de C, donde originalmente implicaba almacenamiento automático, como contraposición al almacenamiento estático. Sin embargo, al convertirse el almacenamiento automático en el almacenamiento por defecto de las variables, se hizo innecesaria su utilización.

Cuando un lenguaje evoluciona (como es el caso de C++11) se debe poner especial atención en que las modificaciones al lenguaje no afecten al código ya existente. Esto hace que los diseñadores del lenguaje sean muy reticentes a la introducción de nuevas palabras reservadas. Por esta razón, el comité de normalización tomó la decisión de resucitar auto dotándola de nuevas semánticas.

En C++11 se puede dar dos usos a auto:

  • Para indicar la deducción automática de tipos en la declaración de una variable.
  • Para indicar la deducción automática de tipo de retorno en la declaración de una función.


Cada uno de estos usos presenta ventajas en la escritura de código. Hoy presentaré algunos ejemplos del primer caso y dejaré para un próximo post el caso de las funciones con deducción automática de tipo de retorno.

Deducción automática del tipo de variables

Cualquiera que haya escrito código usando la biblioteca estándar de C++ habrá visto alguna vez cosas como la siguiente:

vector<int> v = {1, 2, 3};
for (vector<int>::iterator i=v.begin(), e=v.end();i!=e;++i) {
    cout << *i << endl;
}

Claro que esto puede empeorar:

vector<list<string> > v = { { "Carlos", "Maria"}, {"Niño", "Niña"} };
for (vector<list<string> >::iterator i=v.begin(),e=v.end();i!=e;++i) {
for (list<string>::iterator j=i->begin(), e=i->end(); j!=e; ++j) {
cout << *j << " ";
}
cout << endl;
}

Para complicar las cosas un poco más, todos los contenedores ofrecen variantes de iteradores (como const_iterator) que ocasionan algunos pequeños dolores de cabeza al escribir código.

Sin embargo en los ejemplos anteriores, tener que escribir los tipos de las variables i y j. No es realmente necesario. Se puede simplificar el lenguaje siguiendo una máxima que a mí me gusta mucho: “Deja que el compilador haga todo lo que puede hacer y deja el resto para el programador”.

Antes de entrar en los detalles del uso de auto, veamos los ejemplos anteriores en C++11. Baste por ahora decir que cuando se especifica que el tipo de una variable es auto, el compilador determina su tipo a partir del valor que se usa para iniciar la variable.

Con esto nuestro primer ejemplo queda:

  vector<int> v = {1, 2, 3};
  for (auto i=v.begin(), e=v.end();i!=e;++i) {
    cout << *i << endl;
  }

Y el segundo ejemplo:

  vector<list<string> > v = { { "Carlos", "Maria"}, {"Niño", "Niña"} };
  for (auto i=v.begin(),e=v.end();i!=e;++i) {
    for (auto j=i->begin(), e=i->end(); j!=e; ++j) {
      cout << *j << " ";
    }
    cout << endl;
  }

Deducción de tipos en contextos de declaración de variable

El principal uso de la deducción automática de variables es la declaración de variables.
Probablemente el uso más simple de auto es la declaración de una variable en un bloque (dentro de una función, dentro de un bucle,…) o bien en un alcance de un espacio de nombres.

  auto x = 5; // x es int
  auto z = 2.5;  // z es double
  string s = "Daniel";
  auto lon = s.length(); // el tipo de lon coincide con el tipo de retorno de length

Otros usos equivalentes son la declaración de una variable en una sentencia de iniciación de un bucle for, en una condición de una sentencia de selección (if, switch) o de una sentencia de iteración (while, do, for).

  string s = "Daniel";
  for (auto i=s.length();i>0;--i) {
    cout << s[i-1];
  }
  cout << endl;

Estos usos facilitan la vida del desarrollador permitiendo escribir código más simple. En este casi no es necesario recordar que tipo concreto devuelve la función miembro length(), basta con indicar que la variable i debe tener el mismo tipo.

Algunos pueden ver esta utilización de auto como una simple conveniencia que no mejora la calidad del código. Sin embargo, incluso en estos casos tan sencillos, la deducción automática de tipos aporta ventajas.
Por una parte, permite expresar claramente la intención del desarrollador. Es decir, la variable i debe tener el mismo tipo que el valor devuelto por la función miembro length(). Por otra parte, este estilo permite evitar errores derivados de la conversión automática de tipos. Veamos:

  string s = "Daniel";
  for (short i=s.length();i>0;--i) {
    cout << s[i-1];
  }
  cout << endl;

¿Qué ocurre si el valor devuelto por length() no cabe en un short? Ciertamente, es una situación que puede calificarse como mínimo de desagradable.

Pero cuando auto se vuelve realmente útil es en la escritura de código genérico. En C++03, se hacía necesario recurrir a código innecesariamente largo para escribir una función que imprimiese los elementos de un contenedor.

template <typename C>
void imprime(const C & c) {
  for (typename C::const_iterator i=c.begin(), e=c.end();i!=e;++i) {
    cout << *i << endl;
  }
}

Con C++11 uno no se tiene que volver a preguntar si el tipo concreto del iterador tiene que ser iterator o const_iterator y tampoco hace falta cualificar el tipo con typename para indicar al compilador de que realmente se trata de un tipo dependiente.

template <typename C>
void imprime(const C & c) {
  for (auto i=c.begin(), e=c.end();i!=e;++i) {
    cout << *i << endl;
  }
}

Más sobre la deducción de tipos

Una pregunta que conviene hacerse sobre la deducción de tipos es qué ocurre con las referencias. Es decir:

int x = 3;
int & z = x;
auto t = z;  // ¿int o int&?

Es decir, si una variable declarada como auto si inicia con otra variable de tipo referencia ¿qué tipo se deduce? La respuesta se obtiene, una vez que se observa que lo que se utiliza como iniciador (en nuestro caso z) expresión y por tanto su tipo es int.

¿Y si se desea que t sea una referencia? La solución es simple, puesto que se puede combinar auto con cualquier otro especificador de declaraciones:

int x = 3;
int & z = x;
auto&  t = z;  // int&
const auto u = x; // const int
auto *p = &x;

Otros usos de la deducción automática de tipos

Probablemente, un caso más sorprendente (aunque no debería) es la deducción automática de tipos en expresiones asociadas al operador new.

auto p = new auto(1.5); // p es un double*

Además, se puede usar la deducción automática de tipos con variables miembro estáticas que se inician dentro de la definición de una clase.

class X {
public:
  static const auto n = 3;
};

En resumen

C++11 introduce un mecanismo que permite que el compilador pueda deducir el tipo de una variable a partir de la expresión con la que ésta se inicia. Este mecanismo simplifica la escritura de código genérico. Como complemento, el mecanismo permite que evitar errores comunes de programación derivados de conversiones implícitas no deseadas.

Próximamente comentaré dos características del lenguaje que están íntimamente relacionadas con esta: la deducción automática de tipos de retorno en funciones y la obtención del tipo de un objeto.

viernes, 2 de septiembre de 2011

Nuevas bibliotecas estándar para C++

Cuando digieras las 1400 páginas que tiene el nuevo estándar de C++, comprobarás que una parte bastante importante de la norma la constituye una renovada biblioteca de clases. No obstante, es probable que todavía pienses que faltan cosas.

Bien, las buenas noticias son que se abre la puerta para nuevas propuestas de bibliotecas. El comité ha decidido animar a que se presenten propuestas para una futura extensión de la biblioteca estándar.

Esta es la resolución del comité:

The C++ committee Library Working Group welcomes proposals for library extensions which will be considered starting in the February 2012 meeting. We have not yet set out an overall timeline for future library extensions, but are ready to consider new proposals at this point.
To increase the chances of your proposal being accepted by the committee, we strongly recommend that a committee member willing to champion your proposal (this could be you yourself, or a delegate) attend upcoming meetings to help shepherd your proposal through the process.
La preparación de una propuesta de biblioteca para normalizar debe considerar múltiples aspectos que van desde la utilidad general del componente hasta la implementabilidad en las diversas plataformas usadas y la capacidad de ser expresadas de forma portable.

Como comentaba en mi anterior post, ya tenemos diversas propuestas encima de la mesa, pero si tienes una propuesta interesante este es el momento.

viernes, 19 de agosto de 2011

Estándar C++. Reunión de Bloomington


Hoy hemos terminado la reunión del JTC1/SC22/WG21 (comité de C++ para los amigos). La reunión comenzó con la noticia de que el nuevo estándar ha sido oficialmente aprobado de forma unánime por los países con derecho a voto, como adelantaba en mi anterior post. De hecho, hemos tenido confirmación de ISO de que se van a acelerar los trámites de la publicación oficial del documento, por lo que con casi toda seguridad podemos hablar de C++11 (ISO/IEC 14882:2011) y no de C++ 2012.

Una buena parte de la reunión ha estado dedicada a la resolución de issues tanto de la biblioteca como del propio lenguaje. Si. El estándar se acaba de publicar, pero el comité es consciente de que el documento tiene algunos errores e inconsistencias menores que habrá que resolver. En la resolución de estos defectos se ha avanzado bastante, pero no se ha votado ninguno de ellos. Esto hace prever que la próxima reunión en Marzo de 2012 tendremos una buena lista que aprobar.

Además de esto, dentro del grupo de trabajo de biblioteca hemos visto versiones preliminares de algunas propuestas que podrían añadirse:

  • Sistema de ficheros. Es biblioteca te permitirá olvidarte del API C/POSIX para navegar por directorios, entro otras cosas.
  • Cerrojos compartidos. Básicamente son algunos tipos más de mutex, que no se añadieron al estándar para no retrasarlo más. Estos cerrojos (con nombres tentativos de shared_mutex y upgrade_mutex) son especialmente apropiados para soportar problemas del tipo múltiples lectores/único escritor.
  • Nuevos algoritmos para la generación de distintos tipos de permutaciones y combinaciones que generalizan el existente next_permutation.
  • Entrada salida para tipos que representan duraciones de tiempo (espacio de nombres chrono). De esta manera se podrán imprimir mensajes que en el caso de duraciones se incluya de forma automática la unidad en la que se expresa la duración.
  • Un nuevo tipo para representar fechas (también  a incluir en el espacio de nombres chrono).
Otro aspecto bastante relevante ha sido la discusión sobre el futuro del lenguaje. Aunque el comité no ha cerrado decisiones al respecto, parece que los más probable será que se trabaje por una parte un modificaciones al lenguaje y por otra parte en la extensión de la biblioteca estándar. Estos trabajos se podrán realizar de forma independiente de forma que se hagan públicos con ritmos de trabajo diferentes.

En el caso de la biblioteca, el comité hará publica una petición de propuestas de nuevas bibliotecas en breve. Así que si tienes una buena idea para alguna biblioteca que te gustaría ver en el futuro como parte del estándar, este parece un buen momento.

Nuestra próxima reunión será en Kona, Hawaii en febrero de 2012. Probablemente, en esa reunión dediquemos una parte del tiempo a definir la evolución del lenguaje. En cualquier caso y con toda seguridad dedicaremos tiempo a estudiar propuestas de modificaciones y adiciones a la biblioteca (entre mis favoritos estarán propuestas para mejorar la concurrencia y las comunicaciones a través de red).

Y eso es todo por ahora.

viernes, 12 de agosto de 2011

FDIS de C++ aprobado

Por fin ha finalizado el periodo de voto del FDIS del nuevo estándar de C++ (C++0x para los amigos).

El estándar ha sido aprobado con los votos favorables de: Canadá, China, República Checa, Dinamarca, Finlandia, Francia, Alemania, Irlanda, Italia, Japón, Kenya, Corea, Holanda, Nigeria, Noruega, Pakistán, Federación Rusa, España, Suiza, Ucrania, Reino Unido y Estados Unidos.

No ha habido ningún voto en contra.

Ciertamente para la comunidad de C++ es una gran noticia. Después de más de una década por fin tenemos una nueva norma del lenguaje. Sin duda, esto va a revitalizar mucho el lenguaje con nuevas características largamente esperadas y una biblioteca más completa.

Y desde hoy, empezamos a trabajar en el nuevo estándar. Bueno, realmente desde este próximo lunes 15 de agosto que es cuando nos reuniremos en Bloomington, Indiana.

Evidentemente, la norma es perfecta y seguro que encontraremos defectos y posibles mejoras. Si encuentras algo, no dudes en hacérmelo llegar por correo electrónico.

Pero por ahora disfrutemos de la nueva versión del lenguaje...

domingo, 27 de marzo de 2011

Tenemos nuevo estándar de C++

Si os digo que esta semana se ha celebrado en Madrid la reunión del comité ISO/IEC JTC1/SC22/WG21 y que se a aprobado el FDIS de la norma ISO/IEC 14882:2011, probablemente me diréis que lo que quiero es que no entendáis nada de lo que digo. Y tendríais razón. Así que lo diremos de otra forma.

Esta semana se ha reunido en Madrid el comité internacional de normalización del lenguaje C++. Algunos sabéis que represento a España en este comité. Y bueno la gran noticia es que hemos acordado una nueva norma para el lenguaje y su biblioteca estándar. Realmente los procedimientos de ISO harán que la nueva norma no sea oficial hasta el verano (más o menos).

Estoy muy contento por varias razones.

Por una parte, el estándar se a aprobado en Madrid, así que permitidme una ligera dosis de chovinismo. Además, la norma incluyen algunas propuesta menores que yo hice, así que permitidme otra dosis de egolatría.

Siendo un poco más serios, creo que el lenguaje se va a ver sensiblemente reforzado. Ha pasado demasiado tiempo desde la anterior norma (la ISO 14882:1998) que tuvo posteriormente una revisión menor en el año 2003.

Cada vez que doy una charla o conferencia sobre esta renovación siempre que hay alguien que me pregunta sobre su aspecto más destacable. He ido dando una respuesta distinta a lo largo de los últimos años, al tiempo que las características aparecían y desaparecían del lenguaje. A día de hoy, creo que el lenguaje se ha renovado de forma sustancial y que ahora se disponer de una biblioteca mejor y más completa.

Es difícil hacer una enumeración de las distintas novedades en el lenguaje y en la biblioteca. Y además esto está bien hecho en algunas páginas Web. Por ejemplo se puede encontrar una buena explicación de la mayoría de los cambios en la página Web de Bjarne Stroustrup (http://www2.research.att.com/~bs/C++0xFAQ.html).

Desde mi punto de vista, y posiblemente esto sea una visión sesgada, una de las novedades más relevantes es la incorporación de un modelo de hilos como parte del lenguaje. Esto afecta, tanto a las reglas del lenguaje como a la biblioteca, pero permitirá que se puedan escribir aplicaciones multi-hilo de forma portable e independiente de la plataforma (hw y sistema operativo).

A partir de ahora surgirán dos retos importantes:

  • En primer lugar, va a ser necesario realizar un importante esfuerzo de diseminación de la información. Ya están varios libros en marcha. Serán necesarios nuevos materiales de formación y la adaptación de cursos.
  • Por otra parte, será necesario seguir trabajando en la siguiente renovación del lenguajes que debería concluirse con mayor celeridad que la actual. Las estrategias para esta nueva versión la discutiremos en la siguiente reunión del comité que tendrá lugar este verano en Bloomington, Indiana.
Como siempre las posiciones de España se fijarán en el comité español de C++. Este es el comité CTN71/GT21 en el que siempre estamos deseosos de incorporar a nuevas empresas y organismos.

Para más información, me podéis encontrar en josedaniel.garcia@uc3m.es.

sábado, 7 de agosto de 2010

C++0x cada vez más cerca

En la reunión del comité de C++ en Suiza esta terminando hoy.

Durante la semana se han procesado varios centenares de comentarios enviados por los distintos países participantes en ISO. Ha sido una semana bastante productiva.

Parece que el estándar estará terminado (o casi) para la reunión del comité en Madrid el próximo marzo de 2011.

Algunas decisiones:
  • Se ha refinado la bilioteca bastante (más sobre este en otro post)
  • Se ha tomado la decisión de que los destructores serán por defecto noexcept(true).
  • Se ha decidido pasar a una sintáxis para alignment basada en keywords en vez de los actuales atributos. Esto permitirá una mayor compatibilidad con C.
  • Se ha decidido que noreturn siga siendo un atributo. Esto lo hace incompatible con C, donde usan una palabra reservada.
  • Se ha decidido que el control de redefinición virtual deje de hacerse con atributos. Todavía se están buscando los nombres más adecuados para las palabras reservadas.
  • Se ha decidido cambiar la gestión de SFINAE para que se tenga en cuenta el control de acceso.
  • Se ha decidido eliminar las declaraciones de acceso, que están deprecated desde C++98.
  • Se está estudiando la posible recuperación (actualmente deprecated de static en el ámbito de un espacio de nombres.

miércoles, 7 de abril de 2010

Se ha hecho público el FCD (Final Committee Draft) del lenguaje C++.  Lo puedes acceder en la dirección:
  
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf

Ahora se abre un periodo en que los comités nacionales pueden emitir comentarios sobre cualquier punto del estándar.

 
El comité español, decidirá la lista de comentarios que envia, pero he creado un grupo en LinkedIn (Desarrolladores C++) en el que se pueden emitir opiniones, comentarios, ...

Si te apetece participar en el proceso, o utilizar el grupo para otra cosa, te animo a unirte en:

 
http://www.linkedin.com/groupRegistration?gid=2863690

 
El grupo "Desarrolladores C++" tiene como objetivos:
  • Ser un foro de discusión sobre el proceso de estandarización del lenguaje C++ que permita una participación amplia.
  • Anunciar eventos locales (en España) sobre el lenguaje, como cursos o conferencias.
  • Publicitar ofertas de empleo, becas, etc asociadas al lenguaje C++
  • Otros que se le vayan ocurriendo al grupo.

--

 
J. Daniel Garcia

Presidente del comité español de normalización de C++

jueves, 25 de marzo de 2010

ISO/IEC DTR 24772

El subcomité ISO/IEC SC22 ha dado otro paso hacia la aprobación de un Technical Report relevante para los desarrolladores software. Se trata del ISO/IEC DTR 24772 (Guidance to Avoiding Vulnerabilities in Programming Languages through Language Selection and Use).

Este documento será muy relevante para todos aquellos interesados en las vulnerabilidades que se pueden introducir en el software al utilizar ciertas características de un lenguaje de programación.

El estado actual del document ha sido el de aprobación con comentarios, por lo que ahora el comité deberá estudiar estos comentarios y generar una nueva versión.