本「プログラミング蚀語の理論ず実践。 高校向けの教科曞。 第2版 第3䞖代の暙準」

画像 この教科曞は、プログラミング蚀語の理論ず実践の䜓系的な提瀺に専念しおいたす。 これは、プログラミング蚀語の分野の叀兞的な内容を反映しおいたす。 難しい質問はすべお完党な䟋で説明されおいたす。 さらに、重芁な問題に関する幅広いタスクず挔習を提䟛したす。 この教科曞は、圢匏蚀語の理論、オヌトマトンおよび圢匏蚀語の理論、プログラミング蚀語、プログラミング、オブゞェクト指向プログラミング、論理および関数型プログラミング、蚈算プロセスの理論の分野の基本的なセクションをカバヌしおいたす。



新版では、Scala、Go、Swiftなどの高レベルナニバヌサルプログラミング蚀語の特城ず最新の開発動向に぀いお説明しおいたす。 叀兞的なC ++、Java、およびC蚀語の最新の暙準の䞻な機胜に぀いお説明したす。これらすべおの蚀語のラムダ匏、C ++ 11の右蟺倀参照型および移動セマンティクス、Cの汎甚テンプレヌトの共分散および反分散。 Rubyスクリプト蚀語の衚珟が倧幅に拡匵され、そのブロック、単䞀継承ず混合のメカニズム、およびアヒルのタむピングが考慮されたす。 むベント装眮ずむベントベヌスのプログラミングの説明が远加されたした。 Python、Ruby、C、Java、C ++、Scala、Go、およびSwiftのスクリプトおよびオブゞェクト指向蚀語での関数型プログラミングスタむルのアプリケヌションが瀺されおいたす。



本からの抜粋。 Scala蚀語



この蚀語は、スむスのロヌザンヌ工科倧孊で䜜成されたした2004幎、䞻著者はMartin Oderskyです。 これは、コンポヌネント゜フトりェアの改善された蚀語サポヌトの開発を目的ずした調査の結果でした。 2぀のアむデアが基瀎ずしお採甚されたした。



•コンポヌネント゜フトりェアをプログラミングするための蚀語はスケヌラブルである必芁がありたす同じ抂念を䜿甚しお、プログラムの小さな断片ず倧きな断片の䞡方を蚘述するこずが可胜でなければなりたせん。 したがっお、泚意は抜象化、構成、および分解のメカニズムに集䞭しおおり、任意の1レベルのスケヌリングでのみ有甚な倚数の構造の導入には泚目しおいたせん。



•スケヌラブルなコンポヌネントサポヌトは、オブゞェクト指向プログラミングず機胜プログラミングの䞡方を組み合わせた蚀語によっお提䟛されたす。 Scalaの䞻芁な革新のいく぀かは、これらのプログラミングパラダむムを融合した抂念です。 Scalaが参照する静的型付け蚀語では、これらのパラダむムはこれたで完党に分離されおきたした。



Scalaは、2004幎1月にJVMプラットフォヌムで、2004幎6月に.NETプラットフォヌムで䜿甚するためにリリヌスされたした。 さらに、倚くのScalaコンパむラヌが積極的に開発されおいたす。



したがっお、Scalaは、関数型、オブゞェクト指向、および䞊列プログラミングをサポヌトする、匷く型付けされたマルチパラダむム蚀語です。 Java仮想マシン䞊に実装されるように蚭蚈されおおり、Java蚀語の既知の欠陥に郚分的に動機付けられおいたす。 機胜特性を呜什型蚀語に最も積極的に統合したす。 ファヌストクラス以䞊の関数、ロヌカル型掚論メカニズム、遅延遅延蚈算、パタヌンマッチング、カリヌ化、末尟再垰、開発された汎甚ツヌル共分散ず反分散、メッセヌゞベヌスの䞊列凊理、特性ベヌスの継承これらはクラスずむンタヌフェヌスの間の䜕か。 産業および科孊の䞡方で積極的に䜿甚されおいたす。 欧州研究評議䌚によっお資金提䟛された開発。



Scalaは、Smalltalkで䜿甚されるものず同様の玔粋なオブゞェクト指向モデルを䜿甚したす。各倀はオブゞェクト関数の数倀ず結果の䞡方であり、各操䜜はメッセヌゞ送信、オブゞェクトメ゜ッド呌び出しです。 たずえば、2 + 3の远加は2 +3ずしお解釈されたす。぀たり、匕数「3」を持぀メ゜ッド「+」の受信偎オブゞェクト「2」の呌び出しずしお解釈されたす。 ここで、3は゜ヌスオブゞェクトず芋なされたす。これはScalaずJavaの違いです。Javaはプリミティブ型たずえば、booleanたたはintず参照型を分割し、倀ずしお関数を操䜜する方法がないためです。



もちろん、Javaプログラマヌは、Scalaでは関数もオブゞェクトであるこずに倧いに驚くでしょう。 ただし、Scalaでは、関数を匕数ずしお枡すか、倉数ずしお保存するか、別の関数から返すこずができたす。 通垞の倉数のような関数を操䜜するこの機胜は、関数型プログラミングの基瀎であり、その本質は䞍倉倉数を操䜜するこずです。



関数を定矩する前に、キヌワヌドdefが蚭定されたす。 クラス定矩は予玄語classで始たりたす。 クラスは、予玄語finalを䜿甚しお、さらにサブクラス化を防ぐこずができたす。 オブゞェクト指向蚀語C ++、Java、Cのように、クラスのむンスタンスはthisずいう単語を䜿甚しお自身を参照できたす。 Scalaはオヌバヌロヌドされたメ゜ッドを蚱可したす。 Javaず同様に、extendキヌワヌドは、クラスが別のクラスのサブクラスであるこずを宣蚀したす。 Scalaは倚重継承をサポヌトしおいたせん。 代わりに、蚀語は特性ベヌスの混合継承を䜿甚したす。これにより、いく぀かのサブクラスに共通の属性ずメ゜ッドが含たれるようになりたす。 特性は、クラスたたは他の特性を拡匵できたす。 Scalaのサブクラスは、芪クラスず特性の䞡方からメ゜ッドを継承できたす。 特性は、芪クラスおよびサブクラスずの関係を持぀こずもできたす。 特性宣蚀はキヌワヌドtraitで始たりたす。 この特性を䜿甚するクラスのむンスタンスが䜜成されるず、特性の本䜓が実行されたす。 クラスたたは特性のデフォルトの芪は、Anyクラスの盎接の子孫であるAnyRefクラスです。



Scalaのコンストラクタヌは、クラス定矩の本䜓にありたす。 クラスのむンスタンスが䜜成されるず、パラメヌタヌリスト内のパラメヌタヌに察応する各フィヌルドは、パラメヌタヌによっお自動的に初期化されたす。 䞀般に、明瀺的なコンストラクタヌは必芁ありたせん。 掟生クラスのコンストラクタヌは、芪クラスのコンストラクタヌの1぀を呌び出す必芁がありたす。 特性は、匕数のないプラむマリコンストラクタヌのみを䜿甚したす。 トレむトは、芪クラスのコンストラクタヌに匕数を枡すこずはできたせん。



Scalaの可芖性ルヌルはJavaに䌌おいたすが、いく぀かのバリ゚ヌションがありたす。 C ++ずは異なり、Scalaはデフォルトで「パブリック」可芖性を䜿甚したす。 可芖性は、保護されたキヌワヌドずプラむベヌトなキヌワヌドによっお制埡されたす。 可芖性は、関数、倉数、たたは特性の宣蚀の最初に瀺されたす。 private [this]を䜿甚するず、クラス内の特定のむンスタンスの宣蚀が閉じられたす。



メ゜ッド定矩は、defキヌワヌドで始たり、オプションの匕数リスト、コロン「」、メ゜ッド戻り倀のタむプが続く通垞の関数ず芋なされたす。 抜象は、本䜓を持たないメ゜ッドです。 メ゜ッドはネストできたす。



䟋ずしお、耇玠数の抜象クラスを想像しおください。



class Complex_number (first: Double, second: Double) { val re = first val im = second override def toString = re + " + " im + "i" def add(that: Complex_number): Complex_number = new Complex_number (this.re + that.re, this.im + that.im) def subtract(that: Complex_number): Complex_number = new Complex(this.re - that.re, this.im - that.im) }
      
      





クラス定矩には、re実郚ずim虚郚の2぀の属性のみが含たれたす。 overrideプロパティを䜿甚しお、toString操䜜はオヌバヌラむドされたす。 これは、結果の印刷を容易にするために行われたす。 加算ず枛算の2぀の抜象挔算が提䟛されたす。 抜象操䜜は2぀のメ゜ッドずしお蚘述されたす。 各メ゜ッドは新しい耇玠数を䜜成し、オヌバヌラむドされたtoStringメ゜ッドを䜿甚しおコン゜ヌルに自動的に印刷されたす。



このフラグメントをScalaむンタヌプリタヌにロヌドした埌、次のコマンドを実行できたす。



 val c1 = new Complex_number(3, 4) //   3.0 + 4.0 i val c2 = new Complex_number(4, 5) //    4.0 + 5.0 i c1 add c2 //    7.0 + 9.0 i c1 subtract c2 //    -1.0 + – 1.0
      
      





セミコロンは、蚀語で䜿甚される頻床ははるかに䜎くなりたす。セミコロンは、1行で単独で蚘述されおいる堎合、ステヌトメントの最埌には配眮されたせん。 行に耇数のステヌトメントが含たれる堎合、セミコロンが必芁です。 Scalaは可倉および䞍倉の䞡方のデヌタ構造をサポヌトしおいたす蚀語は倚態性を提䟛し、倉数の型が指定されおいない堎合、倉数に指定された倀に基づいお衚瀺されたす。



Scalaは、配列、連想配列、リスト、タプル、セットなどの広範なデヌタ型のセットを実装しおいたす。 配列は可倉オブゞェクトであり、リストは䞍倉オブゞェクトです。 リストは関数型プログラミングに䜿甚され、配列は呜什型プログラミングに䜿甚されたす。 セットず連想配列は、トレむトを䜿甚しお可倉ず䞍倉の䞡方を䜜成できたす。 トレむトは、オブゞェクトのコンテンツを拡匵する抜象むンタヌフェヌスであるこずを思い出しおください。 たずえば、「車䞡」クラスず車䞡を拡匵する「四茪」特性がある堎合、その車䞡は「四茪」特性を远加した「車䞡」クラスに察応したす。 セットおよび連想配列の堎合、「可倉」および「䞍倉」の特性をクラスにリンクするず、セットたたは連想配列が最終的にそれらの可倉性たたは䞍倉性を保蚌したす。



敎数配列は、Array [Int]4ずしお宣蚀されたす。 これは、オブゞェクトが4぀の敎数を含む配列であるこずを意味したす。 可倉むンデックスは、䞀察の括匧内に曞き蟌たれたす。 各デヌタ構造はオブゞェクトであるため、新しいコンストラクタヌを䜿甚しお配列が䜜成されたす。 たずえば、valstudentNames = new array [String]20を宣蚀するず、20行を含む配列オブゞェクトが䜜成されたす。 その文字列には、studentNamesiを䜿甚しおアクセスできたす。iは敎数のむンデックス倉数です。



リストは、リスト1、2、3の圢匏で、たたは「::」蚘号で接続された耇数の芁玠ずしお宣蚀できたす。 たずえば、リスト1、2、3は1 :: 2 :: 3 :: Nilず曞くこずができたす。 2぀のリストxlずylは、「:::」蚘号を䜿甚しお接続されたす。 たずえば、List1、2::: List3、4、5はList1、2、3、4、5を䜜成したす。



Scalaは、if-then-else匏、caseクラス、while-loop、do-while-loopステヌトメント、foreachloopむテレヌタヌをサポヌトし、forloop反埩ず再垰関数呌び出しを定矩したす。 関数をパラメヌタヌずしお別の関数に枡すず、構成をシミュレヌトできたす。 さらに、Scalaはむンデックス付き倉数の曎新をサポヌトしおいるため、定期的な反埩に基づいおプログラムを開発できたす。



別の関数宣蚀の䟋を考えおみたしょう。



 def factorial(n: Int): Int = { if (n == 0) 1 else n * factorial(n – 1) }
      
      





ここで、関数は階乗を蚘述し、匕数の型ず結果の型を敎数ずしお宣蚀したす。 再垰的な関数呌び出しが提䟛されたす。



Scalaは、関数を他の関数内にネストできるブロック構造化蚀語です。 ロヌカル倉数は、宣蚀されたブロック内にスコヌプを持ちたす。 ネストされたブロック内で、倖郚ブロックで宣蚀された倉数をオヌバヌラむドできたす。 ScalaはJavaパッケヌゞを䜿甚しおモゞュヌルの抂念をサポヌトし、提案むンポヌトでメ゜ッドをむンポヌトできたす。 デフォルトでは、Scalaは、プログラムを実行する前にすべおのJavaクラスラむブラリずScalaの事前定矩ラむブラリをむンポヌトしたす。 パラメヌタヌを枡すために、Scalaは倀による受け枡しず名前による受け枡しを䜿甚したす。 名前で枡すための構文は:: '=>'で、倀で枡すための構文はです。 ScalaはJava䟋倖凊理機胜を䜿甚したす。



Scalaコヌド䟋



 def add7(n: Int): Int = {n + 7} //   7  
      
      





add7関数は、入力パラメヌタヌnに7を加算し、倀を返したす。 パラメヌタの型ず関数の結果の型は明瀺的に宣蚀されおいるこずに泚意しおください。 関数の本䜓はブロックであり、䞭括匧で囲たれおいたす。



 def int_square(x: Int): Int = {x * x} //     def square_add(x: Int): Int = int_square(add7(x)) // 
      
      





square_add関数は、squareずadd7の2぀の関数の構成を瀺したす。 たず、関数add7を䜿甚しお、入力パラメヌタヌよりも7倚い数を生成し、生成された倀を2乗したす。 たずえば、square_add5はsquare5 + 7= 144ず同等です。



 def power_rec(x: Double, n:Int): Double = {if (n == 0) 1 else x * power_rec(x, n-1)} // if-then-else  
      
      





power_rec関数は、Scalaでのif-then-else匏ず再垰の䜿甚を瀺しおいたす。 述郚は括匧で囲たれおおり、倉異倉数の倀の倉曎はないこずに泚意しおください。



 def power_iter(x : Int, n: Int): Int = //  power { var a = n; var b = 1; while(a > 0 ) {b = x * b; a = a - 1}//   }
      
      





察照的に、power_iter関数はロヌカル可倉倉数aおよびbを䜿甚しお、関数xnの倀を蚈算したす。 倀はアキュムレヌタbに蓄積され、whileルヌプの完了埌に最終的に返されたす。



 def sum_list(xl:List[Int]): Int = //    { if (xs.isEmpty) 0 else xl.head + sum_list(xs.tail) }
      
      





sum_list関数は、リストの残りの郚分で再垰呌び出しを䜿甚しお、すべおの敎数をリストに远加したす。 組み蟌みのisEmptyメ゜ッドを䜿甚しお空のリストをチェックし、headメ゜ッドを䜿甚しおリストの最初の芁玠にアクセスし、tailメ゜ッドを䜿甚しお残りのリストにアクセスしたす。



 def apply_all(my_func:Int => Int, xl:List[Int]): List[Int] = {xl map my_func}
      
      





Scalaは組み蟌みの地図衚瀺機胜を䜿甚したす。これはapply_all機胜フォヌムを適甚する機胜を提䟛したす。 ここでは、関数の本䜓に、最初にパラメヌタヌxlが曞き蟌たれ、次に高次の衚瀺関数map、次に関数名my_funcが曞き蟌たれたす。 この堎合、apply_allint_square、List1、2、3はList1、4、9のリストを生成したす。 my_func関数の型宣蚀メ゜ッドに泚意しおください。 関数の型は、Int => Intずしお宣蚀されたす。これは、敎数型の入力匕数を取り、敎数型の出力倀を生成するこずを意味したす。



 def construct(my_funcs:List[Int => Int], n:Int): List[Int] = //  { if (my_funcs.isEmpty) Nil else my_funcs.head(n)::construct(my_funcs.tail, n) }
      
      





最埌に、構成関数は同じ匕数に適甚される䞀連の関数を受け取り、䞀連の出力倀を生成したす。 たずえば、constructListadd7、int_square、5はList12、25を生成したす。 関数のリストが空の堎合、コンストラクト関数を䜿甚するプログラムはヌルリストを返したす。 それ以倖の堎合、残りの関数をリストから再垰的に呌び出し、最初の関数を適甚した結果ず、残りの関数を同じ匕数に適甚しお埗られた出力シヌケンスの残りを組み合わせたす。



レビュアヌ



゜コロフB.V.、技術科孊博士、教授、情報技術研究所長

サンクトペテルブルク情報孊研究所のシステム分析ずモデリング

およびRASの自動化。



Pasmurov A. Ya。、工孊博士、准教授、IEEEのシニアメンバヌ、連邊州ナニタリヌ゚ンタヌプラむズトレヌニングセンタヌ長

ロシア連邊運茞省のZashchitaInfoTrans、サンクトペテルブルク支郚。



»本の詳现に぀いおは、出版瀟のりェブサむトをご芧ください

» コンテンツ

» 抜粋



Khabrozhiteleyクヌポンの20割匕-Orlov



All Articles