[svn] r5943: nemerle/trunk/doc/presentation/ksi-kamil-2005: .
content.tex main.tex
nazgul
svnadmin at nemerle.org
Thu Nov 17 00:40:49 CET 2005
Log:
Ksi presentation
Author: nazgul
Date: Thu Nov 17 00:40:47 2005
New Revision: 5943
Added:
nemerle/trunk/doc/presentation/ksi-kamil-2005/
- copied from rev 5942, nemerle/trunk/doc/presentation/ksi-michal-2005/
Modified:
nemerle/trunk/doc/presentation/ksi-kamil-2005/content.tex
nemerle/trunk/doc/presentation/ksi-kamil-2005/main.tex
Modified: nemerle/trunk/doc/presentation/ksi-kamil-2005/content.tex
==============================================================================
--- nemerle/trunk/doc/presentation/ksi-michal-2005/content.tex (original)
+++ nemerle/trunk/doc/presentation/ksi-kamil-2005/content.tex Thu Nov 17 00:40:47 2005
@@ -6,483 +6,312 @@
\definecolor{lgray}{rgb}{0.8,0.8,0.8}
\title{Nemerle}
-\author{Micha{\l} Moskal}
-\institute{Instytut Informatyki Uniwersytetu Wrocławskiego \\
-Spotkanie Koła Studentów Informatyki}
+\author{Kamil Skalski}
+\institute{Instytut Informatyki Uniwersytetu WrocĹawskiego \\
+Spotkanie KoĹa StudentĂłw Informatyki}
\date{17 listopada 2005}
\begin{document}
-\section{Wstęp}
+\section{Abstrakcja i uogĂłlnianie w programowaniu}
\frame{\titlepage}
\frame{
-\frametitle{Cechy Nemerle}
+\frametitle{Abstrakcja}
\begin{itemize}
- \item język programowania wysokiego poziomu
- \item statycznie typowany
- \item ogólnego przeznaczenia
- \item od początku projektowany z myślą o \net
- \item funkcjonalny i obiektowy
- \item potężny system metaprogramowania
+ \item najlepsze sÄ
proste i bezpoĹrednie rozwiÄ
zania
+ \item jednak wtedy niskopoziomowe detale wchodzÄ
wszÄdzie gdzie tylko siÄ da
+ \item potrzeba podzieliÄ problem na warstwy
+ \item kaĹźda warstwa realizowana jest niezaleĹźnie
+ \item kolejna warstwa jest abstrakcjÄ
poprzedniej
+ \item ostatnia zawsze sprowadza siÄ do hasĹa ``chcÄ mieÄ program, ktĂłry dziaĹa''
+ \footnote {tudzieĹź, ktĂłry uda mi siÄ sprzedaÄ}
\end{itemize}
}
+\frame[containsverbatim]{
+\frametitle{Prosta pÄtla}
+ZaĹóşmy, Ĺźe chcemy zrealizowaÄ jakieĹ proste zadanie programistyczne.
+Na przykĹad wykonaÄ pewien kod w pÄtli.
-\frame{
-\frametitle{A co to język funkcjonalny?}
-\begin{itemize}
- \item funkcje jako wartości
- \begin{itemize}
- \item wskaźniki na funkcje
- \item \textit{functional object}
- \item delegaty
- \end{itemize}
- \item rekonstrukcja typów
- \item trwałość wartości (brak efektów ubocznych)
-\end{itemize}
-}
-
-
-\frame{
-\frametitle{Czemu \net\ ?}
-
-\begin{itemize}
- \item szeroki dostęp do bibliotek
- \item środowisko uruchomieniowe (odśmiecanie, JIT)
- \item ``wielojęzykowość''
- \item przenośne pliki wykonywalne (Microsoft \net, Mono, DotGNU, Rotor)
- \item dynamiczne ładowanie klas
- \item dynamiczna generacja kodu
-\end{itemize}
-}
-
-\frame{
-\frametitle{Po co to to?}
-
-\begin{itemize}
- \item chcieliśmy połączyć programowanie obiektowe (w sensie C\#) z programowaniem
- funkcjonalnym
-\begin{itemize}
- \item znajoma, obiektowa podstawowa struktura programu
- \item metody w środku zaimplementowane funkcjonalnie
- \item łatwy dostęp do cech imperatywnych
-\end{itemize}
- \item od ML-owej składni, podzbioru funkcjonalności C\# oraz aspektów funkcjonalnych
- \item do języka który wygląda jak C\#, zawiera C\# oraz aspekty funkcjonalne
- \item makra!
-
-\end{itemize}
-}
-
+Bierzemy nasz ulubiony asembler i kodujemy...
-\section{Wszyscy lubimy przykłady}
+\begin{verbatim}
+ mov bx, 10
+ mov cx, 0
+l1:
+ cmp cx, bx
+ br_eq l2
+ mov ax, cx
+ inc
+ mov cx, ax
-\frame[containsverbatim]{
-\frametitle{Cześć}
+ ...
-\begin{verbatim}
-// typy po prawej i po :
-class Hello {
- public static Main () : void
- {
- System.Console.Write ("Hello world!\n");
- }
-}
+ br l1
+l2:
\end{verbatim}
}
-
\frame[containsverbatim]{
-\frametitle{Cześć 2.0}
+\frametitle{Implementacja bardziej na czasie}
+Ok, w asemblerze pisaĹo siÄ w moich czasach, teraz uĹźywamy C / C++ / C\#.
\begin{verbatim}
-System.Console.Write ("Hello world!\n");
+ int n = 10;
+ int i = 0;
+l1:
+ if (i == n)
+ goto l2;
+ i++;
+ ...
+ goto l1;
+l2:
\end{verbatim}
-}
+CaĹy czas coĹ nie gra?
+}
\frame[containsverbatim]{
-\frametitle{Silnia}
+\frametitle{Pierwszy ``design pattern'' w akcji}
+Teraz lepiej.
\begin{verbatim}
-class Factorial {
- public static factorial (x : int) : int {
- def loop (acc : int, x : int) : int {
- if (x <= 1) acc
- else loop (acc * x, x - 1)
- }
-
- loop (1, x)
- }
-
- public static Main () : void
- {
- System.Console.WriteLine (factorial (10));
- }
-}
+for (int i = 0; i < n; i++)
+ // ...
\end{verbatim}
+
+Wczujmy siÄ w panĂłw Kernighan i Ritchie'iego. Co zrobiliĹmy?
+WĹaĹnie wbudowaliĹmy w nasz jÄzyk pewnÄ
konstrukcjÄ, ktĂłra
+zawiera w sobie doĹÄ czÄsto stosowany schemat uĹźywany przez programistĂłw -
+pÄtlÄ z inicjalizacjÄ
.
}
-\frame[containsverbatim]{
-\frametitle{Silnia 2.0}
-\begin{verbatim}
-class Factorial {
- public static factorial (x : int) : int {
- def loop (acc, x) {
- if (x <= 1) acc
- else loop (acc * x, x - 1)
- }
+\frame{
+\frametitle{Design pattern - co to?}
+\emph{Design pattern} to ogĂłlne rozwiÄ
zanie do pewnego
+ czÄsto spotykanego problemu w projektach programistycznych.
- loop (1, x)
- }
+\begin{itemize}
+ \item wykonanie czegoĹ wiele razy (pÄtla)
+ \item modelowanie danych i relacji miÄdzy nimi (struktury, klasy)
+ \item schematy rozwiÄ
zaĹ w projektowaniu obiektowym (to je powszechnie nazywa
+ siÄ \emph{design pattern})
+ \item konwencje nazywania zmiennych, metod, klas i ich wystÄpowanie w
+ okreĹlonych sytuacjach (getX(), setX() w Javie, wĹaĹciwoĹci w C\#)
+ \item setki innych, o ktĂłrych ludzie piszÄ
ksiÄ
Ĺźki i zarabiajÄ
pieniÄ
dze
+\end{itemize}
- public static Main () : void
- {
- System.Console.WriteLine (factorial (10));
- }
-}
-\end{verbatim}
+Jednym sĹowem - abstrakcja, uogĂłlnianie i powszechne korzystanie ze sprawdzonych
+pomysĹĂłw \footnote{ok, to juĹź wiÄcej niĹź jedno sĹowo}.
}
+\section {RozwĂłj jÄzykĂłw programowania}
-\frame[containsverbatim]{
-\frametitle{Brak rekonstrukcji}
+\frame[containsverbatim] {
+\frametitle{Iteratory w Javie}
\begin{verbatim}
-// C#
-void SendMessage (byte[] addr, int port, string data)
-{
- IPEndPoint ip = new IPEndPoint (new IPAddress (addr), port);
- TcpClient client = new TcpClient (ip);
- NetworkStream str = client.GetStream ();
- byte[] data = Encoding.UTF8.GetBytes (data);
- str.Write (data, 0, data.Length);
- client.Close ();
-}
+ Iterator iter = coll.iterator ();
+ while (iter.hasNext()) {
+ Order ord = (Order) iter.next ();
+ // ..
+ }
\end{verbatim}
+
+Pisze siÄ je naprawdÄ dziesiÄ
tki, a nawet setki razy.
}
\frame[containsverbatim]{
-\frametitle{Rekonstrukcja}
+\frametitle{foreach}
+Trzeba byĹo 8-miu lat, aby Sun wprowadziĹ do jÄzyka skrĂłconÄ
formÄ skĹadniowÄ
+lub jak kto woli, nowego jÄzyka (C\#), ktĂłry wprowadziĹ jÄ
od samego poczÄ
tku, a
+poza tym niewiele siÄ od Javy róşniĹ.
+
\begin{verbatim}
-// Nemerle
-def SendMessage (addr, port, data)
+for (Widget w: box)
{
- def ip = IPEndPoint (IPAddress (addr), port);
- def client = TcpClient (ip);
- def str = client.GetStream ();
- def data = Encoding.UTF8.GetBytes (data);
- str.Write (data, 0, data.Length);
- client.Close ();
+ System.out.println(w);
}
\end{verbatim}
}
+\frame[containsverbatim] {
+\frametitle{Nemerle - jÄzyk oparty o rozszerzalnoĹÄ}
+ Z ideami zawartymi w Nemerle skracamy ten wieloletni okres oczekiwania na
+innowacjÄ do kilkunastu minut potrzebnych programiĹcie, aby zaimplementowaĹ
+nastÄpujÄ
ce makro:
-\frame[containsverbatim]{
-\frametitle{Brak rekonstrukcji II}
\begin{verbatim}
-Dictionary<string, int> CountEach (string[] args)
+macro Foreach (n, coll, body)
+syntax (``foreach'', ``(``, i, ``in'', coll, ``)'', body)
{
- Dictionary<string, int> d = new Dictionary<string, int>();
- foreach (string s in args) {
- if (d.ContainsKey (s))
- d[s] += 1;
- else
- d[s] = 1;
+ <[ def iter = $coll.iterator ();
+ while (iter.hasNext ()) {
+ def $i = iter.next ();
+ $body
}
- return d;
+ ]>
}
-\end{verbatim}
+\end{verbatim} % $
}
-\frame[containsverbatim]{
-\frametitle{Rekonstrukcja II}
-\begin{verbatim}
-def CountEach (args : array [string])
-{
- def d = Dictionary ();
- foreach (s in args) {
- if (d.ContainsKey (s))
- d[s] += 1;
- else
- d[s] = 1;
- }
- d
-}
-\end{verbatim}
-}
+\section {PrzykĹadowe schematy z programowania obiektowego}
\frame[containsverbatim]{
-\frametitle{Trudna rekonstrukcja}
-\begin{verbatim}
-[Record]
-class Foo {
- my_value : int;
- public Barize () : void
- { System.Console.Write ($ "Foo ($my_value), "
- "times 42 = $(my_value * 42)\n");
- }
-}
-class Qux { public Barize () : void { } }
+\frametitle{Adapter pattern}
+Przystosowanie pewnego interfejsu do jakiegoĹ nieco innego, lecz
+udostÄpniajÄ
cego podobnÄ
funkcjonalnoĹÄ.
+Mapuje pewien zestaw metod na inny zestaw metod.
-// Main starts here
-def call_barize (x) { x.Barize () }
-def our_list = [Foo (1), Foo (2), Foo (3)];
-foreach (e in our_list)
- call_barize (e);
-\end{verbatim}
-}
+$$Stack + ListImpl = StackListImpl$$
+Tu moĹźemy wykorzystaÄ makra generujÄ
ce metody, jak
-\frame[containsverbatim]{
-\frametitle{Jeszcze trudniejsza}
\begin{verbatim}
-[Record]
-class Foo {
- my_value : int;
- public Barize () : void
- { System.Console.Write ($ "Foo ($my_value), "
- "times 42 = $(my_value * 42)\n");
+<[ decl:
+ public Push (x : string) : int
+ {
+ // mapped into
+ list.AddLast (x)
}
-}
-class Qux { public Barize () : void { } }
-
-// Main starts here
-def call_barize (x) { x.Barize () }
-def our_list = [Foo (1), Foo (2), Foo (3)];
-// foreach (e in our_list)
-// call_barize (e);
+]>
\end{verbatim}
}
-
-\section{Makra}
\frame{
-\frametitle{Makra}
-\begin{itemize}
- \item ładowane dynamicznie wtyczki (DLL-e) do kompilatora
- \begin{itemize}
- \item preprocesorowi C mówimy \textbf{Nie!}
- \end{itemize}
- \item przekształcają, generują lub analizują programy
- \item pisane w Nemerle
- \item pracują w środku kompilatora na jego strukturach danych
- \item mogą czytać pliki, patrzeć do bazy danych etc.
-\end{itemize}
-}
+\frametitle{Composite pattern}
+Kontener na obiekty, ktĂłre majÄ
podobny zestaw metod.
+UdostÄpnia te metody i wywoĹuje je dla zawarych w nim obiektach.
-\frame{
-\frametitle{Użycia makr}
-\begin{itemize}
- \item wyspecjalizowane podjęzyki
- \begin{itemize}
- \item SQL
- \item {\tt printf}, {\tt scanf}
- \item wyrażenia regularne
- \item XML
- \end{itemize}
- \item tworzenie programów z programów (serializacja, specjalizacja kodu)
- \item optymalizacje specyficzne dla domeny
- \item automatyzacja wzorców projektowych
- \item system asercji
- \item \textit{Aspect Oriented Programming}
-\end{itemize}
+$$Window + ListView + TreeView = Control$$
}
-\section{Warianty}
+\section {Z Ĺźycia wziÄte}
\frame{
-\frametitle{Warianty}
+\frametitle{Jak wykorzystaĹbym to w firmie?}
\begin{itemize}
-\item rozszerzone typy wyliczeniowe (ang. \textit{enum})
-\item albo, albo, albo
-\item lista
- \begin{itemize}
- \item lista pusta, albo
- \item komórka listy -- głowa (element) i ogon (wskaźnik na resztę listy)
- \end{itemize}
-\item drzewo
- \begin{itemize}
- \item element wewnętrzny (para dzieci i element), albo
- \item liść (element)
- \end{itemize}
-\item dobre też dla menu czy VRML-a
-\end{itemize}
-}
-
-\frame{
-\frametitle{VRML}
-\begin{itemize}
-\item \textit{Virtual Reality Modeling Language}
-\item oparty na OpenGL
-\item węzły
- \begin{itemize}
- \item przekształcenia geometryczne
- \item ustawianie materiałów
- \item bryły
- \item separatory
- \item inne (tekst, linki)
- \end{itemize}
+ \item generacja kodu
+ \item generacja klas
+ \item generacja pĂłl w klasach
+ \item generacja metod
+ \item generacja kodu
\end{itemize}
}
\frame[containsverbatim]{
-\frametitle{Tak napisałbym w C\#...}
+\frametitle{PrzykĹad 1. - propagacja danych}
\begin{verbatim}
-abstract class Node { }
-class Separator : Node {
- public Node[] children;
-}
-class Translation : Node {
- public double x;
- public double y;
- public double z;
-}
-class Material : Node {
- public double x;
- public double y;
- public double z;
-}
-class Cube : Node { }
+if (ord1.getReceiver() != null)
+ ord2.setReceiver (ord1.getReceiver());
+if (ord1.getProducer() != null)
+ ord2.setProducer (ord1.getProducer());
+if (ord1.getSpeditor() != null)
+ ord2.setSpeditor (ord1.getReceiver());
+if (ord1.getAddress() != null)
+ ord2.setAddress (ord1.getAddress());
+if (ord1.getIncoterms() != null)
+ ord2.setIncoterms (ord1.getIncoterms());
\end{verbatim}
}
\frame[containsverbatim]{
-\frametitle{...a tak w Nemerle (porównamy potem)}
+\frametitle{A makro potrafi generowaÄ...}
+MoĹźemy przecieĹź pisaÄ
+
\begin{verbatim}
-variant Node {
- | Separator {
- children : list [Node];
- }
- | Translation {
- x : double;
- y : double;
- z : double;
- }
- | Material {
- r : double;
- g : double;
- b : double;
- }
- | Cube
-}
+propagateNotNull (ord1, ord2,
+ Receiver, Producer, Speditor,
+ Address, Incoterms);
\end{verbatim}
-}
+przy uĹźyciu makra podobnego do
-\frame[containsverbatim]{
-\frametitle{Wyświetlenie sceny}
\begin{verbatim}
-DisplayNode (n : Node) : void
-{
- match (n) {
- | Node.Separator (nodes) =>
- glPushMatrix ();
- glPushAttrib (GL_CURRENT_BIT);
- foreach (n in nodes)
- DisplayNode (n);
- glPopAttrib ();
- glPopMatrix ();
-
- | Node.Translation (x, y, z) => glTranslated (x, y, z);
- | Node.Material (r, g, b) => glColor3d (r, g, b);
- | Node.Cube => DrawCube ();
- }
+macro propagateNotNull (o1, o2, names : list [PExpr]) {
+ names.Map (fun (name) {
+ <[ if ($o1.$name() != null) $o2.$name ($o1.$name ()) ]>
+ })
}
\end{verbatim}
}
-
\frame[containsverbatim]{
-\frametitle{Optymalizacja sceny}
+\frametitle{PrzykĹad 2. - propercje aplikacji}
\begin{verbatim}
-Optimize (n : Node) : Node
-{
- match (n) {
- | Node.Separator ([(Node.Cube) as c]) => c
- | Node.Separator (children) =>
- Node.Separator (List.Map (children, Optimize))
- | x => x
- }
+class PropertyNames {
+public static String PAGE_ORDER_RECEIVER_VISIBLE =
+ ``page.order.receiver.visible'';
+ ...
}
-\end{verbatim}
+class PropertyDefaults {
+public static boolean PAGE_ORDER_RECEIVER_VISIBLE_DEFAULT =
+ false;
+ ...
}
+\end{verbatim}
-\frame{
-\frametitle{Warianty a dziedziczenie}
-\begin{itemize}
-\item wzajemnie uzupełniają się
-\item w dziedziczeniu zamiast dopasowania wzorca metody abstrakcyjne
-\item zalety wariantów
-\begin{itemize}
-\item są zamknięte -- ostrzeżenia o ominiętych przypadkach
-\item obsługa przez dopasowanie wzorca -- kod dla danej funkcjonalności w jednym miejscu
-\item metody binarne
-\end{itemize}
-\end{itemize}
-}
+a obok tego w bazie danych struktura drzewiasta
+\begin{verbatim}
+ ID PARENTID KEY TYPE VALUE
+ 22 1 'order' 6 null
+\end{verbatim}
+}
-\section{Podsumowanie}
+\frame[containsverbatim]{
+\frametitle{A jakbym chciaĹ?}
-\frame{
-\frametitle{Kompilator}
+\begin{verbatim}
+[assembly: Properties (ReadFrom = DataBase,
+ Source = 'woadm.companyptype')]
+\end{verbatim}
-\begin{itemize}
- \item kompiluje sam siebie
- \item produkuje i pożera genericsy
- \item wydana wersja 0.9.1, dla mono 1.1.9+ i MS .NET 2.0
-\end{itemize}
+\emph{Properties} jest makrem, ktĂłre podczas kompilacji programu wczytuje drzewo
+propercji z bazy danych (pliku XML, czegokolwiek) i wygenerujeÄ klasy
+\emph{PropertyNames} i \emph{PropertyDefaults} wypeĹniajÄ
c je polami jak wyĹźej,
+lub moĹźe zagnieĹźdĹźonymi klasami, Ĺźeby dopeĹnianie lepiej dziaĹaĹo:
+\emph{Page.Order.Receiver.Visible}.
}
+\frame[containsverbatim]{
+\frametitle{PrzykĹad 3. Klasy odpowiadajÄ
ce tabelom z bazy}
+\begin{verbatim}
+ class OrderPosition {
+ Long id;
+ Integer state;
+ // ...
-\frame{
-\frametitle{Projekty używające Nemerle}
+ public Long getId () { return id; }
-\begin{itemize}
- \item Sioux -- serwer HTTP/aplikacji
- \item cs2n -- konwerter C\# do Nemerle
- \item nemish -- Nemerle Interactive Shell
- \item Asper IDE/edytor
- \item RiDL narzędzia do generowania parserów i lekserów
- \item wtyczki do NAnt'a i MS.Builda
- \item generator CodeDom (wsparcie dla ASP.NET)
- \item Code Completion Engine
- \item integracja z IDE (VS.NET, \#D, MD)
-\end{itemize}
-}
+ public OrderPositionData GetData () {
+ OrderPositionData pd = new OrderPositionData ();
+ pd.id = id;
+ // ...
+ return pd;
+ }
+ }
+\end{verbatim}
+i dodatkowo definicja \emph{OrderPositionData}...
+}
\frame{
-\frametitle{Społeczność}
-
+\frametitle{Po co klepaÄ gĹupi kod?}
\begin{itemize}
- \item .NET runtime issues
- \item Subversion
- \item licencja BSD
- \item lista mailingowa (70 subscribers)
- \item forum www
- \item issue tracker -- 500 raportów ogólnie, 50 otwartych
- \item strona na silniku wikipedii -- zewnętrzni pisarze dokumentacji
- \item kurs online (niedawno się skończył)
- \item kurs w II
-\end{itemize}
-}
+\item OczywiĹcie caĹy ten kod, ktĂłrego wklepanie, przetestowanie
+i utrzymanie kosztuje firmÄ cenne mendejsy, powinien zniknÄ
Ä
+i zostaÄ wygenerowany automatycznie.
-\frame{
-\frametitle{TODO}
+\item To samo tyczy siÄ bardzo duĹźej czÄĹci kodu nad ktĂłrym pracujÄ
+firmy zajmujÄ
ce siÄ szarym biznesem.
-\begin{itemize}
- \item zbliża się stabilna wersja 1.0
- \item więcej integracji z IDE
- \item więcej budowania społeczności
- \item więcej analizy statycznej
+\item PrzyszĹoĹÄ leĹźy w automatyzacji programowania, generacji kodu...
+na szczÄĹcie ciÄ
gle ktoĹ musi pisaÄ kod generujÄ
cy kod.
\end{itemize}
}
-
\end{document}
% vim: language=polish
Modified: nemerle/trunk/doc/presentation/ksi-kamil-2005/main.tex
==============================================================================
--- nemerle/trunk/doc/presentation/ksi-michal-2005/main.tex (original)
+++ nemerle/trunk/doc/presentation/ksi-kamil-2005/main.tex Thu Nov 17 00:40:47 2005
@@ -3,6 +3,6 @@
%\usepackage{beamerthemesidebar}
\usepackage{graphicx}
\usepackage{polski}
-\usepackage[latin2]{inputenc}
+\usepackage[utf8]{inputenc}
\input{content.tex}
More information about the svn
mailing list