Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

まとめと展望

666 views

Published on

PPLサマースクール2016「商用Java処理系の研究開発」のパート4です.
http://ppl.jssst.or.jp/index.php?ss2016

Published in: Software
  • Profit Maximiser is a brand new approach is on a far bigger scale to bonus bagging. Making you more money, from more markets, more often. What i lover about Mike is that he takes the time to actually show you with real examples and over the shoulder tuition. ●●● http://t.cn/A6hP86vM
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • ...My Scandalous Secret to Crushing The Odds So Effortlessly... ➤➤ http://t.cn/A6hPRSfx
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • She hasn't even mentioned my snoring!! When I read the story on your website I understood EXACTLY what you were talking about. I have been single for years because my snoring is so loud. As soon as I get to the stage where a girl stays over, I never hear from them again. Your program has taken my snoring down to a low hum. I now have a girlfriend and she hasn't even mentioned my snoring!! ★★★ https://bit.ly/37PhtTN
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Tackle Odds With Lottery Secrets ■■■ https://tinyurl.com/t2onem4
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

まとめと展望

  1. 1. 2016年年9⽉月6⽇日     ⼩小野寺  ⺠民也  http://ibm.biz/onodera     ⽇日本アイ・ビー・エム(株)  東京基礎研究所 PPLサマースクール2016「商⽤用Java処理理系の研究開発」 まとめと展望 1 まとめと展望/⼩小野寺⺠民也 JavaTMおよびすべてのJava関連の 商標およびロゴはOracleやその関連 会社の米国およびその他の国にお ける商標または登録商標です.
  2. 2. © 2016 IBM Corporation 概要:⽇日本アイ・ビー・エム(株)東京基礎研究所はJava⾔言語の黎黎明期からその処理理系に関する研究開発を リードし,IBM開発部⾨門と協業して業務アプリケーションの基盤として使われるJava処理理系を世に送り出し てきた.特に,Just-In-TimeコンパイラとJava仮想マシンの主要構成要素については各種の先進的技術を考 案し,世界トップクラスの性能を達成するとともに,多数の学会発表も⾏行行ってきている.本セミナーでは, この商⽤用Java処理理系の研究開発に関する経験をもとに,以下の内容について述べる. 1 Javaの登場と発展(30分,講師:⼩小野寺⺠民也) 1995年年のJavaの登場とその後の受容の過程を概観し,Java登場時にどのような性能上の課題があったかを 述べ,続く2つのセッションへの導⼊入とする.また,性能向上の研究開発における標準ベンチマークの重 要さについても⾔言及する. 2 Java仮想マシンの実装技術(2時間,講師:河内⾕谷清久仁) Java⾔言語処理理系の実装について詳説する.まずJava仮想マシンの概要について述べ,その主要な構成要素 として,クラス管理理とインタープリタ,ヒープ管理理とガベージコレクション,スレッド管理理と同期機構, JITコンパイラとの連携,などについて説明する.性能改善のために⾏行行った各種⼿手法についても触れる. 3 Java Just-In-Timeコンパイラの実装技術(2時間,講師:⽯石崎⼀一明) Javaの動的コンパイラの実装について詳説する.まず構成の概要について述べ,主な最適化,動的コンパ イラ特有の最適化,Java⾔言語特有の最適化,について説明する.また,Java⾔言語からSIMDやGPUなどの ハードウェア機構を使う試みについても述べる.商⽤用コンパイラの実装に関する経験談についても触れる. 4 まとめと展望(1時間,講師:⼩小野寺⺠民也) まとめとして,プログラミング⾔言語の実装技術の歴史を概観し,Javaの誕⽣生と発展に果たした役割につい て考えてみたい(内容は予告なく変更更することがあります). 2 商⽤用Java処理理系の研究開発 まとめと展望/⼩小野寺⺠民也
  3. 3. © 2016 IBM Corporation3 講師紹介 ⼩小野寺  ⺠民也(おのでら  たみや)  http://ibm.biz/onodera ⽇日本アイ・ビー・エム(株)技術理理事,東京基礎研究所  サービス型コンピューティング  部⻑⾧長.1988年年東 京⼤大学⼤大学院理理学系研究科情報科学専⾨門課程博⼠士課程修了了.同年年⽇日本アイ・ビー・エム(株)⼊入社.以来, 同社東京基礎研究所にて,プログラミング⾔言語およびミドルウェアおよびシステムソフトウェアの研究開 発に従事.  情報処理理学会第41回(平成2年年後期)全国⼤大会学術奨励賞,同平成7年年度度⼭山下記念念研究賞,同平 成16年年度度論論⽂文賞,同平成16年年度度業績賞,各受賞.理理学博⼠士.⽇日本ソフトウェア科学会会員(元・理理事), 情報処理理学会シニア会員,ACM Distinguished Scientist. 河内⾕谷  清久仁(かわちや  きよくに)  http://ibm.biz/kawatiya ⽇日本アイ・ビー・エム(株)シニア・テクニカル・スタッフ・メンバー,東京基礎研究所  ディープ・コン ピューティング&アナリティクス  部⻑⾧長.1987年年東京⼤大学⼤大学院理理学系研究科情報科学専攻修⼠士課程修了了. 同年年⽇日本アイ・ビー・エム(株)⼊入社.以来,同社東京基礎研究所にてOSやプログラミング⾔言語処理理系な どの研究に従事.最近は,Javaの性能問題分析などにも携わる.博⼠士(政策・メディア).1994年年情報処 理理学会⼤大会奨励賞,2005年年同・論論⽂文賞,2008年年⽇日本ソフトウェア科学会⾼高橋奨励賞,各受賞.⽇日本ソフト ウェア科学会編集副委員⻑⾧長(元・理理事),情報処理理学会シニア会員,ACM Distinguished Engineer. ⽯石崎  ⼀一明(いしざき  かずあき)  http://ibm.biz/ishizaki ⽇日本アイ・ビー・エム(株)東京基礎研究所  リサーチ・スタッフ・メンバー.1992年年早稲⽥田⼤大学理理⼯工学研 究科修⼠士課程修了了.同年年⽇日本アイ・ビー・エム(株)⼊入社.以来,同社東京基礎研究所にて,Fortran⾔言語 の並列列化コンパイラ,Java⾔言語の動的コンパイラ,Python⾔言語の動的コンパイラ,などのプログラミング ⾔言語処理理系の研究に従事.最近は,JavaやApache Sparkからの,GPUその他アクセラレータ活⽤用⽅方法に興 味を持つ.情報処理理学会平成16年年度度業績賞受賞.博⼠士(情報科学).⽇日本ソフトウェア科学会理理事,情報 処理理学会会員,ACM Senior Member. まとめと展望/⼩小野寺⺠民也
  4. 4. まとめと展望 ! Benchmarksの話 ! Garbage CollectionとJava ! Dynamic CompilationとJava ! 最後に 4 まとめと展望/⼩小野寺⺠民也
  5. 5. Benchmarksの話
  6. 6. 6 Benchmarks drive systems innovations. –  Progress is measurable –  Enable fair competitions Hard to build and agree on. –  Reflect current (and ideally, future) reality. –  Define an appropriate methodology. founded in 1988 formed in 1988 The Standard Performance Evaluation Corporation
  7. 7. The Standard Performance Evaluation Corporation (SPEC) !  A non-profit corporation formed to establish, maintain and endorse a standardized set of relevant benchmarks that can be applied to the newest generation of high-performance computers. !  Formed by the industry in 1988 !  Develops benchmark suites and also reviews and publishes submitted results from our member organizations and other benchmark licensees. 7 https://www.spec.org/
  8. 8. The SPEC Consortium 8 !  SPEC Members !  SPEC Associates !  SPEC Research Group
  9. 9. SPEC Members (as of July 27, 2016) Acer Inc. * Action S.A. * Advanced Micro Devices * Amazon Web Services, Inc. * Apple Inc. * ARM * Avere Systems * Bull SAS * Cavium Inc. * Ciara Technologies Inc. * Cisco Systems, Inc. * Dell, Inc. * Digital Ocean * E4 Computer Engineering SPA * EMC * Fujitsu * Gartner, Inc. * Google, Inc. * Hangzhou H3C Technologies Co., Ltd. * Hitachi Data Systems * Hitachi Ltd. * Hewlett Packard Enterprise * HP Inc. * Huawei Technologies Co. Ltd. * IBM * Inspur Corporation * Intel * Lenovo * M Computers s.r.o. * Microsoft * NEC - Japan * NetApp * NVIDIA * Oracle * Primary Data * Principled Technologies * Pure Storage * Qualcomm Technologies Inc. * Quanta Computer Inc. * Red Hat * Samsung * SAP AG * Seagate * SGI * Sugon * Super Micro Computer, Inc. * SUSE * Symantec Corporation * Taobao (China) Software Co. Ltd. * Unisys * Via Technologies * VMware * 9
  10. 10. SPEC Associates (as of July 27, 2016) Acadamia Sinica, Institute of Information Science * Argonne National Laboratory * Charles University * China Academy of Telecommunication Research * Dresden University of Technology ZIH * fortiss GmbH * Helmholtz-Zentrum Dresden Rossendorf (HZDR) * Indiana University * JAIST * Karlsruhe Institute of Technology * Leibniz Rechenzentrum - Germany * National University of Singapore * Oak Ridge National Laboratory * Ohio State University * Pennsylvania State University * Purdue University * RWTH Aachen University * Technische Universität Darmstadt * Technische Universität Dresden * Tsinghua University * University of Aizu - Japan * University of California - Berkeley * University of Cologne * University of Delaware * University of Illinois at Urbana-Champaign * University of Maryland * University of Miami * University of Texas at Austin * University of Tsukuba * University of Wuerzburg * Virginia Polytechnic Institute and State University * 10
  11. 11. SPEC – Java Client/Server Measure performance of Java 2 Enterprise Edition SPECjAppServer2001 SPECjAppServer2002 SPECjAppServer2004 (all retired) Measure performance based on the latest Java application features. SPECjbb2015 SPECjbb2013 SPECjbb2005 SPECjbb2000 Measure full-system performance for Java Enterprise Edition 5 or later SPECjEnterprise2010 Evaluate the performance enterprise-oriented middleware SPECjms2007 Measure the performance of Java Runtime Environment SPECjvm2008 SPEC JVM98 11
  12. 12. SPECjvm98 (retired in May 2008) 12 Programs Description _202_jess Expert shell system solving a set of puzzles _201_compress LZW compression and decompression _209_db Perform database functions on memory resident database _222_mpegaudio Decompress MP3 audio files _228_jack Parser generator generating itself _213_javac Java source-to-bytecode compiler from the JDK 1.0.2 _227_mtrt Two-threaded ray tracer
  13. 13. SPECjvm2008 13 Programs Description Compiler uses the OpenJDK (JDK 7 alpha) front end compiler to compile a set of .java files. Compress compresses data, using a modified Lempel-Ziv method (LZW). Crypto focuses on different areas of crypto and are split in three different sub-benchmarks, AES, RSA, Signverify Derby uses an open-source database written in pure Java. MPEGaudio very similar to the SPECjvm98 mpegaudio. Scimark developed by NIST and widely used by the industry as a floating point benchmark, incorporates fft, lu, monte_carlo, sor, and sparse. Serial serializes and deserializes primitives and objects, using data from the JBoss benchmark. Startup starts each benchmark for one operation. Sunflow tests graphics visualization using an open source, internally multi-threaded global illumination rendering system. XML has two sub-benchmarks: XML.transform and XML.validation
  14. 14. SPECjbb2000 (retired in January 2006) !  Java Business Benchmark !  SPEC's first benchmark for evaluating the performance of server-side Java. –  SPECjvm98 for client-side Java !  Highlights –  Emulates a 3-tier system, the most common type of server-side Java application today. –  Business logic and object manipulation, the work of the middle tier, predominate. –  Clients are replaced by driver threads, database storage by binary trees of objects. –  Increasing amounts of workload are applied, providing a graphical view of scalability. 14
  15. 15. SPECjbb2000 – Architecture Schematic 15
  16. 16. SPECjbb2005 (retired in October 2013) !  Evaluates the performance of server side Java by emulating a three-tier client/server system (with emphasis on the middle tier). !  Introduces new features such as XML processing and BigDecimal computations. !  Features more complex transactions and multiple JVM instances. !  Exercises the implementations of the JVM (Java Virtual Machine), JIT (Just-In-Time) compiler, garbage collection, threads and some aspects of the operating system. !  Also measures the performance of CPUs, caches, memory hierarchy and the scalability of shared memory processors (SMPs). 16
  17. 17. Java仮想マシンとコンピューターアーキテクチャ ! 25年の歴史で2つの大きな変革に対応した – 32ビットから64ビット化 – マルチコア ! 性能の低下をいかに抑えるが課題だった 17
  18. 18. 18 http://www.dacapobench.org/
  19. 19. Innovation Trap ! Innovation is gated by benchmarks ! Poor benchmarking retards innovation & misdirects energy – Reality: inappropriate, unrealistic benchmarks – Reality: poor methodology ! Example – GC is avoided when doing SPEC performance runs – Lack of architectural tuning to Java 19
  20. 20. The DaCapo Suite: Background & Scope !  Motivation (mid 2003) –  We wanted to do good Java runtime and compiler research –  An NSF review panel agreed that the existing Java benchmarks were limiting our progress !  Non-goal: Product comparison framework (see SPEC) !  Scope –  Client-side, real-world, measurable Java apps. –  Real-world data and coding idioms, manageable dependencies !  Two-pronged effort – New candidate benchmarks – New suite of analyses to characterize candidates 20
  21. 21. DaCapo 2006 !  We provide 3 inputs (small, default, large). We highly recommend using small for testing, and either reporting default or large in any performance analysis. 21 Programs Description antlr parses one or more grammar files and generates a parser and lexical analyzer for each bloat performs a number of optimizations and analysis on Java bytecode files chart uses JFreeChart to plot a number of complex line graphs and renders them as PDF eclipse executes some of the (non-gui) jdt performance tests for the Eclipse IDE fop takes an XSL-FO file, parses it and formats it, generating a PDF file hsqldb executes a JDBCbench-like in-memory benchmark, executing a number of transactions against a model of a banking application jython Interprets the pybench Python benchmark luindex uses lucene to indexes a set of documents; the works of Shakespeare and the King James Bible lusearch uses lucene to do a text search of keywords over a corpus of data comprising the works of Shakespeare and the King James Bible pmd analyzes a set of Java classes for a range of source code problems xalan transforms XML documents into HTML
  22. 22. DaCapo-9.12-bach (2009) !  We have a default size of all benchmarks, and where applicable a small and large size. We highly recommend using small or default for testing, and reporting default any performance analysis. 22 Programs Description avrora simulates a number of programs run on a grid of AVR microcontrollers batik produces a number of Scalable Vector Graphics images based on the unit tests in Apache Batik eclipse executes some of the (non-gui) jdt performance tests for the Eclipse IDE fop takes an XSL-FO file, parses it and formats it, generating a PDF file. h2 executes a JDBCbench-like in-memory benchmark, executing a number of transactions against a model of a banking application, replacing the hsqldb benchmark. jython interprets the pybench Python benchmark luindex Uses lucene to indexes a set of documents; the works of Shakespeare and the King James Bible lusearch Uses lucene to do a text search of keywords over a corpus of data comprising the works of Shakespeare and the King James Bible pmd analyzes a set of Java classes for a range of source code problems sunflow renders a set of images using ray tracing tomcat runs a set of queries against a Tomcat server retrieving and verifying the resulting webpages tradebeans runs the daytrader benchmark via a Jave Beans to a GERONIMO backend with an in memory h2 as the underlying database tradesoap runs the daytrader benchmark via a SOAP to a GERONIMO backend with in memory h2 as the underlying database xalan transforms XML documents into HTML
  23. 23. Garbage CollectionとJava
  24. 24. 24 Garbage Collectors - Basic Algorithms Reference Counting non-moving Tracing Mark-Sweep non-moving Mark-Sweep-Compact moving Copying moving
  25. 25. 25 Garbage Collectors - Basic Algorithms Reference Counting [Collins, 1960] Tracing Mark-Sweep [McCarthy, 1960] Mark-Sweep-Compact [Saunders, 1960] Copying [Fenichel & Yochelson,1969]
  26. 26. 26 Garbage Collector’s View of World Globals ・  ・  ・ ・  ・  ・ Stacks Registers Garbage-Collected Heap
  27. 27. Where are Pointers? - Tagging !  How do you determine which locations hold pointers? – in registers, stacks, globals, and heap objects. !  Tagging! – Extra overhead to check, mask, and insert tags. – Not affordable in mainstream languages 27 0 pointer 1 signed integer
  28. 28. 28 Where are Pointers? - Tagless Collection !  Maps built by compilers – easy to generate for globals and heap objects. – much more involved for stacks and registers. !  Not a recent idea – [Branquart & Lewi, 1971] and [Wodon, 1971] for Algol-68 – [Britton, 1975] for Pascal
  29. 29. 29 Where are Pointers? - Conservative Collection !  Treat it as a pointer if the value looks like a pointer. !  Surprisingly, a relatively recent idea – [Bartlett, 1988] for Scheme – [Boehm-Weiser, 1988] for C !  Garbage collection is now a viable option even for imperative languages. . Bartlett, J.F., “Compacting Garbage Collection with Ambiguous Roots”, DEC WRL Research Report 88/2 (February 1988). Boehm, H.J., and Wiser, M., “Garbage Collection in an Uncooperative Environment”, Software Practice and Experience, Vol.18(9) (September 1988)
  30. 30. 30
  31. 31. 31 Conservative Collection: Full or Partial !  Full for C/C++, while partial for Java. Globals ・  ・  ・ ・  ・  ・ Stacks Registers Garbage-Collected Heap
  32. 32. 32 Partial Can Be Moving. !  Partially conservative collection can be moving. !  Java was initially built with a partially conservative mark-sweep-compact. Reference Counting non-moving Tracing Mark-Sweep non-moving Mark-Sweep-Compact moving Copying moving
  33. 33. 33 Conservative Collection: Pros and Cons !  Pro: Simple to implement !  Con: Memory leak and fragmentation – In Java, it (non-deterministically) causes Out-Of-Memory – Intolerable for Enterprise
  34. 34. 34 JVM Providers Moved to “Tagless Collection” !  Type-accurate collection in Java term !  Sun: Java HotSpot VM in April 1999. !  IBM: J9/Testarossa in June 2004. Ole Agesen, David Detlefs and J. Eliot Moss, “Garbage collection and local variable type-precision and liveness in Java virtual machines” (PLDI 98)
  35. 35. 35 Conservative Collectionその後(1/2) !  Bartlett, J.F., “Mostly-Copying Garbage Collection Picks Up Generations and C++.”, DEC WRL Technical Note TN-12 (October 1989). !  Wentworth, E.P., “Pitfalls of Conservative Garbage Collection”, Software Practice and Experience, 20,7 (July 1990), 719-727. !  Demers, A., Weiser, M., Hayes, B., Boehm, H., Bobrow, D. and Shenker, S., “Combining Generational and Conservative Garbage Collection: Framework and Implementations.”, Proceedings of the Seventeenth Annual ACM Symposium on Principles of Programming Languages (1990), 273-282. !  Boehm, H.J., “Space Efficient Conservative Garbage Collection”, Proceedings of the ACM SIGPLAN'93 Conference on Programming Language Design and Implementation (1993), 197-206. !  Zorn, B. “The Measured Cost of Conservative Garbage Collection”, Software Practice and Experience, 23,7 (July 1993), 733-756. !  Onodera, T., “A Generational and Conservative Copying Collector for Hybrid Object- oriented Languages”, Software Practice and Experience, 23,10 (October 1993), 1077-1093.
  36. 36. 36 Conservative Collectionその後(2/2) !  Boehm, H.J., “Simple Garbage-Collector-Safety”, Proceedings of the ACM SIGPLAN '96 Conference on Programming Language Design and Implementation (1996), 89-98. !  Boehm, H.J., “Bounding space usage of conservative garbage collectors”, Proceedings of the 29th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (2002), 93-100 !  Endo, T. and Taura, K., “Reducing pause time of conservative collectors”, Proceedings of the 3rd International Symposium on Memory Management (2002), 119 – 131 !  Boehm, H.J. and Spertus, M., “Garbage collection in the next C++ standard”, Proceedings of the 2009 International Symposium on Memory Management (2009), 30-38.
  37. 37. Dynamic CompilationとJava
  38. 38. 38 Dynamic Compilation研究の主戦場 Java May 23 1995 C 1971 Smalltalk 1971 C++ July, 1983 Self 1987
  39. 39. 39 Smalltalk (1971- ) !  Pure object-oriented, class-based language !  Originally, interpreter-based !  Dynamic compiler with Deutsch–Schiffman Smalltalk [1984] – Template based translator – Peephole optimization – Code cache – Inline cache L. Peter Deutsch and Allan M. Schiffman, “Efficient implementation of the smalltalk-80 system” (POPL’84)
  40. 40. 40 Self (1987- ) !  Pure object-oriented, prototype-based language !  Dynamic, optimizing compiler to generate better code. –  Traditional optimizations and OO optimizations. !  Invented fundamental technologies for efficiently implementing OO languages. – Customization – Message splitting – Polymorphic inline cache – Runtime type feedback – Dynamic deoptimization – Adaptive optimization
  41. 41. 41 Major Papers on Self Implementations !  Craig Chambers and David Ungar, “Customization: Optimizing Compiler Technology for Self, a Dynamically-Typed Object-Oriented Programming Language” (PLDI ‘89) !  Craig Chambers, David Ungar, and Elgin Lee, “An Efficient Implementation of Self, a Dynamically-Typed Object-Oriented Language Based on Prototypes” (OOPSLA ‘89) !  Craig Chambers and David Ungar, “Iterative Type Analysis and Extended Message Splitting: Optimizing Dynamically-Typed Object-Oriented Programs” (PLDI ‘90) !  Craig Chambers and David Ungar , “Making Pure Object-Oriented Languages Practical (OOPSLA ‘91) !  Urs Holzle, Craig Chambers, and David Ungar, “Optimizing Dynamically-Typed Object-Oriented Programming Languages with Polymorphic Inline Caches” (ECOOP ‘91) !  Urs Holzle, Craig Chambers, and David Ungar, “Debugging Optimized Code with Dynamic Deoptimization” (PLDI ‘92) !  Urs Holzle and David Ungar, “Optimizing Dynamically-Dispatched Calls with Run-Time Type Feedback” (PLDI ‘94) !  Urs Holzle and David Ungar, “A Third-Generation Self Implementation: Reconciling Responsiveness with Performance” (OOPSLA '94) !  Urs Holzle and David Ungar, “Do object-oriented languages need special hardware support?” (ECOOP '95)
  42. 42. Smalltalk on the Rise, Communications of ACM, October 1995 42 1995
  43. 43. Animorphic Systems !  Build a high performance Smalltalk environment by combining a type system and a compilation technology. – Started on the system in 1994, which was working nicely by 1996. !  Initial members (in the alphabetical order) –  Lars Bak was the VM wizard. –  Gilad Bracha wrote the typechecker, the reflective interface support, and mixins at the Smalltalk level. –  Steffen Grarup, who worked not only on the VM, especially the garbage collector; but on the Smalltalk side, where he wrote the programming environment, as well as the source code manager and other things. –  Robert Griesemer wrote the interpreter, the interpreter generator, most of the compiler, and other VM stuff. –  David Griswold wrote the typed "Blue Book" libraries, and the glyph-based user- interface framework, the widgets and the HTML browser, and also managed the group. –  Urs Hölzle of course worked on the compiler and the tricky inlining infrastructure that it used, and other VM stuff. !  Acquired by Sun in 1997. 43
  44. 44. 44 Self’s Influence on Java Perhaps because we were forced to think ambitiously in order to make Self practical, we found techniques, such as transparent, adaptive optimization, that have been harnessed for Java and many other subsequent projects. Descendants of Self's implementation techniques have aided Java's acceptance by slashing the performance penalty faced by Java's adopters. (David Ungar, 2001)
  45. 45. 最後に
  46. 46. 46 If I could change Java specification…. !  No java.lang.Object.hashCode() !  Not every object synchronizable !  No finalization? !  Better java.lang.String? !  No dynamic class loading? !  Not architecture neutral? !  Not always with classes but also standalone code.
  47. 47. 47 Thank You Merci Grazie Gracias Obrigado Danke Japanese French Russian GermanItalian Spanish Portuguese Arabic Traditional Chinese Simplified Chinese Hindi Romanian Korean Multumesc Turkish Teşekkür ederim English

×