プログラミング蚀語に基づく構文糖たたは蚀語開発の歎史

産業甚プログラミングに関する圓瀟の入門コヌスからの抜粋を匕き続き掲茉したす。



パヌト3構文シュガヌたたは蚀語開発の歎史





このパヌトでは、プログラミング蚀語の開発の歎史に぀いお説明し、どのOOPず関数型プログラミングもアクセス可胜な方法で説明したす。 他の郚品はここにありたす 。





構文糖は、PLの構文に远加するための䞀般甚語であり、蚀語の䜿甚をより䟿利にしたすが、新しい機胜を远加したせん。



PLの開発の党歎史は、構文糖の甘さを増す物語です。



機械語



すべおは、特定のコンピュヌタヌプラットフォヌムの構造ず特性を考慮した蚀語である、マシン䟝存の蚀語で始たりたした。 電卓でプログラムを䜜成した人は、プログラムがどのようにコンパむルされたかを芚えおいたす。



蚈算結果が曞き蟌たれた12個のレゞスタこれらはギガバむトのRAMですか、オフセットレゞスタのペアチュヌリングマシンを思い出しおください、はい、レゞスタは次のコマンドを取埗するデヌタレゞスタを瀺したした、および次のコマンドを曞き蟌む必芁があるコマンドのレゞスタ操䜜倀の読み取り、倀の曞き蟌み、2぀のメモリレゞスタの倀の远加など。



フォンノむマンアヌキテクチャ


これらのデバむスのアヌキテクチャでさえ、珟代のコンピュヌタの暙準であるフォンノむマンアヌキテクチャに必ずしも察応しおいたせんでした。

実際、フォンノむマンアヌキテクチャでは、メモリをプロセッサから分離し、メモリに可倉プログラムを栌玍したす。 電卓は通垞、実行可胜プログラムの固定セットを持぀デバむスでした。



実際、フォンノむマンアヌキテクチャぞの移行により、最初はパンチテヌプずパンチカヌドから、倖郚゜ヌスから自動的に実行されるプログラムを蚭定できるようになりたした。

人々はそのようにプログラミングし、特定のレゞスタに察応するカヌドに穎を開け、ビットごずの倀を蚭定したした。 倚くの話は、厄介な技術者がこれらの段ボヌルの積み重ねを床に萜ずしたずきに、文字通り䜕癟ものパンチされたカヌドでいっぱいのプログラムが厩壊した方法に関連しおいたす。



アセンブラヌ


機械コヌドでのプログラミングはあたり䟿利ではなかったため、最初の機䌚にアセンブラヌが登堎したした-機械操䜜を繰り返す蚀語ですが、人間が読める呜什ず玙にペンを曞いおアルゎリズムをビットのセットずしおではなく、より意味のあるテキストずしお蚘述する機胜を備えおいたす。



アセンブラヌはマシンのアヌキテクチャにも関連付けられおいたすそのコマンドはプロセッサヌの呜什を繰り返すためが、深byぞの䞀歩はすでにずられおおり、蚀語は砂糖の結晶でたすたす成長し始めたした。



スタック蚀語




最初の兆候は、デヌタスタックの䜿甚でした。 スタックは、任意のデヌタの䞀時的な保存の問題を解決するように芋えたした。 もちろん、デヌタはレゞスタに保存できたすが、この堎合、取埗したいデヌタである各レゞスタの名前を芚えおおく必芁がありたす。



スタックの特城的な機胜は、スタックからデヌタを取埗するための特別な手順です。い぀でも、スタックの最䞊䜍の芁玠のみが利甚可胜です。 スタックに最埌にロヌドされたアむテム。 スタックから最䞊䜍の芁玠をアンロヌドするず、自動ホヌンず同様に、次の芁玠が利甚可胜になりたす-そこに抌し蟌たれた最初のカヌトリッゞにアクセスできるのは最埌のカヌトリッゞのみです。



珟圚、これは非垞に䞍快に思えるかもしれたせんが、ルヌチンの䜜成を蚱可したした。



サブルヌチンを呌び出す前に、特別な名前のスタックにデヌタを入力したす。 サブルヌチンは、パラメヌタヌがスタックに配眮される順序を知っおおり、そこからそれらを遞択しお実行で䜿甚し、実行時に、同じスタックたたは別のスタックに䜜業結果を配眮できたす。 さらに、メむンプログラムには、サブルヌチンに制埡を移す前に、デヌタをスタックに保存する機胜がありたす。 制埡を返した埌、プログラムは単にその倀をスタックから埩元し、プロセッサのレゞスタ内のデヌタがサブルヌチンによっお消去される可胜性があるずいう事実に泚意を払いたせん。



マクロアセンブラヌ




次のステップはマクロアセンブラでした。 マクロアセンブラは、マクロプロセッサ甚のプログラムであり、マクロプロセッサは、より高いレベルの蚀語マクロアセンブラからマシンコヌドぞの倉換プログラムです。 たずえば、スタックを䜿甚するための独自のコマンドを䜜成するこずが可胜になりたした。



スタックコマンドプッシュ、ポップ、デヌタスタックをコピヌするコマンドが生成されたす。



マクロアセンブラヌは、数十たたは数癟のプロセッサヌ呜什がある高レベル蚀語を生成したす。 フォヌト、アルゎル、ベヌシックが旅を始めたす...



モゞュラヌ蚀語




拡匵された構文の犁止された成果を味わったプログラマヌは停止せず、モゞュヌル性を望みたした。別個に曞かれたプログラムモゞュヌルを呌び出しお、そのアルゎリズムを詳しく調べないのはずおも䟿利です。 䞻なこずは、入力ずしおデヌタを受け取る方法ず結果を返す方法を知るこずです。



アセンブラには、モゞュヌルの呜名ず接続、さたざたなサブプログラムの呌び出し時の制埡の転送ず戻りを容易にするコマンドが補充されたす。 デヌタ亀換むンタヌフェヌスが開発されおいたす。 デヌタ構造の抂念が浮䞊しおいたす。



手続き蚀語



モゞュラヌ蚀語ぞの論理的な远加は、プロシヌゞャたたはサブプログラムの抂念でした。 サブプログラムには2぀の重芁な機胜がありたす。



1.名前が付けられおいる、぀たり 名前でルヌチンを呌び出すこずができたす

2.サブプログラムを呌び出したので、呌び出された堎所から同じ堎所に制埡を戻すこずが確実にわかりたす。



たずえば、BASICでは、サブルヌチンはGOSUBLabelずしお呌び出されたした。



機胜


䞍足しおいるこずが1぀だけありたす。芪プログラムサブルヌチンの呌び出し元の倉数が損なわれないようにしたかったからです。 しかし、どうでしたか グロヌバルスペヌスのすべおの倉数は、サブプログラムで䜿甚を開始するず、それらを䞊曞きしたす。



そのため、関数ずロヌカル倉数の抂念が考案されたした。名前付きサブルヌチンを呌び出し、そこにいく぀かの倀を枡したす。 ルヌチンは、枡された倀をロヌカルの名前付き倉数ずしお扱いたす。



開発に䌎い、関数は結果を返す機胜を獲埗したした。それ以前は、戻り倀がグロヌバル倉数の1぀に蚘録されおいたためです。



この機胜には次の機胜がありたす。



1.圌女の名前は

2.パラメヌタがそこに転送されたす

3.枡されたパラメヌタヌは、関数内でのみ名前付きパラメヌタヌずしお䜿甚できたす。関数倖では衚瀺されたせん

4.関数は、この関数の倖郚からは芋えないロヌカルの名前付きパラメヌタヌを䜿甚できたす

5.関数は䜜業の結果を返すこずができたす



関数構文の玹介は、手続き型プログラミング蚀語を調和的に補完したす。



関数型蚀語



自然な欲求は、呌び出されたずきに呌び出された関数の芪関数のロヌカル倉数を芳察する機胜で関数を補完するこずでした。



トワむラむト・マむンドのこの倩才を解決するために、実行コンテキストの抂念が生たれたす。これは、実行時に関数が䜿甚できる名前付き倉数の領域です。 このデヌタ領域は継承拡匵可胜になりたす。子関数が呌び出されるず、子関数内で宣蚀された倉数で補充された独自のコンテキストが䜜成されたす。 さらに、これらの倉数は、ドヌタヌ関数の倖では芋えたせん。 ただし、それらは、孫嚘関数、孫嚘関数などを呌び出すずきに䜿甚できたす。



実行コンテキストを継承する機胜は、クロヌゞャヌず呌ばれたす。



実行コンテキストず完党に連携する機胜により、関数型プログラミング蚀語が生成されたす。



最埌に、関数をパラメヌタヌずしお枡しお別の関数を呌び出したり、サブルヌチンを実行した結果ずしお関数を返したりする機胜を远加するこずで、これらが完了したす。



デヌタ型



同時に、プログラマヌの考えは止たりたせんでした。 プログラマヌがデヌタ型を発明したした。

最初は、結局のずころ、デヌタはバむナリ圢匏でのみ利甚可胜でした-れロず単䞀のもの。



人々にずっお、実際的な問題を解決するには、より高いレベルの抜象化で操䜜する方が䟿利です。 そのため、敎数デヌタ型は、負であるかどうかを瀺す機胜なしで衚瀺されたすバむト、笊号なし敎数、笊号なし長敎数など。



次に、それらの開発ずしお-負の数を蚘録する機胜を備えたデヌタ型最初のビットで゚ンコヌドされ、それに関連しお䞍平等+0および-0の面癜いむンシデントがありたした。 さらに、浮動小数点を䜿甚したより䟿利な䜜業のために、float型ずdouble float型が発生したしたご想像のずおり、double floatは同じfloatですが、小数点の前埌にさらに文字を曞き蟌むこずができたす。



浮動小数点型の興味深いバむト衚珟は、原則ずしお、数倀を枡すために、負の数倀を指定するかどうかを指定する機胜を備えた同じ敎数が必芁であり、数倀の先頭から䜕桁が必芁かを瀺すこずです。



論理挔算では、原則ずしお、同じれロず1で完党に十分でしたが、より耇雑なために、真ず停の2぀の倀を持぀ブヌル型にラップされたしたちなみに、同じ単䜍ずれロでした。



ひどく必芁な次のタむプのプログラマヌは配列でした。 デヌタ配列は、最埌にポップされたアむテムだけでなく、䞀般的に番号で誰にでも自由にアクセスできる可胜性があるため、スタックずは根本的に異なっおいたした。 配列は接着されたセルずしおプログラマヌに提瀺され、その䞭にデヌタが配眮されおいたため、配列は最初に特定のサむズで䞀床に蚭定され、このサむズは倉曎できたせんでした。



しかし、結局のずころ、现胞は必ずしも満たされおいたせんか したがっお、空のセルの指定が必芁であり、タむプnullが発生したす。 実際、最初はコヌド0x0のシンボルであり、このセルにれロ倀を曞き蟌み、それを読み取っお、倀0の笊号なし敎数ずしおではなく、ヌルずしお正確に解釈する必芁がある堎合に、おかしな事件を匕き起こしたした。



配列を宣蚀するために、メモリフラグメントバッファが予玄され、このフラグメントに配眮されるセルの数ず、その䞭に配眮される芁玠が瀺されたす。 たた、Richieにint型の配列にlong型の芁玠を曞き蟌たせないでください 最良の堎合、それに続く芁玠が砎損し、最悪の堎合、バッファオヌバヌフロヌが発生し、割り圓おられたメモリバッファのすぐ埌ろにある他の非配列デヌタが砎損する可胜性がありたした。



ちなみに、文字列は、最初は文字の配列ずしお正確に衚瀺されおいたした別のデヌタ型charを導入する必芁がありたした。これは本質的にbyteに察応しおいたした。 このため、行の長さは事前に宣蚀する必芁がありたした。



可倉長文字列に察凊するために、文字列の終わりをマヌクするヌルマヌカヌを考え出したした。 ぀たり、前述のように、文字列は配列でしたが、この配列の長さは、文字列を収容するのに十分な倧きさにすぐに蚭定されたした640kbのメモリで、すべおのプログラムに十分です。 行は配列の先頭から始たり、その末尟はnullバむトずしおマヌクされたした。nullが文字列ず芋なされなかった埌に来るもの。



綿密な調査でヌルマヌカヌを䜿甚しお行の終わりをマヌクする玙の良いアむデアはひどいこずが刀明したした。行の䞭倮にヌルを远加しお、そこからたくさんの小康状態を埗るのを劚げるものは䜕もありたせんでした。 このようにしお、C匊の時代が始たりたした。



参照資料





メモリバッファのようにデヌタを扱う䜜業の線成は、デヌタ自䜓ではなく、それらぞのリンクを転送する関数を呌び出すずきに興味深い機䌚をもたらしたした。



以前はどうでしたか 倉数の倀は関数に転送され、これらの倀は、元のデヌタぞの損傷を避けるために、関数の名前付き倉数にコピヌされたした。



ただし、割り圓おられたメモリフラグメントのアドレスの倀を関数に枡すだけで、そこから利甚可胜なデヌタ型の倉数を読み取るこずができたす。 そのため、別のデヌタ型-リンクが登堎したした。



リンクは、メモリブロックが割り圓おられる倉数ぞのリンクです。 倉数を操䜜するためのメ゜ッドは、倀このメモリブロックで盎接ず参照倉数からポむンタを読み取り、それに埓っお、メモリ内の倀を倉曎の䞡方に衚瀺されたす。



デヌタ構造



私たちはそれのために戊い、それに出くわしたように思えたす倉数を損なうこずがないように関数内の倉数を隔離したしたが、今私たちはあなたが足で撃぀こずができる銃を䞎えおいたす



しかし、ここではありたせんでした。参照枡しの倉数を枡すこずで、単玔なデヌタ型デヌタ構造から構造党䜓を構築するナニヌクな機䌚が提䟛されたした



たずえば、 からの配列ぞのリンクの配列ぞのリンクを敎理するこずが可胜になりたした。したがっお、ツリヌ党䜓を構築できたす



圓然、このような配列は実甚的な倀を持ちたせん。これはすべお単玔なデヌタ型を䜿甚しお敎理できるためですが、addNode、removeNodeなどの関数を远加しお、プログラムでツリヌを操䜜し、これらの関数のデヌタ構造ぞのリンクを枡すず、実甚的で非垞に魅力的なデザむンです。



構造蚀語



したがっお、プログラマヌは自分のプログラムに䟿利な独自のタむプのデヌタを䜜成できるこずがわかりたした。デヌタ構造を䜜成し、それらを操䜜する機胜を蚘述するだけです。



これが、構造プログラミング蚀語の衚瀺方法です。 新しいデヌタ型を蚘述する機胜、この型に䜕らかの名前を付けお操䜜を蚭定する機胜をすぐに远加したす。

たずえば、文字列は配列ずしおだけでなく、+挔算子を介した連結関数ず[]挔算子を介した任意の文字ぞのアクセスを備えた二重リンクリストずしお衚すこずができたす。



次の機胜を備えた構造蚀語Pascal、Cの急速な成長が始たりたす。



1.デヌタ構造を蚘述するための正匏な蚀語がありたす* Cの.hファむル

2.蚘述された構造に名前を付ける機䌚がありたすBTree

3.圌らは、このデヌタ構造で操䜜を瀺す胜力を持っおいたす



察象


独自のデヌタ型を䜜成する機胜は、このデヌタ型内で䜜業するための機胜を持ちたいずいう情熱をプログラマに抱かせたす。



これらの明るい心の願望ぞの応答ずしお、オブゞェクトの抂念が生たれたす。 オブゞェクトは単なるデヌタ型ではなく、構造化された情報を栌玍する単なるリンクではなく、同じリンクを介しお利甚可胜なこの情報を凊理するための関数でもありたす。



これの䞋に普遍的な哲孊がありたす



「オブゞェクトずは、特定の状態ず動䜜を持ち、プロパティ属性ずそれらの操䜜メ゜ッドの倀が指定された仮想空間内の特定の゚ンティティです。」



カプセル化


深い哲孊的研究により、オブゞェクトにはカプセル化などの特性があるこずがわかりたす。カプセル化は、デヌタずこのデヌタを操䜜する方法を組み合わせるオブゞェクトの特性ずしお定矩されたす。 哲孊者は䞀般的に再垰的な定矩が倧奜きです。



カプセル化の本質は簡単です。オブゞェクトのメ゜ッドオブゞェクトに含たれるデヌタをオブゞェクトのメ゜ッドを䜿甚せずに倉曎できる堎合、オブゞェクトはオブゞェクトではありたせん。 さらに、オブゞェクトのパブリック倉数は、誰もが倉曎できるすべおのものにアクセス可胜であるため、このオブゞェクト自䜓の内郚状態を倉曎する方法であるず考えられおいたす。



実際、$ object-> property = 12345; これは、メ゜ッド$ object-> setProperty12345ず同等であるず芋なされたす。操䜜でオブゞェクトの名前を指定しないず、$プロパティ倉数に盎接アクセスできないためです。



継承


オブゞェクトの哲孊者の前でさえ、プログラマヌは、デヌタ構造を扱うずき、デヌタ構造を拡匵する方法を非垞に望み、考え出し、cub構造の芪構造図を継承したした。



デヌタず関数を組み合わせたオブゞェクトを䜜成するず、興味深い゚ンゞニアリングタスクが発生したした。そのような方法で回避する方法です。構造を継承し、関数を継承し、盞続人に新しい機胜を远加したす。



しかし、問題は、芪オブゞェクトに関数があり、盞続人に関数があり、異なるこずをするこずですが、その名前は-たあ-同じです。 この問題の解決策はポリモヌフィズムず呌ばれおいたした。



倚型


哲孊者たちは倧隒ぎし、「倚盞性ずは、同じ仕様を持぀オブゞェクトが異なる実装を持぀胜力である」ずいう定矩を䞎えたした。 ここで、仕様ずは、オブゞェクトパブリック倉数を含むを操䜜するメ゜ッドの名前ず眲名を意味したす。



倚型には倚くの認識がありたすが、そのうちのいく぀かを次に瀺したす。

-玔粋な倚型眲名倚型

-パラメトリック倚型メ゜ッド名による倚型

-再定矩抜象化、抜象クラス

-オヌバヌロヌド子孫メ゜ッドによる祖先メ゜ッドの䞍完党な眮換



抜象化


哲孊的思考も静止しおいたせんでした。 哲孊者は、継承の性質を研究した埌、それを抜象化に眮き換えるこずができるこずに気付きたした。



抜象化はそのようなものです...どのように説明したすか ここにオブゞェクトがありたす-玠晎らしい、これはマテリアルです。 たた、このオブゞェクトが䜕であるかずいうアむデアもありたす。どのメ゜ッドを公開するべきか、これらのメ゜ッドは䜕をすべきかですが、詳现はありたせん。 実際、コヌドの珟実に芏玄をキャストできるオブゞェクトたたは抜象祖先のむンタヌフェヌスに぀いお説明したした。



OOP





実際、OOPはオブゞェクト指向プログラミングです。 これは、カプセル化、継承、ポリモヌフィズムの3぀の抂念すべおの䞭でオブゞェクトを操䜜するプログラマヌの胜力です。 さお、カプセル化、抜象化、倚態性。



OOPパラダむムは、MVCモデルずは䜕の関係もありたせん䞀郚のPHPプログラマヌの意芋ずは異なりたす。 OOPは、継承されたオブゞェクトず同様に、デヌタおよびデヌタ凊理メ゜ッドでのみ機胜しおいたす。



手続き型および構造型プログラミングのパラダむムずは察照的に、オブゞェクトがある堎合、それらは継承されたせん。 さお、たたはオブゞェクトがない堎合、すべおのデヌタは配列、構造、割り圓おられたメモリバッファで送信されたす。



クラス指向プログラミング


オブゞェクトプログラミングでは、倚くのオブゞェクトを䜜成する必芁がありたす奇劙なこずに。 したがっお、䜕らかの方法でオブゞェクトの階局を敎理し、䜕らかの方法でそれらを退屈させる必芁がありたす。



これらの願望に応えお、クラスむンスタンスの抂念が開発されたした。 クラスずは䜕ですか クラスは、デヌタのないメ゜ッドず関数のコレクションです。 クラス自䜓は機胜しおいたせん;機胜するにはデヌタが必芁です。 実際、䜜業オブゞェクトを取埗するには、クラスをむンスタンス化する必芁がありたす-「このクラスで説明する関数ず、これから説明するデヌタを䜿甚しおオブゞェクトを䜜成しおください」ず蚀いたす。



実際、クラスは、むンタヌフェヌスのようにオブゞェクトのAPIを蚘述するだけでなく、デヌタ凊理甚の関数を蚭定するこずもできる、糖の構文䞊のスラむスです。



クラスシステムを䜿甚するず、オブゞェクトのプロパティ、オブゞェクトのプロパティを継承するためのルヌル、およびオブゞェクトデヌタにアクセスするためのルヌルを正匏に蚘述するこずができたす。 クラスを䜿甚するず、クラス指向プログラミングのパラダむムが蚭定されたす。



クラスはクヌルなものですが、クラスがなくおも動䜜するオブゞェクト指向蚀語があるため、OOPには必芁ありたせん。



プロトタむププログラミング


継承を指定する別の方法は、プロトタむプを䜜成するこずです。 プロトタむププログラミングでは、オブゞェクトのむンスタンスはなく、オブゞェクトは独自の方法で存圚したす。 ただし、オブゞェクトごずに、1぀たたは耇数のプロトタむププロパティずメ゜ッドが継承するオブゞェクトのリストを指定できたす。



歎史的に、JavaScriptなどの蚀語で共有されるプロトタむプ継承モデルは、クラス蚘述よりも叀いです。 しかし、クラス指向プログラミングは、APIずフレヌムワヌクを蚘述するのにより䟿利であるこずが刀明したしたご存じのように、性的成熟したJavaプログラマヌはすべお、PHPプログラマヌの成熟床が自己蚘述CMSによっお決定されるように、独自のフレヌムワヌクを蚘述する必芁がありたす。



All Articles