Emerge (أو Emerge-viz ) هي أداة تفاعلية لتحليل التعليمات البرمجية لجمع رؤى حول بنية التعليمات البرمجية المصدر والمقاييس والتبعيات وتعقيد مشاريع البرامج. يمكنك مسح الكود المصدري لمشروع ما، وحساب النتائج والإحصائيات المترية، وإنشاء تطبيق ويب تفاعلي بهياكل رسم بياني (مثل رسم بياني للتبعية أو رسم بياني لنظام الملفات) وتصدير النتائج في بعض تنسيقات الملفات. يتمتع Emerge حاليًا بدعم التحليل للغات التالية: C
و C++
و Groovy
و Java
و JavaScript
و TypeScript
و Kotlin
و ObjC
و Ruby
و Swift
و Python
و Go
. يتم حساب البنية والتلوين والتجميع بناءً على فكرة الجمع بين محاكاة الرسم البياني الموجه بالقوة ونمطية لوفان. الظهور مكتوب بشكل أساسي بلغة Python 3 ويتم اختباره على أنظمة التشغيل macOS وLinux ومتصفحات الويب الحديثة (مثل أحدث إصدارات Safari وChrome وFirefox وEdge).
الظهور (/ɪˈمəːدʒ/)
- أن يظهر بالخروج من الشيء أو الخروج من خلف الشيء
- أن يصبح معروفًا، خاصة نتيجة فحص شيء ما أو طرح أسئلة عنه
الهدف الرئيسي من هذا المشروع هو إنشاء أداة مجانية/مفتوحة المصدر، يمكن استخدامها بسهولة من قبل أي شخص مهتم بتطوير البرمجيات والهندسة المعمارية والمقاييس والتصور لجمع المزيد من الأفكار حول هذه المواضيع. ينبغي أن يسهل/يدعم الحصول على فهم أفضل لمشروع برمجي معين باستخدام نهج استكشافي.
C
و C++
و Groovy
و Java
و JavaScript
و TypeScript
و Kotlin
و ObjC
و Ruby
و Swift
و Python
Groovy
و Java
و Kotlin
و Swift
git-based
(SLOC، وتعقيد المسافة البيضاء، وتغيير الاقتران)SwiftUI
وكيانات واجهة المستخدم التعريفية Composable
git-based
على سبيل المثال تغيير التعليمات البرمجيةأسهل طريقة للاستخدام تظهر في حاوية Docker سابقة الإنشاء. الشرط الوحيد هو أن يكون لديك محرك Docker. على سبيل المثال سطح المكتب Docker.
قم بإعداد مجلد العمل الخاص بك مثل هذا
config.yml
?export
?source
الأمر لتشغيل التحليل هو:
docker run --rm -v <YOUR_WORKING_FOLDER_PATH>:/tmp/emerge achtelik/emerge:2.0.0 /tmp/emerge/config.yml
المعلمة الأخيرة هي المسار إلى config.yml داخل حاوية Docker.
⚡يمكنك تجاهل خطأ Pyperclip في نهاية التشغيل.
إذا كنت تستخدم الاقتراح المذكور أعلاه، انتبه إلى أن مسار analyses.source_directory
ومسار export.directory
يجب أن يبدأ بـ /tmp/emerge
. يعد ذلك ضروريًا لأن التحليل الخاص بك يعمل داخل حاوية Docker.
على سبيل المثال:
---
project_name: java_project_example
loglevel: info
analyses:
- analysis_name: full java check
source_directory: /tmp/emerge/source
.
.
.
export:
- directory: /tmp/emerge/export
.
.
.
حاوية Docker نفسها مستقلة عن المسار. لا تتردد في استخدام وحدة التخزين الخاصة بك ومسارات تكوين المشروع.
في الأساس هناك طريقتان لتثبيت الظهور. إذا كنت معتادًا على استخدام pip
(يوصى باستخدام بيئة افتراضية باستخدام pyenv
و virtualenv
و virtualenvwrapper
، ولكن ليس هناك حاجة إليها) يمكنك ببساطة تثبيت الإصدار الأحدث منmerge من خلال الخطوات القليلة التالية.
الطريقة الموصى بها هي استخدام بيئة افتراضية، يمكنك القيام بذلك باستخدام المثال التالي:
pyenv install 3.10.0
pyenv virtualenv 3.10.0 venv-3.10.0
pyenv activate venv-3.10.0
يمكنك ببساطة تثبيت الظهور باستخدام pip
.
في Ubuntu 20.04+، يرجى التأكد من تثبيت الحزمتين graphviz
و graphviz-dev
، أي
apt-get install graphviz graphviz-dev
إما التثبيت كحزمة جديدة مع:
pip install emerge-viz
أو إذا كان مثبتًا بالفعل، فما عليك سوى التحديث باستخدام:
pip install -U emerge-viz
ثم قم بتنفيذ الأمر ببساطة على النحو التالي:
(emerge) user@host ~ % emerge
usage: emerge [-h] [-c YAMLCONFIG] [-v] [-d] [-e] [-a LANGUAGE]
? Welcome to emerge x.y.z (yyyy-mm-dd hh:mm:ss)
options:
-h, --help show this help message and exit
-c YAMLCONFIG, --config YAMLCONFIG
set yaml config file
-v, --verbose set logging level to INFO
-d, --debug set logging level to DEBUG
-e, --error set logging level to ERROR
-a LANGUAGE, --add-config LANGUAGE
add a new config from a template, where LANGUAGE is one of [JAVA, SWIFT, C, CPP, GROOVY, JAVASCRIPT,
TYPESCRIPT, KOTLIN, OBJC, RUBY, PY, GO]
يمكنك إنشاء تكوين مخصص لمشروع بسيط من سطر الأوامر ثم ضبط مسارات المصدر/التصدير الضرورية
(emerge) user@host tmp % pwd
/Users/user1/tmp
(emerge) user@host tmp % emerge -a java
✅ created config file from template: /Users/user1/tmp/java-template.yaml
ثم قم ببساطة بضبط المسارات الضرورية ( analyses/source_directory
و export/directory
):
(emerge) user@host tmp % cat java-template.yaml
---
project_name: java_project_example
loglevel: info
analyses:
- analysis_name: full java check
source_directory: /Users/user1/emerge/project/source
only_permit_languages:
- java
only_permit_file_extensions:
- .java
file_scan:
- number_of_methods
- source_lines_of_code
- dependency_graph
- fan_in_out
- louvain_modularity
- tfidf
entity_scan:
- dependency_graph
- source_lines_of_code
- number_of_methods
- fan_in_out
- louvain_modularity
- tfidf
export:
- directory: /Users/user1/emerge/project/export
- graphml
- json
- tabular_file
- tabular_console_overall
- d3
(emerge) user@host tmp %
بعد ذلك يمكنك ببساطة بدء الفحص
(emerge) user@host tmp % emerge -c java-template.yaml
2021-12-04 21:18:15 analysis I starting to analyze java_project_example
2021-12-04 21:18:15 analysis I ⏩ performing analysis 1/1: full java check
2021-12-04 21:18:15 analysis I starting to create filesystem graph in full java check
2021-12-04 21:18:15 analysis I ⏩ starting scan at directory: ...
...
...
...
2021-12-04 21:18:27 analysis I ✅ all your generated/exported data can be found here: /Users/user1/tmp/java
2021-12-04 21:18:27 analysis I ✅ copy the following path to your browser and start your web app: file:///Users/user1/tmp/java/html/emerge.html
2021-12-04 21:18:27 analysis I ✅ total runtime of analysis: 00:00:10 + 154 ms
الآن، ما عليك سوى نسخ file://
المسار إلى أي متصفح ويب حديث واستكشاف قاعدة التعليمات البرمجية التي تم تكوينها بشكل تفاعلي
يمكنك استنساخ هذا المستودع وتثبيته باتباع التعليمات التالية:
git clone https://github.com/glato/emerge.git
graphviz
أولاً brew install graphviz
إذا واجهت الخطأ التالي على جهاز Apple silicon Mac
pygraphviz/graphviz_wrap.c:2711:10: fatal error: ' graphviz/cgraph.h ' file not found
# include "graphviz/cgraph.h"
^~~~~~~~~~~~~~~~~~~
1 error generated.
تحتاج إلى تشغيل الأمر التالي مرة واحدة لتحديث pygraphviz لتضمين الدلائل الخاصة ببيئة البيرة الجديدة
pip install --global-option=build_ext --global-option= " -I $( brew --prefix graphviz ) /include/ " --global-option= " -L $( brew --prefix graphviz ) /lib/ " pygraphviz
انظر القضية في السياق هنا.
تأكد من تثبيت أحدث إصدار من Python 3 على نظام التشغيل macOS لديك. أوصي بتثبيت/استخدام Python 3 من Homebrew. إنشاء بيئة افتراضية لـ Python 3 (اختياريًا ضمن بنية المشروع)
cd emerge
pip3 install virtualenv
virtualenv -p python3 venv
تثبيت الحزم المطلوبة وإنشاء بيئة افتراضية لـ Python 3 (اختياريًا ضمن بنية المشروع)
apt-get install python3-venv python3-dev graphviz graphviz-dev
cd emerge
python3 -m venv venv
source venv/bin/activate
قم بتثبيت جميع التبعيات المطلوبة للمشروع باستخدام النقطة
pip install -r requirements.txt
قم بتثبيت حزمة العجلة، وبعد ذلك قم بتثبيت جميع التبعيات المطلوبة للمشروع باستخدام النقطة
pip install wheel
pip install -r requirements.txt
قم بتنفيذ ما يلي من جذر المشروع المستنسخ:
python -m unittest discover -v -s ./emerge -p "test_*.py"
وإلا قم بتنفيذ البرنامج النصي run_tests.py
:
python run_tests.py
إذا واجهت أي مشكلة في تنفيذ الاختبارات، فتحقق من هذا الحل البديل.
emerge
الجري كأداة قائمة بذاتها (emerge) user@host emerge % python emerge.py
usage: emerge.py [-h] [-c YAMLCONFIG] [-v] [-d] [-e] [-a LANGUAGE]
? Welcome to emerge x.y.z (yyyy-mm-dd hh:mm:ss)
options:
-h, --help show this help message and exit
-c YAMLCONFIG, --config YAMLCONFIG
set yaml config file
-v, --verbose set logging level to INFO
-d, --debug set logging level to DEBUG
-e, --error set logging level to ERROR
-a LANGUAGE, --add-config LANGUAGE
add a new config from a template, where LANGUAGE is one of [JAVA, SWIFT, C, CPP, GROOVY, JAVASCRIPT,
TYPESCRIPT, KOTLIN, OBJC, RUBY, PY, GO]
دعونا نحاول بسرعة تشغيل برنامج الظهور على قاعدة التعليمات البرمجية الخاصة به
python emerge.py -c configs/emerge.yaml
يجب أن ينتج عن هذا مخرجات مماثلة:
... analysis I starting to analyze emerge
... analysis I ⏩ performing analysis 1/1: self-check
... analysis I starting to create filesystem graph in self-check
... analysis I ⏩ starting scan at directory: .
... ...
... analysis I the following statistics were collected in self-check
+-------------------------------------+-------------------+
| statistic name | value |
+-------------------------------------+-------------------+
| scanning_runtime | 00:00:00 + 61 ms |
| scanned_files | 32 |
| skipped_files | 176 |
| parsing_hits | 313 |
| parsing_misses | 141 |
| extracted_file_results | 32 |
| file_results_creation_runtime | 00:00:00 + 538 ms |
| number-of-methods-metric-runtime | 00:00:00 + 4 ms |
| source-lines-of-code-metric-runtime | 00:00:00 + 11 ms |
| louvain-modularity-metric-runtime | 00:00:00 + 161 ms |
| fan-in-out-metric-runtime | 00:00:00 + 4 ms |
| total_runtime | 00:00:00 + 786 ms |
+-------------------------------------+-------------------+
... analysis I the following overall metrics were collected in self-check
+----------------------------------------------+----------------------------+
| metric name | value |
+----------------------------------------------+----------------------------+
| avg-number-of-methods-in-file | 13.0 |
| avg-sloc-in-file | 151.41 |
| total-sloc-in-files | 4845 |
| louvain-communities-dependency-graph | 3 |
| louvain-modularity-dependency-graph | 0.21 |
| louvain-biggest-communities-dependency-graph | 0.49, 0.46, 0.05, 0.0, 0.0 |
| avg-fan-in-dependency-graph | 5.55 |
| avg-fan-out-dependency-graph | 5.55 |
| max-fan-in-dependency-graph | 29 |
| max-fan-in-name-dependency-graph | typing |
| max-fan-out-dependency-graph | 19 |
| max-fan-out-name-dependency-graph | emerge/appear.py |
+----------------------------------------------+----------------------------+
... analysis I ✅ all your generated/exported data can be found here: /Users/user1/tmp/python
... analysis I ✅ copy the following path to your browser and start your web app: file:///Users/user1/tmp/python/html/emerge.html
... analysis I ✅ total runtime of analysis: 00:00:00 + 786 ms
الآن فقط قم بنسخ file://
المسار إلى أي متصفح ويب حديث واستكشف بشكل تفاعلي قاعدة التعليمات البرمجية الناشئة
s
لتحديد عقدة معينة وتمييزها أو إلغاء تحديدهاr
f
والآن دعونا نجعل هذا أكثر إثارة للاهتمام ...
إذا كنت ترغب في استخدام الظهور في مشاريع أخرى، فيمكنك ببساطة نسخ أو تخصيص أحد قوالب التكوين الموجودة من دليل emerge/configs
.
للتشغيل السريع، يجب أن يكون كافيًا ضبط source_directory
directory
في export
.
---
project_name : c-example-project
loglevel : info
analyses :
- analysis_name : check_c_files
source_directory : /Users/user1/emerge/project/source/github/linux-5.8.5/crypto
only_permit_languages :
- c
only_permit_file_extensions :
- .c
- .h
ignore_dependencies_containing :
- string.h
ignore_dependencies_matching :
- ^test_(.*).h$
file_scan :
- number_of_methods
- source_lines_of_code
- dependency_graph
- louvain_modularity
- fan_in_out
- tfidf
export :
- directory : /Users/user1/emerge/project/export
- graphml
- json
- tabular_file
- tabular_console_overall
- d3
بعد تخصيص التكوين الحالي (على سبيل المثال config/c-template.yaml
) أو إنشاء التكوين الخاص بك، ما عليك سوى تشغيل الظهور مرة أخرى باستخدام هذا التكوين الجديد
python emerge.py -c configs/c-template.yaml
بعد الفحص، يمكن العثور على مخرجات الفحص (بما في ذلك تطبيق الويب التفاعلي الخاص بك) في الدليل الذي قمت بإنشائه وتعيينه في معلمة التكوين export
-> directory
، كما هو موضح في السجلات أعلاه.
تكوين YAML الكامل الذي يحتوي على فحص الملف والكيان له التنسيق التالي:
---
project_name : java_project_example
loglevel : info
analyses :
- analysis_name : check_java_files_and_classes
source_directory : /Users/user1/emerge/project/source
only_permit_languages :
- java
only_permit_file_extensions :
- .java
ignore_dependencies_containing :
- java.util
file_scan :
- number_of_methods
- source_lines_of_code
- dependency_graph
- fan_in_out
- louvain_modularity
- tfidf
entity_scan :
- dependency_graph
- source_lines_of_code
- number_of_methods
- fan_in_out
- louvain_modularity
- tfidf
export :
- directory : /Users/user1/emerge/project/export
- graphml
- json
- tabular_file
- tabular_console_overall
- d3
في بعض الأحيان قد يكون من المنطقي استبعاد التبعيات المعتادة للنظام الأساسي أو التبعيات التي لا تساهم كثيرًا في فهم المشروع. يمكن أن تكون نقطة البداية الجيدة لمشروع Android على سبيل المثال قسم ignore_dependencies_containing
على التالي:
ignore_dependencies_containing :
- android
- java
- javax
أو بالنسبة لمشروع iOS، غالبًا ما يكون قسم ignore_entities_containing
التالي منطقيًا، على سبيل المثال، عدم مراعاة معاينات SwiftUI لمخرجات الرسم البياني:
ignore_entities_containing :
- _Previews
يتم تعريف تكوين yaml بشكل أساسي على المستويات التالية:
مفتاح | القيمة / الوصف |
---|---|
project_name | اسم المشروع لجميع التحليلات والمسح والتصدير |
loglevel | تعيين مستوى السجل: error (صامت، أخطاء فقط)، info (تتضمن error ) تمنحك سجلات أساسية حول تدفق التحكم، debug (يتضمن info ) سوف ينتج الكثير من سجلات التصحيح |
analyses | مجموعة من التحليلات التي يمكن تكوينها بشكل فردي، وبالتالي يمكن أن يحتوي المشروع على تحليل واحد إلى العديد من التحليلات. |
مفتاح | القيمة / الوصف |
---|---|
analysis_name | اسم تحليل محدد |
source_directory | الدليل المصدر حيث يجب أن يبدأ فحص الملف العودي |
git_directory | دليل git repo، إذا كان ينبغي تضمين مقاييس git |
git_commit_limit | كم عدد الالتزامات من الالتزام الأخير الذي يجب استخراجه؟ الافتراضي: 150 |
git_exclude_merge_commits | هل يجب استبعاد عمليات الدمج من تعدين جميع المقاييس؟ الافتراضي: true |
ignore_files_containing | استبعاد أسماء الملفات من الفحص الذي يحتوي على السلاسل الفرعية المحددة |
ignore_directories_containing | استبعاد أسماء الدليل من الفحص الذي يحتوي على السلاسل الفرعية المحددة |
only_permit_languages | تتضمن القيم المحتملة: java، وkotlin، وobjc، وswift، وRuby، وgroovy، وjavascript، وc - يمنع بشكل صريح أي لغة أخرى من المسح إلى جانب اللغة التي قمت بتعيينها هنا |
only_permit_file_extensions | السماح صراحةً بامتدادات الملفات التالية التي قمت بتعيينها هنا، على سبيل المثال .java |
only_permit_files_matching_absolute_path | يُسمح فقط بالقائمة التالية لمسارات الملفات المطلقة لفحص الملفات، على سبيل المثال [/Users/user1/source/file1.java] . يجب أن تتبع الملفات source_directory |
ignore_dependencies_containing | تجاهل كل التبعيات المدرجة في قائمة السلاسل الفرعية هذه، على سبيل المثال java.util |
ignore_dependencies_matching | تجاهل كل تبعية تطابق أيًا من التعبيرات العادية في قائمة السلاسل الفرعية هذه، على سبيل المثال ^java.util. |
ignore_entities_containing | تجاهل كل كيان مدرج في قائمة السلاسل الفرعية هذه، على سبيل المثال NotRelevantClass |
ignore_entities_matching | تجاهل كل كيان يطابق أيًا من التعبيرات العادية في قائمة السلاسل الفرعية هذه، على سبيل المثال ^Test |
import_aliases | تحديد قائمة الأسماء المستعارة للاستيراد، أي استبدال السلاسل الفرعية ضمن مسار التبعية الكامل، على سبيل المثال "@foo": src/foo أي اسم مستعار @foo بـ src/foo |
override_resolve_dependencies | إذا كان مدعومًا من قبل محلل اللغة، فافرض حل كل التبعيات في هذه القائمة |
override_do_not_resolve_dependencies | إذا كان مدعومًا من قبل محلل اللغة، فافرض عدم حل كل تبعية في هذه القائمة (أي معاملتها على أنها تبعية عالمية) |
file_scan | إجراء فحص للملف، ويحتوي على المقاييس التي يجب تطبيقها على كل ملف مصدر |
entity_scan | إجراء فحص للكيان، ويحتوي على المقاييس التي يجب تطبيقها على كل كيان (على سبيل المثال، على كل فئة) |
export | يحتوي على أي تنسيقات تصدير يجب إنشاؤها كمخرجات |
appconfig | يحتوي على أي معلمات تكوين التطبيق القابلة للتكوين |
مفتاح | القيمة / الوصف |
---|---|
dependency_graph | إنشاء بنية رسم بياني تبعية استنادًا إلى الملفات المصدر، وستتم إضافة مقاييس إضافية إلى عقد الرسم البياني |
source_lines_of_code | تطبيق سطر مصدر لمقياس التعليمات البرمجية على كل ملف، وإنشاء مقياس شامل |
number_of_methods | تطبيق عدد من الأساليب المترية على كل ملف، وإنشاء مقياس شامل |
fan_in_out | قم بتطبيق مقياس الرسم البياني للداخل/الخارج على كل ملف، وقم بإنشاء مقياس شامل |
louvain_modularity | تطبيق مقياس نمطية لوفان على كل ملف، وإنشاء مقياس شامل |
tfidf | قم بتطبيق مقياس tfidf على كل ملف واستخرج الكلمات الرئيسية الدلالية ذات الصلة |
ws_complexity | تطبيق مقياس تعقيد المسافة البيضاء على كل ملف |
git_metrics | قم بتضمين بعض المقاييس المستندة إلى git وحاول تطبيقها على كل ملف |
مفتاح | القيمة / الوصف |
---|---|
dependency_graph | إنشاء بنية رسم بياني تبعية استنادًا إلى الكيانات المستخرجة من الملفات، وستتم إضافة مقاييس إضافية إلى عقد الرسم البياني |
inheritance_graph | إنشاء بنية رسم بياني للوراثة استنادًا إلى الكيانات المستخرجة من الملفات، وستتم إضافة مقاييس إضافية إلى عقد الرسم البياني |
complete_graph | إنشاء بنية رسم بياني كاملة (رسم بياني لاتحاد التبعية/الميراث) استنادًا إلى الكيانات المستخرجة من الملفات، وستتم إضافة مقاييس إضافية إلى عقد الرسم البياني |
source_lines_of_code | تطبيق أسطر مصدر لمقياس التعليمات البرمجية على كل كيان، وإنشاء مقياس شامل |
number_of_methods | تطبيق عدد من أساليب القياس على كل كيان، وإنشاء مقياس شامل |
fan_in_out | قم بتطبيق مقياس الرسم البياني للداخل/الخارج على كل كيان، وقم بإنشاء مقياس شامل |
louvain_modularity | تطبيق مقياس نمطية لوفان على كل كيان، وإنشاء مقياس شامل |
tfidf | قم بتطبيق مقياس tfidf على كل كيان واستخرج الكلمات الرئيسية الدلالية ذات الصلة |
مفتاح | القيمة / الوصف |
---|---|
directory | دليل الإخراج لجميع تنسيقات التصدير المحددة |
graphml | قم بإنشاء ملف graphML الذي يحتوي على بنية الرسم البياني ونتائج القياس المعينة لعقد الرسم البياني |
tabular_file | إنشاء ملف نصي بتنسيق جدولي يحتوي على كل نتيجة قياس وإحصائية |
tabular_console | طباعة مخرجات منسقة جدولياً على وحدة التحكم التي تحتوي على كل نتيجة قياس وإحصائية |
tabular_console_overall | طباعة مخرجات منسقة جدولياً إلى وحدة التحكم التي تحتوي فقط على نتائج القياس والإحصائية الإجمالية |
json | قم بإنشاء ملف JSON يحتوي على كل نتيجة قياس وإحصائية |
d3 | قم بإنشاء تطبيق ويب Bootstrap/D3 في المجلد الفرعي force-graph-html لمزيد من التحليل المرئي والتفاعلي/الاستكشافي |
مفتاح | القيمة / الوصف |
---|---|
radius_fan_out | عامل مضاعفة نصف قطر العقدة لمقياس الانتشار، الافتراضي: 0.1 |
radius_fan_in | عامل مضاعفة نصف قطر العقدة لمقياس دخول المروحة، الافتراضي: 0.1 |
radius_louvain | عامل مضاعفة نصف قطر العقدة لمقياس لوفان، الافتراضي: 0.02 |
radius_sloc | عامل مضاعفة نصف قطر العقدة لمقياس sloc، الافتراضي: 0.005 |
radius_number_of_methods | عامل مضاعفة نصف قطر العقدة لعدد طرق القياس، الافتراضي: 0.05 |
heatmap_sloc_active | هل يجب تضمين مقياس sloc في حساب نقاط الخريطة الحرارية؟ الافتراضي: true |
heatmap_fan_out_active | هل يجب تضمين مقياس التوزيع الموسع في حساب نقاط الخريطة الحرارية؟ الافتراضي: true |
heatmap_sloc_weight | عامل الوزن لمقياس sloc ضمن حساب نقاط الخريطة الحرارية، الافتراضي: 1.5 |
heatmap_fan_out_weight | عامل الوزن لمقياس التوزيع الموسع ضمن حساب نقاط الخريطة الحرارية، الافتراضي: 1.7 |
heatmap_score_base | الحد الأدنى لدرجات تعيين ألوان الخريطة الحرارية، الافتراضي: 10 |
heatmap_score_limit | الحد الأقصى لدرجة تعيين ألوان الخريطة الحرارية، الافتراضي: 300 |
يدعم Emerge امتدادات الملفات وأنواع المسح التالية لكل لغة، بينما يقوم file_scan
ببساطة بحساب المقاييس وتعيين العقد داخل هياكل الرسم البياني للملفات الممسوحة ضوئيًا ويحاول entity_scan
استخراج المزيد من الكيانات الدقيقة من الملفات، على سبيل المثال الفئات أو البنيات.
امتداد الملف | محلل اللغة | ملفات | الكيانات |
---|---|---|---|
.java | جافا | ✅ | ✅ |
.swift | سويفت | ✅ | ✅ |
.c / .h / .hpp | ج | ✅ | |
.cpp / .h / .hpp | سي ++ | ✅ | |
.groovy | رائع | ✅ | ✅ |
.js / .jsx | جافا سكريبت | ✅ | |
.ts / .tsx | تايب سكريبت | ✅ | |
.k | كوتلين | ✅ | ✅ |
.m / .h | الهدف-ج | ✅ | |
.rb | روبي | ✅ | |
.py | بايثون | ✅ | |
.go | يذهب | ✅ |
غالبًا ما يكون تفسير هذه الرسوم البيانية ذاتيًا للغاية ويعتمد على المشروع. من المفترض أن تساعد الأمثلة التالية في التعرف على أنماط معينة من خلال المؤشرات والتلميحات.
يكمن سحر الكشف عن النمطية في تطبيق خوارزمية اكتشاف المجتمع، على سبيل المثال، تحسين Louvain على رسم بياني موجه بالقوة، بحيث تؤثر المسافات والألوان على النتيجة. يتضمن المثال التالي عدة مؤشرات لقاعدة تعليمات برمجية معيارية.
في المثال الأول على اليسار، يمكنك اكتشاف عدة مجموعات ملونة متماسكة تظهر اقترانًا منخفضًا بمسافة معينة (= يتم إنشاؤها بواسطة الرسم البياني الموجه بالقوة).
في المثال الثاني على اليمين، يتم تقديم نفس الرسم البياني مع الهياكل العنقودية النشطة. في هذا المثال، تظهر الهياكل الحد الأدنى أو عدم التداخل. يمكن لمثل هذه التلميحات أن تكون مؤشرات لبنية برمجية جيدة، على سبيل المثال، من حيث النمطية والتجريد والواجهات المحددة جيدًا.
"إن كرة كبيرة من الطين منظمة بشكل عشوائي، مترامية الأطراف، قذرة، شريط لاصق وأسلاك الكفالة، غابة رمز السباغيتي" (B. Foote، J. Yoder، 1997). غالبًا ما يمثل هذا النوع من الرسم البياني بنية أقل مثالية. للتحقق من هذا النوع من غابة رموز السباغيتي ، يمكن للمرء ببساطة تمكين عرض الهيكل لجميع المجموعات ليحدد أخيرًا: هناك مجموعة كبيرة واحدة فقط على كل حال.
في بعض الأحيان قد يكون من المفيد فهم مدى تعقيد بنية البرامج بشكل أفضل إذا تم تجاهل التبعيات غير ذات الصلة.
ignore_dependencies_containing
(أو ignore_dependencies_matching
إذا كنت تفضل التعبيرات العادية). باستخدام مقياس التشتت المنشط نسبيًا، يمكن للمرء التعرف على المزيد من التشتت وبعض العقد المحورية البعيدة والمجموعات الأكثر وضوحًا. كل هذه هي أدلة محتملة على البنية الحقيقية (= الأكثر قابلية للفهم في كثير من الأحيان) الموجودة تحتها.