Programação orientada a objetos em C puro: o caso do htop

Documentos relacionados
C com introdução a OO

A história do htop um making of

Aula 6 POO 1 Construtores. Profa. Elaine Faria UFU

Introdução a POO. Introdução a Linguagem C++ e POO

Linguagem de Programação Orientada a Objeto Construtores e Sobrecarga

CPP. C plus plus versus Java

Construtores. Introdução

Linguagens de Programação Departamento de Engenharia Eletrônica e de Computação - DEL-Poli/UFRJ Prof.: Miguel Elias Mitre Campista

1 Introdução e Conceitos básicos

Fundamentos de Programação

Suporte a programação orientada a objetos

Conversão de Tipos. BCC Programação Orientada a Objectos(POO)

Programação por Objectos. Java

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Fundamentos de Programação

Módulo 5. Programação Orientada a Objetos. Programação Orientada a Objetos I Java (Rone Ilídio)

Ponteiros e Alocação de Memória

Fundamentos de Programação 2

Programação II. Vetores Bidimensionais e Vetores de Ponteiros. Bruno Feijó Dept. de Informática, PUC-Rio

Gilberto A. S. Segundo. 24 de agosto de 2011

Introdução à Programação. Conceitos Básicos de Orientação a Objetos

Carlos Eduardo Batista. Centro de Informática - UFPB

Programação Orientada a Objetos

Classes e Objetos. Prof. Fernando V. Paulovich 9 de agosto de 2010

Linguagem de Programação III

Linguagem de Programação II Implementação

Programação Java. Linguagem de Programação Java

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

13/11/15. Incrementando C: C++ E na especificação de BigInt... Arquitetura da solução exemplo. O arquivo de declarações. Explorando a classe BigInt

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

PLANO DE UNIDADE DIDÁTICA- PUD

Programação de Computadores II

Java Básico. Carga Horária: 32 horas. Pré-requisito: Lógica de Programação; JAVA. Conteúdo Programático

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação

Introdução à orientação a objetos. João Tito Almeida Vianna 18/05/2013

INF 1620 P2-14/10/05 Questão 1 Nome:

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Introdução ao C++ Ambientes de Desenvolvimento Avançados. 2 de Outubro de 2002 ADA / DEI - ISEP 2002/2003 1

Programação OO em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Carlos Eduardo Batista. Centro de Informática - UFPB

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Linguagem de Programação III

Curso de Programação C em Ambientes Linux Aula 05

Programação Orientada a Objetos HERANÇA E COMPOSIÇÃO

Csharp. Teresa do Carmo

Conceitos Básicos da Programação OO

Listas (cont.) K&R: Capitulo 6. Lista Simplesmente Ligada IAED, 2012/2013. Conjunto de nós. Cada nó contém. head NULL. typedef struct node {

Ponteiros & tabelas (cont.) K&R: Capítulo 5

Introdução à Programação C

[Desenvolvimento OO com Java] Orientação a objetos básica

Programação orientada a objetos

Programação Orientada a Objetos OUTROS MECANISMOS

Básico: estrutura de programa, sintaxe Interface com linha de comando

Conceitos Básicos de C

Instituto de Informática Estrutura de Dados II

Programação II. Vetor de Tipo Estruturado e Vetor de Ponteiros. Bruno Feijó Dept. de Informática, PUC-Rio

Herança e Polimorfismo - Parte I -

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Programação Orientada a Objetos II

Análise de Programação

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

Fundamentos de Programação 1

Laboratório de programação II

Programação Orientada a Objetos

Linguagens de Programação Aula 12

Linguagem de Programação

[Desenvolvimento OO com Java] Orientação a objetos básica

[Desenvolvimento OO com Java] Modificadores de acesso e atributos de classe

Prof. Rogério Albuquerque de Almeida. Programação Orientada a Objetos II JAVA Décima Segunda Aula

Programação Orientada a Objetos

Classes e Encapsulamento

Introdução à linguagem C++

Linguagem de Programação II Implementação

Algoritmos e Estruturas de Dados I (AEDI) Introdução - AEDI. Prof. Paulo Henrique Pisani

Orientação a objetos. Programação. Orientada a Objetos. Orientação a objetos. Orientação a objetos. Abstração e encapsulamento

Variáveis primitivas e Controle de fluxo

PCS3111. Laboratório de Programação Orientada a Objetos para Engenharia Elétrica. Aula 6: Polimorfismo

CIÊNCIA DA COMPUTAÇÃO - LINGUAGEM DE PROGRAMAÇÃO II REVISÃO POO

Primeira Prova de Linguagens de Programação - DCC024B -

Roteiro. Introdução. Uma Introdução à Programação Orientada a Objetos e JAVA usando NetBeans. Objetos. Princípios da Orientação a Objetos

Descrição de recursos de C++ não relacionados às classes

Vetores. IFSC/Florianópolis - Programação Orientada a Objetos + POO - prof. Herval Daminelli

INF 1620 P3-27/11/04 Questão 1 Nome:

MCTA028 Programação Estruturada Aula 09: - Ponteiros (parte 2)

# Estrutura de Dados # Aula - Revisão de C/C++ na Prática. Prof. Leinylson Fontinele Pereira

Palavras Reservadas da Linguagem Java

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Lista de Linguagens de Programação 14

Programação Java. - Classes, Objetos, Atributos e Métodos - Marco Fagundes Marco Fagundes -

Linguagens de Programação

MULTITHREADING. Prof.: Michele Nasu Tomiyama Bucci

Apêndice 1. Padrão de composição de módulos

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

Transcrição:

Programação orientada a objetos em C puro: o caso do htop Hisham Muhammad h@hisham.hm @hisham_hm FISL 16, 2015

Quem sou eu Hisham Muhammad - h@hisham.hm GoboLinux htop LuaRocks gobolinux.org hisham.hm/htop luarocks.org

http://hisham.hm/htop/ O htop

Por que C? portabilidade de hardware? de sistema? de distro? desempenho desempenho CPU footprint de RAM controle sobre a execução sobre a memória

Qual C? K&R C (1978) ANSI C (1989) ISO C99 (1999) ISO C11 (2011)

Qual C? K&R C (1978) ANSI C (1989) ISO C99 (1999) ISO C11 (2011)

Por que não C++? "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." Bjarne Stroustrup, criador de C++

Dependências do htop build: Autotools (Automake, Autoconf...) runtime: NCurses

Abordagem de desenvolvimento código simples o mais alto-nível possível pagar o preço somente das features que usarmos

github.com/hishamhm/htop

Programação orientada a objetos Objetos Classes Herança Subtipagem Métodos virtuais Estruturas de dados

Peraí, isso é "Java"? Não, apenas algumas convenções: Uma classe por arquivo Nomenclatura "CamelCase" this setdefaultbar Vector Hashtable indexof Object AvailableColumnsPanel

objetos = atributos + métodos Objetos

Objetos objetos = atributos + métodos em C: atributos = struct métodos = funções

Construtor e destrutor MyObject* MyObject_new(int foo) { MyObject* this = malloc(sizeof(myobject)); this->foo = foo; return this; } MyObject_delete(MyObject* this) { } free(this);

Métodos int MyObject_sumValue(MyObject* this, int value) { this->foo += value; return this->foo; }

Objetos e métodos no htop Em quase todo lugar: Painéis Elementos dos painéis Processos Lista de processos Medidores Cabeçalho Barras de funções

public vs. private (vs....) Visibilidade

Visibilidade public vs. private (vs....) em C: métodos privados = funções static

Métodos públicos e privados void MyObject_publicMethod(MyObject* this) { }... static void MyObject_privateMethod(MyObject* this) { }... Se...

Métodos públicos e privados void MyObject_publicMethod(MyObject* this) { }... static void MyObject_privateMethod(MyObject* this) { }... Se temos uma classe por arquivo

Subtipagem (!= herança!) relação "X is a Y"

Subtipagem (!= herança!) relação "X is a Y" em C: "Onde os casts são válidos?"

Subtipagem em C typedef struct Dog_ { int a; double b; } Dog; a b typedef struct Pug_ { Dog super; char c; } Pug; super c Dog* d =...; printf("%d", d->a); Pug* p =...; printf("%c", p->c); printf("%d", p->super.a); Dog* x = (Dog*) &p; printf("%d", x->a);

Subtipagem em C typedef struct Dog_ { int a; double b; } Dog; a b typedef struct Pug_ { Dog super; char c; } Pug; a b c Dog* d =...; printf("%d", d->a); Pug is a Dog Pug* p =...; printf("%c", p->c); printf("%d", p->super.a); Dog* x = (Dog*) &p; printf("%d", x->a);

Subtipagem em C typedef struct Dog_ { int a; double b; } Dog; a b typedef struct Pug_ { Dog* super; char c; } Pug; super c Dog* d =...; printf("%d", d->a); Pug is not a Dog! Pug* p =...; printf("%c", p->c); printf("%d", p->super->a); Dog* x = (Dog*) &p; printf("%d", x->a);

Subtipagem em C typedef struct Dog_ { int a; double b; } Dog; a b typedef struct Pug_ { Dog* super; char c; } Pug; super c Dog* d =...; printf("%d", d->a); Pug is not a Dog!? Pug* p =...; printf("%c", p->c); printf("%d", p->super->a); Dog* x = (Dog*) &p; printf("%d", x->a);

Subtipagem no htop Process is an Object Meter is an Object Panel is an Object MainPanel is a Panel MetersPanel is a Panel etc. um Panel apresenta uma lista de Objects

Quais classes reaproveitam código de quais Herança

Herança Quais classes reaproveitam código de quais em C: como organizamos nossos ponteiros para funções

Métodos virtuais Em C++ temos... class Pessoa { void ola() { printf("bom dia"); } virtual void bye() { printf("adeus"); } }; class Barulhento: Pessoa { void ola() { printf("bom DIA!"); } virtual void bye() { printf("falou!"); } };... Barulhento joaozinho; Pessoa* p = &joaozinho; p->ola(); p->bye();

Métodos virtuais Em C... void Pessoa_ola() { printf("bom dia"); void Pessoa_bye() { printf("adeus"); } void Barulhento_ola() { printf("bom DIA!"); } void Barulhento_bye() { printf("falou!"); }... Barulhento* joaozinho = Barulhento_new(); Pessoa* p = joaozinho; Pessoa_ola(); p->klass->bye();

VTables Tabela de ponteiros de função Em C, criamos uma struct contendo os ponteiros dos métodos virtuais e os "atributos de classe" C++ e Java não fazem mágica

Métodos virtuais no htop Classes que derivam de Object redefinem delete display Classe Panel usa o método display Na prática, uma minoria das funções!

Estruturas de dados Linguagens OO tipicamente oferecem coleções padrão

Estruturas de dados Linguagens OO tipicamente oferecem coleções padrão em C: Coleções (vetores, hashtables) podem nos ajudar muito na gerência de memória

C e as segmentation faults ponteiro não inicializado ponteiro contém valor velho ponteiro contém valor inválido

C e as segmentation faults ponteiro não inicializado erro na inicialização do objeto ponteiro contém valor velho ponteiro contém valor inválido

C e as segmentation faults ponteiro não inicializado erro na inicialização do objeto ponteiro contém valor velho problema no gerência do tempo de vida ponteiro contém valor inválido

C e as segmentation faults ponteiro não inicializado erro na inicialização do objeto ponteiro contém valor velho problema no gerência do tempo de vida ponteiro contém valor inválido erro em aritmética de ponteiros / limites

Separation of concerns Classes implementando estruturas de dados de alto nível: Vector, Hashtable, Stack... Isolar código que faz "coisas complicadas" com ponteiros nessas classes O resto do código fica simples: Vector_insert(v, 3, data);

Ownership Gerência de tempo de vida dos objetos Cada objeto tem um dono Geralmente é: ou quem o criou ou uma coleção

Coleções com ownership Vector* Vector_new(ObjectClass* type, bool owner, int size) Se o Vector é "owner", ele chama o método delete do Object ao remover um elemento (o destrutor certo é chamado graças à herança!)

Estruturas de dados no htop Vector cada painel tem um o ScreenManager controla um Vector de Panels Hashtable processtable userstable

Ownership no htop Código simétrico: Quase todos os malloc() e free() do programa ficam em construtores e destrutores Granularidade no controle: Quase todas as chamadas explícitas a destrutores são para destruir alguma coleção, e não objetos individuais

Um pouquinho de introspecção RTTI (Run Time Type Information)

Um pouquinho de introspecção RTTI (Run Time Type Information) em C: Como nossas VTables são explícitas, podemos usá-las para identificar as classes em tempo de execução Útil para debugging (das coleções!)

Comentários finais Programação C precisa ser disciplinada

Comentários finais Programação C precisa ser disciplinada OO é uma disciplina de programação

Comentários finais Programação C precisa ser disciplinada OO é uma disciplina de programação OO em C funciona bem e é eficiente

Comentários finais Programação C precisa ser disciplinada OO é uma disciplina de programação OO em C funciona bem e é eficiente Algumas poucas macros escondem as partes mais feias e/ou repetitivas

Comentários finais Programação C precisa ser disciplinada OO é uma disciplina de programação OO em C funciona bem e é eficiente Algumas poucas macros escondem as partes mais feias e/ou repetitivas Use C se fizer sentido para os seus requisitos

http://hisham.hm/dit/ Reuso!

Obrigado! Perguntas? htop e mais em: http://hisham.hm/ @hisham_hm Avalie essa apresentação usando o Makadu! APK do aplicativo Android: http://www.makadu.net/makadu.apk Estes slides são licenciados pela Creative Commons CC BY 4.0: https://creativecommons.org/licenses/by/4.0/