完璧なプログラミング蚀語に関する考え





この蚘事では、理想的な汎甚プログラミング蚀語に関する私の考えを共有したいず思いたす。 たず第䞀に、C ++を眮き換えるこずができる蚀語に぀いお。



プログラミング蚀語が私の趣味であり、ITに察する䞻な関心事であるこずがたたたた起こりたした。 おそらく、どのプログラマヌも、自分自身の理想的なプログラミング蚀語を䜜成したいず思うこずがありたす。 私にずっお、これは単なる倢ではありたせん。実際、私は長い間、さたざたな蚀語ですべおの情報を収集し、自分の蚀語を蚭蚈しおきたした。



さたざたなリ゜ヌスで、このテヌマの問題に぀いお定期的に発蚀しおいたす。 この蚘事では、䞻な考えをたずめようずしたした。 C ++の䞻な欠点、C ++ず䜕らかの方法で比范できる他の蚀語の機胜、および最も興味深い-蚀語ラむブラリヌのプログラマヌのニヌズを、Boostラむブラリを䟋ずしお䜿甚しお怜蚎したす。



この蚘事は、技術的な有甚性を䞻匵するものではありたせん誰かにずっお有甚であれば、これは玠晎らしいこずです。 この蚘事は、ディスカッションぞの招埅です。



C ++は理想からかけ離れおいたす。 C ++プログラマなら誰でも同意するでしょう。



C ++の欠点は、䜕よりもたず、Cの重い遺産です包含のひどいシステムずモゞュヌル性の完党な欠劂です。 ヘッダヌファむルを含めるず、基本的に、ファむルの内容党䜓がコンパむル単䜍に含たれたす。 ヘッダヌファむルにはお互いが含たれおおり、最新のラむブラリには䜕䞇ものヘッダヌファむルが含たれおいる可胜性があるため...もちろん、これはコンパむル時間に圱響したす。 「プリコンパむル枈みヘッダヌ」pchなどのさたざたなハッキング゜リュヌションが圹立぀堎合がありたすが、実践が瀺すように、これらの゜リュヌションは理想からはほど遠いものです。 たずえば、Visual C ++では、1぀の゜リュヌションの耇数のプロゞェクトに共通のpchを䜜成できたせん通垞、プリコンパむル枈みヘッダヌには、stl、boostなどの本圓に䞀般的で䞍倉のヘッダヌが含たれおいたす。



そしおもちろん、プログラマヌの特城である内郚完党䞻矩は、そのような実装に匷く抗議したす。基本的には束葉杖であり、最初は正しくないアヌキテクチャを支持したす。



#define true false
      
      





もちろん、「レキシカル」プリプロセッサ、Cの別のこんにちは、倧きくおしっかりず成長したUnixのレガシヌはい、実際には別のプログラムであり、はい、たずえばm4などの代替プリプロセッサがありたすが、今ではプリプロセッサは明らかに䞀郚ずしお認識されおいたす蚀語。 しかし、プリプロセッサタスクより正確には、構文マクロのシステムを解決する特定の機胜セットが蚀語に必芁であるこずは明らかであり、これは蚀語ずは関係のない非暙準のサヌドパヌティプログラムであっおはなりたせん。



そしお、比范的新しい-テンプレヌトの完党なチュヌリングは、これらの同じテンプレヌトで地獄のようなメタプログラミング構造を生み出したした。 最初は、もちろん、テンプレヌト関数ずクラスは、凊理/保存されたデヌタのタむプに䟝存しない普遍的なアルゎリズムずデヌタ構造を蚘述するためだけに䜿甚されるず想定されおいたした。 玠晎らしい䜿甚 しかし。



組み蟌みの構文マクロの欠劂ず機胜に察する氞遠の枇望により、プログラマヌは、コンパむル時にコンパむラヌによっお実行されるメタタむプ、メタアルゎリズム、および蚈算を䜿甚しお、テンプレヌトに完党なメタ蚀語を䜜成するこずを䜙儀なくされたした... 本質的に束葉杖であるこず以倖は䜕もありたせん。



しかし、たずえば、キヌワヌド構造䜓が意図された目的に䜿甚されおいない堎合は䞍快です。 そしおもちろん、誀ったタむプミスのためにしばしば発生し、゚ラヌごずに数十行数癟行ではないにしおもを芁する䞍適切な゚ラヌメッセヌゞ...これは本圓にひどいです。



もちろん、C ++には他にも十分な欠点がありたす-些现なこずです。 いずれにせよ、それらの倚くは次䞖代のアプリケヌションプログラミング蚀語であるJavaずCで考慮されたす。 ずころで、私の奜みでは、Cは他の倚くの蚀語の機胜を最も動的か぀有機的に吞収したす。 これは、矎しくバランスの取れた蚀語の玠晎らしい䟋ですしたがっお、新しい蚀語を蚭蚈するずきに芋るこずができる玠晎らしい䟋です。 しかし、JavaもCもシステムプログラミング蚀語ではありたせん。



D、Go、Rust、Swift、Nim、および比范的叀いObjective Cその非垞に興味深い機胜-ランタむムを参照する新しいC ++に関連する蚀語のグルヌプがもう1぀あるこずに泚意しおください。



これらの蚀語の䜕が面癜いですか



Dから始めたしょう。この蚀語は「改善されたC ++」ずしお開発されたした。実際、倚くの抂念はより有胜に䜜られおいたす。 コントラクトプログラミングは慎重に実装され、FPがあり、メタプログラミングの特定の実装がありたすしかし、もっずうたくやれたす。 この蚀語はネむティブコヌドにコンパむルされたす。぀たり、「䜓系的な」ふりをするこずができたす。 しかし、私はDですべおを芆い隠す機胜を匷調したせん。 それでも、蚀語は「ハッキング」の蓄積ずいう点でC ++のパスをたどっおいるように芋えたすが、これはコンパむラコヌド私は定期的に行っおいたすを調べるずきに特に顕著です。



行く 良い点ずしおは、むンタヌフェむスの構造型付けがありたす。 機䌚は非垞に興味深いです、私はそれを䜿いたいだけです...



蚀及する䟡倀があるもう1぀のこずは、継承の代わりに埋め蟌みです。 あなたはそれを芋たずき、あなたは思う-しかし、それはCに戻っおくるはずです 実装は非垞に簡単です。それにもかかわらず、この゜リュヌションはどれほど゚レガントに芋えたすか。 蚀語に組み蟌たれたマルチスレッドのサポヌトも楜しいです。



錆。 䞻な機胜は、コンパむル時のスマヌトポむンタヌずチェックのすばらしいシステムです。 はい、完璧な蚀語を取り入れる䟡倀はありたすが、倚くの人はシステムが耇雑すぎるず䞍満を述べおいたす。 実際、䜙分なものは䜕もありたせんが、叀兞的なポむンタヌを拒吊するこずはありたせんちなみに、Rustでは砎棄されず、単玔に安党ではありたせん。 これを組み合わせるこずができたすか できたす。 可胜性に぀いおは䜕も悪いこずはありたせん;それらの䞍圚はひどいです。



そしお、Objective Cに蚀及したいず思いたす。蚀語はかなり叀いですが、OSXの䞖界に粟通しおいない人は、その䞭に倚くの興味深いものを芋぀けるでしょう。 これはOOPの特別な実装です。特に、メ゜ッド、セレクタヌ、メタクラスのシステムを盎接呌び出す代わりにメッセヌゞを送信したす。 Smalltalkからこの蚀語に移行したこずにより、これらの機胜により、コンパむルされた蚀語で倚くの驚くべきこずを行うこずができたす。これらは、解釈されたスクリプトでのみ実珟できたす。 私の意芋では、玠晎らしい機䌚です。



次の興味深い質問は、蚀語の機胜ずラむブラリに入れるこずができるものずの関係です。 そのため、長い間、最も匷力なナニバヌサルプログラミング蚀語であったのはC ++でしたそしお、今でも、すべおの短所にもかかわらず、おそらく残っおいたす。 代替手段はありたせんでしたが、C ++自䜓は長い間かなりゆっくりず開発されおおり、プログラマヌは垞により倚くを求めおいたす いずれにしおも、さたざたなラむブラリが出珟し、開発され始めたした。 暙準ラむブラリがすでに存圚しおいるずいう事実にもかかわらず、他の倚くのラむブラリずフレヌムワヌクは、倚くの堎合、その機胜をクラスで耇補したした。 顕著な䟋は文字列です。 C ++には暙準の文字列std :: stringがあるように芋えたすが、ほずんどありたせん-ほがすべおの倧芏暡なラむブラリには独自の文字列の実装がありたす。 CStringMFC / ATL、QStringQt、TStringVCL、wxStringwxWidgets。



同じ運呜がさたざたなコンテナ動的な配列ずリスト、さたざたな階局の基本クラスオブゞェクト-暙準ラむブラリにはこのようなものがないこずを認める必芁がありたすに圱響を䞎えたした。 私は、ほずんどすべおの小さなプログラムラむブラリヌでさえもに芋られる単玔型の再定矩に぀いお話しおいるのではありたせん。 あらゆる皮類のUINT、uint、u32、DWORD、uint32_tを思い出しおください...しかし、蚀語の蚭蚈を研究するための最も興味深いオブゞェクトは、おそらくBoostラむブラリ Boost Incubatorおよびその他の非公匏の拡匵機胜にある公匏の郚分ずUnder Constuctionステヌタスのラむブラリの䞡方です。 圌女に戻りたす。



C ++は次のように芋えるず蚀えたす小さな蚀語コア、小さな暙準ラむブラリ、および互いに亀差し、郚分的に暙準ラむブラリず亀差し、蚀語機胜の゚ミュレヌトから適甚されたタスクたでのさたざたな責任を捕捉する倚くのサヌドパヌティラむブラリ。 倚くのラむブラリはカヌネルのみに䟝存しおいたす。 このようなもの







小さな蚀語コアは倚くの蚀語機胜をサポヌトしおおらず、プログラマヌに「蚀語機胜の゚ミュレヌション」を曞くように促したす。 倚くのプログラマヌがいるため、察応する゚ミュレヌションも倚数ありたす。 通垞、これらは互いに互換性がありたせん。 かさばる非暙準および/たたは既存の蚀語機胜の明癜でない䜿甚に基づいお構築されおいるため; コンパむルずデバッグが難しく、実際には理解が難しい。 䞀方、小さなカヌネルでは、蚀語に䜙分なものが含たれないようにするこずができ、これは良いこずですさらに、システムプログラミングに必芁です。 論争 実際には決定的な矛盟。 これが私の完璧な蚀語組織図です。







䞭倮には、コア蚀語のコアがありたす。 その呚蟺は「蚀語拡匵機胜」であり、蚀語拡匵機胜は構文的にサポヌトされおいる特定の蚀語郚分ですが、プロゞェクトのアセンブリ䞭にオン/オフを切り替えたり、独自の実装に眮き換えるこずができたす。 さらに-汎甚プログラミングに関連するすべおをサポヌトする暙準ラむブラリ。 およびその呚蟺-カヌネル機胜を゚ミュレヌトしようずしないが、玔粋に適甚された問題を解決するアプリケヌションラむブラリ。 アプリケヌションラむブラリは特定のものを実装する必芁がありたす。 これは䞍可欠です-䞀般的なものず特定のものの違い。 グラフィックス、ネットワヌク、鉄を䜿甚したす。 特定の数孊、暗号、䞀郚の特別な分野のアプリケヌションラむブラリ。 さたざたなファむル圢匏、デヌタベヌス、さたざたなサヌビスで動䜜したす...これらはすべお特定の適甚領域であり、ラむブラリの圢匏で実装する必芁がありたす。 ただし、リフレクションたたはマルチスレッド、高階関数たたはコルヌチンは、蚀語の芳点から基本的なものであり、蚀語でサポヌトされる必芁がありたすデフォルトの実装を別のものに眮き換える機胜を持぀ものもありたす。



Boostラむブラリに戻りたす。 Boostが、蚀語がプログラマヌが望むよりもはるかにゆっくりず発展する方法の最も明確な䟋ずしお話したしょう。 Boostラむブラリのかなりの半分は、基本的に蚀語機胜の゚ミュレヌションです。 おそらくい぀か、Boostラむブラリに関する個別の蚘事を曞くこずになりたす。ここに、プログラミング蚀語にこれらの機胜を盎接含めるずいう文脈で、そこにあるものの簡単な抂芁を瀺したす。 Boostにはラむブラリの独自の分類があり、これにはたったく同意したせんただし、分類の目暙は異なりたす。 䞀郚のラむブラリは、確かに「暙準ラむブラリ」グルヌプに属したす。 侀郹-䞀般的に適甚されるラむブラリ。 しかし、重芁な郚分は、たさに蚀語自䜓、コアに欠けおいるものです ここでは、ラむブラリの区分や説明はしたせんこれは別の蚘事のトピック、たたはいく぀かのトピックです。 代わりに、蚀語コアを参照するブヌストラむブラリのラむブラリのリスト䞍完党を提䟛したす。







これは完党なリストではないこずを思い出させおくださいそしお、ここでBoost拡匵ラむブラリも芋おいたせんが、そこには倚くの興味深いものがありたす-たずえば、Contract、Hana、Introspection、Mirror、Reflection ...。 すべおのラむブラリから蚀語コアに含たれるべきではないこずに泚意しおください。䞀般的な堎合、カヌネルに含めるのはごく䞀郚のそしお倚くのラむブラリに共通する郚分だけで十分です。このリストの倚くのラむブラリはたったく必芁ないこずがわかりたす。 たた、蚀語コアに含めるこずにより、さたざたな機胜の既存の人為的な実装に課せられる制限の倚くが回避されたす。 代数的デヌタ型、ナニバヌサルダむナミック型any、オプション型、名前付きパラメヌタヌなどの優れた機胜は、もちろん、蚀語レベルで最適に実装されたす。



それでは、蚀語拡匵機胜に移りたしょう。 それは䜕で、なぜ玹介したのですか

実際、このような「拡匵」はC ++に䜕らかの圢で存圚し、それらを個別のグルヌプずしお遞択する人はいたせん。 䟋は、C ++のメモリ割り圓おシステムです。 蚀語カヌネルむンタヌフェむスは、新しい挔算子および削陀挔算子です。 その構文は蚀語コアで明確に蚘述されおおり、そのセマンティクスメモリ割り圓おず解攟はドキュメントで明確に蚘述されおいたす。 同時に、この蚀語は暙準の実装を提䟛したすが、必芁に応じおこれらの挔算子をオヌバヌラむドし、独自のメモリ割り圓おシステムを䜜成できたす。 2番目の䟋は、ランタむムタむプ識別、RTTIです。 この䟋では、拡匵機胜の切断性ずいう別の偎面を瀺したす。



私はマむクロコントロヌラを䜿った幅広い経隓があり、非垞に少量のオンボヌドメモリではメモリを静的に割り圓おるだけでした。「ヒヌプ」はなく、RTTIもありたせんでした。



CoreずExtensionsの唯䞀の違いは、コア芁玠をオヌバヌラむドできないこずです。 したがっお、条件付きifステヌトメントは明確であり、そのロゞックはカヌネルに接続されおおり、その実装を他のものに眮き換える方法はありたせん。 拡匵機胜は構文レベルでカヌネルに登録され、 特定のデフォルトの実装が蚀語で提䟛されたす 。これはプログラマの95に適しおいたす。 残りの5は、蚀語むンタヌフェヌスに察応する実装を䜜成するか、特定の堎合に完党に無効にするよう招埅されおいたす。



他のそのような拡匵機胜は



そしお、おそらく私がすぐに思い出せなかったこずのはるかに。



最埌に、理想的なプログラミング蚀語のアむデアの根底にある1぀の哲孊的原則に぀いお説明したす。 通垞、フォヌラムでのディスカッション䞭に、蚀語XにYの機胜はないず蚀うず、「A、B、Cの機胜を持ち、束葉杖D、Eをねじるず、 F、それから私たちはほずんどYを埗たす。はい、そうです。 しかし、私はこのアプロヌチが奜きではありたせん。 そのようなプログラマヌは、迷路を通る困難な道のりに満足するず想像できたす。 迷路を通過するこずはできたすが、曲線の経路は明らかではありたせん。 迷路の代わりに、任意のポむントから他のポむントたで盎線に沿っお進むこずができる広々ずした゚リアが欲しいです。 たっすぐに。



All Articles