C--。 最初の知り合い

KolibriOSのソフトウェア開発ツールの移植と作成のプロセスは継続しています。 最も広く使用されているプログラミング言語については、記事を公開しています。 今日、私たちはC--言語について話し始めています。C--言語は、2000年代に活発なコミュニティが発展してきました。 カットの下の詳細。







公式ウェブサイトから簡単に言語について:







C--は、アセンブラーとCの間の中間位置を占めるプログラミング言語です。 小さなプログラム、レジデント(TSR)、ドライバー、割り込みハンドラーの作成に最適です。 C言語を使用するには、アセンブラーとCの知識が必要です。 現在、C--はDOSおよびWindows用の32ビットコードを生成できます(約Ed。およびMenuetOS、KolibriOS用)



SPHINX C--の著者はPeter Cellik(カナダ)です。 SPHINX C--v0.203の最新の著者のバージョンは、96.Oct.96です。 残念ながら、著者は言語をさらに開発することを拒否しました。 言語自体は、ソーステキストとともに、孤児と宣言され、どこにも与えられませんでした。 つまり あなたがしたいことをしてください。 しませんか? このページには、言語自体の最新(ただし、オリジナルではない)バージョン、ライブラリ、プログラムの例、Notronガイド形式の言語とライブラリの説明、およびC--言語に関するその他の多くの有用な情報があります。


Peter Sellickの後、Michael Shekerはサポートに対処しましたが、数年前に開発を停止しました。 昨年、 ソースは Github https://github.com/jossk/c--sphinx投稿されましたが、これについては2016年3月にしか知りませんでした。







次の2つの理由から、この言語について話すことが決定されました。







  1. いくつかの人気のあるKolibriOSプログラムが書かれており、そのうちEoliteはおそらく最も使用されているファイルマネージャです。

  2. 比較的最近、この言語のコンパイラはKolibriOSに移植されました(ライセンスに関する質問への回答はこちらにあります )。


GerdtRからの移植プロセスについて少し:







だから。 まず、gccでコードを再編集しました。 ソースコードはWatcom C用に単純に記述されており、重要ではない場合でも、非互換性がありました。 いくつかの変数名を修正し(明らかにwatcomの外部が可能です)、64ビット数の指定が異なります。 その後、Leencyは、gccバージョンは現在のフォルダー内のファイルをまったく検索せず、実行可能ファイル自体のフォルダー内のみを検索することを明らかにしました。 これが修正されたとき、最も難しかったのはハミングバードのポートです。 まあ、私はCでCOSに書いていないので、標準の問題がありました-誰とリンクし、どのインクルーダーを取るべきか。 選択肢は広くなく、menuetlibcはすぐに消えました。ソースを掘り下げてみると、ファイルにアクセスするための古い関数(f56のようなもの)が残っていたからです。 要するに、menuetlibcは非常に時代遅れで、newlibは残っています。 長い間、PEではなくkexを取得する方法を考え出しましたが、1つのMakefileが役立ち、追加のobjcopy処理が書き込まれました。 その後、newlibにない関数を追加します(たとえば、statが存在しなかったため、その実装はport.cにあります)。 コンパイラ行にロシア文字が含まれていないため、いくつかのエンコード変換関数はANSI-> ASCII、またはむしろスタブです。 さて、最後の問題があり、これは部分的に残っていました:newlib(他の誰もいない可能性が高い)のために、現在のディレクトリはcmm自体(および通常/ rd / 1)へのパスとして設定されます。コンパイラは、それがどこから始まったとしてもできません。 現時点では、コンパイラをソースフォルダーにコピーするか、絶対パスを指定する方法があります。 ところで、記号 '/'がパラメーターの開始と見なされ、絶対パスを示すことができなかった前に、今では可能です。 しかし、絶対的な道筋では、彼が何を見つけるかはまだわかりません。 これまで、これをいじりたくはありません。単に-IP = "/ hd1 / 1 / my_source"と書くことができます。 理論的には、実際には機能するはずです。 ちなみに...フォーラムまたは何かで示し、パラメータを「-」で今示します...そしてパラメータなしで開始する場合、そのテーブルでは、正しい、そうでなければいくつかの混乱が得られます。 さて、どういうわけか。 まあ、一般的に、全体の話。 最も困難なことは、それをどこから取得するかを理解することでした:) :)コード自体はかなり単純で、スーパーオーダーではありませんが、コードを掘り下げる必要はありませんでした


言語マニュアルはhttp://www.c--sphinx.narod.ru/c--doc.htmにあります 。 KolibriOSの簡単なアプリケーションの例を考えてみましょう。







#define MEMSIZE 4096*10 #include "../lib/io.h" #include "../lib/gui.h" void main() { word id; dword file; io.dir.load(0,DIR_ONLYREAL); loop() switch(WaitEvent()) { case evButton: id=GetButtonID(); if (id==1) ExitProcess(); break; case evKey: GetKeys(); if (key_scancode == SCAN_CODE_ESC ) ExitProcess(); break; case evReDraw: draw_window(); break; } } void draw_window() { proc_info Form; int i; DefineAndDrawWindow(215,100,350,300,0x34,0xFFFFFF,"Window header"); GetProcessInfo(#Form, SelfInfo); for (i=0; i<io.dir.count; i++) { WriteText(5,i*8+3,0x80,0xFF00FF,io.dir.position(i)); } DrawCaptButton(100, 10, 100, 22, 22, 0xCCCccc, 0x000000, "Button"); WriteText(100,50,0x80,0,"Textline small"); WriteText(100,70,0x90,0,"Textline big"); DrawBar(100, 110, 100, 100, 0x66AF86); }
      
      











ご覧のとおり、このコードはCコードとほとんど変わりませんが、システム関数のラッパーを作成するのと同じように、ほとんどアセンブラースタイルで落ち着いて作成できます。 たとえば、ウィンドウ作成関数:







 void DefineAndDrawWindow(dword x, y, size_w, size_h, byte WindowType,dword WindowAreaColor, EDI, ESI) { EAX = 12; EBX = 1; $int 0x40 $xor EAX,EAX EBX = x << 16 + size_w; ECX = y << 16 + size_h; EDX = WindowType << 24 | WindowAreaColor; $int 0x40 EAX = 12; EBX = 2; $int 0x40 }
      
      





KolibriOSのソフトウェア開発者にとって何が魅力的ですか? まず、それについて書き始めることは非常に簡単です。 これは、クロスコンパイル設定に煩わされることなく書き始めることができる、FASMを除く唯一の言語でした(現在、このビジネスでCが勢いを得ています)。 第二に、多くのライブラリとシステム関数のさまざまなラッパーがC--向けに記述されています。 それらの中には、独自のインターフェイス要素のセットと、優れたフォントさえあります。















あなたはおそらく疑問に思うでしょう:もしすべてがとても美しいなら、問題は何ですか? 少なくともKolibriOSプロジェクトの一部として、どこでも使用されないのはなぜですか?

答えは次のとおりです。 開発の容易さという利点にもかかわらず、それを使用すると、欠点が生じます。










All Articles