docs: function Program(gl, codes, includes) {
      if (typeof codes.vert !== 'string') {
          throw Error('[webgl.program] Missing attribute `vert` in argument `codes`!');
      }
      if (typeof codes.frag !== 'string') {
          throw Error('[webgl.program] Missing attribute `frag` in argument `codes`!');
      }
  
      codes = parseIncludes(codes, includes);
  
      this.gl = gl;
      Object.freeze(this.gl);
  
      this._typesNamesLookup = getTypesNamesLookup(gl);
  
      var shaderProgram = gl.createProgram();
      var shaderVert = getVertexShader(gl, codes.vert);
      var shaderFrag = getFragmentShader(gl, codes.frag);
      gl.attachShader(shaderProgram, shaderVert);
      gl.attachShader(shaderProgram, shaderFrag);
      gl.linkProgram(shaderProgram);
      /*  Si on exécute les 4 lignes suivantes, on ne peut pas debugger les shaders.
        gl.detachShader( shaderProgram, shaderVert );
        gl.deleteShader( shaderVert );
        gl.detachShader( shaderProgram, shaderFrag );
        gl.deleteShader( shaderFrag );
      */
      this.program = shaderProgram;
      Object.freeze(this.program);
  
      this.use();
      createAttributes(this, gl, shaderProgram);
      createUniforms(this, gl, shaderProgram);
  }