Fantomを遞ぶ理由

Fantomは、フランク兄匟 Brian Frank、Andy Frank によっお開発された、オブゞェクト指向の静的に型付けされた汎甚蚀語です。 Fantomの䞻芁な機胜の1぀は、実行される特定の環境から抜象化された匷力な暙準ラむブラリです。 珟圚、Fantomで蚘述されたコヌドは、Javaランタむム環境JRE、. NET共通蚀語ランタむムCLRで実行するか、JavaScriptコヌドにコンパむルできたす。



class HelloWorld { static Void main() { echo("Hello, World!") } }
      
      





移怍性



Fantomを䜜成した䞻な理由は、2぀のJava VMおよび.NET CLRプラットフォヌムで実行できる゜フトりェアを曞くこずでした。 珟実には、ほずんどの䌁業がこれらのプラットフォヌムのいずれかで゜フトりェアを開発しおいたす。 PythonやRubyなどの動的蚀語でさえ、これらの仮想マシンのいずれかで実行されたす。 Fantomは、ある仮想マシンから別の仮想マシンぞの移怍性の問題を解決するために䜜成されたした。 Fantomの゜ヌスコヌドはfcodeJavaバむトコヌドたたはILに簡単に倉換できるバむトコヌドにコンパむルされたす。 ブロヌドキャストは実行時に行われたす。これにより、Fantomモゞュヌルを個別のファむルずしお展開し、任意のVMで実行できたす。



移怍性ずは、単なるJavaや.NET以䞊のものを意味したす。 前述のように、Fantomはブラりザヌで動䜜するようにJavaScriptでコンパむルできたす。 同時に、Fantomはそこで停止する぀もりはありたせん。次の目暙は、Objective-C for iPhone、 LLVM 、 Parrotです。



゚レガントなAPI



圌らは奜みに぀いお議論したせんが矎しさは芋る人の目にありたす、Fantomの䜜成者は矎しく䟿利なAPIに倢䞭です。 Fantomの基本原則の1぀。 Javaず.NETには、小さな独立した抜象化されたナニットクラスぞの機胜分割を最倧化するずいう共通の傟向がありたす。 Fantomには逆の哲孊がありたす-圌らは、少数ながら匷力なナニットでできるず信じおいたす。







良い䟋はjava.ioパッケヌゞで、これには60以䞊のクラスずむンタヌフェヌスが含たれおいたす; Fantomでは、必芁なものはすべおFile 、 Buf 、 InStreamおよびOutStreamにありたす。 そしお、これはその䜿甚方法です



 Void textIO() { f := File(`text-io.txt`) // write text file (overwrites existing) f.out.printLine("hello").close // append to existing text file f.out(true).printLine("world").close // read text file as big string echo(f.readAllStr) // read text file into list of lines echo(f.readAllLines) // read text file, line by line f.eachLine |line| { echo(line) } }
      
      





タむピング



党䞖界が静的型ず動的型のサポヌタヌに分かれおいたす。 Fantomの䜜成者は、双方が互いに非垞に批刀的であるず信じおおり、䞡者の䞭間を遞択したす。これは、タむピングシステムに察する䞭皋床のアプロヌチです。



静的型付けの偎面から、Fantomは型のフィヌルドずメ゜ッドシグネチャの説明を必芁ずしたす。 コンポヌネント間の通信圢匏を修正するこずをお勧めしたす。 たずえば、文字列ず数倀で機胜するメ゜ッドを䜜成する堎合、コヌドで盎接修正する必芁がありたす。 メ゜ッドやフィヌルドの眲名の静的な型付けずは異なり、コヌドではしばしば干枉するだけで、䞍必芁なコヌドを曞くこずを䜙儀なくされたす。 Fantomの型掚論はこの問題を回避したす。 たずえば、Javaでの面倒な蟞曞の䜜成



 Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "one"); map.put(2, "two");
      
      





Fantomの1行に盞圓
 map := [1: "one", 2: "two"]
      
      





ただし、動的型付けが本圓に必芁な堎合があるため、Fantomの䞻芁な機胜の1぀は、静的型たたは動的型付けを䜿甚しおメ゜ッドを呌び出す機胜です。 「。」挔算子を䜿甚しおメ゜ッドを呌び出すず、コンパむラによっお呌び出しがチェックされ、効率的なマシンコヌドにコンパむルされたす。



たたは、「->」挔算子を䜿甚しお動的呌び出しを指定できたす。 実際、「->」はObj.trapの呌び出しにリダむレクトされたす。 デフォルトでは、トラップは「。」のように機胜したすが、実行時のみです。 動的蚭蚈を定矩するこずにより、この動䜜を倉曎できたす。



 if (a is Str) { return a->toInt } obj->foo // obj.trap("foo", [,]) obj->foo(2, 3) // obj.trap("foo", [2, 3]) obj->foo = 7 // obj.trap("foo", [7])
      
      





ゞェネリック



興味深いこずに、Fantomはコヌドの型付けを少なくしようずしおいたすが、JavaずCは型付けの匷化に向かっおいたすが、ゞェネリックはこの傟向を瀺しおいたす。 完党にパラメヌタヌ化されたシステムは、システムの耇雑さに盎接関係するため、Fantomは珟圚 、利益ず耇雑さのバランスを暡玢しおいたす。



Fantomでは珟圚、ゞェネリックのサポヌトが制限されおいたす-ナヌザヌは自分のゞェネリックを䜿甚できたせん。 ただし、3぀の組み蟌みクラスはList、Map、およびFuncです。 たずえば、Fantomの敎数のリストは、Int []ずしお宣蚀されたす。 Fantomの䜜成者は、圌らが䞭間にいるず信じおいたす。ゞェネリックはありたすが、システムを耇雑にするこずはありたせん。



䞍玔物



モデルをサブゞェクト領域からコヌドに比范する問題は、゜フトりェア開発で最も頻繁に解決される問題の1぀です。 通垞、オブゞェクト指向プログラミングでは、このフレヌズはモデリングクラスずむンタヌフェむスを意味したす。 JavaずCは同じアプロヌチを䜿甚したす。クラスは単䞀の継承をサポヌトし、むンタヌフェむスは耇数の継承をサポヌトしたすが、実装の継承はサポヌトしたせん。



JavaたたはCを䜿甚したこずがある人なら誰でも、クラスたたはむンタヌフェヌスを䜜成するこずを遞択するこずが非垞に重芁であるこずを知っおいたす。 クラスを遞択する堎合、実装を継承する唯䞀のチャンスを䜿甚しおいるためです。 倧芏暡で耇雑なモデルを䜿甚しおいる堎合、むンタヌフェヌスは远加の負担になりたす。 たずえば、盞続人が異なり、同じむンタヌフェむスを等しく実装する2぀のオブゞェクトがある堎合、機胜を耇補する必芁がありたす。 耇補に加えお、すべおの実装に圱響するむンタヌフェヌスのバヌゞョンを倉曎する問題がありたす。



JavaずCがクラス/むンタヌフェヌスモデルを䜿甚する理由はたくさんありたす。 倚重継承は倚くの扉を開きたすが、これは耇雑さの増倧ずむしろ䞍快なニュアンスのために起こりたす。 Fantomは再びmixinsず呌ばれる䞭倮を占めたす。 䞍玔物は、実装が保存できるむンタヌフェむスです。 倚重継承゚ラヌを回避するために、フィヌルドを保存する状態などの䞀郚の関数は、䞍玔物が制限されおいたす。 䞍玔物の䟋



 mixin Audio { abstract Int volume Void incrementVolume() { volume += 1 } Void decrementVolume() { volume -= 1 } } class Television : Audio { override Int volume := 0 }
      
      





興味があれば、Javaの同等物をここで芋るこずができたす 。



モゞュヌル性



モゞュヌル性は、珟代のプログラミング蚀語が必芁ずする゜フトりェアの重芁な偎面です。

残念なこずに、Javaの過去10幎間、私たちはclasspathで本圓の地獄を経隓しおきたした。 classpathの問題に加えお、javaは間違った決定を䞋し、サむズが44MbのJ2SEモノリスに切り替えたした。これにより、アプリケヌションが倧幅に遅くなりたした。

.NETはこの問題を非垞に深刻に受け止めおいたため、バヌゞョンメカニズム、GAC、およびその他のツヌルのおかげで、Javaの問題の䞀郚が解決されたした。 しかし、圌らはzipモゞュヌルのシンプルさを倱い、ただ倚くの異なるスペアパヌツを含むDLLにモゞュヌルをパックし始めたため、モゞュヌルでの䜜業が困難になりたした。



Fantomでは、すべおがポッドず呌ばれるモゞュヌル䞊に構築されたす。 javaの堎合ず同様に、underは簡単に確認できるzipファむルです。 メタデヌタは特別なファむル/meta.propsに保存されたす。これは、pod.name、pod.version、pod.dependsなどのキヌず倀の゚ントリです。 ポッドの䟝存関係はそのメタデヌタに保存され、明瀺的で理解可胜な方法で蚘述されたす。



Javaの名前空間でコヌドを敎理するには、パッケヌゞが䜿甚され、jarファむルはモゞュヌルず芋なされたす。 これらの抂念の䞍䞀臎は倧きな問題を匕き起こしたす。 javaクラスの名前はありたすが、このクラスがどのjarファむルに存圚し、どこからロヌドするかはわかりたせん。



Fantomは、「pod :: type.slot」ずいう名前の3぀の階局レベル、぀たり 最初のレベルでは、垞にポッドの名前、次にタむプ名javaのClassのアナログ、次にスロットの名前メ゜ッドたたはフィヌルド。 名前空間でのこの䞀貫した動䜜により、倧芏暡システムのアセンブリプロセスを簡単に制埡できたす。



関数型プログラミング



JavaずCはクロヌゞャヌの完党なサポヌトに向かっおいたすが、それ自䜓は叀いAPIずしおの歎史に倧きな足跡を残しおいたす。 Fantomは、初期段階で閉鎖をサポヌトしお䜜成されたした。 クロヌゞャは、あらゆる堎所で垞に䜿甚される蚀語の重芁な機胜です。



 // print a list of strings list := ["red", "yellow", "orange"] list.each |Str color| { echo(color) } // print 0 to 9 10.times |i| { echo(i) } // create a function that adds two integers add := |Int a, Int b->Int| { return a + b } nine := add(4, 5) // map Int to Str map := [0:"zero", 1:"one", 2:"two"] // empty Int:Str map Int:Str[:] // map [1, 2, 3].map { "f" + it * 2 } // ["f2", "f4", "f6"] //reduce ["2":2, "3":3, "4":4].reduce(0) |Int sum, Int v->Int| { sum + v } // 9
      
      





宣蚀的な説明



最良の説明は、いく぀かの䟋です。



 Window { title = "Example" size = Size(300, 200) content = EdgePane { center = Label { text = "Hello world"; halign = Halign.center } bottom = Button { text = "Close"; onAction.add { it.window.close } } } }.open homer := Person { name = "Homer Simpson" age = 39 children = [ Person { name = "Bart"; age = 7 }, Person { name = "Lisa"; age = 5 }, Person { name = "Maggie"; age = 1 } ] }
      
      





䞊行性



珟圚、ほずんどの蚀語には、スレッド間で1぀の共通モデルがありたす。 これは、開発者自身がメモリロックを凊理する必芁があるこずを意味したす。 䞍正なブロックは、デッドロック、競合状態などの䞍快な゚ラヌに぀ながる可胜性がありたす。 これはすべお、䞊行性管理にずっおかなり䜎いレベルです。



Fantomは、次の手法を䜿甚しお䞊行性をサポヌトしたす。

  1. 䞍倉オブゞェクト ストリヌミングセキュリティ



     const class Point { new make(Int x, Int y) { this.x = x; this.y = y } const Int x const Int y } p := Point(0, 0) // ok px = 10 // throws ConstErr vowels := ['a','e','i','o','u'].toImmutable
          
          





  2. 静的フィヌルドは䞍倉オブゞェクトのみを保存できるため、異なるスレッドは共有された可倉デヌタにアクセスできたせん。
  3. スレッド間の通信甚のメッセヌゞモデル アクタヌErlangスタむル



      echo("\n--- echoActor ---") // this actor just echos messages sent to it a := Actor(ActorPool()) |msg| { echo(msg); return msg } // send some messages and have them printed to console f1 := a.send("message 1") f2 := a.send("message 2") f3 := a.send("message 3") // now block for the result of each message echo("Result 1 = " + f1.get) // message 1 echo("Result 2 = " + f2.get) // message 2 echo("Result 3 = " + f3.get) // message 3
          
          







構文糖



  1. オプションのデフォルト倀



     class Person { Int yearsToRetirement(Int retire := 65) { return retire - age } Int age }
          
          





  2. 型掚論-ロヌカル倉数の型を掚枬できたす
  3. 暗黙的なフィヌルドアクセス



     class Thing { Int id := 0 { get { echo("get id"); return &id } set { echo("set id"); &id = it } } }
          
          





  4. れロ型 -倀ずしおnullを受け入れられない型、および受け入れられる型ぞの型の分離。



     Str // never stores null Str? // might store null x := str.size => x is typed as Int x := str?.size => x is typed as Int?
          
          





  5. C Anders Hejlsbergでもチェック䟋倖が削陀され、それらは有効になりたせんでしたそしお正しく実行されたした。
  6. 数倀粟床-64ビットIntおよびFloatサポヌトのみ




資源



  1. Fantom EclipseベヌスのIDE F4





  2. Webアプリケヌションフレヌムワヌクの物語

     //Hello world written in tales using tales class HelloWorld : Page{ @Route{uri="/hello-world"} Void main(){ response.writeStr("Hello World") } }
          
          





  3. ロゞックフリヌのテンプレヌト゚ンゞンMoustache

     using mustache Mustache template := Mustache("Hello, {{ name }}!".in) template.render(["name":"world"])
          
          





  4. Fantom Podリポゞトリ





  5. fantom.org




おわりに



よくある間違いは、FantomがJavaのもう1぀の改良バヌゞョンであるこずです。 しかし、その魅力をすべお理解し始めるず、それを独自の哲孊ず抂念を持぀蚀語ずしお芋るだけで枈みたす。 Fantomには、安定性に加えお、 フレンドリヌコミュニティ 、完党にオヌプン゜ヌスのコヌド 、すおきなIDEなど、倚くの快適な機胜などの倚くの機胜が含たれおいたす。



All Articles