/doc/presentation/fit-2004/main.tex

http://github.com/xxVisorxx/nemerle · LaTeX · 236 lines · 185 code · 49 blank · 2 comment · 0 complexity · b9f1ff33aee502d64975cb569e0e7112 MD5 · raw file

  1. \documentclass[14pt]{beamer}
  2. \usepackage{beamerthemeshadow}
  3. %\usepackage{beamerthemesidebar}
  4. \usepackage{graphicx}
  5. \usepackage{polski}
  6. \usepackage[latin2]{inputenc}
  7. \newcommand{\net}[0]{{\tt .NET}}
  8. \newcommand{\kw}[1]{{\textcolor{kwcolor}{\tt #1}}}
  9. \definecolor{kwcolor}{rgb}{0.2,0.4,0.0}
  10. \definecolor{lgray}{rgb}{0.8,0.8,0.8}
  11. \title{Metaprogramowanie w Nemerle}
  12. \author{Kamil Skalski}
  13. \institute{Instytut Informatyki Uniwersytetu Wroc³awskiego}
  14. \date{17 kwietnia 2004 roku}
  15. \begin{document}
  16. \section{Wprowadzenie}
  17. \frame{\titlepage}
  18. \frame{
  19. \frametitle{Metaprogramowanie}
  20. \begin{itemize}
  21. \item operacje na drzewach sk³adniowych wyra¿eñ i typów
  22. \item homogeniczny meta-jêzyk
  23. \item wykonywanie dowolnych obliczeñ w fazie kompilacji (czytanie plików, zagl±danie
  24. do bazy danych, itp.)
  25. \item integracja z procesem kompilacji (³adowane dynamicznie modu³y kompilatora)
  26. \end{itemize}
  27. }
  28. \frame{
  29. \frametitle{Co zyskujemy?}
  30. \begin{itemize}
  31. \item elegancki sposób na rozszerzanie sk³adni jêzyka
  32. \item analiza kodu i danych dostêpnych w czasie kompilacji
  33. \item inlining, partial evaluation i optymalizacje
  34. \item specjalizowane pod-jêzyki ({\tt printf}, wyra¿enia regularne, SQL)
  35. \item implementacja interpreterów
  36. \end{itemize}
  37. }
  38. \frame[containsverbatim]{
  39. \frametitle{Przyk{\l}adowe u¿ycie makr}
  40. \begin{verbatim}
  41. def s = 10;
  42. sql_loop ("SELECT name FROM Produkt"
  43. " WHERE Produkt.size = $s")
  44. printf ("%s ma rozmiar: %d\n", name, s);
  45. ...
  46. tab [Random()] <-> tab[Random()];
  47. ...
  48. def r = rotate ((1.1, 0.3), Math.Pi / 2.0)
  49. \end{verbatim}
  50. }
  51. \frame{
  52. \frametitle{Dlaczego komplikowaæ semantykê programu?}
  53. \begin{itemize}
  54. \item ka¿dy ma mo¿liwoæ rozbudowywania jêzyka
  55. \item u¿ycie makr jest identyczne do wywo³ania funkcji
  56. \item skracaj± kod niedaj±cy siê ³atwo rozdzieliæ na funkcje
  57. \item ewentualne b³êdy w meta-programie wykrywane s± w czasie kompilacji
  58. \end{itemize}
  59. }
  60. \section{Operowanie na kodzie programu}
  61. \frame[containsverbatim]{
  62. \frametitle{Drzewa sk{\l}adniowe jako dane}
  63. \begin{verbatim}
  64. macro foreach (i : name, coll, body) {
  65. <[
  66. def enumerator = $coll.GetEnumerator ();
  67. def loop () {
  68. when (enumerator.MoveNext ()) {
  69. def $(i : name) = enumerator.Current;
  70. $body;
  71. loop ();
  72. }
  73. }; loop ()
  74. ]> }
  75. \end{verbatim}
  76. }
  77. \section{Symbole w przekszta{\l}canym kodzie}
  78. \frame[containsverbatim]{
  79. \frametitle{Higiena makr}
  80. Symbole wprowadzane przez makro nie koliduj± z nazwami zdefiniowanymi w kontekcie
  81. jego u¿ycia, ani w kodzie przekazanym mu przez parametry.
  82. \begin{itemize}
  83. \item ka¿de wykonanie makra ma swój unikalny ,,kolor'', którym oznaczane s± u¿yte
  84. w nim identyfikatory
  85. \item mo¿liwe jest ³amanie higieny np. poprzez wykorzystanie koloru z miejsca u¿ycia makra
  86. (wprowadzane symbole pochodz± wtedy z kontekstu wywo³ania makra)
  87. \end{itemize}
  88. }
  89. \frame[containsverbatim]{
  90. \frametitle{Koliduj±ce symbole}
  91. \begin{verbatim}
  92. macro identity (e) {
  93. <[ def f (x) { x }; f ($e) ]>
  94. }
  95. \end{verbatim}
  96. U¿ycie \emph{identity} w kontekcie
  97. \begin{verbatim}
  98. def f (y) { y + 1 }; identity (f (2))
  99. \end{verbatim}
  100. zostaje przekszta³cone na
  101. \begin{verbatim}
  102. def f_23 (x_23) { x_23 }; f_23 (f (2))
  103. \end{verbatim}
  104. }
  105. \frame[containsverbatim]{
  106. \frametitle{Kontrolowane ³amanie higieny}
  107. \begin{verbatim}
  108. print ("Ala ma $k kotów.")
  109. \end{verbatim}
  110. Podczas przekszta³cenia na
  111. \begin{verbatim}
  112. Write ("ala ma " + k.ToString () + " kotów")
  113. \end{verbatim}
  114. tworzone jest odwo³anie do zmiennej \emph{k} pochodz±cej z miejsca u¿ycia
  115. \emph{print}. Dziêki u¿yciu funkcji \emph{UseSiteSymbol("k")} wygenerowany
  116. symbol w kodzie wynikowym ma ten sam kolor co wywo³anie makra \emph{print}.
  117. }
  118. \frame[containsverbatim]{
  119. \frametitle{Wi±zanie definicji globalnych}
  120. \begin{verbatim}
  121. using System.Text.RegularExpressions;
  122. ...
  123. <[ def r = Regex ("a+.*") ]>
  124. \end{verbatim}
  125. Otwarte przestrzenie nazw s± zapamiêtane w symbolach, dziêki czemu wygenerowany kod
  126. ma postaæ
  127. \begin{verbatim}
  128. def r = System.Text.RegularExpressions.
  129. Regex ("a+.*")
  130. \end{verbatim}
  131. \emph{UseSiteSymbol} zmienia tak¿e kontekst symboli globalnych.
  132. }
  133. \section{Odwo{\l}ywanie siê do procedur kompilatora}
  134. \frame[containsverbatim]{
  135. \frametitle{Typowanie drzew sk{\l}adniowych}
  136. \begin{verbatim}
  137. macro if (cond, e1, e2) {
  138. def tcond = TypedExpr (cond);
  139. def te1 = TypedExpr (e1);
  140. def te2 = TypedExpr (e2);
  141. if (tcond.Type == <[ ttype: bool ]> ) <[
  142. match ($(tcond : typed)) {
  143. | true => $(te1 : typed)
  144. | false => $(te2 : typed)
  145. } ]>
  146. else
  147. throw Error ("condition isn't boolean") }
  148. \end{verbatim}
  149. }
  150. \section{Zastosowania w tworzeniu oprogramowania}
  151. \frame[containsverbatim]{
  152. \frametitle{Makra na definicjach typów}
  153. \begin{verbatim}
  154. [SerializeBinary]
  155. class Klient {
  156. ...
  157. Dodaj ([NotNull] t : Tranzakcja) : void
  158. }
  159. [MembersFrom ("Producent.xml")]
  160. class Producent { ... }
  161. \end{verbatim}
  162. Atrybuty modyfikuj±ce dowolnie kod klas w czasie kompilacji.
  163. }
  164. \section{Podsumowanie}
  165. \frame{
  166. \frametitle{Status}
  167. \begin{itemize}
  168. \item makra wykonywane podczas kompilacji
  169. \item uruchamianie procedur typowania
  170. \item system higieny
  171. \item wi±zanie symboli globalnych
  172. \item rozszerzenia sk³adniowe
  173. \item \textcolor{blue}{\tt http://nemerle.org/}
  174. \end{itemize}
  175. }
  176. \frame{
  177. \frametitle{Do zrobienia}
  178. \begin{itemize}
  179. \item makra na deklaracjach typów
  180. \item API do procedur typuj±cych
  181. \item generacja kodu w czasie wykonania programów
  182. \item kontrola typów w kodzie tworzonym przez cytowanie
  183. \item Aspects-Oriented Programming
  184. \end{itemize}
  185. }
  186. \end{document}
  187. % vim: language=polish